from .IdiBusDefs import comFuncList from .IdiBusParse import IdiBusSMESParser from .IdiBusSerialLine import IdiBusSerialLine from .IdiBusMessage import * class IdiBusModule(): def __init__(self, addr, line:IdiBusSerialLine): self.addr = addr self.last_mmes_err = 0 if not isinstance(line, IdiBusSerialLine): raise TypeError("Line is not an IdiBusSerialLine") self.line = line def startLongOp(self): self.line.timeout = 3 def endLongOp(self): self.line.timeout = self.line.defaultTimeout def c_Init(self): return self._sendMMESG(comFuncList.IDIMMES_COM_C_Init.value, await_bytes=5) def c_Shutdown(self): return self._sendMMESG(comFuncList.IDIMMES_COM_C_ShtDown.value, await_bytes=5) def c_Dummy(self): return self._sendMMESG(comFuncList.IDIMMES_COM_C_Dummy.value, await_bytes=5) def c_GotoApp(self): return self._sendMMESG(comFuncList.IDIMMES_COM_C_GotoApp.value, await_bytes=5) def c_FmwBootloaderInfo(self): return self._sendMMESG(comFuncList.IDIMMES_COM_C_FmwBootloaderInfo.value, ) def c_EnterBootloader(self, moduleType, hwRev, SN): moduleType = bytearray(moduleType, 'ascii') hwRev = bytearray(hwRev, 'ascii') #hwRev[0]-=48 #hwRev[1]-=48 SN = bytearray(SN, 'ascii') devdata =bytearray() devdata.extend(moduleType) devdata.extend(hwRev) devdata.extend(SN) return self._sendMMESG(comFuncList.IDIMMES_COM_C_EnterBootloader.value, data=devdata, await_bytes=5) def c_ReadDevFullSN_MS(self): return self._sendMMESG(comFuncList.IDIMMES_COM_C_ReadDevFullSN_MS.value) def c_BootloaderStart(self, data): self.startLongOp() rcv = self._sendMMESG(comFuncList.IDIMMES_COM_C_FmwBootloaderStart.value, data=data, await_bytes=5) self.endLongOp() return rcv def c_BootloaderWrite(self, data): self.startLongOp() rcv = self._sendMMESG(comFuncList.IDIMMES_COM_C_FmwBootloaderWrite.value, data=data, await_bytes=5) self.endLongOp() return rcv def c_BootloaderEnd(self): self.startLongOp() rcv = self._sendMMESG(comFuncList.IDIMMES_COM_C_FmwBootloaderEnd.value, await_bytes=5) self.endLongOp() return rcv def _sendMMESG(self, func, data=None, await_bytes = 0): if not func in comFuncList.values(): self.last_mmes_err = "BadFunc" return 1 init_com = IdiBusMMESG( self.addr, IdiBusMMPS(IdiBusMMPS.typeMMESG).getValue(), func, ) #Append data if present if not data is None: init_com.addData(data) self.line.writeData(init_com.getMsg()) #Set max packet size if not specified if await_bytes == 0: await_bytes = self.line.maxPacketSize #read all data SMES = self.line.readData(await_bytes) #No response from slave if len(SMES) == 0: self.last_mmes_err = "NoResponse" return 1 if len(SMES) < 5 or len(SMES) > 270: self.last_mmes_err = "InvalidPacketSize" return 1 else: self.parser = IdiBusSMESParser(SMES) if self.parser.validate() == -1: self.last_mmes_err = "Corrupted" return 1 else: #Packet good return 0 def _sendMMES(self,msg:IdiBusMMES, await_bytes=0 ): #send it #print(f"raw message : {msg.getMsg().hex()}") self.line.writeData(msg.getMsg()) # read all data SMES = self.line.readData(await_bytes) #print(f"raw answer : {SMES.hex()}") # No response from slave if len(SMES) == 0: self.last_mmes_err = "NoResponse" return 1 if len(SMES) < 5 or len(SMES) > 270: self.last_mmes_err = "InvalidPacketSize" return 1 else: self.parser = IdiBusSMESParser(SMES) if self.parser.validate() == -1: self.last_mmes_err = "Corrupted" return 1 else: # Packet good self.last_mmes_err = self.parser.getErrcode() return 0 class IdiBusDevice(): def __init__(self, num): self.num = num self.errors = {} self.commands = {}