Ugly Python client.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Wed, 3 Jun 2009 17:50:12 +0000 (17:50 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Wed, 3 Jun 2009 17:50:12 +0000 (17:50 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@23 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/goodfet [new file with mode: 0755]

diff --git a/client/goodfet b/client/goodfet
new file mode 100755 (executable)
index 0000000..1552475
--- /dev/null
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+# GoodFET Client Application
+# 
+# (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
+#
+# This code is ugly as sin, for bootstrapping the firmware only.
+# Rewrite cleanly as soon as is convenient.
+
+import sys, time, string, cStringIO, struct
+sys.path.append("/usr/lib/tinyos")
+import serial
+
+
+class Client:
+    def __init__(self, *args, **kargs):
+        print "inited\n";
+    def timeout(self):
+        print "timout\n";
+    def serInit(self, port):
+        """Open the serial port"""
+        self.serialport = serial.Serial(
+            port,
+            9600,
+            parity = serial.PARITY_NONE
+            )
+        #Drop DTR, which is !RST, low to begin the app.
+        self.serialport.setDTR(0);
+        self.serialport.flushInput()
+        self.serialport.flushOutput()
+        
+        #Read and handle the initial command.
+        client.readcmd();
+        client.handlecmd();
+        
+        time.sleep(1);
+    def writecmd(self, app, verb, count, data):
+        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));
+    def readcmd(self):
+        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
+    
+    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();
+        return ord(self.data[0]);
+    def peekword(self,address):
+        """Read a word of memory from the monitor."""
+        return self.peekbyte(address)+(self.peekbyte(address+1)<<8);
+    def pokebyte(self,address,value):
+        """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):
+        """Self-test several functions through the monitor."""
+        print "Performing self-test.";
+        
+        if self.peekword(0x0c00)!=0x0c04:
+            print "ERROR Fetched wrong value from 0x0c04.";
+        self.pokebyte(0x0021,0); #Drop LED
+        if self.peekbyte(0x0021)!=0:
+            print "ERROR, P1OUT not cleared.";
+        
+        print "Self-test complete.";
+
+client=Client();
+client.serInit("/dev/ttyUSB0")
+
+
+
+client.monitortest();
+