Better packet len, confirmed that odd frequencies fail.
[goodfet] / client / GoodFET.py
index 468b091..5a0f78b 100755 (executable)
@@ -8,6 +8,8 @@
 import sys, time, string, cStringIO, struct, glob, serial, os;
 import sqlite3;
 
+fmt = ("B", "<H", None, "<L")
+
 def getClient(name="GoodFET"):
     import GoodFET, GoodFETCC, GoodFETAVR, GoodFETSPI, GoodFETMSP430;
     if(name=="GoodFET" or name=="monitor"): return GoodFET.GoodFET();
@@ -67,13 +69,16 @@ class GoodFET:
         return self.symbols.get(name);
     def timeout(self):
         print "timeout\n";
-    def serInit(self, port=None, timeout=None):
+    def serInit(self, port=None, timeout=2):
         """Open the serial port"""
+        # Make timeout None to wait forever, 0 for non-blocking mode.
         
         if port is None and os.environ.get("GOODFET")!=None:
             glob_list = glob.glob(os.environ.get("GOODFET"));
             if len(glob_list) > 0:
                 port = glob_list[0];
+            else:
+                port = os.environ.get("GOODFET");
         if port is None:
             glob_list = glob.glob("/dev/tty.usbserial*");
             if len(glob_list) > 0:
@@ -83,6 +88,7 @@ class GoodFET:
             if len(glob_list) > 0:
                 port = glob_list[0];
         
+        
         self.serialport = serial.Serial(
             port,
             #9600,
@@ -91,20 +97,25 @@ class GoodFET:
             timeout=timeout
             )
         
-        #Explicitly set RTS and DTR to halt board.
-        self.serialport.setRTS(1);
-        self.serialport.setDTR(1);
-        #Drop DTR, which is !RST, low to begin the app.
-        self.serialport.setDTR(0);
-        self.serialport.flushInput()
-        self.serialport.flushOutput()
+        self.verb=0;
+        attempts=0;
+        while self.verb!=0x7F:
+            self.serialport.flushInput()
+            self.serialport.flushOutput()
+            #Explicitly set RTS and DTR to halt board.
+            self.serialport.setRTS(1);
+            self.serialport.setDTR(1);
+            #Drop DTR, which is !RST, low to begin the app.
+            self.serialport.setDTR(0);
+            self.serialport.flushInput()
+            self.serialport.flushOutput()
+            #time.sleep(.1);
+            attempts=attempts+1;
+            self.readcmd(); #Read the first command.
+            
+        #print "Connected after %02i attempts." % attempts;
+        self.mon_connected();
         
-        #Read and handle the initial command.
-        #time.sleep(1);
-        self.readcmd(); #Read the first command.
-        if(self.verb!=0x7F):
-            print "Verb %02x is wrong.  Incorrect firmware?" % self.verb;
-        #print "Connected."
     def getbuffer(self,size=0x1c00):
         writecmd(0,0xC2,[size&0xFF,(size>>16)&0xFF]);
         print "Got %02x%02x buffer size." % (self.data[1],self.data[0]);
@@ -158,10 +169,12 @@ class GoodFET:
                     print "Rx: ( 0x%02x, 0x%02x, 0x%04x )" % ( self.app, self.verb, self.count )
             
                 #Debugging string; print, but wait.
-                if self.app==0xFF and self.verb==0xFF:
-                    print "# DEBUG %s" % self.serialport.read(self.count);
+                if self.app==0xFF:
+                    if self.verb==0xFF:
+                        print "# DEBUG %s" % self.serialport.read(self.count)
+                           elif self.verb==0xFE:
+                        print "# DEBUG 0x%x" % struct.unpack(fmt[self.count-1], self.serialport.read(self.count))[0]
                     sys.stdout.flush();
-                    return []
                 else:
                     self.data=self.serialport.read(self.count);
                     return self.data;
@@ -213,7 +226,9 @@ class GoodFET:
         self.besilent=s;
         print "besilent is %i" % self.besilent;
         self.writecmd(0,0xB0,1,[s]);
-        
+    def mon_connected(self):
+        """Announce to the monitor that the connection is good."""
+        self.writecmd(0,0xB1,0,[]);
     def out(self,byte):
         """Write a byte to P5OUT."""
         self.writecmd(0,0xA1,1,[byte]);
@@ -300,12 +315,13 @@ class GoodFET:
         """Self-test several functions through the monitor."""
         print "Performing monitor self-test.";
         
-        if self.peekword(0x0c00)!=0x0c04 and self.peekword(0x0c00)!=0x0c06:
-            print "ERROR Fetched wrong value from 0x0c04.";
-        self.pokebyte(0x0021,0); #Drop LED
-        if self.peekbyte(0x0021)!=0:
-            print "ERROR, P1OUT not cleared.";
-        self.pokebyte(0x0021,1); #Light LED
+        for f in range(0,30):
+            if self.peekword(0x0c00)!=0x0c04 and self.peekword(0x0c00)!=0x0c06:
+                print "ERROR Fetched wrong value from 0x0c04.";
+            self.pokebyte(0x0021,0); #Drop LED
+            if self.peekbyte(0x0021)!=0:
+                print "ERROR, P1OUT not cleared.";
+            self.pokebyte(0x0021,1); #Light LED
         
         print "Self-test complete.";