def _rbytes2str(data): if isinstance(data, tuple): data = list(data) return tuple(_rbytes2str(b) for b in data) elif isinstance(data, bytes): return bytes2str(data) else: return data
def _send_command(self, command, **params): # Page 38-39 parameters = [] for param, value in sorted(params.items()): if isinstance(value, Decimal): value = ('%.03f' % value).replace('.', ',') elif isinstance(value, bytes): value = '"%s"' % bytes2str(value) elif isinstance(value, str): value = '"%s"' % value elif isinstance(value, bool): if value is False: value = 'f' elif value is True: value = 't' elif isinstance(value, datetime.date): value = value.strftime('#%d/%m/%y#') parameters.append('%s=%s' % (param, value)) reply = self.writeline("%d;%s;%s;" % (self._command_id, command, ' '.join(parameters))) if reply[0] != '{': # This happened once after the first command issued after # the power returned, it should probably be handled gracefully raise AssertionError(repr(reply)) # Page 39 sections = reply[1:].split(';') if len(sections) != 4: raise AssertionError retdict = self._parse_return_value(sections[2]) errorcode = int(sections[1]) if errorcode != 0: errordesc = retdict['Circunstancia'] try: exception = self.errors_dict[errorcode] except KeyError: raise DriverError(errordesc, errorcode) raise exception(errordesc, errorcode) return retdict
def _create_packet(self, command): """ Create a 'pre-package' (command + params, basically) and involves it around STX, NB and CS:: 1 2 n 2 +-----+------+-----------------+----+ | STX | NB | 0x1C + command | CS | +-----+------+-----------------+----+ Where: STX: 'Transmission Start' indicator byte NB: 2 bytes, big endian length of command + CS (2 bytes) CS: 2 bytes, big endian checksum for command """ command = chr(self.CMD_PROTO) + command packet = struct.pack('<bH%dsH' % len(command), STX, len(command) + 2, str2bytes(command), sum([ord(i) for i in command])) return bytes2str(packet)
def _create_packet(self, command): """ Create a 'pre-package' (command + params, basically) and involves it around STX, NB and CS:: 1 2 n 2 +-----+------+-----------------+----+ | STX | NB | 0x1C + command | CS | +-----+------+-----------------+----+ Where: STX: 'Transmission Start' indicator byte NB: 2 bytes, big endian length of command + CS (2 bytes) CS: 2 bytes, big endian checksum for command """ command = chr(self.CMD_PROTO) + command packet = struct.pack( '<bH%dsH' % len(command), STX, len(command) + 2, str2bytes(command), sum([ord(i) for i in command])) return bytes2str(packet)
def read(self, n_bytes): # stoqdrivers is expecting str but pyserial will reply with bytes data = self._port.read(n_bytes) return bytes2str(data)