master clear works (at least for memory ship)
[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     public static ServerSocket ss;
11     public static void main(String[] args) throws Exception {
12         System.err.println("programming...");
13         Process proc = Runtime.getRuntime().exec(new String[] {
14                 "/afs/megacz.com/work/ml410/program.sh",
15                 "/afs/megacz.com/work/ml410/main.bit"
16             });
17         BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
18         String str = null;
19         while((str = br.readLine()) != null) {
20             System.err.println("  " + str);
21         }
22         int ret = proc.waitFor();
23         if (ret != 0) {
24             System.err.println("programming error: " + ret);
25             return;
26         }
27         System.err.println("done programming.");
28         ss = new ServerSocket(3133);
29         while(true) {
30             try {
31                 Socket s = ss.accept();
32                 new Handler(s).start();
33             } catch (Exception e) {
34                 e.printStackTrace();
35             }
36         }
37     }
38
39     public static String pass_string = "password=security_is_for_wimps ";
40
41     static class Handler extends Thread {
42         private Socket socket;
43         boolean closed = false;
44         private SerialPort sp;
45         public Handler(Socket s) { this.socket = s; this.sp = sp; }
46         public void run() {
47             synchronized(Server.class) {
48                 try {
49                     this.sp = new RXTXPort("/dev/ttyS0");
50                     sp.sendBreak(500);
51                     try {
52                         _run();
53                     } finally {
54                         sp.close();
55                     }
56                 } catch (Exception e) { throw new RuntimeException(e); }
57             }
58         }
59         public void _run() {
60             try {
61                 final InputStream is = socket.getInputStream();
62                 byte[] buf = new byte[1024];
63                 StringBuffer sb = new StringBuffer();
64                 while(true) {
65                     int i = is.read();
66                     if (i==-1) return;
67                     if (((char)i)=='\n') break;
68                     sb.append((char)i);
69                 }
70                 System.err.println("login string: " + sb.toString());
71                 if (!sb.toString().startsWith(pass_string)) return;
72
73                 //try { Thread.sleep(2000); } catch(Exception e) { }
74                 final OutputStream os = socket.getOutputStream();
75                 System.err.println("sending instructions...");
76
77                 sp.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
78                 sp.setFlowControlMode(sp.FLOWCONTROL_RTSCTS_IN | sp.FLOWCONTROL_RTSCTS_OUT);
79                 final OutputStream fos = sp.getOutputStream();
80                 final InputStream fis = sp.getInputStream();
81
82                 new Thread() {
83                     public void run() {
84                         try {
85                             byte[] buf = new byte[1024];
86                             while(true) {
87                                 int numread = is.read(buf, 0, buf.length);
88                                 if (numread == -1) break;
89                                 fos.write(buf, 0, numread);
90                                 fos.flush();
91                             }
92                         } catch (Exception e) { throw new RuntimeException(e);
93                         } finally {
94                             System.err.println("closing...");
95                             closed = true;
96                             try { fos.close(); } catch (Throwable t) { t.printStackTrace(); }
97                         }
98                     }
99                 }.start();
100
101                 System.err.println("reading back...");
102                 while(true) {
103                     long result = 0;
104                     int val = 0;
105                     for(int i=0; i<6; i++) {
106                         int k = 0;
107                         while(!closed && fis.available()==0) {
108                             if (closed) return;
109                             k++;
110                             if (k >= 100) {
111                                 System.err.println("sleep");
112                                 k = 0;
113                             }
114                             Thread.sleep(10);
115                         }
116                         if (closed) return;
117                         val = fis.read();
118                         if (val==-1) break;
119                         System.err.println("byte: 0x"+Integer.toString(val & 0xff, 16));
120                         os.write((byte)val);
121                         os.flush();
122                         result |= ((long)val) << (i * 8);
123                     }
124                     if (val==-1) break;
125                     System.err.print(result);
126                     System.err.print(" 0x");
127                     System.err.print(Long.toString(result, 16));
128                     System.err.println();
129                 }
130                 System.err.println("done.");
131
132             } catch (Exception e) { throw new RuntimeException(e);
133             } finally {
134                 try {
135                     System.err.println("closing...");
136                     /*
137                     fis.close();
138                     if (fis != null) fis.close();
139                     */
140                 } catch (Throwable t) { t.printStackTrace(); }
141             }
142         }
143     }
144
145 }