Exchange is now explicit; every command must return something.
[goodfet] / client / goodfet
index 7e93f6a..78171b7 100755 (executable)
@@ -29,41 +29,37 @@ class Client:
         self.serialport.flushOutput()
         
         #Read and handle the initial command.
-        client.readcmd();
-        client.handlecmd();
-        
         time.sleep(1);
+        client.readcmd(); #Read the first command.
+        if(self.verb!=0x7F):
+            print "Verb is wrong.  Incorrect firmware?";
+        
+        
     def writecmd(self, app, verb, count, data):
+        """Write a command and some data to the GoodFET."""
         self.serialport.write(chr(app));
         self.serialport.write(chr(verb));
         self.serialport.write(chr(count));
         #print "count=%02x, len(data)=%04x" % (count,len(data));
-        for d in data:
-            self.serialport.write(chr(d));
+        if count!=0:
+            for d in data:
+                self.serialport.write(chr(d));
+        self.readcmd();  #Uncomment this later, to ensure a response.
     def readcmd(self):
+        """Read a reply from the GoodFET."""
         self.app=ord(self.serialport.read(1));
         self.verb=ord(self.serialport.read(1));
         self.count=ord(self.serialport.read(1));
         if self.count>0:
             self.data=self.serialport.read(self.count);
         #print "%02x %02x %02x" % (self.app, self.verb, self.count);
-    def handlemonitor(self):
-        if self.verb==0x7E:
-            print "Monitor: NOK";
-        if self.verb==0x7F:
-            print "Monitor: OK";
-    def handlecmd(self):
-        if self.app==0:
-            #print "Monitor command."
-            self.handlemonitor();
-        else:
-            print "Unknown application %02x." % self.app
     
+    #Monitor stuff
     def peekbyte(self,address):
         """Read a byte of memory from the monitor."""
         self.data=[address&0xff,address>>8];
         self.writecmd(0,0x02,2,self.data);
-        self.readcmd();
+        #self.readcmd();
         return ord(self.data[0]);
     def peekword(self,address):
         """Read a word of memory from the monitor."""
@@ -72,8 +68,6 @@ class Client:
         """Set a byte of memory by the monitor."""
         self.data=[address&0xff,address>>8,value];
         self.writecmd(0,0x03,3,self.data);
-        self.readcmd();
-        #print "POKE returned %02x" % ord(self.data[0]);
         return ord(self.data[0]);
     
     def monitortest(self):
@@ -88,11 +82,28 @@ class Client:
         self.pokebyte(0x0021,1); #Light LED
         
         print "Self-test complete.";
+    
+    def spisetup(self):
+        """Moved the FET into the SPI application."""
+        print "Initializing SPI.";
+        self.writecmd(1,0x10,0,self.data); #SPI/SETUP
+        #self.readcmd();
+    def spitrans8(self,byte):
+        """Read and write 8 bits by SPI."""
+        self.data=[byte];
+        self.writecmd(1,0,1,self.data);    #SPI exchange
+        #self.readcmd();
+        
+        if self.app!=1 or self.verb!=0:
+            print "Error in SPI transaction; app=%02x, verb=%02x" % (self.app, self.verb);
+        return ord(self.data[0]);
 
 client=Client();
 client.serInit("/dev/ttyUSB0")
 
-
-
 client.monitortest();
 
+client.spisetup();
+while 1:
+    print "%02x" % client.spitrans8(5);
+    time.sleep(0.1);