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);
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);
00062 start();
00063 }
00064
00065 public void run() {
00066 while (true) {
00067 try {
00068 socket.receive(paket);
00069
00070
00071
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")) {
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) {
00093
00094
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
00122
00123 void parseMsg(String msg){
00124 try{
00125
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
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
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 VisScale.scaleIt(args[1], value, 1f, client.root);
00160 }else if (cmd.equals("view2")){
00161
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
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 }else if (cmd.equals("top") && args[1].equals("get") && args[2].equals("files")){
00188
00189
00190
00191 String path=args[3];
00192 if (!path.matches("http://"))
00193 path="http://vis.hfbk.net/"+path;
00194
00195
00196
00197 client.panel.allesfresser.friss(path);
00198 }
00199
00200 }catch(Throwable t){
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 }