def _send_command(self, command, data): p = Packet(seq=self.txseq, cmd=command, data=data) self.logger.debug("Msg to mastercontroller: %s" % list(p.toMessage())) msg = self.aes.encrypt([ord(x) for x in p.toMessage()], self.key, AES.keySize["SIZE_128"]) msg = "".join([chr(x) for x in msg]) self.interface.writeMessage(self.address, msg)
def _send_command(self, command, data): p = Packet(seq=self.tx_seq, cmd=command, data=data, seq_sync=False) msg = p.toMessage(key = self.key) self.logger.debug('%s Msg to door: %s'%(self.name, list(p.toMessage()))) self.interface.writeMessage(self.priority, self.address, msg, self.tx_msg_queue) self.tx_seq += 1
def _send_command(self, command, data): p = Packet(seq=self.txseq, cmd=command, data=data) self.logger.debug('Msg to mastercontroller: %s'%list(p.toMessage())) msg = self.aes.encrypt([ord(x) for x in p.toMessage()], self.key, AES.keySize["SIZE_128"]) msg = ''.join([chr(x) for x in msg]) self.interface.writeMessage(self.address, msg)
def _send_command(self, command, data): p = Packet(seq=self.txseq, cmd=command, data=data) msg = self.aes.encrypt([ord(x) for x in p.toMessage()], self.key, AES.keySize["SIZE_128"]) msg = ''.join([chr(x) for x in msg]) self.logger.debug('Msg to door %s: %s'%(self.name, list(p.toMessage()))) self.interface.writeMessage(self.address, msg) '''
def _send_command(self, command, data): p = Packet(seq=0, cmd=command, data=data, seq_sync=False) msg = p.toMessage() self.logger.debug('Msg to mastercontroller: %s' % list(msg)) self.interface.writeMessage(self.priority, self.address, msg, self.tx_msg_queue)
def update(self, message): if len(message) != 16: self.logger.warning( "%s: The received message is not 16 bytes long" % (self.name)) return False p = Packet.fromMessage(message, key=self.key) if p == None: self.logger.debug("%s: Decoded packet was invalid" % self.name) self._set_bad_key(True) return False self._set_bad_key(False) if p.seq_sync: self.logger.debug("%s: Sync packet with seq: %d" % (self.name, p.seq)) # This message contains a synchronization message for our # tx sequence number. self.tx_seq = p.seq return False if not p.seq >= self.min_rx_seq: self.logger.debug("%s: Seq %d not ok. Sending seq update to %d." % (self.name, p.seq, self.min_rx_seq)) self._set_wrong_rx_seq(True) # The door sent a sequence number which is too low. # Inform it about what we expect. p = Packet(seq=self.min_rx_seq, cmd=0, data='', seq_sync=True) msg = p.toMessage(key=self.key) self.logger.debug('%s: Msg to door: %s' % (self.name, list(p.toMessage()))) self.interface.writeMessage(self.priority, self.address, msg, self.tx_msg_queue) return False self._set_wrong_rx_seq(False) if p.seq >= self.persisted_min_rx_seq: self.persisted_min_rx_seq = p.seq + self.min_rx_seq_leap self.write_rx_sequence_number_to_container( self.persisted_min_rx_seq) self.min_rx_seq = p.seq + 1 if p.cmd == ord('S'): self.status_update_timestamp = time.time() self.supply_voltage = ord(p.data[3]) * 0.1 pressed_buttons = ord(p.data[0]) self.logger.debug('master: pressed_buttons = %d' % pressed_buttons) for pin in self.buttons: if pressed_buttons & pin and not self.pressed_buttons & pin: self.pressed_buttons |= pin self.input_queue.put({ 'origin_name': self.name, 'origin_type': DoorLogic.Origin.DOOR, 'input_name': self.buttons[pin], 'input_type': DoorLogic.Input.BUTTON, 'input_value': True }) elif not pressed_buttons & pin and self.pressed_buttons & pin: self.input_queue.put({ 'origin_name': self.name, 'origin_type': DoorLogic.Origin.DOOR, 'input_name': self.buttons[pin], 'input_type': DoorLogic.Input.BUTTON, 'input_value': False }) self.pressed_buttons &= ~pin doorstate = ord(p.data[1]) self.closed = doorstate & Door.DOOR_CLOSED \ == Door.DOOR_CLOSED self.locked = doorstate & Door.LOCK_LOCKED \ == Door.LOCK_LOCKED self.unlocked = doorstate & Door.LOCK_UNLOCKED \ == Door.LOCK_UNLOCKED self.locking = doorstate & Door.LOCK_LOCKING \ == Door.LOCK_LOCKING self.unlocking = doorstate & Door.LOCK_UNLOCKING \ == Door.LOCK_UNLOCKING self.handle_pressed = doorstate & Door.HANDLE_PRESSED \ == Door.HANDLE_PRESSED self.manual_unlocked = doorstate & Door.LOCK_MANUAL_UNLOCKED \ == Door.LOCK_MANUAL_UNLOCKED self.logger.info('%s: Door state: %s' % (self.name, self.get_state())) self.logger.info('%s: Desired door state: %s' % (self.name, self.get_desired_state())) if self._old_state != p.data: self._old_state = p.data self.notify_state_listeners() return True
def _send_command(self, command, data): p = Packet(seq=0, cmd=command, data=data, seq_sync=False) msg = p.toMessage() self.logger.debug("Msg to mastercontroller: %s" % list(msg)) self.interface.writeMessage(self.priority, self.address, msg, self.tx_msg_queue)
def update(self, message): if len(message) != 16: self.logger.warning("%s: The received message is not 16 bytes long"%(self.name)) return False p = Packet.fromMessage(message, key = self.key) if p == None: self.logger.debug("%s: Decoded packet was invalid" % self.name) self._set_bad_key(True) return False self._set_bad_key(False) if p.seq_sync: self.logger.debug("%s: Sync packet with seq: %d" % (self.name, p.seq)) # This message contains a synchronization message for our # tx sequence number. self.tx_seq = p.seq return False if not p.seq >= self.min_rx_seq: self.logger.debug("%s: Seq %d not ok. Sending seq update to %d." % (self.name, p.seq, self.min_rx_seq)) self._set_wrong_rx_seq(True) # The door sent a sequence number which is too low. # Inform it about what we expect. p = Packet(seq=self.min_rx_seq, cmd=0, data='', seq_sync=True) msg = p.toMessage(key = self.key) self.logger.debug('%s: Msg to door: %s' % (self.name, list(p.toMessage()))) self.interface.writeMessage(self.priority, self.address, msg, self.tx_msg_queue) return False self._set_wrong_rx_seq(False) if p.seq >= self.persisted_min_rx_seq: self.persisted_min_rx_seq = p.seq + self.min_rx_seq_leap self.write_rx_sequence_number_to_container(self.persisted_min_rx_seq) self.min_rx_seq = p.seq + 1 if p.cmd == ord('S'): self.status_update_timestamp = time.time() self.supply_voltage = ord(p.data[3])*0.1 pressed_buttons = ord(p.data[0]) self.logger.debug('master: pressed_buttons = %d' % pressed_buttons) for pin in self.buttons: if pressed_buttons & pin and not self.pressed_buttons & pin: self.pressed_buttons |= pin self.input_queue.put({'origin_name': self.name, 'origin_type': DoorLogic.Origin.DOOR, 'input_name': self.buttons[pin], 'input_type': DoorLogic.Input.BUTTON, 'input_value': True}) elif not pressed_buttons & pin and self.pressed_buttons & pin: self.input_queue.put({'origin_name': self.name, 'origin_type': DoorLogic.Origin.DOOR, 'input_name': self.buttons[pin], 'input_type': DoorLogic.Input.BUTTON, 'input_value': False}) self.pressed_buttons &= ~pin doorstate = ord(p.data[1]) self.closed = doorstate & Door.DOOR_CLOSED \ == Door.DOOR_CLOSED self.locked = doorstate & Door.LOCK_LOCKED \ == Door.LOCK_LOCKED self.unlocked = doorstate & Door.LOCK_UNLOCKED \ == Door.LOCK_UNLOCKED self.locking = doorstate & Door.LOCK_LOCKING \ == Door.LOCK_LOCKING self.unlocking = doorstate & Door.LOCK_UNLOCKING \ == Door.LOCK_UNLOCKING self.handle_pressed = doorstate & Door.HANDLE_PRESSED \ == Door.HANDLE_PRESSED self.manual_unlocked = doorstate & Door.LOCK_MANUAL_UNLOCKED \ == Door.LOCK_MANUAL_UNLOCKED self.logger.info('%s: Door state: %s'%(self.name, self.get_state())) self.logger.info('%s: Desired door state: %s'%(self.name, self.get_desired_state())) if self._old_state != p.data: self._old_state = p.data self.notify_state_listeners() return True