VisClient/org/hfbk/vis/UdpListener.java

Go to the documentation of this file.
00001 package org.hfbk.vis;
00002 
00003 
00004 import java.io.IOException;
00005 import java.net.DatagramPacket;
00006 import java.net.DatagramSocket;
00007 import java.net.SocketAddress;
00008 import java.util.Arrays;
00009 
00010 import org.hfbk.util.Scripter;
00011 import org.hfbk.vis.visnode.VisNode;
00012 import org.hfbk.vis.visnode.VisScale;
00013 import org.hfbk.vis.visnode.VisUeberwach;
00014 
00031 class UdpListener extends Thread {
00035         static int udpport = 7778;
00036         DatagramSocket socket = null;
00037         DatagramPacket paket = null;
00038         VisClient client;
00039         
00040         
00041         ScriptRouter router;
00042         
00043         
00044         UdpListener(VisClient client) {
00045                 super("UdpListener, port "+udpport); //name this thread
00046                 setDaemon(true);
00047                 
00048                 paket = new DatagramPacket(new byte[256], 256);
00049                 this.client=client;
00050                 try {
00051                         socket = new DatagramSocket(udpport);
00052                 } catch (IOException e) {
00053                         System.err.println("UdpListener: " + e.getClass());
00054                 }
00055                 
00056                 try{
00057                         router=new ScriptRouter(client);
00058                 }catch(Exception e){
00059                         e.printStackTrace();
00060                 }
00061                 setPriority(Thread.MIN_PRIORITY); // don't slow down animation
00062                 start();
00063         }
00064 
00065         public void run() {
00066                 while (true) {
00067                         try {
00068                                 socket.receive(paket);
00069                                 //InetSocketAddress add = (InetSocketAddress) paket.getSocketAddress();
00070                         
00071                                 // Text aus Paket extrahieren
00072                                 String text = new String(paket.getData(), 0, paket.getLength());
00073                                 if(Prefs.current.verbose) 
00074                                         System.out.println(text);
00075                                 
00076                                 if (text.equals("PING\n")) { //answer a VisMCP ping attempt. 
00077                                         SocketAddress mcp=paket.getSocketAddress();
00078                                         byte[] pong="PONG\n".getBytes();
00079                                         socket.send(new DatagramPacket(pong, pong.length, mcp));
00080                                 }
00081                                 
00082                                 if (text.startsWith("javascript:")) {
00083                                         SocketAddress mcp=paket.getSocketAddress();
00084                                         String result=script(text.substring(11));
00085                                         byte[] answer=result.getBytes();
00086                                         socket.send(new DatagramPacket(answer, answer.length, mcp));
00087                                 }
00088                                 
00089                                 if (text.indexOf('[')>-1 && text.indexOf('[')<2)
00090                                         parseMsg(text);
00091                                 
00092                         }catch (IOException e) { //common reason is that we ourselves 
00093                                                                         //closed this connection so fail silently                               
00094                                 //System.err.println("Ausnahmefehler: " + e);
00095                                 return;
00096                         }
00097                 }
00098         }
00099         
00100         public void close(){
00101                 if (socket!=null)
00102                         socket.close();
00103         }
00104         
00120         float nickNeutral=0x160, rollNeutral=0x160;
00121         //float nickNeutral=344, rollNeutral=348; //Floß
00122         
00123         void parseMsg(String msg){
00124                 try{
00125                         //gracefully ignore extra chars
00126                         int start=msg.indexOf('['); 
00127                         int end=msg.lastIndexOf(']');
00128                         
00129                         if(end<1)
00130                                 throw new RuntimeException("No correct ] delimiter!");
00131                         msg=msg.substring(start+1, end);
00132                         String[] args=msg.split(",");
00133                         
00134                         MouseViewpoint vp=client.mouseViewpoint;
00135                         
00136                         String cmd=args[0];
00137                         if (cmd.equals("scale")){
00138                                 float value=Long.decode(args[2])/(float)0x3FF;
00139                 
00140                                 //router.dispatch(Arrays.copyOfRange(args, 1, args.length));
00141                                 router.dispatch(args[1], Arrays.copyOfRange(args, 2, args.length));
00142                                 
00143                                 if (args[1].matches("sonar.*")){
00144                                         VisNode n=client.root.findNode(VisUeberwach.class);
00145                                         ((VisUeberwach)n).parseMsg(args);
00146                                 }
00147                                 
00148                                 /*if (args[1].equals("poti1")) //poti1 controls timescale..
00149                                         client.timescale=value*5;
00150                                 else if (args[1].equals("poti3")){
00151                                         vp.tfov=3.15f-value*3;  
00152                                 }
00153                                 else if (args[1].equals("poti4")){
00154                                         vp.tfov=2.15f-value*2;
00155                                 }*/
00156                                 
00157                                         //client.background=new Color(value,value,value);
00158                                 //all others control a visual scale
00159                                 VisScale.scaleIt(args[1], value, 1f, client.root);
00160                         }else if (cmd.equals("view2")){
00161                                 //harte Steuerung für Handschuh
00162                                 
00163                                 final float CONTROL=4;
00164                                 
00165                                 float nick=(Long.decode(args[3])-nickNeutral )/70f;
00166                                 float roll=(Long.decode(args[2])-rollNeutral)/70f;
00167                                 nickNeutral+=nick*0.01f; rollNeutral+=roll*0.01f;
00168                                 vp.dangle=vp.roll;
00169                                 vp.dforward=-(vp.elevation*100-30)*(float)Math.cos(vp.elevation);
00170                                 vp.dlift=(float)Math.sin(vp.elevation)*100;
00171                                 vp.delevation=(-roll-vp.elevation)* CONTROL;
00172                                 vp.droll=(-nick-vp.roll)* CONTROL;
00173                                 
00174                                 /*Floß usw. sensible, langsame Steuerung
00175                                  *
00176                                 final float CONTROL=2;
00177                                 float nick=(Long.decode(args[3])-nickNeutral )/20f;
00178                                 float roll=(Long.decode(args[2])-rollNeutral)/20f;
00179                                 nickNeutral+=nick*0.01f; rollNeutral+=roll*0.01f;
00180                                 System.out.println(nickNeutral+" "+rollNeutral);
00181                                 vp.dangle=vp.roll;
00182                                 //vp.dforward=(vp.elevation*100-30)*(float)Math.cos(vp.elevation);
00183                                 vp.dforward=(vp.elevation*100);//*(float)Math.cos(vp.elevation);
00184                                 //vp.dlift=(float)Math.sin(vp.elevation)*100;
00185                                 vp.delevation=(-nick-vp.elevation)*2;
00186                                 vp.droll=(-roll-vp.roll)*2;*/
00187                         }else if (cmd.equals("top") && args[1].equals("get") && args[2].equals("files")){
00188                                 //quick dirty handler for portramat
00189                                 // [top,get,files,faces/face195435415_426_568.jpg]
00190                         
00191                                 String path=args[3];
00192                                 if (!path.matches("http://"))
00193                                         path="http://vis.hfbk.net/"+path;
00194                                 
00195                         //      VisNode n=findNode(findNode(client.root,VisStructure.class),VisUeberwach.class);
00196                                 //((VisUeberwach)n).addPortrait(path, paket.getAddress().getHostAddress());
00197                                 client.panel.allesfresser.friss(path);
00198                         }
00199                                 
00200                 }catch(Throwable t){ //could happen often with wireless incoming 
00201                         if(Prefs.current.verbose) System.out.println("UdpListener parseMsg:"+t);
00202                 }
00203         }
00204         
00205         String script(String js){
00206                 Scripter engine=new VisClientScripter(client);
00207         
00208                 Object result;
00209                 
00210         try {
00211                         result = engine.evaluate(js);
00212                         if (result!=null)       return result.toString();
00213                         else                            return "(null)";
00214                 } catch (Exception e) {
00215                         return "Client Script Error: "+e;
00216                 }
00217                 
00218         }
00219 }

Generated on Tue Apr 7 17:57:20 2009 for visclient by  doxygen 1.5.1