def loop(receive_time=1): """Handle receive processing""" radio.receiver(fsk=True) timeout = time.time() + receive_time handled = False while True: if radio.is_receive_waiting(): payload = radio.receive_cbp() now = time.time() try: msg = OpenThings.decode(payload, receive_timestamp=now) hdr = msg["header"] mfr_id = hdr["mfrid"] product_id = hdr["productid"] device_id = hdr["sensorid"] address = (mfr_id, product_id, device_id) registry.fsk_router.incoming_message(address, msg) handled = True except OpenThings.OpenThingsException: print("Can't decode payload:%s" % payload) now = time.time() if now > timeout: break return handled
def receive(self, radio_config=None): # -> (radio_measurements, address or None, payload or None) # radio_params is an overlay on top of radio rx defaults (e.g. poll rate, timeout, min payload, max payload) # radio_measurements might include rssi reading, short payload report, etc pass # TODO #TODO: set radio to receive mode #TODO: merge radio_params with self.tx_defaults #TODO: configure radio modulation based on merged params #TODO: poll radio at rate until timeout or received #TODO: start timeout timer payload = None radio.receiver(fsk=True) while True: # timer not expired if radio.is_receive_waiting(): payload = radio.receive() #TODO: payload, radio_measurements = radio.receive() now = time.time() p = OpenThings.decode(payload, receive_timestamp=now) #TODO: if crc failure, report it, but keep trying #if crc check passes... break #TODO: inter-try delay #TODO: return radio to state it was before receiver (e.g. standby) - radio needs a pop() on this too? if payload == None: # nothing received in timeout return (None, None, None) # (radio_measurements, address, payload) #TODO: might be measurements, average min max? #TODO: extract addresses: header_manufacturerid, header_productid header_deviceid -> (m, p, d) m, p, d = None, None, None radio_measurements = None #TODO: get from radio.receive() address = (m, p, d) return (radio_measurements, address, payload)
def receive(self, radio_config=None): # -> (radio_measurements, address or None, payload or None) # radio_params is an overlay on top of radio rx defaults (e.g. poll rate, timeout, min payload, max payload) # radio_measurements might include rssi reading, short payload report, etc #TODO: merge radio_params with self.tx_defaults #TODO: configure radio modulation based on merged params #TODO: poll radio at rate until timeout or received #TODO: start timeout timer payload = None radio.receiver(ook=True) while True: # timer not expired if radio.is_receive_waiting(): #TODO: radio config should set receive preamble 4 bytes to prevent false triggers payload = radio.receive(size=12) #TODO: payload, radio_measurements = radio.receive() p = TwoBit.decode(payload) #TODO: if failure, report it, but keep trying #if check passes... break #TODO: inter-try delay #TODO: return radio to state it was before receiver (e.g. standby) - radio needs a pop() on this too? if payload == None: # nothing received in timeout return (None, None, None) # (radio_measurements, address, payload) #TODO: might be measurements, average min max? #TODO: extract addresses (house_address, device_index) radio_measurements = None #TODO: return this from radio.receive() h = 0xC8C8C #TODO: Get house address from TwoBit.decode()[:10] d = 0xEE #TODO: Get device command from TwoBit.decode()[11:12] address = (h, d) return (radio_measurements, address, payload)
def loop(receive_time=1): radio.receiver(fsk=True) timeout = time.time() + receive_time handled = False while True: if radio.is_receive_waiting(): payload = radio.receive_cbp() now = time.time() try: msg = OpenThings.decode(payload, receive_timestamp=now) hdr = msg["header"] mfr_id = hdr["mfrid"] product_id = hdr["productid"] device_id = hdr["sensorid"] address = (mfr_id, product_id, device_id) msg_list = msg["recs"] handled = True except OpenThings.OpenThingsException: pass # print("Can't decode payload:%s" % payload) now = time.time() if now > timeout: break # print("handled: {handled}".format(handled=handled)) if handled: return msg_list else: return handled
def send(self, payload, radio_config=None, encoded=False): # payload is a pydict suitable for OpenThings # radio_params is an overlay on top of radio tx defaults if encoded: p = payload else: p = OpenThings.encode(payload) # Set radio defaults, if no override outer_times = self.tx_defaults.outer_times outer_delay = self.tx_defaults.outer_delay inner_times = self.tx_defaults.inner_times # Merge any wanted radio params, if provided if radio_config != None: try: outer_times = radio_config.outer_times except AttributeError: pass try: outer_delay = radio_config.outer_delay except AttributeError: pass try: inner_times = radio_config.inner_times except AttributeError: pass radio.transmitter(fsk=True) ##print("inner times %s" % inner_times) radio.transmit(p, outer_times=outer_times, inner_times=inner_times, outer_delay=outer_delay) if encoded: payload = OpenThings.decode(p) radio.receiver(fsk=True)
def receive(self, radio_config=None ): # -> (radio_measurements, address or None, payload or None) # radio_params is an overlay on top of radio rx defaults (e.g. poll rate, timeout, min payload, max payload) # radio_measurements might include rssi reading, short payload report, etc pass # TODO #TODO: set radio to receive mode #TODO: merge radio_params with self.tx_defaults #TODO: configure radio modulation based on merged params #TODO: poll radio at rate until timeout or received #TODO: start timeout timer payload = None radio.receiver(fsk=True) while True: # timer not expired if radio.is_receive_waiting(): payload = radio.receive( ) #TODO: payload, radio_measurements = radio.receive() now = time.time() p = OpenThings.decode(payload, receive_timestamp=now) #TODO: if crc failure, report it, but keep trying #if crc check passes... break #TODO: inter-try delay #TODO: return radio to state it was before receiver (e.g. standby) - radio needs a pop() on this too? if payload == None: # nothing received in timeout return ( None, None, None ) # (radio_measurements, address, payload) #TODO: might be measurements, average min max? #TODO: extract addresses: header_manufacturerid, header_productid header_deviceid -> (m, p, d) m, p, d = None, None, None radio_measurements = None #TODO: get from radio.receive() address = (m, p, d) return (radio_measurements, address, payload)
def receive(self, radio_config=None ): # -> (radio_measurements, address or None, payload or None) # radio_params is an overlay on top of radio rx defaults (e.g. poll rate, timeout, min payload, max payload) # radio_measurements might include rssi reading, short payload report, etc #TODO: merge radio_params with self.tx_defaults #TODO: configure radio modulation based on merged params #TODO: poll radio at rate until timeout or received #TODO: start timeout timer payload = None radio.receiver(ook=True) while True: # timer not expired if radio.is_receive_waiting(): #TODO: radio config should set receive preamble 4 bytes to prevent false triggers payload = radio.receive( size=12 ) #TODO: payload, radio_measurements = radio.receive() p = TwoBit.decode(payload) #TODO: if failure, report it, but keep trying #if check passes... break #TODO: inter-try delay #TODO: return radio to state it was before receiver (e.g. standby) - radio needs a pop() on this too? if payload == None: # nothing received in timeout return ( None, None, None ) # (radio_measurements, address, payload) #TODO: might be measurements, average min max? #TODO: extract addresses (house_address, device_index) radio_measurements = None #TODO: return this from radio.receive() h = 0xC8C8C #TODO: Get house address from TwoBit.decode()[:10] d = 0xEE #TODO: Get device command from TwoBit.decode()[11:12] address = (h, d) return (radio_measurements, address, payload)