def update(self, message): if len(message) != 16: self.logger.warning("The received message is not 16 bytes long") return #self.logger.debug("Decoded message: %s"%str(list(message))) p = Packet.fromMessage(message) if p.cmd == ord('S'): 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': 'master', 'origin_type': DoorLogic.Origin.CONTROL_PANNEL, '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': 'master', 'origin_type': DoorLogic.Origin.CONTROL_PANNEL, 'input_name': self.buttons[pin], 'input_type': DoorLogic.Input.BUTTON, 'input_value': False }) self.pressed_buttons &= ~pin self.logger.info('Master state: %s' % self.get_state())
def update(self, message): if len(message) != 16: self.logger.warning("The received message is not 16 bytes long") return message = self.aes.decrypt([ord(x) for x in message], self.key, AES.keySize["SIZE_128"]) message = "".join([chr(x) for x in message]) self.logger.debug("Decoded message: %s" % str(list(message))) p = Packet.fromMessage(message) if p.cmd == 83: self.supply_voltage = ord(p.data[3]) * 0.1 pressed_buttons = ord(p.data[0]) self.logger.debug("master: pressed_buttons = %d", pressed_buttons) if pressed_buttons & 0x01 and not self.pressed_buttons & 0x01: self.pressed_buttons |= 0x01 self.command_queue.put("lock") elif not pressed_buttons & 0x01: self.pressed_buttons &= ~0x01 if pressed_buttons & 0x02 and not self.pressed_buttons & 0x02: self.pressed_buttons |= 0x02 self.command_queue.put("toggle_announce") elif not pressed_buttons & 0x02: self.pressed_buttons &= ~0x02 if pressed_buttons & 0x04 and not self.pressed_buttons & 0x04: self.pressed_buttons |= 0x04 elif not pressed_buttons & 0x04: self.pressed_buttons &= ~0x04 self.logger.info("Master state: %s" % self.get_state())
def update(self, message): if len(message) != 16: self.logger.warning("The received message is not 16 bytes long") return message = self.aes.decrypt([ord(x) for x in message], self.key, AES.keySize["SIZE_128"]) message = ''.join([chr(x) for x in message]) self.logger.debug("Decoded message: %s"%str(list(message))) p = Packet.fromMessage(message) if p.cmd==83: self.supply_voltage = ord(p.data[3])*0.1 pressed_buttons = ord(p.data[0]) self.logger.debug('master: pressed_buttons = %d', pressed_buttons) if pressed_buttons & 0x01 and not self.pressed_buttons & 0x01: self.pressed_buttons |= 0x01 self.command_queue.put('lock') elif not pressed_buttons & 0x01: self.pressed_buttons &= ~0x01 if pressed_buttons & 0x02 and not self.pressed_buttons & 0x02: self.pressed_buttons |= 0x02 self.command_queue.put('toggle_announce') elif not pressed_buttons & 0x02: self.pressed_buttons &= ~0x02 if pressed_buttons & 0x04 and not self.pressed_buttons & 0x04: self.pressed_buttons |= 0x04 elif not pressed_buttons & 0x04: self.pressed_buttons &= ~0x04 self.logger.info('Master state: %s'%self.get_state())
def update(self, message): if len(message) != 16: self.logger.warning("The received message is not 16 bytes long") return # self.logger.debug("Decoded message: %s"%str(list(message))) p = Packet.fromMessage(message) if p.cmd == ord("S"): 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": "master", "origin_type": DoorLogic.Origin.CONTROL_PANNEL, "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": "master", "origin_type": DoorLogic.Origin.CONTROL_PANNEL, "input_name": self.buttons[pin], "input_type": DoorLogic.Input.BUTTON, "input_value": False, } ) self.pressed_buttons &= ~pin self.logger.info("Master state: %s" % self.get_state())
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 update(self, message): if len(message) != 16: self.logger.warning("The received message is not 16 bytes long") return message = self.aes.decrypt([ord(x) for x in message], self.key, AES.keySize["SIZE_128"]) message = ''.join([chr(x) for x in message]) self.logger.debug("Decoded message: %s"%str(list(message))) p = Packet.fromMessage(message) if p.cmd==83: self.supply_voltage = ord(p.data[3])*0.1 ''' pressed_buttons = 0 if self.buttons_toggle_state == None: self.buttons_toggle_state = ord(p.data[0]) else: pressed_buttons = self.buttons_toggle_state ^ ord(p.data[0]) self.buttons_toggle_state = ord(p.data[0]) if pressed_buttons: self.logger.info('Got pressed buttons: %d' % pressed_buttons) if pressed_buttons & 0x01: ''' pressed_buttons = ord(p.data[0]) if pressed_buttons & 0x01 and not self.pressed_buttons & 0x01: self.pressed_buttons |= 0x01 if self.desired_state == Door.LOCK_LOCKED: self.desired_state = Door.LOCK_UNLOCKED elif self.desired_state == Door.LOCK_UNLOCKED: self.desired_state = Door.LOCK_LOCKED elif not pressed_buttons & 0x01: self.pressed_buttons &= ~0x01 doorstate = ord(p.data[1]) state = '' 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.perm_unlocked = doorstate & Door.LOCK_PERM_UNLOCKED \ == Door.LOCK_PERM_UNLOCKED self.logger.info('Door state: %s'%self.get_state()) self.logger.info('Desired door state: %s'%self.get_desired_state()) elif p.cmd==ord('A'): accepted = ord(p.data[0]) == 1 if not self.command_accepted: if accepted: self.logger.info('Command at %d was accepted'%self.command_time) self.command_accepted = True else: self.logger.warning('Command at %d was NOT accepted'% self.command_time)
def update(self, message): if len(message) != 16: self.logger.warning("The received message is not 16 bytes long") return message = self.aes.decrypt([ord(x) for x in message], self.key, AES.keySize["SIZE_128"]) message = ''.join([chr(x) for x in message]) self.logger.debug("Decoded message: %s" % str(list(message))) p = Packet.fromMessage(message) if p.cmd == 83: self.supply_voltage = ord(p.data[3]) * 0.1 ''' pressed_buttons = 0 if self.buttons_toggle_state == None: self.buttons_toggle_state = ord(p.data[0]) else: pressed_buttons = self.buttons_toggle_state ^ ord(p.data[0]) self.buttons_toggle_state = ord(p.data[0]) if pressed_buttons: self.logger.info('Got pressed buttons: %d' % pressed_buttons) if pressed_buttons & 0x01: ''' pressed_buttons = ord(p.data[0]) if pressed_buttons & 0x01 and not self.pressed_buttons & 0x01: self.pressed_buttons |= 0x01 if self.desired_state == Door.LOCK_LOCKED: self.desired_state = Door.LOCK_UNLOCKED elif self.desired_state == Door.LOCK_UNLOCKED: self.desired_state = Door.LOCK_LOCKED elif not pressed_buttons & 0x01: self.pressed_buttons &= ~0x01 doorstate = ord(p.data[1]) state = '' 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.perm_unlocked = doorstate & Door.LOCK_PERM_UNLOCKED \ == Door.LOCK_PERM_UNLOCKED self.logger.info('Door state: %s' % self.get_state()) self.logger.info('Desired door state: %s' % self.get_desired_state()) elif p.cmd == ord('A'): accepted = ord(p.data[0]) == 1 if not self.command_accepted: if accepted: self.logger.info('Command at %d was accepted' % self.command_time) self.command_accepted = True else: self.logger.warning('Command at %d was NOT accepted' % self.command_time)
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