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