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