LPCconnector/LPCAppProto.py
changeset 0 51f5a3138405
child 29 86fb7dc2b54e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPCconnector/LPCAppProto.py	Sun May 20 11:29:35 2012 +0200
@@ -0,0 +1,121 @@
+import ctypes
+from LPCProto import *
+
+LPC_STATUS={0xaa : "Started",
+            0x55 : "Stopped"}
+
+class LPCAppProto(LPCProto):
+    def HandleTransaction(self, transaction):
+        self.TransactionLock.acquire()
+        try:
+            transaction.SetPseudoFile(self.serialPort)
+            # send command, wait ack (timeout)
+            transaction.SendCommand()
+            current_plc_status = transaction.GetCommandAck()
+            if current_plc_status is not None:
+                res = transaction.ExchangeData()
+            else:
+                raise LPCProtoError("controller did not answer as expected")
+        except Exception, e:
+            raise LPCProtoError("application mode transaction error : "+str(e))
+        finally:
+            self.TransactionLock.release()
+        return LPC_STATUS.get(current_plc_status,"Broken"), res
+    
+class LPCAppTransaction:
+    def __init__(self, command, optdata = ""):
+        self.Command = command
+        self.OptData = optdata
+        self.pseudofile = None
+        
+    def SetPseudoFile(self, pseudofile):
+        self.pseudofile = pseudofile
+        
+    def SendCommand(self):
+        # send command thread
+        self.pseudofile.write(chr(self.Command))
+        
+    def GetCommandAck(self):
+        res = self.pseudofile.read(2)
+        if len(res) == 2:
+            comm_status, current_plc_status = map(ord, res)
+        else:
+            raise LPCProtoError("LPC transaction error - controller did not ack order")
+        # LPC returns command itself as an ack for command
+        if(comm_status == self.Command):
+            return current_plc_status
+        return None 
+        
+    def SendData(self):
+        length = len(self.OptData)
+        # transform length into a byte string
+        # we presuppose endianess of LPC same as PC
+        lengthstr = ctypes.string_at(ctypes.pointer(ctypes.c_int(length)),4)
+        buffer = lengthstr + self.OptData
+        return self.pseudofile.write(buffer)
+
+    def GetData(self):
+        lengthstr = self.pseudofile.read(4)
+        # transform a byte string into length 
+        length = ctypes.cast(ctypes.c_char_p(lengthstr), ctypes.POINTER(ctypes.c_int)).contents.value
+        return self.pseudofile.read(length)
+
+    def ExchangeData(self): 
+        pass
+
+class IDLETransaction(LPCAppTransaction):
+    def __init__(self):
+        LPCAppTransaction.__init__(self, 0x07)
+    ExchangeData = LPCAppTransaction.GetData
+
+class STARTTransaction(LPCAppTransaction):
+    def __init__(self):
+        LPCAppTransaction.__init__(self, 0x01)
+    
+class STOPTransaction(LPCAppTransaction):
+    def __init__(self):
+        LPCAppTransaction.__init__(self, 0x02)
+
+class RESETTransaction(LPCAppTransaction):
+    def __init__(self):
+        LPCAppTransaction.__init__(self, 0x03)
+
+class SET_TRACE_VARIABLETransaction(LPCAppTransaction):
+    def __init__(self, data):
+        LPCAppTransaction.__init__(self, 0x04, data)
+    ExchangeData = LPCAppTransaction.SendData
+
+class GET_TRACE_VARIABLETransaction(LPCAppTransaction):
+    def __init__(self):
+        LPCAppTransaction.__init__(self, 0x05)
+    ExchangeData = LPCAppTransaction.GetData
+
+class GET_PLCIDTransaction(LPCAppTransaction):
+    def __init__(self):
+        LPCAppTransaction.__init__(self, 0x07)
+    ExchangeData = LPCAppTransaction.GetData
+
+if __name__ == "__main__":
+    __builtins__.BMZ_DBG = True
+    TestConnection = LPCAppProto(6,115200,2)
+#    TestConnection.HandleTransaction(GET_PLCIDTransaction())
+    TestConnection.HandleTransaction(STARTTransaction())
+#    TestConnection.HandleTransaction(SET_TRACE_VARIABLETransaction(
+#           "\x03\x00\x00\x00"*200))
+#    TestConnection.HandleTransaction(STARTTransaction())
+    while True:
+        TestConnection.HandleTransaction(SET_TRACE_VARIABLETransaction(
+           "\x01\x00\x00\x00"+
+           "\x04"+
+           "\x01\x02\x02\x04"+
+           "\x01\x00\x00\x00"+
+           "\x08"+
+           "\x01\x02\x02\x04"+
+           "\x01\x02\x02\x04"+
+           "\x01\x00\x00\x00"+
+           "\x04"+
+           "\x01\x02\x02\x04"))
+    #status,res = TestConnection.HandleTransaction(GET_TRACE_VARIABLETransaction())
+    #print len(res)
+    #print "GOT : ", map(hex, map(ord, res))
+    #TestConnection.HandleTransaction(STOPTransaction())