예제 #1
0
    def poll(self):
        if self.serial_port.in_waiting > 0:
            self.pkt_buffer.extend(
                self.serial_port.read(self.serial_port.in_waiting))

        while True:
            if 0 in self.pkt_buffer:
                index = self.pkt_buffer.index(0)
                data = cobs.decode(self.pkt_buffer[0:index])
                del self.pkt_buffer[0:index + 1]

                if data is None or len(data) < 6:
                    self.rx_errs += 1
                    continue

                pkt = packet.parse(data)

                if pkt is not None:
                    if self.raw_log_callback:
                        self.raw_log_callback(0, data)
                    self.rx_pkts += 1
                    return pkt
                else:
                    self.rx_errs += 1

            else:
                return None
예제 #2
0
    def handle_packet(self, data):
        self._object_ref.bytes_received = self._object_ref.bytes_received + len(
            data) + 1
        try:
            decoded_packet = cobs.decode(data)
        except:
            self._object_ref.decode_error_count = self._object_ref.decode_error_count + 1
        else:
            # ce pa dobim korekten podatek, pogledam po seznamu handlerjev in klicem ustrezen callback
            length_of_packet = len(decoded_packet)
            # potegnem ven kodo
            code = decoded_packet[0:2]
            # in podatke
            packet_data = decoded_packet[2:length_of_packet - 2]

            code_and_data = decoded_packet[0:length_of_packet - 2]
            # in na koncu se CRC
            crc_received = int.from_bytes(decoded_packet[length_of_packet -
                                                         2:length_of_packet],
                                          byteorder='little')

            # sedaj naredim se CRC nad podatki in ukazom
            crc_of_data = CRC16(True).calculate(bytes(code_and_data))

            # ce sta CRC-ja enaka, potem nadaljujem, sicer pa kar odneham
            if crc_of_data == crc_received:
                # uspesno prejet paket
                self._object_ref.packets_received = self._object_ref.packets_received + 1
                # handlerji po novo
                try:
                    index = self._object_ref.rx_code_list.index(code)
                    callback = self._object_ref.rx_handler_list[index]
                    # poklicem handler
                    if packet_data == None:
                        callback.rx_handler()
                    else:
                        callback.rx_handler(packet_data)
                except:
                    self._object_ref.non_registered_packets_received = self._object_ref.non_registered_packets_received + 1
                    pass

            else:
                # povecam stevec CRC napak
                self._object_ref.crc_error_count = self._object_ref.crc_error_count + 1
                # ce je CRC handler registriran potem
                if self._object_ref.crc_handler_function != False:
                    # dam stevec na vrsto
                    self._object_ref.crc_data.put(
                        self._object_ref.crc_error_count)
                    # in preko signala klicem sistem
                    self._object_ref.crc_print_signal.emit()
예제 #3
0
 def receive(self):
     success = False
     packet = bytes()
     data = bytes()
     try:
         packet = self.oven.read_until(bytes([0x00]))
         # print('>', str(packet))
     except Exception as e:
         print(f'Error: Exception encountered on serial.read_until {e}.')
     if packet:
         data = cobs.decode(packet[:-1])
         # print('>', str(list(data)))
         success = True
     return success, data
예제 #4
0
 def decode(self, txt):
     if txt[-1] == '\x00':
         txt = txt[:-1]
     p = Packet()
     decoded = cobs.decode(txt)
     # print ''.join( [ "%02X " % ord( x ) for x in decoded ] ).strip()
     crc = self.checksum(decoded[0:-2])
     crc_check = uint16(decoded[-2:])
     if crc != crc_check:
         raise DecodeError("CRC mismatch")
     p.rtr = uint8(decoded[0]) & 0x40 != 0
     p.id = uint16(decoded[0:2]) & 0x7ff
     p.data = [uint8(x) for x in decoded[2:-2]]
     return p
예제 #5
0
 def decode(self, txt):
     if txt[-1] == '\x00':
         txt = txt[:-1]
     p = Packet()
     decoded = cobs.decode(txt)
     # print ''.join( [ "%02X " % ord( x ) for x in decoded ] ).strip()
     crc = self.checksum(decoded[0:-2])
     crc_check = uint16(decoded[-2:])
     if crc != crc_check:
         raise DecodeError("CRC mismatch")
     p.rtr = uint8(decoded[0]) & 0x40 != 0
     p.id = uint16(decoded[0:2]) & 0x7ff
     p.data = [uint8(x) for x in decoded[2:-2]]
     return p
예제 #6
0
 def read(self, addr):
     tx = bytearray(4)
     tx[0] = (addr & 0x3F0000) >> 16
     tx[1] = (addr & 0xFF00) >> 8
     tx[2] = addr & 0xFF
     tx[3] = 3
     self.dev.write(cobs.encode(tx))
     del tx
     self.dev.write(b'\x00')
     # expect 7 bytes back + 1 overhead + 1 framing
     rx = self.dev.read(9)
     pk = cobs.decode(rx[:8])
     val = pk[3]
     val |= (pk[4] << 8)
     val |= (pk[5] << 16)
     val |= (pk[6] << 24)
     del rx
     del pk
     return val
예제 #7
0
 def write(self, addr, val):
     tx = bytearray(7)
     tx[0] = (addr & 0x3F0000) >> 16
     tx[0] |= 0x80
     tx[1] = (addr & 0xFF00) >> 8
     tx[2] = addr & 0xFF
     tx[3] = val & 0xFF
     tx[4] = (val & 0xFF00) >> 8
     tx[5] = (val & 0xFF0000) >> 16
     tx[6] = (val & 0xFF000000) >> 24
     self.dev.write(cobs.encode(tx))
     del tx
     self.dev.write(b'\x00')
     # expect 4 bytes back + 1 overhead + 1 framing
     rx = self.dev.read(6)
     pk = cobs.decode(rx[:5])
     val = pk[3]
     del rx
     del pk
     return val
예제 #8
0
 def process(self, data):
     """
     process input data
     """
     data = buf_unpack(data)
     self._buf += data
     frames = []
     while self._idx < len(self._buf):
         if self._buf[self._idx] == 0:
             # recovered a frame
             self._idx += 1
             fr = self._buf[:self._idx]
             fr = cobs.decode(fr)
             fr = buf_pack(fr)
             frames.append(fr)
             # remove frame from input
             self._buf = self._buf[self._idx:]
             self._idx = 0
         else:
             self._idx += 1
     return frames
예제 #9
0
파일: packet.py 프로젝트: loligo/lps
 def _decode(self, in_bytes):
     decoded = cobs.decode(in_bytes)
     if self._checksum_ok(decoded):
         return map(ord, decoded[:-2])
     else:
         return None