import processing.serial.*; import processing.net.*; import java.io.FileWriter; import java.io.*; import java.util.*; import spout.*; boolean spoutactive=true; Spout spout; PFont fontregular; PImage image_line; Serial myPort; Server myServer; String val = "0.0"; int speeds_show=10; float[] speeds=new float[speeds_show]; int speeds_index=0; //points to next array index float speedfloat=0; float triggerspeedmin=15; //current triggerspeed int unitdisplay=0; int unitdisplay_count=9; //how much different units available int xtextstart=10; void setup() { size(800, 600, P3D); frameRate(30); fontregular=createFont("Montserrat-Regular.ttf",64); textFont(fontregular); myServer = new Server(this, 2323); image_line = loadImage("bleeptrackline.png"); //String portName = "COM5"; //String portName = "/dev/ttyUSB0"; int useportID=-1; println("Serialports:"); for(int i=0;i 0) { String sread = myPort.readString(); println("serialRead: " + sread); if (sread.length()>=7 && sread.substring(0,6).equals("speed=")){ //new speed measurement val = sread.substring(6,sread.length()-1); speedfloat=float(val); speeds[speeds_index]=speedfloat; speeds_index++; speeds_index%=speeds_show; Date d=new Date(); println(d.getTime()+";"+speedfloat); //pw.println(d.getTime()+";"+speedfloat); //pw.flush(); appendTextToFile("speeds.txt",d.getTime()+";"+speedfloat); unitdisplay=int(random(0,unitdisplay_count)); println("unitdisplay: "+unitdisplay); triggerspeedmin=getTimesPercentile(0.8); //triggerspeedmin=getTimesMax(); sendSpeedTrapValue(int(triggerspeedmin)); myServer.write(str(speedfloat)); } } background(0); fill(0,132,176); textSize(100); int xtext=xtextstart; int ytext=100; switch(unitdisplay){ case 0: text(nf(speedfloat,1,2) + " km/h" , xtext, ytext); break; case 1: text(nf(speedfloat*0.621371,1,2) + " mph" , xtext, ytext); break; case 2: text(nf(speedfloat*0.000809848,1,6) + " Mach" , xtext, ytext); break; case 3: text(nf(speedfloat*0.911344,1,2) + " ft/s" , xtext, ytext); break; case 4: text(nf(speedfloat*0.277778,1,2) + " m/s" , xtext, ytext); break; case 5: text(nf(speedfloat*0.539957,1,2) + " knots" , xtext, ytext); break; case 6: text(nf(speedfloat*0.000000000926567,1,9) + " c" , xtext, ytext); break; case 7: text(nf(speedfloat*54.67469,1,0) + " ft/min" , xtext, ytext); break; case 8: text(nf(pow((speedfloat*0.277778/0.836), 2.0/3),1,0) + " Bft" , xtext, ytext); break; } //Line image(image_line, 10, 100); int reducesizefactor=40; int lastytextpos=200; for (int i=speeds_show;i>0;i--){ float colorpercentage=i*1.0/speeds_show; fill(0,132*colorpercentage+163*(1-colorpercentage),176*colorpercentage+86*(1-colorpercentage)); textSize(50-(1-colorpercentage)*reducesizefactor); text( nf(speeds[(speeds_show+speeds_index-1+i)%speeds_show], 1,2) + " km/h", xtextstart, lastytextpos); lastytextpos+=50-(1-colorpercentage)*reducesizefactor; } textSize(40); text( "speed trap: "+nf(triggerspeedmin,1,1) +" km/h", 10, height-50); if (spoutactive){ spout.sendTexture(); } } float getTimesMax(){ float speedmax=0; for (int i=0;i