diff --git a/raspberry-dataserver/CommsCommon.py b/raspberry-dataserver/CommsCommon.py index 3714ba08cff7801f6a824d5bed4b74ed9e63db34..40a6e2a855ee5aecea2671b0f0176672df6b75c9 100644 --- a/raspberry-dataserver/CommsCommon.py +++ b/raspberry-dataserver/CommsCommon.py @@ -46,6 +46,10 @@ class BaseFormat(): def getDict(self) -> Dict: return asdict(self) + + def getByteArray(self) -> bytearray: + self.toByteArray() + return self._byteArray # at the minute not generalised. needs to be overridden def fromByteArray(self, byteArray) -> None: diff --git a/raspberry-dataserver/CommsControl.py b/raspberry-dataserver/CommsControl.py index 04c1d4633972395be423bdb91cd1f76cded180e4..22c2ab9039acdb0a040bd26a7235630d134b7e96 100644 --- a/raspberry-dataserver/CommsControl.py +++ b/raspberry-dataserver/CommsControl.py @@ -41,8 +41,8 @@ class CommsControl(): self._timeLastTransmission = int(round(time.time() * 1000)) # packet counter checker - self._sequenceSend = 0 - self._sequenceReceive = 0 + self._sequence_send = 0 + self._sequence_receive = 0 # initialize of the multithreading self._lockSerial = threading.Lock() @@ -103,11 +103,11 @@ class CommsControl(): with self._dvlock: if len(queue) > 0: logging.debug(f'Queue length: {len(queue)}') - currentTime = int(round(time.time() * 1000)) - if currentTime > (self._timeLastTransmission + timeout): + current_time = int(round(time.time() * 1000)) + if current_time > (self._timeLastTransmission + timeout): with self._lockSerial: - self._timeLastTransmission = currentTime - queue[0].setSequenceSend(self._sequenceSend) + self._timeLastTransmission = current_time + queue[0].setSequenceSend(self._sequence_send) self.sendPacket(queue[0]) def getQueue(self, payload_type): @@ -150,11 +150,11 @@ class CommsControl(): tmp_comms = CommsFormat.commsFromBytes(decoded) if tmp_comms.compareCrc(): control = tmp_comms.getData()[tmp_comms.getControl()+1] - self._sequenceReceive = (tmp_comms.getData()[tmp_comms.getControl()] >> 1) & 0x7F + self._sequence_receive = (tmp_comms.getData()[tmp_comms.getControl()] >> 1) & 0x7F # get type of payload and corresponding queue payload_type = self.getInfoType(tmp_comms.getData()[tmp_comms.getAddress()]) - tmpQueue = self.getQueue(payload_type) + queue = self.getQueue(payload_type) # get type of packet ctrl_flag = control & 0x0F @@ -164,9 +164,9 @@ class CommsControl(): elif ctrl_flag == 0x01: logging.debug("Received ACK") # received ACK - self.finishPacket(tmpQueue) + self.finishPacket(queue) else: - sequenceReceive = ((control >> 1) & 0x7F) + 1 + sequence_receive = ((control >> 1) & 0x7F) + 1 address = tmp_comms.getData()[tmp_comms.getAddress():tmp_comms.getControl()] if self.receivePacket(payload_type, tmp_comms): @@ -175,7 +175,7 @@ class CommsControl(): else: logging.debug("Preparing NACK") comms_response = CommsFormat.CommsNACK(address = address) - comms_response.setSequenceReceive(sequenceReceive) + comms_response.setSequenceReceive(sequence_receive) self.sendPacket(comms_response) self._received.clear() @@ -192,8 +192,7 @@ class CommsControl(): elif payload_type == CommsCommon.PAYLOAD_TYPE.DATA: tmp_comms = CommsFormat.generateData(payload) else: - return False - tmp_comms.setInformation(payload) + return False with self._dvlock: queue = self.getQueue(payload_type) @@ -212,8 +211,8 @@ class CommsControl(): with self._dvlock: if len(queue) > 0: # 0x7F to deal with possible overflows (0 should follow after 127) - if ((queue[0].getSequenceSend() + 1) & 0x7F) == self._sequenceReceive: - self._sequenceSend = (self._sequenceSend + 1) % 128 + if ((queue[0].getSequenceSend() + 1) & 0x7F) == self._sequence_receive: + self._sequence_send = (self._sequence_send + 1) % 128 queue.popleft() except: logging.debug("Queue is probably empty") @@ -317,20 +316,11 @@ if __name__ == "__main__" : except: pass - comms_ctrl = CommsControl(port = port) - example = Dependant(comms_ctrl) + comms = CommsControl(port = port) + example = Dependant(comms) - payload_send = CommsCommon.CommandFormat(CommsCommon.CMD_TYPE.GENERAL.value, CommsCommon.CMD_GENERAL.START.value, param=0) - comms_ctrl.writePayload(payload_send) - -# commsCtrl.payloadrecv = "testpacket1" -# commsCtrl.payloadrecv = "testpacket2" - -# LEDs = [3,5,7] -# for _ in range(30): -# for led in LEDs: -# commsCtrl.registerData(led) -# time.sleep(5) - -# while True: -# time.sleep(60) \ No newline at end of file + cmd = CommsCommon.CommandFormat(cmd_type = CommsCommon.CMD_TYPE.GENERAL.value, cmd_code = CommsCommon.CMD_GENERAL.START.value, param=0) + time.sleep(4) + comms.writePayload(cmd) + print('sent cmd start') + print(cmd) \ No newline at end of file diff --git a/raspberry-dataserver/CommsFormat.py b/raspberry-dataserver/CommsFormat.py index cbff3509bf47efa24c50def0cab3c7380afce6c9..979ce4c46d147db67a743adff3d7682377947a52 100644 --- a/raspberry-dataserver/CommsFormat.py +++ b/raspberry-dataserver/CommsFormat.py @@ -12,32 +12,32 @@ def commsFromBytes(byteArray): return comms def generateAlarm(payload): - comms = CommsFormat(infoSize = payload.getSize(), address = 0xC0) - comms.setInformation(payload) + comms = CommsFormat(info_size = payload.getSize(), address = 0xC0) + comms.setInformation(payload.getByteArray()) return comms def generateCmd(payload): - comms = CommsFormat(infoSize = payload.getSize(), address = 0x80) - comms.setInformation(payload) + comms = CommsFormat(info_size = payload.getSize(), address = 0x80) + comms.setInformation(payload.getByteArray()) return comms def generateData(payload): - comms = CommsFormat(infoSize = payload.getSize(), address = 0x40) - comms.setInformation(payload) + comms = CommsFormat(info_size = payload.getSize(), address = 0x40) + comms.setInformation(payload.getByteArray()) return comms # basic format based on HDLC class CommsFormat: - def __init__(self, infoSize = 0, address = 0x00, control = [0x00, 0x00]): - self._data = bytearray(7 + infoSize) - self._infoSize = infoSize + def __init__(self, info_size = 0, address = 0x00, control = [0x00, 0x00]): + self._data = bytearray(7 + info_size) + self._info_size = info_size self._crc = None - self.assignBytes(self.getStart() , bytes([0x7E]) , calcCrc = False) - self.assignBytes(self.getAddress(), bytes([address]), calcCrc = False) - self.assignBytes(self.getControl(), bytes(control) , calcCrc = False) - self.assignBytes(self.getStop() , bytes([0x7E]) , calcCrc = False) + self.assignBytes(self.getStart() , bytes([0x7E]) , calc_crc = False) + self.assignBytes(self.getAddress(), bytes([address]), calc_crc = False) + self.assignBytes(self.getControl(), bytes(control) , calc_crc = False) + self.assignBytes(self.getStop() , bytes([0x7E]) , calc_crc = False) self.generateCrc() @@ -50,9 +50,9 @@ class CommsFormat: def getInformation(self): return 4 def getFcs(self): - return 4 + self._infoSize + return 4 + self._info_size def getStop(self): - return 4 + self._infoSize + 2 + return 4 + self._info_size + 2 def setAddress(self, address): self.assignBytes(self.getAddress(), bytes([address]), 1) @@ -60,9 +60,9 @@ class CommsFormat: def setControl(self, control): self.assignBytes(self.getControl(), bytes(control), 2) - def setInformation(self, payload): + def setInformation(self, bytes_array): # convert provided value - self.assignBytes(self.getInformation(), payload.byteArray) + self.assignBytes(self.getInformation(), bytes_array) def setSequenceSend(self, value): # sequence sent valid only for info frames (not supervisory ACK/NACK) @@ -84,17 +84,17 @@ class CommsFormat: def getSequenceReceive(self): return (self._data[self.getControl()] >> 1) & 0x7F - def assignBytes(self, start, values, calcCrc = True): + def assignBytes(self, start, values, calc_crc = True): for idx in range(len(values)): self._data[start + idx] = values[idx] - if calcCrc: + if calc_crc: self.generateCrc() # generate checksum def generateCrc(self, assign = True): self._crc = libscrc.x25(bytes(self._data[self.getAddress():self.getFcs()])).to_bytes(2, byteorder='little') if assign: - self.assignBytes(self.getFcs(), self._crc, calcCrc = False) + self.assignBytes(self.getFcs(), self._crc, calc_crc = False) def compareCrc(self): self.generateCrc(False) @@ -105,12 +105,12 @@ class CommsFormat: def getData(self): return self._data - def copyData(self, dataArray): - self.copyBytes(dataArray.to_bytes(self._infoSize, byteorder='little')) + def copyData(self, data_array): + self.copyBytes(data_array.to_bytes(self._info_size, byteorder='little')) - def copyBytes(self, bytesArray): - self._infoSize = len(bytesArray) - 7 - self._data = bytesArray + def copyBytes(self, bytes_array): + self._info_size = len(bytes_array) - 7 + self._data = bytes_array # ACK specific formating class CommsACK(CommsFormat):