updates for ml410 board
[fleet.git] / src / edu / berkeley / fleet / fpga / Server.java
1 package edu.berkeley.fleet.fpga;
2
3 import java.io.*;
4 import java.net.*;
5 import java.util.*;
6
7 public class Server {
8
9     public static ServerSocket ss;
10     public static void main(String[] args) throws Exception {
11         ss = new ServerSocket(3133);
12         /*
13         new Listener(3).start();
14         new Listener(4).start();
15         new Listener(1).start();
16         new Listener(2).start();
17         */
18         new Listener(0).start();
19     }
20
21     public static String pass_string = "password=security_is_for_wimps ";
22
23     static class Listener extends Thread {
24         private int devnum;
25         public Listener(int devnum) { this.devnum = devnum; }
26         public void run() {
27             while(true) {
28                 try {
29                     Socket s = null;
30                     synchronized(Server.class) {
31                         System.err.println("thread " + devnum + " listening");
32                         s = ss.accept();
33                         System.err.println("connection");
34                     }
35                     new Handler(s, devnum).run();
36                 } catch (Exception e) { throw new RuntimeException(e); }
37                 try { Thread.sleep(1000); } catch (Exception e) { }
38             }
39         }
40     }
41
42     static class Handler extends Thread {
43         private Socket socket;
44         boolean closed = false;
45         private int devnum;
46         public Handler(Socket s, int devnum) { this.socket = s; this.devnum = devnum; }
47         public void run() {
48             RandomAccessFile raf = null;
49             FileInputStream fis = null;
50             try {
51                 final InputStream is = socket.getInputStream();
52                 byte[] buf = new byte[1024];
53                 StringBuffer sb = new StringBuffer();
54                 while(true) {
55                     int i = is.read();
56                     if (i==-1) return;
57                     if (((char)i)=='\n') break;
58                     sb.append((char)i);
59                 }
60                 System.err.println("login string: " + sb.toString());
61                 if (!sb.toString().startsWith(pass_string)) return;
62                 String file = sb.toString().substring(pass_string.length()).trim();
63
64                 System.err.println("programming...");
65                 Process proc = Runtime.getRuntime().exec(new String[] { "/afs/megacz.com/work/ml410/program.sh", "/afs/megacz.com/work/ml410/main.bit" });
66                 BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
67                 String s = null;
68                 while((s = br.readLine()) != null) {
69                     System.err.println("  " + s);
70                 }
71                 int ret = proc.waitFor();
72                 if (ret != 0) {
73                     System.err.println("programming error: " + ret);
74                     return;
75                 }
76                 /*
77                 System.err.println("programming...");
78                 ret = Runtime.getRuntime().exec(new String[] {
79                         "/usr/bin/user_program", ""+devnum, "/var/slipway/"+file }).waitFor();
80                 if (ret != 0) {
81                     System.err.println("programming error: " + ret);
82                    return;
83                 }
84                 */
85                 System.err.println("done programming.");
86                 try { Thread.sleep(2000); } catch(Exception e) { }
87                 final OutputStream os = socket.getOutputStream();
88                 System.err.println("sending instructions...");
89                 raf = new RandomAccessFile("/dev/ttyS"+devnum, "rw");
90
91
92                 final RandomAccessFile raf2 = raf;
93                 new Thread() {
94                     public void run() {
95                         FileOutputStream fos = null;
96                         try {
97                             fos = new FileOutputStream(raf2.getFD());
98                             byte[] buf = new byte[1024];
99                             while(true) {
100                                 int numread = is.read(buf, 0, buf.length);
101                                 if (numread == -1) break;
102                                 fos.write(buf, 0, numread);
103                                 fos.flush();
104                             }
105                         } catch (Exception e) { throw new RuntimeException(e);
106                         } finally {
107                             if (raf2 != null) {
108                                 System.err.println("closing...");
109                                 closed = true;
110                                 try { raf2.close(); } catch (Throwable t) { t.printStackTrace(); }
111                                 try { fos.close(); } catch (Throwable t) { t.printStackTrace(); }
112                             }
113                         }
114                     }
115                 }.start();
116
117                 System.err.println("reading back...");
118                 fis = new FileInputStream(raf.getFD());
119                 while(true) {
120                     long result = 0;
121                     int val = 0;
122                     for(int i=0; i<6; i++) {
123                         int k = 0;
124                         while(!closed && fis.available()==0) {
125                             if (closed) return;
126                             k++;
127                             if (k >= 100) {
128                                 System.err.println("sleep");
129                                 k = 0;
130                             }
131                             Thread.sleep(10);
132                         }
133                         if (closed) return;
134                         val = fis.read();
135                         if (val==-1) break;
136                         os.write((byte)val);
137                         os.flush();
138                         result |= ((long)val) << (i * 8);
139                     }
140                     if (val==-1) break;
141                     System.err.print(result);
142                     System.err.print(" 0x");
143                     System.err.print(Long.toString(result, 16));
144                     System.err.println();
145                 }
146                 System.err.println("done.");
147
148             } catch (Exception e) { throw new RuntimeException(e);
149             } finally {
150                 try {
151                     if (raf != null) {
152                         System.err.println("closing...");
153                         raf.close();
154                     }
155                     if (fis != null) fis.close();
156                 } catch (Throwable t) { t.printStackTrace(); }
157             }
158         }
159     }
160
161 }