You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
4.3 KiB

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 = {}