Edouard@0: import ctypes Edouard@0: from LPCProto import * Edouard@0: Edouard@0: LPC_STATUS={0xaa : "Started", Edouard@0: 0x55 : "Stopped"} Edouard@0: Edouard@0: class LPCAppProto(LPCProto): Edouard@0: def HandleTransaction(self, transaction): Edouard@0: try: Edouard@0: transaction.SetPseudoFile(self.serialPort) Edouard@0: # send command, wait ack (timeout) Edouard@0: transaction.SendCommand() Edouard@0: current_plc_status = transaction.GetCommandAck() Edouard@0: if current_plc_status is not None: Edouard@0: res = transaction.ExchangeData() Edouard@0: else: Edouard@0: raise LPCProtoError("controller did not answer as expected") Edouard@0: except Exception, e: Edouard@0: raise LPCProtoError("application mode transaction error : "+str(e)) Edouard@0: return LPC_STATUS.get(current_plc_status,"Broken"), res Edouard@0: Edouard@0: class LPCAppTransaction: Drauoude@29: def __init__(self, command): Edouard@0: self.Command = command Edouard@0: self.pseudofile = None Edouard@0: Edouard@0: def SetPseudoFile(self, pseudofile): Edouard@0: self.pseudofile = pseudofile Edouard@0: Edouard@0: def SendCommand(self): Edouard@0: # send command thread Edouard@0: self.pseudofile.write(chr(self.Command)) Edouard@0: Edouard@0: def GetCommandAck(self): Edouard@0: res = self.pseudofile.read(2) Edouard@0: if len(res) == 2: Edouard@0: comm_status, current_plc_status = map(ord, res) Edouard@0: else: Edouard@0: raise LPCProtoError("LPC transaction error - controller did not ack order") Edouard@0: # LPC returns command itself as an ack for command Edouard@0: if(comm_status == self.Command): Edouard@0: return current_plc_status Edouard@0: return None Edouard@0: Drauoude@29: def SendData(self, Data): Edouard@36: return self.pseudofile.write(Data) Edouard@0: Edouard@0: def GetData(self): Edouard@0: lengthstr = self.pseudofile.read(4) Edouard@0: # transform a byte string into length Edouard@36: length = ctypes.cast( Edouard@36: ctypes.c_char_p(lengthstr), Edouard@36: ctypes.POINTER(ctypes.c_uint32)).contents.value Edouard@0: return self.pseudofile.read(length) Edouard@0: Edouard@0: def ExchangeData(self): Edouard@0: pass Edouard@0: Edouard@0: class IDLETransaction(LPCAppTransaction): Edouard@0: def __init__(self): Edouard@0: LPCAppTransaction.__init__(self, 0x07) Edouard@0: ExchangeData = LPCAppTransaction.GetData Edouard@0: Edouard@0: class STARTTransaction(LPCAppTransaction): Edouard@0: def __init__(self): Edouard@0: LPCAppTransaction.__init__(self, 0x01) Edouard@0: Edouard@0: class STOPTransaction(LPCAppTransaction): Edouard@0: def __init__(self): Edouard@0: LPCAppTransaction.__init__(self, 0x02) Edouard@0: Edouard@0: class RESETTransaction(LPCAppTransaction): Edouard@0: def __init__(self): Edouard@0: LPCAppTransaction.__init__(self, 0x03) Edouard@0: Edouard@0: class SET_TRACE_VARIABLETransaction(LPCAppTransaction): Edouard@0: def __init__(self, data): Drauoude@29: LPCAppTransaction.__init__(self, 0x04) Edouard@36: length = len(data) Edouard@36: # transform length into a byte string Edouard@36: # we presuppose endianess of LPC same as PC Edouard@36: lengthstr = ctypes.string_at(ctypes.pointer(ctypes.c_uint32(length)),4) Edouard@36: self.Data = lengthstr + data Edouard@36: Drauoude@29: def ExchangeData(self): Drauoude@29: self.SendData(self.Data) Edouard@0: Edouard@0: class GET_TRACE_VARIABLETransaction(LPCAppTransaction): Edouard@0: def __init__(self): Edouard@0: LPCAppTransaction.__init__(self, 0x05) Edouard@0: ExchangeData = LPCAppTransaction.GetData Edouard@0: Edouard@0: class GET_PLCIDTransaction(LPCAppTransaction): Edouard@0: def __init__(self): Edouard@0: LPCAppTransaction.__init__(self, 0x07) Edouard@0: ExchangeData = LPCAppTransaction.GetData Edouard@0: Drauoude@29: class GET_LOGCOUNTSTransaction(LPCAppTransaction): Drauoude@29: def __init__(self): Drauoude@29: LPCAppTransaction.__init__(self, 0x0B) Drauoude@29: ExchangeData = LPCAppTransaction.GetData Drauoude@29: Drauoude@29: class GET_LOGMSGTransaction(LPCAppTransaction): Drauoude@29: def __init__(self,level,msgid): Drauoude@29: LPCAppTransaction.__init__(self, 0x0C) Drauoude@29: msgidstr = ctypes.string_at(ctypes.pointer(ctypes.c_int(msgid)),4) Drauoude@29: self.Data = chr(level)+msgidstr Drauoude@29: Drauoude@29: def ExchangeData(self): Drauoude@29: self.SendData(self.Data) Drauoude@29: return self.GetData() Drauoude@29: Laurent@47: class RESET_LOGCOUNTSTransaction(LPCAppTransaction): Laurent@47: def __init__(self): Laurent@47: LPCAppTransaction.__init__(self, 0x0D) Laurent@47: ExchangeData = LPCAppTransaction.GetData Laurent@47: Edouard@0: if __name__ == "__main__": Edouard@0: __builtins__.BMZ_DBG = True Edouard@0: TestConnection = LPCAppProto(6,115200,2) Edouard@0: # TestConnection.HandleTransaction(GET_PLCIDTransaction()) Edouard@0: TestConnection.HandleTransaction(STARTTransaction()) Edouard@0: # TestConnection.HandleTransaction(SET_TRACE_VARIABLETransaction( Edouard@0: # "\x03\x00\x00\x00"*200)) Edouard@0: # TestConnection.HandleTransaction(STARTTransaction()) Edouard@0: while True: Edouard@0: TestConnection.HandleTransaction(SET_TRACE_VARIABLETransaction( Edouard@0: "\x01\x00\x00\x00"+ Edouard@0: "\x04"+ Edouard@0: "\x01\x02\x02\x04"+ Edouard@0: "\x01\x00\x00\x00"+ Edouard@0: "\x08"+ Edouard@0: "\x01\x02\x02\x04"+ Edouard@0: "\x01\x02\x02\x04"+ Edouard@0: "\x01\x00\x00\x00"+ Edouard@0: "\x04"+ Edouard@0: "\x01\x02\x02\x04")) Edouard@0: #status,res = TestConnection.HandleTransaction(GET_TRACE_VARIABLETransaction()) Edouard@0: #print len(res) Edouard@0: #print "GOT : ", map(hex, map(ord, res)) Edouard@0: #TestConnection.HandleTransaction(STOPTransaction())