re-arrange some code in Server.java
[fleet.git] / src / edu / berkeley / fleet / fpga / Server.java
1 package edu.berkeley.fleet.fpga;
2
3 import gnu.io.*;
4 import java.io.*;
5 import java.net.*;
6 import java.util.*;
7
8 public class Server {
9
10     static long jarFileTime = 0;
11     static long bitFileTime = 0;
12     static {
13         try {
14             jarFileTime = new File("fleet.jar").lastModified();
15             bitFileTime = new File("build/fpga/main.bit").lastModified();
16         } catch (Exception e) { throw new RuntimeException(e); }
17     }
18
19     public static ServerSocket ss;
20     public static void main(String[] args) throws Exception {
21         System.err.println("programming...");
22         Process proc = Runtime.getRuntime().exec(new String[] {
23                 "misc/program.sh",
24                 "build/fpga/main.bit"
25             });
26         BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
27         String str = null;
28         while((str = br.readLine()) != null) {
29             System.err.println("  " + str);
30         }
31         int ret = proc.waitFor();
32         if (ret != 0) {
33             System.err.println("programming error: " + ret);
34             return;
35         }
36         System.err.println("done programming.");
37         new Thread() {
38             public void run() {
39                 try {
40                     while(true) {
41                         Thread.sleep(500);
42                         if (jarFileTime != new File("fleet.jar").lastModified()) {
43                             System.err.println("jarfile modified; exiting...");
44                             System.exit(0);
45                         }
46                         if (bitFileTime != new File("build/fpga/main.bit").lastModified()) {
47                             System.err.println("bitfile modified; exiting...");
48                             System.exit(0);
49                         }
50                     }
51                 } catch (Exception e) { throw new RuntimeException(e); }
52             }
53         }.start();
54         ss = new ServerSocket(3133);
55         while(true) {
56             try {
57                 Socket s = ss.accept();
58                 new Handler(s).start();
59             } catch (Exception e) {
60                 e.printStackTrace();
61             }
62         }
63     }
64
65     public static String pass_string = "password=security_is_for_wimps ";
66
67     static class Handler extends Thread {
68         private Socket socket;
69         boolean closed = false;
70         private SerialPort sp;
71         public Handler(Socket s) { this.socket = s; this.sp = sp; }
72         public void run() {
73             synchronized(Server.class) {
74                 try {
75                     this.sp = new RXTXPort("/dev/ttyS0");
76                     sp.setInputBufferSize(0);
77                     sp.setOutputBufferSize(0);
78                     sp.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
79                     sp.setFlowControlMode(sp.FLOWCONTROL_RTSCTS_IN | sp.FLOWCONTROL_RTSCTS_OUT);
80                     try {
81                         _run();
82                     } finally {
83                         sp.close();
84                     }
85                 } catch (Exception e) { throw new RuntimeException(e); }
86             }
87         }
88         public void _run() {
89             try {
90                 final InputStream is = socket.getInputStream();
91                 byte[] buf = new byte[1024];
92                 StringBuffer sb = new StringBuffer();
93                 while(true) {
94                     int i = is.read();
95                     if (i==-1) return;
96                     if (((char)i)=='\n') break;
97                     sb.append((char)i);
98                 }
99                 System.err.println("login string: " + sb.toString());
100                 if (!sb.toString().startsWith(pass_string)) return;
101
102                 //try { Thread.sleep(500); } catch(Exception e) { }
103                 final OutputStream os = socket.getOutputStream();
104
105                 System.out.println("sending breaks");
106                 for(int i=0; i<2; i++) {
107                     sp.sendBreak(100);
108                     Thread.sleep(100);
109                 }
110                 System.out.println("done sending breaks");
111
112                 final OutputStream fos = sp.getOutputStream();
113                 final InputStream fis = sp.getInputStream();
114
115                 System.err.println("sending instructions...");
116                 new Thread() {
117                     public void run() {
118                         try {
119                             byte[] buf = new byte[1024];
120                             while(true) {
121                                 int numread = is.read(buf, 0, buf.length);
122                                 if (numread == -1) break;
123                                 fos.write(buf, 0, numread);
124                                 fos.flush();
125                             }
126                         } catch (Exception e) { throw new RuntimeException(e);
127                         } finally {
128                             System.err.println("closing...");
129                             closed = true;
130                             try { fos.close(); } catch (Throwable t) { t.printStackTrace(); }
131                         }
132                     }
133                 }.start();
134
135                 /*
136                 int last = 0;
137                 for(int j=0; j<3; j++)
138                     while(true) {
139                         int i = fis.read();
140                         if (i==-1) return;
141                         System.out.println("leader byte: 0x" + Integer.toString(i, 16) + " '"+((char)i)+"'");
142                         if (((char)last) == 'o' && ((char)i) == 'k') break;
143                         last = i;
144                     }
145                 */
146
147                 System.err.println("reading back...");
148                 while(true) {
149                     long result = 0;
150                     int val = 0;
151                     for(int i=0; i<6; i++) {
152                         int k = 0;
153                         while(!closed && fis.available()==0) {
154                             if (closed) return;
155                             k++;
156                             if (k >= 100) {
157                                 System.err.println("sleep");
158                                 k = 0;
159                             }
160                             Thread.sleep(10);
161                         }
162                         if (closed) return;
163                         val = fis.read();
164                         if (val==-1) break;
165                         System.err.println("byte: 0x"+Integer.toString(val & 0xff, 16));
166                         os.write((byte)val);
167                         os.flush();
168                         result |= ((long)val) << (i * 8);
169                     }
170                     if (val==-1) break;
171                     System.err.print(result);
172                     System.err.print(" 0x");
173                     System.err.print(Long.toString(result, 16));
174                     System.err.println();
175                 }
176                 System.err.println("done.");
177
178             } catch (Exception e) { throw new RuntimeException(e);
179             } finally {
180                 try {
181                     System.err.println("closing...");
182                     /*
183                     fis.close();
184                     if (fis != null) fis.close();
185                     */
186                 } catch (Throwable t) { t.printStackTrace(); }
187             }
188         }
189     }
190
191 }