import org.jdom.*; import org.jdom.input.*; import java.util.List; import pitaru.sonia_v2_9.*; import processing.opengl.*; import processing.serial.*; import processing.video.*; Stadt[] eineStadt; float max_volume = 2; float pan = 0; float volume = 0; int x = 0; int y = 0; int distanz_x; int distanz_y; float distanz; int stadt_status = -1; int distanzgrenze = 62; int j = 0; int tastenstatus = 0; String stadt_wetterzustand; int stadt_zustandscode; int motor = 0; int lichter = 0; String aktivestadt = ""; int imgWidth = 800; int imgHeight = 600; float rc, gc, bc; int positionsstatus = 0; int camWidth = 400; int camHeight = 300; float imgFaktor = 0.0; // AN/AUS (0 = aus, 1 = an): int arduino_an_aus = 1; int internet_an_aus = 1; int tracking_an_aus = 1; ////if (internet_an_aus == 0){ //String[] Stadt_ID = { // "USCA0638", "USNY0996", "UKXX0085" }; ////} ////else{ String[] Stadt_ID = { "USCA0638", "USNY0996", "UKXX0085", "MXDF0132", "BRXX0201", "RSXX0063", "CHXX0008", "USAK0083", "RPXX0017", "EGXX0004", "INXX0026", "ASXX0112", "SFXX0010", "CGXX0005", "CAXX0126", "RSXX0080", "POXX0020", "CIXX0017", "PEXX0003", "GPXX0004", "MAXX0002" }; ////} Sample donner_regen; Sample donner; Sample regen; Sample schnee_eis; Sample sonne_warm; Sample sonne_kalt; Sample wind; PFont font; PImage weltkarte; Serial myPort; Capture video; PImage img; color trackColor; color trackColorRed; color trackColorGreen; color trackColorBlue; void setup() { //size(800, 600); size(800, 600, OPENGL); //frameRate(20); //font = loadFont("HelveticaNeue-24.vlw"); //font = loadFont("HelveticaNeue-10.vlw"); font = loadFont("HelveticaNeue-24.vlw"); textAlign(CENTER); textFont(font, 10); //weltkarte = loadImage("weltkarte_normal.png"); weltkarte = loadImage("eigene_weltkarte_3.png"); if (arduino_an_aus == 1){ println(Serial.list()); myPort = new Serial(this, Serial.list()[3], 9600); } Sonia.start(this); donner_regen = new Sample("donner_regen.aif"); donner = new Sample("donner.aif"); regen = new Sample("regen.aif"); schnee_eis = new Sample("schnee_eis_4.aif"); sonne_warm = new Sample("sonne_warm_3.aif"); sonne_kalt = new Sample("sonne_warm_1.aif"); wind = new Sample("wind_2.aif"); donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); //frameRate(25); colorMode(RGB,255,255,255,100); if (tracking_an_aus == 1){ //println(Capture.list()); String s = "IIDC FireWire Video"; //video = new Capture(this, s, imgWidth, imgHeight, 12); video = new Capture(this, camWidth, camHeight, 12); //video.settings(); } img = new PImage(400,300); imgFaktor = float(imgWidth/camWidth); //trackColor = color(255); // Start off Tracking for white trackColorRed = color(200); trackColorGreen = color(0); trackColorBlue = color(0); eineStadt = new Stadt[Stadt_ID.length]; for(int i=0; i < Stadt_ID.length; i++) { String url; if (internet_an_aus == 0){ url = Stadt_ID [i] + "&u=c.xml"; } else{ url = "http://xml.weather.yahoo.com/forecastrss?p=" + Stadt_ID [i] + "&u=c.xml"; } SAXBuilder builder = new SAXBuilder(); try { Document doc = builder.build(url); Element root = doc.getRootElement(); Element channel = root.getChild("channel"); Element item = channel.getChild("item"); Element geo_lat = (Element)item.getChildren().get(1); Element geo_long = (Element)item.getChildren().get(2); Element weather_location = (Element)channel.getChildren().get(6); Element weather_wind = (Element)channel.getChildren().get(8); Element weather_condition = (Element)item.getChildren().get(5); String stadt_name = weather_location.getAttributeValue("city"); String stadt_land = weather_location.getAttributeValue("country"); int stadt_wind = int(weather_wind.getAttributeValue("speed")); float stadt_lat = float(geo_lat.getValue()); float stadt_long = float(geo_long.getValue()); int stadt_wettercode = int(weather_condition.getAttributeValue("code")); int stadt_temperatur = int(weather_condition.getAttributeValue("temp")); //String stadt_wetterzustand = wetterCodeFunktion(stadt_wettercode); String stadt_wetterzustand = "Wetter: "; int stadt_zustandscode = wetterCodeFunktion(stadt_wettercode); //float stadt_x = ((width/360)*stadt_long) + (width/2); //float stadt_y = height - ( ((height/180)*stadt_lat) + (height/2) ); float stadt_x = ((width/360.0)*stadt_long) + (width/2.0); float stadt_y = height - ( ((height/180.0)*stadt_lat) + (height/2.0) ); String stadt_id = Stadt_ID[i]; float stadt_distanz = 0; int startstatus = 0; eineStadt[i] = new Stadt(stadt_x, stadt_y, stadt_id, stadt_name, stadt_land, stadt_wetterzustand, stadt_zustandscode, stadt_wettercode, stadt_temperatur, stadt_wind, stadt_lat, stadt_long, stadt_distanz, startstatus); //println(stadt_name + " " + stadt_long + " " + stadt_lat + " " + stadt_x + " " + stadt_y); println(stadt_name + " " + stadt_land + " " + stadt_wind + " " + stadt_lat + " " + stadt_long + " " + stadt_wettercode + " " + stadt_zustandscode + " " + stadt_temperatur); } catch (Exception e) { System.out.println(e); } } } void captureEvent(Capture myCapture) { myCapture.read(); } void keyPressed() { if (key == '2') { tastenstatus = 1; } if (key == '1') { tastenstatus = 0; } } void draw() { //background(175,200,255); background(0); ////image(weltkarte, 0, 95); //image(weltkarte, 25, 15); /* stroke(150); for(int i=-180; i<=180; i=i+45) { for(int j=-90; j<=90; j=j+45) { float cor_x = ((width/360.0)*i) + (width/2.0); line(cor_x,0,cor_x,height); float cor_y = height - ( ((height/180.0)*j) + (height/2.0) ); line(0,cor_y,width,cor_y); } } stroke(255,0,0); noFill(); //rect( ((width/360.0)*-180) + (width/2.0) , height - ( ((height/180.0)*90) + (height/2.0) ) , ((width/360.0)*180) + (width/2.0) , height - ( ((height/180.0)*-90) + (height/2.0) ) ); */ if (tracking_an_aus == 0){ x = mouseX; y = mouseY; } //tastenstatus = 0; // //if(keyPressed) { // if (key == 'a') { // tastenstatus = 1; // } //} fill(255); textAlign(RIGHT); textFont(font, 36); text(aktivestadt, width - 25, height - 25); // KAMERATRACKING if (tracking_an_aus == 1){ loadPixels(); //image(video,0,0,width,height); img.copy(video, 0, 0, video.width, video.height, 0, 0, img.width, img.height); //img.copy(video, 0, 0, video.width, video.height, 0, 0, imgWidth, imgHeight); //fastblur(img, 2); //image(img,0,0); float closestDiff = 500.0f; //float x = 0; //float y = 0; for ( int xx = 0; xx < video.width; xx++) { for ( int yy = 0; yy < video.height; yy++) { int loc = xx + yy*video.width; color currentColor = video.pixels[loc]; float r1 = red(currentColor); float g1 = green(currentColor); float b1 = blue(currentColor); float r2 = red(trackColorRed); float g2 = green(trackColorGreen); float b2 = blue(trackColorBlue); float d = dist(r1,g1,b1,r2,g2,b2); if (d < closestDiff) { closestDiff = d; x = int(xx*imgFaktor); y = int(yy*imgFaktor); } } } int d=((millis()/75) % 20)+4; noStroke(); fill(255); ellipseMode(CENTER); ellipse(x,y,10,10); //println(x + " " + y); } for (int i = 0; i < Stadt_ID.length; i++) { eineStadt[i].run(); } if (arduino_an_aus == 1){ ////motor = 165; myPort.write(motor); myPort.write(lichter); } //println(motor); //println(x + " " + y); } class Stadt { float stadt_x; float stadt_y; String stadt_id; String stadt_name; String stadt_land; String stadt_wetterzustand; int stadt_zustandscode; int stadt_wettercode; int stadt_temperatur; int stadt_wind; float stadt_lat; float stadt_long; float stadt_distanz; int startstatus; Stadt(float _stadt_x, float _stadt_y, String _stadt_id, String _stadt_name, String _stadt_land, String _stadt_wetterzustand, int _stadt_zustandscode, int _stadt_wettercode, int _stadt_temperatur, int _stadt_wind, float _stadt_lat, float _stadt_long, float _stadt_distanz, int _startstatus){ stadt_x = _stadt_x; stadt_y = _stadt_y; stadt_id = _stadt_id; stadt_name = _stadt_name; stadt_land = _stadt_land; stadt_wetterzustand = _stadt_wetterzustand; stadt_zustandscode = _stadt_zustandscode; stadt_wettercode = _stadt_wettercode; stadt_temperatur = _stadt_temperatur; stadt_wind = _stadt_wind; stadt_lat = _stadt_lat; stadt_long = _stadt_long; stadt_distanz = _stadt_distanz; startstatus = _startstatus; } void run() { drawShape(); } void drawShape() { distanz_x = int(stadt_x) - x; distanz_y = int(stadt_y) - y; stadt_distanz = sqrt(pow(distanz_x, 2) + pow(distanz_y, 2)); if (stadt_distanz <= distanzgrenze){ aktivestadt = stadt_name; volume = max_volume; volume = max_volume - ((max_volume/distanzgrenze) * stadt_distanz); motor = 75 + (stadt_wind * 6); //motor = stadt_wind * 8; lichter = stadt_zustandscode; } if (aktivestadt == stadt_name){ if (stadt_distanz > distanzgrenze){ volume = 0; motor = 0; lichter = 0; aktivestadt = ""; } } if (aktivestadt == ""){ volume = 0; motor = 0; lichter = 0; donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (startstatus == 0){ donner_regen.repeat(); donner.repeat(); regen.repeat(); schnee_eis.repeat(); sonne_warm.repeat(); sonne_kalt.repeat(); wind.repeat(); startstatus = 1; } // --> Hier wird der richtige Ton zugeordnet: if (aktivestadt == stadt_name){ if (stadt_zustandscode == 0) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 1) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(volume); } if (stadt_zustandscode == 2) { donner_regen.setVolume(0); donner.setVolume(volume); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 3) { donner_regen.setVolume(volume); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 4) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(volume); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 5) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(volume); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 6) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(volume); schnee_eis.setVolume(volume); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 7) { if (stadt_temperatur > 20){ donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(volume); sonne_kalt.setVolume(0); wind.setVolume(0); } else { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(volume); wind.setVolume(0); } } if (stadt_zustandscode == 8) { if (stadt_temperatur > 16){ donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(volume); sonne_kalt.setVolume(0); wind.setVolume(volume); } else { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(volume); wind.setVolume(volume); } } if (stadt_zustandscode == 9) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(volume); } if (stadt_zustandscode == 10) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(volume); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(volume); } if (stadt_zustandscode == 11) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(volume); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } if (stadt_zustandscode == 12) { donner_regen.setVolume(0); donner.setVolume(0); regen.setVolume(0); schnee_eis.setVolume(0); sonne_warm.setVolume(0); sonne_kalt.setVolume(0); wind.setVolume(0); } } ellipseMode(CENTER); noStroke(); fill(255,0,0); ellipse(stadt_x, stadt_y, 6, 6); if (tastenstatus == 1) { //text(stadt_id, stadt_x, stadt_y + 20); //text(stadt_name + ", " + stadt_land, stadt_x, stadt_y + 35); //text(stadt_wetterzustand + ", " + stadt_temperatur + " ĄC", stadt_x, stadt_y + 50); //text("Wind: " + stadt_wind + " km/h", stadt_x, stadt_y + 65); //text("Distanz: " + stadt_distanz, stadt_x, stadt_y + 80); //text(stadt_name + ", " + stadt_land + '\n' + stadt_wetterzustand + stadt_zustandscode + ", " + stadt_temperatur + " ĄC" + '\n' + "Wind: " + stadt_wind + " km/h" + '\n' + "Distanz: " + int(stadt_distanz), stadt_x, stadt_y + 20); textFont(font, 14); text(stadt_name, stadt_x, stadt_y + 20); } } } float distanz_volume(float _distanz, float _max_volume){ float _volume = 0; _volume = _max_volume - ( (_max_volume / (height * 1.25) ) * _distanz); if (_volume < 0){ _volume = 0; } return _volume; } int wetterCodeFunktion(int stadt_wettercode){ //String stadt_wetterzustand = ""; int stadt_zustandscode = 0; if((stadt_wettercode == 0) || (stadt_wettercode == 1) || (stadt_wettercode == 2) || (stadt_wettercode == 23) || (stadt_wettercode == 24) || (stadt_wettercode == 5)) { stadt_wetterzustand = "Wind oder Sturm"; stadt_zustandscode = 1; } if((stadt_wettercode == 3) || (stadt_wettercode == 4) || (stadt_wettercode == 37) || (stadt_wettercode == 38) || (stadt_wettercode == 39)) { stadt_wetterzustand = "Gewitter"; stadt_zustandscode = 2; } if((stadt_wettercode == 45) || (stadt_wettercode == 7)) { stadt_wetterzustand = "Gewitter & Regen"; stadt_zustandscode = 3; } if((stadt_wettercode == 9) || (stadt_wettercode == 11) || (stadt_wettercode == 12) || (stadt_wettercode == 40)) { stadt_wetterzustand = "Regen"; stadt_zustandscode = 4; } if((stadt_wettercode == 13) || (stadt_wettercode == 14) || (stadt_wettercode == 16) || (stadt_wettercode == 41) || (stadt_wettercode == 43)) { stadt_wetterzustand = "Schnee & Eis"; stadt_zustandscode = 5; } if((stadt_wettercode == 5) || (stadt_wettercode == 6) || (stadt_wettercode == 7) || (stadt_wettercode == 8) || (stadt_wettercode == 10) || (stadt_wettercode == 18) || (stadt_wettercode == 42) || (stadt_wettercode == 46)) { stadt_wetterzustand = "Regen & Schnee"; stadt_zustandscode = 6; } if((stadt_wettercode == 31) || (stadt_wettercode == 32) || (stadt_wettercode == 33) || (stadt_wettercode == 34) || (stadt_wettercode == 36)) { stadt_wetterzustand = "Sonne & warm"; stadt_zustandscode = 7; } if((stadt_wettercode == 29) || (stadt_wettercode == 30) || (stadt_wettercode == 44)) { stadt_wetterzustand = "teils bewšlkt"; stadt_zustandscode = 8; } if((stadt_wettercode == 26) || (stadt_wettercode == 27) || (stadt_wettercode == 28)) { stadt_wetterzustand = "bewšlkt"; stadt_zustandscode = 9; } if((stadt_wettercode == 15)) { stadt_wetterzustand = "Schneesturm"; stadt_zustandscode = 10; } if((stadt_wettercode == 17) || (stadt_wettercode == 35)) { //stadt_wetterzustand = "Hagel"; stadt_wetterzustand = "Schnee & Eis"; stadt_zustandscode = 11; } if((stadt_wettercode == 19) || (stadt_wettercode == 20) || (stadt_wettercode == 21) || (stadt_wettercode == 22)) { stadt_wetterzustand = "Nebel"; stadt_zustandscode = 12; } if((stadt_wettercode == 3200)) { stadt_wetterzustand = "keine Angaben"; stadt_zustandscode = 0; } //return stadt_wetterzustand; return stadt_zustandscode; }