from threading import Lock
LPC_STATUS=dict(STARTED = 0x01,
class LPCError(exceptions.Exception):
return "LPC communication error ! " + str(self.msg)
def __init__(self, port, rate, timeout):
self.TransactionLock = Lock()
# self.serialPort = serial.Serial( port, rate, timeout = timeout )
self._serialPort = serial.Serial( port, rate, timeout = timeout )
res = self._serialPort.read(cnt)
print "Recv :", map(hex,map(ord,res))
print "Send :", map(hex,map(ord,str))
self._serialPort.write(str)
self.serialPort = myser()
self.HandleTransaction(IDLETransaction())
def HandleTransaction(self, transaction):
self.TransactionLock.acquire()
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()
raise LPCError("LPC transaction error - controller did not answer as expected")
self.TransactionLock.release()
return current_plc_status, res
def __init__(self, command, optdata = ""):
def SetPseudoFile(self, pseudofile):
self.pseudofile = pseudofile
self.pseudofile.write(chr(self.Command))
res = self.pseudofile.read(2)
comm_status, current_plc_status = map(ord, res)
raise LPCError("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
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)
self.pseudofile.write(lengthstr + self.OptData)
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)
class IDLETransaction(LPCTransaction):
LPCTransaction.__init__(self, 0x00)
class STARTTransaction(LPCTransaction):
LPCTransaction.__init__(self, 0x01)
class STOPTransaction(LPCTransaction):
LPCTransaction.__init__(self, 0x02)
class SET_TRACE_VARIABLETransaction(LPCTransaction):
def __init__(self, data):
LPCTransaction.__init__(self, 0x04, data)
ExchangeData = LPCTransaction.SendData
class GET_TRACE_VARIABLETransaction(LPCTransaction):
LPCTransaction.__init__(self, 0x05)
ExchangeData = LPCTransaction.GetData
class SET_FORCED_VARIABLETransaction(LPCTransaction):
def __init__(self, data):
LPCTransaction.__init__(self, 0x06, data)
ExchangeData = LPCTransaction.SendData
class GET_PLCIDTransaction(LPCTransaction):
LPCTransaction.__init__(self, 0x07)
ExchangeData = LPCTransaction.GetData
if __name__ == "__main__":
TestConnection = LPCProto(6,115200,2)
#TestConnection.HandleTransaction(GET_PLCIDTransaction())
TestConnection.HandleTransaction(STARTTransaction())
TestConnection.HandleTransaction(SET_TRACE_VARIABLETransaction(
TestConnection.HandleTransaction(STARTTransaction())
TestConnection.HandleTransaction(SET_TRACE_VARIABLETransaction(
#print map(hex,map(ord,TestConnection.HandleTransaction(GET_TRACE_VARIABLETransaction())))
#TestConnection.HandleTransaction(STOPTransaction())