def read_all(self, verbose=False): """Read all settings from device Args: verbose(bool): Echo settings to sdout Returns: Nested dictionary of settings[section][names] with values as strings """ self.settings_list_received = False self.link(MsgSettingsReadByIndexReq(index=0)) attempts = 0 while not self.settings_list_received: time.sleep(self.timeout) attempts += 1 if attempts > 10: # wait 10 timeout periods for settings before trying again attempts = 0 self.link(MsgSettingsReadByIndexReq(index=0)) for section in self.settings_list: if verbose: print('%s:' % section) for setting, value in self.settings_list[section].iteritems(): if verbose: print('- %s = %s' % (setting, value)) return self.settings_list
def __init__(self, link, timeout=None): self.diagnostics = {} self.diagnostics['versions'] = {} self.diagnostics['settings'] = {} self.settings_received = False self.heartbeat_received = False self.handshake_received = False self.sbp_version = (0, 0) self.link = link self.link.add_callback(self._settings_callback, SBP_MSG_SETTINGS_READ_BY_INDEX_REQ) self.link.add_callback(self._settings_callback, SBP_MSG_SETTINGS_READ_BY_INDEX_RESP) self.link.add_callback(self._settings_done_callback, SBP_MSG_SETTINGS_READ_BY_INDEX_DONE) self.link.add_callback(self._heartbeat_callback, SBP_MSG_HEARTBEAT) self.link.add_callback(self._deprecated_handshake_callback, SBP_MSG_BOOTLOADER_HANDSHAKE_DEP_A) self.link.add_callback(self._handshake_callback, SBP_MSG_BOOTLOADER_HANDSHAKE_RESP) self.link.add_callback(self._print_callback, [SBP_MSG_LOG, SBP_MSG_PRINT_DEP]) timeout = time.time() + timeout if timeout is not None else None # Wait for the heartbeat while not self.heartbeat_received: time.sleep(0.1) if timeout is not None and time.time() > timeout: print("timeout waiting for heartbeat") return # Wait for the settings print("received heartbeat") expire = time.time() + 15.0 self.link(MsgSettingsReadByIndexReq(index=0)) while not self.settings_received: time.sleep(0.1) if time.time() > expire: expire = time.time() + 15.0 self.link(MsgSettingsReadByIndexReq(index=0)) if timeout is not None and time.time() > timeout: print("timeout waiting for settings") return # Wait for the handshake print("received settings") expire = time.time() + 10.0 self.link(MsgReset(flags=0)) while not self.handshake_received: time.sleep(0.1) if time.time() > expire: expire = time.time() + 10.0 self.link(MsgReset(flags=0)) if timeout is not None and time.time() > timeout: print("timeout waiting for handshake") return print("received bootloader handshake")
def settings_read_by_index_callback(self, sbp_msg, **metadata): section, setting, value, format_type = sbp_msg.payload[2:].split( '\0')[:4] self.ordering_counter += 1 if format_type == '': format_type = None else: setting_type, setting_format = format_type.split(':') if section not in self.settings: self.settings[section] = {} if format_type is None: # Plain old setting, no format information self.settings[section][setting] = Setting( setting, section, value, ordering=self.ordering_counter, settings=self) else: if setting_type == 'enum': enum_values = setting_format.split(',') self.settings[section][setting] = EnumSetting( setting, section, value, ordering=self.ordering_counter, values=enum_values, settings=self) else: # Unknown type, just treat is as a string self.settings[section][setting] = Setting( setting, section, value, settings=self) if self.enumindex == sbp_msg.index: self.enumindex += 1 self.link(MsgSettingsReadByIndexReq(index=self.enumindex))
def _settings_list_callback(self, sbp_msg, **metadata): section, setting, value, format_type = sbp_msg.payload[2:].split( '\0')[:4] if section not in self.settings_list: self.settings_list[section] = {} self.settings_list[section][setting] = value index = struct.unpack('<H', sbp_msg.payload[:2])[0] self.link(MsgSettingsReadByIndexReq(index=index + 1))
def read_all(self): self.settings_list_received = False self.link(MsgSettingsReadByIndexReq(index=0)) while not self.settings_list_received: time.sleep(0.1) for section in self.settings_list: print('%s:' % (section)) for setting, value in self.settings_list[section].iteritems(): print('- %s = %s' % (setting, value))
def _settings_list_callback(self, sbp_msg, **metadata): section_b, setting_b, value_b, format_type_b = sbp_msg.payload[2:].split(b'\0')[:4] section = section_b.decode(KEY_ENCODING) setting = setting_b.decode(KEY_ENCODING) value = value_b.decode(VALUE_ENCODING) if section not in self.settings_list: self.settings_list[section] = {} self.settings_list[section][setting] = value index = struct.unpack('<H', sbp_msg.payload[:2])[0] self.link(MsgSettingsReadByIndexReq(index=index + 1))
def _settings_callback(self, sbp_msg, **metadata): if not sbp_msg.payload: self.settings_received = True else: section, setting, value, format_type = sbp_msg.payload[2:].split( '\0')[:4] if section not in self.diagnostics['settings']: self.diagnostics['settings'][section] = {} self.diagnostics['settings'][section][setting] = value index = struct.unpack('<H', sbp_msg.payload[:2])[0] self.link(MsgSettingsReadByIndexReq(index=index + 1))
def _settings_read_button_fired(self): self.enumindex = 0 self.ordering_counter = 0 self.link(MsgSettingsReadByIndexReq(index=self.enumindex))
def _send_pending_settings_by_index(self): for eachindex in self.pending_settings: self.link(MsgSettingsReadByIndexReq(index=eachindex))