rework Server.java; much faster now
[fleet.git] / src / edu / berkeley / fleet / fpga / Server.java
index 39a7132..4312787 100644 (file)
@@ -4,6 +4,7 @@ import gnu.io.*;
 import java.io.*;
 import java.net.*;
 import java.util.*;
+import java.util.concurrent.Semaphore;
 
 // FIXME: accept connections, but stall, during programming
 public class Server {
@@ -93,6 +94,11 @@ public class Server {
         public void _run() {
             try {
                 final InputStream is = new BufferedInputStream(socket.getInputStream());
+                final OutputStream os = socket.getOutputStream();
+                final OutputStream fos = sp.getOutputStream();
+                final InputStream fis = new BufferedInputStream(sp.getInputStream());
+
+                // read login string
                 byte[] buf = new byte[1024];
                 StringBuffer sb = new StringBuffer();
                 while(true) {
@@ -103,13 +109,6 @@ public class Server {
                 }
                 System.err.println("login string: " + sb.toString());
                 if (!sb.toString().startsWith(pass_string)) return;
-                final OutputStream os = new BufferedOutputStream(socket.getOutputStream());
-                System.err.println("sending breaks...");
-                sp.sendBreak(100);
-
-                final OutputStream fos = sp.getOutputStream();
-                final InputStream fis = new BufferedInputStream(sp.getInputStream());
-                sign = false;
 
                 System.err.println("sending instructions...");
                 new Thread() {
@@ -118,14 +117,14 @@ public class Server {
                             while(true) {
                                 int r = is.read();
                                 if (r == -1) break;
-                                fos.write(r);
-                                if (!sign) {
-                                    fos.flush();
-                                    Thread.sleep(100);
-                                    sign = true;
+                                synchronized(fos) {
+                                    fos.write(r);
+                                    if (is.available()==0) fos.flush();
                                 }
                             }
-                            fos.flush();
+                            synchronized(fos) {
+                                fos.flush();
+                            }
                         } catch (Exception e) { throw new RuntimeException(e);
                         } finally {
                             System.err.println("closing...");
@@ -135,40 +134,26 @@ public class Server {
                     }
                 }.start();
 
-
                 System.err.println("reading back...");
                 while(true) {
-                    long result = 0;
                     int val = 0;
-                    boolean hit=false;
                     for(int i=0; i<6; i++) {
                         int k = 0;
-                        while(!closed && fis.available()==0) {
+                        while (fis.available()==0) {
                             if (closed) return;
-                            k++;
-                            if (k >= 100) {
-                                System.err.println("sleep");
-                                k = 0;
-                            }
-                            if (k==10) os.flush();
                             Thread.sleep(10);
                         }
-                        if (closed) { os.flush(); return; }
                         val = fis.read();
-                        if (!sign) {
-                            System.err.println("leader byte: 0x" + Integer.toString(val, 16) + " '"+((char)val)+"'");
-                            continue;
-                        }
                         if (val==-1) break;
+                        if ((val & (3<<6)) == 0) {
+                            synchronized(fos) {
+                                fos.write( (1<<6) | 1);
+                            }
+                        }
                         System.err.println("byte: 0x"+Integer.toString(val & 0xff, 16));
                         os.write((byte)val);
-                        result |= ((long)val) << (i * 8);
                     }
                     if (val==-1) break;
-                    System.err.print(result);
-                    System.err.print(" 0x");
-                    System.err.print(Long.toString(result, 16));
-                    System.err.println();
                 }
                 os.flush();
                 System.err.println("done.");
@@ -177,10 +162,6 @@ public class Server {
             } finally {
                 try {
                     System.err.println("closing...");
-                    /*
-                    fis.close();
-                    if (fis != null) fis.close();
-                    */
                 } catch (Throwable t) { t.printStackTrace(); }
             }
         }