diff --git a/python/biopro/device/device_cc2650.py b/python/biopro/device/device_cc2650.py index 976b6b1..0558d94 100644 --- a/python/biopro/device/device_cc2650.py +++ b/python/biopro/device/device_cc2650.py @@ -2186,6 +2186,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized): pack_len = connect_response[0] connect_ack = connect_response[1:pack_len+1] + print('connect_ack:', connect_ack) if pack_len == 1: if connect_ack[0] == 3: connected = True @@ -2205,6 +2206,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized): dont_care = 0 self._device = ret = CC2650Device(device_id=dont_care, master=self, response_info=response) self.log_verbose('[CC2650]', DEVICE_CONNECTED, address_s) + sleep(2) return ret self.log_verbose('[CC2650]', 'connect fail') @@ -2273,34 +2275,45 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized): ins.append(0xF1) self._interface.flush_input() - try: - self.log_verbose('[CC2650]', 'write_characteristic', device, str(hex(handle).upper())) - self.log_verbose('[CC2650]', 'write_characteristic att_write','0x'+str.upper(ins.hex())) - self._cc2650.send("bytes", bytes(ins)) - - except SerialTimeoutException: - self.log_verbose('[CC2650]', 'write_characteristic send fail') - - else: + for _ in range(5): try: - write_response = self._cc2650.recv_uart(0.5) + self.log_verbose('[CC2650]', 'write_characteristic', device, str(hex(handle).upper())) + self.log_verbose('[CC2650]', 'write_characteristic att_write','0x'+str.upper(ins.hex())) + self._cc2650.send("bytes", bytes(ins)) + + except SerialTimeoutException: + self.log_verbose('[CC2650]', 'write_characteristic send fail') - except RecvTimeout: - self.log_verbose('[CC2650]', 'write_characteristic response timeout') + else: + try: + write_response = self._cc2650.recv_uart(0.1) + + except RecvTimeout: + self.log_verbose('[CC2650]', 'write_characteristic response timeout, write retry') + continue + else: + pack_len = write_response[0] + write_ack = write_response[1:pack_len+1] + write_response_hex = ''.join(format(i, '02X') for i in write_response) + if write_ack == [255]: + self.log_verbose('[CC2650]', 'write_characteristic fail, write retry', '0x'+write_response_hex) + continue + else: + break if write_response is None: + self.log_verbose('[CC2650]', 'write_characteristic fail') return False pack_len = write_response[0] write_ack = write_response[1:pack_len+1] - + write_response_hex = ''.join(format(i, '02X') for i in write_response) if write_ack == [3]: - write_response_hex = ''.join(format(i, '02X') for i in write_response) self.log_verbose('[CC2650]', 'write_characteristic success', '0x'+write_response_hex) return True - - self.log_verbose('[CC2650]', 'write_characteristic fail') - return False + else: + self.log_verbose('[CC2650]', 'write_characteristic fail', '0x'+write_response_hex) + return False @synchronized def read_characteristic(self, device: int, handle: int) -> Optional[bytes]: @@ -2323,7 +2336,7 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized): else: try: - read_response = self._cc2650.recv_uart(1) + read_response = self._cc2650.recv_uart(0.5) except RecvTimeout: self.log_verbose('[CC2650]', 'read_characteristic response timeout') diff --git a/python/biopro/devlib/device.py b/python/biopro/devlib/device.py index 30b6f48..a759663 100644 --- a/python/biopro/devlib/device.py +++ b/python/biopro/devlib/device.py @@ -734,7 +734,7 @@ class DeviceCommonInstruction: # don't create DeviceCommonInstruction instance, just return tuple def __new__(cls, instruction: str) -> Optional[Tuple[str, ...]]: if instruction == cls.RESET: - return '_sync(False)', '_notify(False)', 'VIS_RST' + return '_sync(False)', 'VIS_RST' elif instruction == cls.START: return '_data_format("TDC4VAF2")', '_notify(True)', 'VIS_STI', '_sync(True)' elif instruction == cls.INTERRUPT: diff --git a/python/biopro/devlib/instruction.py b/python/biopro/devlib/instruction.py index 81e199e..840b346 100644 --- a/python/biopro/devlib/instruction.py +++ b/python/biopro/devlib/instruction.py @@ -794,6 +794,7 @@ class InstructionDataContent(InstructionContent): offset += 1 else: + buffer.extend([0]*(self._width.size-len(buffer))) for i in range(self._width.size): if self._width.little_endian: value |= (buffer[offset] << (1 * i))