Esempio n. 1
0
    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
Esempio n. 2
0
    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")
Esempio n. 3
0
 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))
Esempio n. 4
0
 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))
Esempio n. 5
0
 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))
Esempio n. 6
0
 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))
Esempio n. 7
0
 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))
Esempio n. 8
0
 def _settings_read_button_fired(self):
     self.enumindex = 0
     self.ordering_counter = 0
     self.link(MsgSettingsReadByIndexReq(index=self.enumindex))
Esempio n. 9
0
 def _send_pending_settings_by_index(self):
     for eachindex in self.pending_settings:
         self.link(MsgSettingsReadByIndexReq(index=eachindex))