diff --git a/docs/meshtastic/admin_pb2.html b/docs/meshtastic/admin_pb2.html index ed62024..4e48e0b 100644 --- a/docs/meshtastic/admin_pb2.html +++ b/docs/meshtastic/admin_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.admin_pb2 API documentation - + @@ -22,7 +22,6 @@

Module meshtastic.admin_pb2

-

Generated protocol buffer code.

Expand source code @@ -30,7 +29,7 @@
# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: admin.proto
-"""Generated protocol buffer code."""
+
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -50,7 +49,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   package='',
   syntax='proto3',
   serialized_options=b'\n\023com.geeksville.meshB\013AdminProtosH\003Z!github.com/meshtastic/gomeshproto',
-  create_key=_descriptor._internal_create_key,
   serialized_pb=b'\n\x0b\x61\x64min.proto\x1a\nmesh.proto\x1a\x11radioconfig.proto\x1a\rchannel.proto\"\xfb\x02\n\x0c\x41\x64minMessage\x12!\n\tset_radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x02 \x01(\x0b\x32\x05.UserH\x00\x12\x1f\n\x0bset_channel\x18\x03 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1b\n\x11get_radio_request\x18\x04 \x01(\x08H\x00\x12*\n\x12get_radio_response\x18\x05 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1d\n\x13get_channel_request\x18\x06 \x01(\rH\x00\x12(\n\x14get_channel_response\x18\x07 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1d\n\x13\x63onfirm_set_channel\x18  \x01(\x08H\x00\x12\x1b\n\x11\x63onfirm_set_radio\x18! \x01(\x08H\x00\x12\x18\n\x0e\x65xit_simulator\x18\" \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18# \x01(\x05H\x00\x42\t\n\x07variantBG\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
   ,
   dependencies=[mesh__pb2.DESCRIPTOR,radioconfig__pb2.DESCRIPTOR,channel__pb2.DESCRIPTOR,])
@@ -64,7 +62,6 @@ _ADMINMESSAGE = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
-  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='set_radio', full_name='AdminMessage.set_radio', index=0,
@@ -72,77 +69,77 @@ _ADMINMESSAGE = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='set_owner', full_name='AdminMessage.set_owner', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='set_channel', full_name='AdminMessage.set_channel', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='get_radio_request', full_name='AdminMessage.get_radio_request', index=3,
       number=4, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='get_radio_response', full_name='AdminMessage.get_radio_response', index=4,
       number=5, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='get_channel_request', full_name='AdminMessage.get_channel_request', index=5,
       number=6, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='get_channel_response', full_name='AdminMessage.get_channel_response', index=6,
       number=7, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='confirm_set_channel', full_name='AdminMessage.confirm_set_channel', index=7,
       number=32, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='confirm_set_radio', full_name='AdminMessage.confirm_set_radio', index=8,
       number=33, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='exit_simulator', full_name='AdminMessage.exit_simulator', index=9,
       number=34, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
       name='reboot_seconds', full_name='AdminMessage.reboot_seconds', index=10,
       number=35, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+      serialized_options=None, file=DESCRIPTOR),
   ],
   extensions=[
   ],
@@ -156,9 +153,7 @@ _ADMINMESSAGE = _descriptor.Descriptor(
   oneofs=[
     _descriptor.OneofDescriptor(
       name='variant', full_name='AdminMessage.variant',
-      index=0, containing_type=None,
-      create_key=_descriptor._internal_create_key,
-    fields=[]),
+      index=0, containing_type=None, fields=[]),
   ],
   serialized_start=62,
   serialized_end=441,
@@ -228,67 +223,756 @@ DESCRIPTOR._options = None
 
class AdminMessage -(*args, **kwargs) +(**kwargs)
-

A ProtocolMessage

+

Abstract base class for protocol messages.

+

Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

Ancestors

    -
  • google.protobuf.pyext._message.CMessage
  • google.protobuf.message.Message

Class variables

+
var CONFIRM_SET_CHANNEL_FIELD_NUMBER
+
+
+
+
var CONFIRM_SET_RADIO_FIELD_NUMBER
+
+
+
var DESCRIPTOR
+
var EXIT_SIMULATOR_FIELD_NUMBER
+
+
+
+
var GET_CHANNEL_REQUEST_FIELD_NUMBER
+
+
+
+
var GET_CHANNEL_RESPONSE_FIELD_NUMBER
+
+
+
+
var GET_RADIO_REQUEST_FIELD_NUMBER
+
+
+
+
var GET_RADIO_RESPONSE_FIELD_NUMBER
+
+
+
+
var REBOOT_SECONDS_FIELD_NUMBER
+
+
+
+
var SET_CHANNEL_FIELD_NUMBER
+
+
+
+
var SET_OWNER_FIELD_NUMBER
+
+
+
+
var SET_RADIO_FIELD_NUMBER
+
+
+
+
+

Static methods

+
+
+def FromString(s) +
+
+
+
+ +Expand source code + +
def FromString(s):
+  message = cls()
+  message.MergeFromString(s)
+  return message
+
+
+
+def RegisterExtension(extension_handle) +
+
+
+
+ +Expand source code + +
def RegisterExtension(extension_handle):
+  extension_handle.containing_type = cls.DESCRIPTOR
+  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
+  # pylint: disable=protected-access
+  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
+  _AttachFieldHelpers(cls, extension_handle)
+
+

Instance variables

var confirm_set_channel
-

Field AdminMessage.confirm_set_channel

+

Getter for confirm_set_channel.

+
+ +Expand source code + +
def getter(self):
+  # TODO(protobuf-team): This may be broken since there may not be
+  # default_value.  Combine with has_default_value somehow.
+  return self._fields.get(field, default_value)
+
var confirm_set_radio
-

Field AdminMessage.confirm_set_radio

+

Getter for confirm_set_radio.

+
+ +Expand source code + +
def getter(self):
+  # TODO(protobuf-team): This may be broken since there may not be
+  # default_value.  Combine with has_default_value somehow.
+  return self._fields.get(field, default_value)
+
var exit_simulator
-

Field AdminMessage.exit_simulator

+

Getter for exit_simulator.

+
+ +Expand source code + +
def getter(self):
+  # TODO(protobuf-team): This may be broken since there may not be
+  # default_value.  Combine with has_default_value somehow.
+  return self._fields.get(field, default_value)
+
var get_channel_request
-

Field AdminMessage.get_channel_request

+

Getter for get_channel_request.

+
+ +Expand source code + +
def getter(self):
+  # TODO(protobuf-team): This may be broken since there may not be
+  # default_value.  Combine with has_default_value somehow.
+  return self._fields.get(field, default_value)
+
var get_channel_response
-

Field AdminMessage.get_channel_response

+

Getter for get_channel_response.

+
+ +Expand source code + +
def getter(self):
+  field_value = self._fields.get(field)
+  if field_value is None:
+    # Construct a new object to represent this field.
+    field_value = field._default_constructor(self)
+
+    # Atomically check if another thread has preempted us and, if not, swap
+    # in the new object we just created.  If someone has preempted us, we
+    # take that object and discard ours.
+    # WARNING:  We are relying on setdefault() being atomic.  This is true
+    #   in CPython but we haven't investigated others.  This warning appears
+    #   in several other locations in this file.
+    field_value = self._fields.setdefault(field, field_value)
+  return field_value
+
var get_radio_request
-

Field AdminMessage.get_radio_request

+

Getter for get_radio_request.

+
+ +Expand source code + +
def getter(self):
+  # TODO(protobuf-team): This may be broken since there may not be
+  # default_value.  Combine with has_default_value somehow.
+  return self._fields.get(field, default_value)
+
var get_radio_response
-

Field AdminMessage.get_radio_response

+

Getter for get_radio_response.

+
+ +Expand source code + +
def getter(self):
+  field_value = self._fields.get(field)
+  if field_value is None:
+    # Construct a new object to represent this field.
+    field_value = field._default_constructor(self)
+
+    # Atomically check if another thread has preempted us and, if not, swap
+    # in the new object we just created.  If someone has preempted us, we
+    # take that object and discard ours.
+    # WARNING:  We are relying on setdefault() being atomic.  This is true
+    #   in CPython but we haven't investigated others.  This warning appears
+    #   in several other locations in this file.
+    field_value = self._fields.setdefault(field, field_value)
+  return field_value
+
var reboot_seconds
-

Field AdminMessage.reboot_seconds

+

Getter for reboot_seconds.

+
+ +Expand source code + +
def getter(self):
+  # TODO(protobuf-team): This may be broken since there may not be
+  # default_value.  Combine with has_default_value somehow.
+  return self._fields.get(field, default_value)
+
var set_channel
-

Field AdminMessage.set_channel

+

Getter for set_channel.

+
+ +Expand source code + +
def getter(self):
+  field_value = self._fields.get(field)
+  if field_value is None:
+    # Construct a new object to represent this field.
+    field_value = field._default_constructor(self)
+
+    # Atomically check if another thread has preempted us and, if not, swap
+    # in the new object we just created.  If someone has preempted us, we
+    # take that object and discard ours.
+    # WARNING:  We are relying on setdefault() being atomic.  This is true
+    #   in CPython but we haven't investigated others.  This warning appears
+    #   in several other locations in this file.
+    field_value = self._fields.setdefault(field, field_value)
+  return field_value
+
var set_owner
-

Field AdminMessage.set_owner

+

Getter for set_owner.

+
+ +Expand source code + +
def getter(self):
+  field_value = self._fields.get(field)
+  if field_value is None:
+    # Construct a new object to represent this field.
+    field_value = field._default_constructor(self)
+
+    # Atomically check if another thread has preempted us and, if not, swap
+    # in the new object we just created.  If someone has preempted us, we
+    # take that object and discard ours.
+    # WARNING:  We are relying on setdefault() being atomic.  This is true
+    #   in CPython but we haven't investigated others.  This warning appears
+    #   in several other locations in this file.
+    field_value = self._fields.setdefault(field, field_value)
+  return field_value
+
var set_radio
-

Field AdminMessage.set_radio

+

Getter for set_radio.

+
+ +Expand source code + +
def getter(self):
+  field_value = self._fields.get(field)
+  if field_value is None:
+    # Construct a new object to represent this field.
+    field_value = field._default_constructor(self)
+
+    # Atomically check if another thread has preempted us and, if not, swap
+    # in the new object we just created.  If someone has preempted us, we
+    # take that object and discard ours.
+    # WARNING:  We are relying on setdefault() being atomic.  This is true
+    #   in CPython but we haven't investigated others.  This warning appears
+    #   in several other locations in this file.
+    field_value = self._fields.setdefault(field, field_value)
+  return field_value
+
+
+
+

Methods

+
+
+def ByteSize(self) +
+
+
+
+ +Expand source code + +
def ByteSize(self):
+  if not self._cached_byte_size_dirty:
+    return self._cached_byte_size
+
+  size = 0
+  descriptor = self.DESCRIPTOR
+  if descriptor.GetOptions().map_entry:
+    # Fields of map entry should always be serialized.
+    size = descriptor.fields_by_name['key']._sizer(self.key)
+    size += descriptor.fields_by_name['value']._sizer(self.value)
+  else:
+    for field_descriptor, field_value in self.ListFields():
+      size += field_descriptor._sizer(field_value)
+    for tag_bytes, value_bytes in self._unknown_fields:
+      size += len(tag_bytes) + len(value_bytes)
+
+  self._cached_byte_size = size
+  self._cached_byte_size_dirty = False
+  self._listener_for_children.dirty = False
+  return size
+
+
+
+def Clear(self) +
+
+
+
+ +Expand source code + +
def _Clear(self):
+  # Clear fields.
+  self._fields = {}
+  self._unknown_fields = ()
+  # pylint: disable=protected-access
+  if self._unknown_field_set is not None:
+    self._unknown_field_set._clear()
+    self._unknown_field_set = None
+
+  self._oneofs = {}
+  self._Modified()
+
+
+
+def ClearField(self, field_name) +
+
+
+
+ +Expand source code + +
def ClearField(self, field_name):
+  try:
+    field = message_descriptor.fields_by_name[field_name]
+  except KeyError:
+    try:
+      field = message_descriptor.oneofs_by_name[field_name]
+      if field in self._oneofs:
+        field = self._oneofs[field]
+      else:
+        return
+    except KeyError:
+      raise ValueError('Protocol message %s has no "%s" field.' %
+                       (message_descriptor.name, field_name))
+
+  if field in self._fields:
+    # To match the C++ implementation, we need to invalidate iterators
+    # for map fields when ClearField() happens.
+    if hasattr(self._fields[field], 'InvalidateIterators'):
+      self._fields[field].InvalidateIterators()
+
+    # Note:  If the field is a sub-message, its listener will still point
+    #   at us.  That's fine, because the worst than can happen is that it
+    #   will call _Modified() and invalidate our byte size.  Big deal.
+    del self._fields[field]
+
+    if self._oneofs.get(field.containing_oneof, None) is field:
+      del self._oneofs[field.containing_oneof]
+
+  # Always call _Modified() -- even if nothing was changed, this is
+  # a mutating method, and thus calling it should cause the field to become
+  # present in the parent message.
+  self._Modified()
+
+
+
+def DiscardUnknownFields(self) +
+
+
+
+ +Expand source code + +
def _DiscardUnknownFields(self):
+  self._unknown_fields = []
+  self._unknown_field_set = None      # pylint: disable=protected-access
+  for field, value in self.ListFields():
+    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
+      if _IsMapField(field):
+        if _IsMessageMapField(field):
+          for key in value:
+            value[key].DiscardUnknownFields()
+      elif field.label == _FieldDescriptor.LABEL_REPEATED:
+        for sub_message in value:
+          sub_message.DiscardUnknownFields()
+      else:
+        value.DiscardUnknownFields()
+
+
+
+def FindInitializationErrors(self) +
+
+

Finds required fields which are not initialized.

+

Returns

+

A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

+
+ +Expand source code + +
def FindInitializationErrors(self):
+  """Finds required fields which are not initialized.
+
+  Returns:
+    A list of strings.  Each string is a path to an uninitialized field from
+    the top-level message, e.g. "foo.bar[5].baz".
+  """
+
+  errors = []  # simplify things
+
+  for field in required_fields:
+    if not self.HasField(field.name):
+      errors.append(field.name)
+
+  for field, value in self.ListFields():
+    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
+      if field.is_extension:
+        name = '(%s)' % field.full_name
+      else:
+        name = field.name
+
+      if _IsMapField(field):
+        if _IsMessageMapField(field):
+          for key in value:
+            element = value[key]
+            prefix = '%s[%s].' % (name, key)
+            sub_errors = element.FindInitializationErrors()
+            errors += [prefix + error for error in sub_errors]
+        else:
+          # ScalarMaps can't have any initialization errors.
+          pass
+      elif field.label == _FieldDescriptor.LABEL_REPEATED:
+        for i in range(len(value)):
+          element = value[i]
+          prefix = '%s[%d].' % (name, i)
+          sub_errors = element.FindInitializationErrors()
+          errors += [prefix + error for error in sub_errors]
+      else:
+        prefix = name + '.'
+        sub_errors = value.FindInitializationErrors()
+        errors += [prefix + error for error in sub_errors]
+
+  return errors
+
+
+
+def HasField(self, field_name) +
+
+
+
+ +Expand source code + +
def HasField(self, field_name):
+  try:
+    field = hassable_fields[field_name]
+  except KeyError:
+    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
+
+  if isinstance(field, descriptor_mod.OneofDescriptor):
+    try:
+      return HasField(self, self._oneofs[field].name)
+    except KeyError:
+      return False
+  else:
+    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
+      value = self._fields.get(field)
+      return value is not None and value._is_present_in_parent
+    else:
+      return field in self._fields
+
+
+
+def IsInitialized(self, errors=None) +
+
+

Checks if all required fields of a message are set.

+

Args

+
+
errors
+
A list which, if provided, will be populated with the field +paths of all missing required fields.
+
+

Returns

+

True iff the specified message has all required fields set.

+
+ +Expand source code + +
def IsInitialized(self, errors=None):
+  """Checks if all required fields of a message are set.
+
+  Args:
+    errors:  A list which, if provided, will be populated with the field
+             paths of all missing required fields.
+
+  Returns:
+    True iff the specified message has all required fields set.
+  """
+
+  # Performance is critical so we avoid HasField() and ListFields().
+
+  for field in required_fields:
+    if (field not in self._fields or
+        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
+         not self._fields[field]._is_present_in_parent)):
+      if errors is not None:
+        errors.extend(self.FindInitializationErrors())
+      return False
+
+  for field, value in list(self._fields.items()):  # dict can change size!
+    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
+      if field.label == _FieldDescriptor.LABEL_REPEATED:
+        if (field.message_type.has_options and
+            field.message_type.GetOptions().map_entry):
+          continue
+        for element in value:
+          if not element.IsInitialized():
+            if errors is not None:
+              errors.extend(self.FindInitializationErrors())
+            return False
+      elif value._is_present_in_parent and not value.IsInitialized():
+        if errors is not None:
+          errors.extend(self.FindInitializationErrors())
+        return False
+
+  return True
+
+
+
+def ListFields(self) +
+
+
+
+ +Expand source code + +
def ListFields(self):
+  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
+  all_fields.sort(key = lambda item: item[0].number)
+  return all_fields
+
+
+
+def MergeFrom(self, msg) +
+
+
+
+ +Expand source code + +
def MergeFrom(self, msg):
+  if not isinstance(msg, cls):
+    raise TypeError(
+        'Parameter to MergeFrom() must be instance of same class: '
+        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
+                                 _FullyQualifiedClassName(msg.__class__)))
+
+  assert msg is not self
+  self._Modified()
+
+  fields = self._fields
+
+  for field, value in msg._fields.items():
+    if field.label == LABEL_REPEATED:
+      field_value = fields.get(field)
+      if field_value is None:
+        # Construct a new object to represent this field.
+        field_value = field._default_constructor(self)
+        fields[field] = field_value
+      field_value.MergeFrom(value)
+    elif field.cpp_type == CPPTYPE_MESSAGE:
+      if value._is_present_in_parent:
+        field_value = fields.get(field)
+        if field_value is None:
+          # Construct a new object to represent this field.
+          field_value = field._default_constructor(self)
+          fields[field] = field_value
+        field_value.MergeFrom(value)
+    else:
+      self._fields[field] = value
+      if field.containing_oneof:
+        self._UpdateOneofState(field)
+
+  if msg._unknown_fields:
+    if not self._unknown_fields:
+      self._unknown_fields = []
+    self._unknown_fields.extend(msg._unknown_fields)
+    # pylint: disable=protected-access
+    if self._unknown_field_set is None:
+      self._unknown_field_set = containers.UnknownFieldSet()
+    self._unknown_field_set._extend(msg._unknown_field_set)
+
+
+
+def MergeFromString(self, serialized) +
+
+
+
+ +Expand source code + +
def MergeFromString(self, serialized):
+  serialized = memoryview(serialized)
+  length = len(serialized)
+  try:
+    if self._InternalParse(serialized, 0, length) != length:
+      # The only reason _InternalParse would return early is if it
+      # encountered an end-group tag.
+      raise message_mod.DecodeError('Unexpected end-group tag.')
+  except (IndexError, TypeError):
+    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
+    raise message_mod.DecodeError('Truncated message.')
+  except struct.error as e:
+    raise message_mod.DecodeError(e)
+  return length   # Return this for legacy reasons.
+
+
+
+def SerializePartialToString(self, **kwargs) +
+
+
+
+ +Expand source code + +
def SerializePartialToString(self, **kwargs):
+  out = BytesIO()
+  self._InternalSerialize(out.write, **kwargs)
+  return out.getvalue()
+
+
+
+def SerializeToString(self, **kwargs) +
+
+
+
+ +Expand source code + +
def SerializeToString(self, **kwargs):
+  # Check if the message has all of its required fields set.
+  if not self.IsInitialized():
+    raise message_mod.EncodeError(
+        'Message %s is missing required fields: %s' % (
+        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
+  return self.SerializePartialToString(**kwargs)
+
+
+
+def SetInParent(self) +
+
+

Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

+
+ +Expand source code + +
def Modified(self):
+  """Sets the _cached_byte_size_dirty bit to true,
+  and propagates this to our listener iff this was a state change.
+  """
+
+  # Note:  Some callers check _cached_byte_size_dirty before calling
+  #   _Modified() as an extra optimization.  So, if this method is ever
+  #   changed such that it does stuff even when _cached_byte_size_dirty is
+  #   already true, the callers need to be updated.
+  if not self._cached_byte_size_dirty:
+    self._cached_byte_size_dirty = True
+    self._listener_for_children.dirty = True
+    self._is_present_in_parent = True
+    self._listener.Modified()
+
+
+
+def UnknownFields(self) +
+
+
+
+ +Expand source code + +
def _UnknownFields(self):
+  if self._unknown_field_set is None:  # pylint: disable=protected-access
+    # pylint: disable=protected-access
+    self._unknown_field_set = containers.UnknownFieldSet()
+  return self._unknown_field_set    # pylint: disable=protected-access
+
+
+
+def WhichOneof(self, oneof_name) +
+
+

Returns the name of the currently set field inside a oneof, or None.

+
+ +Expand source code + +
def WhichOneof(self, oneof_name):
+  """Returns the name of the currently set field inside a oneof, or None."""
+  try:
+    field = message_descriptor.oneofs_by_name[oneof_name]
+  except KeyError:
+    raise ValueError(
+        'Protocol message has no oneof "%s" field.' % oneof_name)
+
+  nested_field = self._oneofs.get(field, None)
+  if nested_field is not None and self.HasField(nested_field.name):
+    return nested_field.name
+  else:
+    return None
+
@@ -311,7 +995,35 @@ DESCRIPTOR._options = None
  • AdminMessage

      +
    • ByteSize
    • +
    • CONFIRM_SET_CHANNEL_FIELD_NUMBER
    • +
    • CONFIRM_SET_RADIO_FIELD_NUMBER
    • +
    • Clear
    • +
    • ClearField
    • DESCRIPTOR
    • +
    • DiscardUnknownFields
    • +
    • EXIT_SIMULATOR_FIELD_NUMBER
    • +
    • FindInitializationErrors
    • +
    • FromString
    • +
    • GET_CHANNEL_REQUEST_FIELD_NUMBER
    • +
    • GET_CHANNEL_RESPONSE_FIELD_NUMBER
    • +
    • GET_RADIO_REQUEST_FIELD_NUMBER
    • +
    • GET_RADIO_RESPONSE_FIELD_NUMBER
    • +
    • HasField
    • +
    • IsInitialized
    • +
    • ListFields
    • +
    • MergeFrom
    • +
    • MergeFromString
    • +
    • REBOOT_SECONDS_FIELD_NUMBER
    • +
    • RegisterExtension
    • +
    • SET_CHANNEL_FIELD_NUMBER
    • +
    • SET_OWNER_FIELD_NUMBER
    • +
    • SET_RADIO_FIELD_NUMBER
    • +
    • SerializePartialToString
    • +
    • SerializeToString
    • +
    • SetInParent
    • +
    • UnknownFields
    • +
    • WhichOneof
    • confirm_set_channel
    • confirm_set_radio
    • exit_simulator
    • @@ -331,7 +1043,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/apponly_pb2.html b/docs/meshtastic/apponly_pb2.html index 723ca15..1180130 100644 --- a/docs/meshtastic/apponly_pb2.html +++ b/docs/meshtastic/apponly_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.apponly_pb2 API documentation - + @@ -22,7 +22,6 @@

      Module meshtastic.apponly_pb2

      -

      Generated protocol buffer code.

      Expand source code @@ -30,7 +29,7 @@
      # -*- coding: utf-8 -*-
       # Generated by the protocol buffer compiler.  DO NOT EDIT!
       # source: apponly.proto
      -"""Generated protocol buffer code."""
      +
       from google.protobuf import descriptor as _descriptor
       from google.protobuf import message as _message
       from google.protobuf import reflection as _reflection
      @@ -48,7 +47,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
         package='',
         syntax='proto3',
         serialized_options=b'\n\023com.geeksville.meshB\rAppOnlyProtosH\003Z!github.com/meshtastic/gomeshproto',
      -  create_key=_descriptor._internal_create_key,
         serialized_pb=b'\n\rapponly.proto\x1a\rchannel.proto\"0\n\nChannelSet\x12\"\n\x08settings\x18\x01 \x03(\x0b\x32\x10.ChannelSettingsBI\n\x13\x63om.geeksville.meshB\rAppOnlyProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
         ,
         dependencies=[channel__pb2.DESCRIPTOR,])
      @@ -62,7 +60,6 @@ _CHANNELSET = _descriptor.Descriptor(
         filename=None,
         file=DESCRIPTOR,
         containing_type=None,
      -  create_key=_descriptor._internal_create_key,
         fields=[
           _descriptor.FieldDescriptor(
             name='settings', full_name='ChannelSet.settings', index=0,
      @@ -70,7 +67,7 @@ _CHANNELSET = _descriptor.Descriptor(
             has_default_value=False, default_value=[],
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
         ],
         extensions=[
         ],
      @@ -114,13 +111,16 @@ DESCRIPTOR._options = None
       
      class ChannelSet -(*args, **kwargs) +(**kwargs)
      -

      A ProtocolMessage

      +

      Abstract base class for protocol messages.

      +

      Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

      Ancestors

        -
      • google.protobuf.pyext._message.CMessage
      • google.protobuf.message.Message

      Class variables

      @@ -129,12 +129,528 @@ DESCRIPTOR._options = None
      +
      var SETTINGS_FIELD_NUMBER
      +
      +
      +
      +
      +

      Static methods

      +
      +
      +def FromString(s) +
      +
      +
      +
      + +Expand source code + +
      def FromString(s):
      +  message = cls()
      +  message.MergeFromString(s)
      +  return message
      +
      +
      +
      +def RegisterExtension(extension_handle) +
      +
      +
      +
      + +Expand source code + +
      def RegisterExtension(extension_handle):
      +  extension_handle.containing_type = cls.DESCRIPTOR
      +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
      +  # pylint: disable=protected-access
      +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
      +  _AttachFieldHelpers(cls, extension_handle)
      +
      +

      Instance variables

      var settings
      -

      Field ChannelSet.settings

      +

      Getter for settings.

      +
      + +Expand source code + +
      def getter(self):
      +  field_value = self._fields.get(field)
      +  if field_value is None:
      +    # Construct a new object to represent this field.
      +    field_value = field._default_constructor(self)
      +
      +    # Atomically check if another thread has preempted us and, if not, swap
      +    # in the new object we just created.  If someone has preempted us, we
      +    # take that object and discard ours.
      +    # WARNING:  We are relying on setdefault() being atomic.  This is true
      +    #   in CPython but we haven't investigated others.  This warning appears
      +    #   in several other locations in this file.
      +    field_value = self._fields.setdefault(field, field_value)
      +  return field_value
      +
      +
      +
      +

      Methods

      +
      +
      +def ByteSize(self) +
      +
      +
      +
      + +Expand source code + +
      def ByteSize(self):
      +  if not self._cached_byte_size_dirty:
      +    return self._cached_byte_size
      +
      +  size = 0
      +  descriptor = self.DESCRIPTOR
      +  if descriptor.GetOptions().map_entry:
      +    # Fields of map entry should always be serialized.
      +    size = descriptor.fields_by_name['key']._sizer(self.key)
      +    size += descriptor.fields_by_name['value']._sizer(self.value)
      +  else:
      +    for field_descriptor, field_value in self.ListFields():
      +      size += field_descriptor._sizer(field_value)
      +    for tag_bytes, value_bytes in self._unknown_fields:
      +      size += len(tag_bytes) + len(value_bytes)
      +
      +  self._cached_byte_size = size
      +  self._cached_byte_size_dirty = False
      +  self._listener_for_children.dirty = False
      +  return size
      +
      +
      +
      +def Clear(self) +
      +
      +
      +
      + +Expand source code + +
      def _Clear(self):
      +  # Clear fields.
      +  self._fields = {}
      +  self._unknown_fields = ()
      +  # pylint: disable=protected-access
      +  if self._unknown_field_set is not None:
      +    self._unknown_field_set._clear()
      +    self._unknown_field_set = None
      +
      +  self._oneofs = {}
      +  self._Modified()
      +
      +
      +
      +def ClearField(self, field_name) +
      +
      +
      +
      + +Expand source code + +
      def ClearField(self, field_name):
      +  try:
      +    field = message_descriptor.fields_by_name[field_name]
      +  except KeyError:
      +    try:
      +      field = message_descriptor.oneofs_by_name[field_name]
      +      if field in self._oneofs:
      +        field = self._oneofs[field]
      +      else:
      +        return
      +    except KeyError:
      +      raise ValueError('Protocol message %s has no "%s" field.' %
      +                       (message_descriptor.name, field_name))
      +
      +  if field in self._fields:
      +    # To match the C++ implementation, we need to invalidate iterators
      +    # for map fields when ClearField() happens.
      +    if hasattr(self._fields[field], 'InvalidateIterators'):
      +      self._fields[field].InvalidateIterators()
      +
      +    # Note:  If the field is a sub-message, its listener will still point
      +    #   at us.  That's fine, because the worst than can happen is that it
      +    #   will call _Modified() and invalidate our byte size.  Big deal.
      +    del self._fields[field]
      +
      +    if self._oneofs.get(field.containing_oneof, None) is field:
      +      del self._oneofs[field.containing_oneof]
      +
      +  # Always call _Modified() -- even if nothing was changed, this is
      +  # a mutating method, and thus calling it should cause the field to become
      +  # present in the parent message.
      +  self._Modified()
      +
      +
      +
      +def DiscardUnknownFields(self) +
      +
      +
      +
      + +Expand source code + +
      def _DiscardUnknownFields(self):
      +  self._unknown_fields = []
      +  self._unknown_field_set = None      # pylint: disable=protected-access
      +  for field, value in self.ListFields():
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if _IsMapField(field):
      +        if _IsMessageMapField(field):
      +          for key in value:
      +            value[key].DiscardUnknownFields()
      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
      +        for sub_message in value:
      +          sub_message.DiscardUnknownFields()
      +      else:
      +        value.DiscardUnknownFields()
      +
      +
      +
      +def FindInitializationErrors(self) +
      +
      +

      Finds required fields which are not initialized.

      +

      Returns

      +

      A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

      +
      + +Expand source code + +
      def FindInitializationErrors(self):
      +  """Finds required fields which are not initialized.
      +
      +  Returns:
      +    A list of strings.  Each string is a path to an uninitialized field from
      +    the top-level message, e.g. "foo.bar[5].baz".
      +  """
      +
      +  errors = []  # simplify things
      +
      +  for field in required_fields:
      +    if not self.HasField(field.name):
      +      errors.append(field.name)
      +
      +  for field, value in self.ListFields():
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if field.is_extension:
      +        name = '(%s)' % field.full_name
      +      else:
      +        name = field.name
      +
      +      if _IsMapField(field):
      +        if _IsMessageMapField(field):
      +          for key in value:
      +            element = value[key]
      +            prefix = '%s[%s].' % (name, key)
      +            sub_errors = element.FindInitializationErrors()
      +            errors += [prefix + error for error in sub_errors]
      +        else:
      +          # ScalarMaps can't have any initialization errors.
      +          pass
      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
      +        for i in range(len(value)):
      +          element = value[i]
      +          prefix = '%s[%d].' % (name, i)
      +          sub_errors = element.FindInitializationErrors()
      +          errors += [prefix + error for error in sub_errors]
      +      else:
      +        prefix = name + '.'
      +        sub_errors = value.FindInitializationErrors()
      +        errors += [prefix + error for error in sub_errors]
      +
      +  return errors
      +
      +
      +
      +def HasField(self, field_name) +
      +
      +
      +
      + +Expand source code + +
      def HasField(self, field_name):
      +  try:
      +    field = hassable_fields[field_name]
      +  except KeyError:
      +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
      +
      +  if isinstance(field, descriptor_mod.OneofDescriptor):
      +    try:
      +      return HasField(self, self._oneofs[field].name)
      +    except KeyError:
      +      return False
      +  else:
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      value = self._fields.get(field)
      +      return value is not None and value._is_present_in_parent
      +    else:
      +      return field in self._fields
      +
      +
      +
      +def IsInitialized(self, errors=None) +
      +
      +

      Checks if all required fields of a message are set.

      +

      Args

      +
      +
      errors
      +
      A list which, if provided, will be populated with the field +paths of all missing required fields.
      +
      +

      Returns

      +

      True iff the specified message has all required fields set.

      +
      + +Expand source code + +
      def IsInitialized(self, errors=None):
      +  """Checks if all required fields of a message are set.
      +
      +  Args:
      +    errors:  A list which, if provided, will be populated with the field
      +             paths of all missing required fields.
      +
      +  Returns:
      +    True iff the specified message has all required fields set.
      +  """
      +
      +  # Performance is critical so we avoid HasField() and ListFields().
      +
      +  for field in required_fields:
      +    if (field not in self._fields or
      +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
      +         not self._fields[field]._is_present_in_parent)):
      +      if errors is not None:
      +        errors.extend(self.FindInitializationErrors())
      +      return False
      +
      +  for field, value in list(self._fields.items()):  # dict can change size!
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if field.label == _FieldDescriptor.LABEL_REPEATED:
      +        if (field.message_type.has_options and
      +            field.message_type.GetOptions().map_entry):
      +          continue
      +        for element in value:
      +          if not element.IsInitialized():
      +            if errors is not None:
      +              errors.extend(self.FindInitializationErrors())
      +            return False
      +      elif value._is_present_in_parent and not value.IsInitialized():
      +        if errors is not None:
      +          errors.extend(self.FindInitializationErrors())
      +        return False
      +
      +  return True
      +
      +
      +
      +def ListFields(self) +
      +
      +
      +
      + +Expand source code + +
      def ListFields(self):
      +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
      +  all_fields.sort(key = lambda item: item[0].number)
      +  return all_fields
      +
      +
      +
      +def MergeFrom(self, msg) +
      +
      +
      +
      + +Expand source code + +
      def MergeFrom(self, msg):
      +  if not isinstance(msg, cls):
      +    raise TypeError(
      +        'Parameter to MergeFrom() must be instance of same class: '
      +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
      +                                 _FullyQualifiedClassName(msg.__class__)))
      +
      +  assert msg is not self
      +  self._Modified()
      +
      +  fields = self._fields
      +
      +  for field, value in msg._fields.items():
      +    if field.label == LABEL_REPEATED:
      +      field_value = fields.get(field)
      +      if field_value is None:
      +        # Construct a new object to represent this field.
      +        field_value = field._default_constructor(self)
      +        fields[field] = field_value
      +      field_value.MergeFrom(value)
      +    elif field.cpp_type == CPPTYPE_MESSAGE:
      +      if value._is_present_in_parent:
      +        field_value = fields.get(field)
      +        if field_value is None:
      +          # Construct a new object to represent this field.
      +          field_value = field._default_constructor(self)
      +          fields[field] = field_value
      +        field_value.MergeFrom(value)
      +    else:
      +      self._fields[field] = value
      +      if field.containing_oneof:
      +        self._UpdateOneofState(field)
      +
      +  if msg._unknown_fields:
      +    if not self._unknown_fields:
      +      self._unknown_fields = []
      +    self._unknown_fields.extend(msg._unknown_fields)
      +    # pylint: disable=protected-access
      +    if self._unknown_field_set is None:
      +      self._unknown_field_set = containers.UnknownFieldSet()
      +    self._unknown_field_set._extend(msg._unknown_field_set)
      +
      +
      +
      +def MergeFromString(self, serialized) +
      +
      +
      +
      + +Expand source code + +
      def MergeFromString(self, serialized):
      +  serialized = memoryview(serialized)
      +  length = len(serialized)
      +  try:
      +    if self._InternalParse(serialized, 0, length) != length:
      +      # The only reason _InternalParse would return early is if it
      +      # encountered an end-group tag.
      +      raise message_mod.DecodeError('Unexpected end-group tag.')
      +  except (IndexError, TypeError):
      +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
      +    raise message_mod.DecodeError('Truncated message.')
      +  except struct.error as e:
      +    raise message_mod.DecodeError(e)
      +  return length   # Return this for legacy reasons.
      +
      +
      +
      +def SerializePartialToString(self, **kwargs) +
      +
      +
      +
      + +Expand source code + +
      def SerializePartialToString(self, **kwargs):
      +  out = BytesIO()
      +  self._InternalSerialize(out.write, **kwargs)
      +  return out.getvalue()
      +
      +
      +
      +def SerializeToString(self, **kwargs) +
      +
      +
      +
      + +Expand source code + +
      def SerializeToString(self, **kwargs):
      +  # Check if the message has all of its required fields set.
      +  if not self.IsInitialized():
      +    raise message_mod.EncodeError(
      +        'Message %s is missing required fields: %s' % (
      +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
      +  return self.SerializePartialToString(**kwargs)
      +
      +
      +
      +def SetInParent(self) +
      +
      +

      Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

      +
      + +Expand source code + +
      def Modified(self):
      +  """Sets the _cached_byte_size_dirty bit to true,
      +  and propagates this to our listener iff this was a state change.
      +  """
      +
      +  # Note:  Some callers check _cached_byte_size_dirty before calling
      +  #   _Modified() as an extra optimization.  So, if this method is ever
      +  #   changed such that it does stuff even when _cached_byte_size_dirty is
      +  #   already true, the callers need to be updated.
      +  if not self._cached_byte_size_dirty:
      +    self._cached_byte_size_dirty = True
      +    self._listener_for_children.dirty = True
      +    self._is_present_in_parent = True
      +    self._listener.Modified()
      +
      +
      +
      +def UnknownFields(self) +
      +
      +
      +
      + +Expand source code + +
      def _UnknownFields(self):
      +  if self._unknown_field_set is None:  # pylint: disable=protected-access
      +    # pylint: disable=protected-access
      +    self._unknown_field_set = containers.UnknownFieldSet()
      +  return self._unknown_field_set    # pylint: disable=protected-access
      +
      +
      +
      +def WhichOneof(self, oneof_name) +
      +
      +

      Returns the name of the currently set field inside a oneof, or None.

      +
      + +Expand source code + +
      def WhichOneof(self, oneof_name):
      +  """Returns the name of the currently set field inside a oneof, or None."""
      +  try:
      +    field = message_descriptor.oneofs_by_name[oneof_name]
      +  except KeyError:
      +    raise ValueError(
      +        'Protocol message has no oneof "%s" field.' % oneof_name)
      +
      +  nested_field = self._oneofs.get(field, None)
      +  if nested_field is not None and self.HasField(nested_field.name):
      +    return nested_field.name
      +  else:
      +    return None
      +
      @@ -157,7 +673,25 @@ DESCRIPTOR._options = None
    • ChannelSet

    • @@ -167,7 +701,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/ble.html b/docs/meshtastic/ble.html index 718bd8a..154731f 100644 --- a/docs/meshtastic/ble.html +++ b/docs/meshtastic/ble.html @@ -3,7 +3,7 @@ - + meshtastic.ble API documentation @@ -47,7 +47,7 @@ \ No newline at end of file diff --git a/docs/meshtastic/channel_pb2.html b/docs/meshtastic/channel_pb2.html index e0ed3a8..7bc29a1 100644 --- a/docs/meshtastic/channel_pb2.html +++ b/docs/meshtastic/channel_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.channel_pb2 API documentation - + @@ -22,7 +22,6 @@

      Module meshtastic.channel_pb2

      -

      Generated protocol buffer code.

      Expand source code @@ -30,7 +29,7 @@
      # -*- coding: utf-8 -*-
       # Generated by the protocol buffer compiler.  DO NOT EDIT!
       # source: channel.proto
      -"""Generated protocol buffer code."""
      +
       from google.protobuf import descriptor as _descriptor
       from google.protobuf import message as _message
       from google.protobuf import reflection as _reflection
      @@ -47,7 +46,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
         package='',
         syntax='proto3',
         serialized_options=b'\n\023com.geeksville.meshB\rChannelProtosH\003Z!github.com/meshtastic/gomeshproto',
      -  create_key=_descriptor._internal_create_key,
         serialized_pb=b'\n\rchannel.proto\"\xe6\x02\n\x0f\x43hannelSettings\x12\x10\n\x08tx_power\x18\x01 \x01(\x05\x12\x32\n\x0cmodem_config\x18\x03 \x01(\x0e\x32\x1c.ChannelSettings.ModemConfig\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x15\n\rspread_factor\x18\x07 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x08 \x01(\r\x12\x13\n\x0b\x63hannel_num\x18\t \x01(\r\x12\x0b\n\x03psk\x18\x04 \x01(\x0c\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\n\n\x02id\x18\n \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x10 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x11 \x01(\x08\"`\n\x0bModemConfig\x12\x12\n\x0e\x42w125Cr45Sf128\x10\x00\x12\x12\n\x0e\x42w500Cr45Sf128\x10\x01\x12\x14\n\x10\x42w31_25Cr48Sf512\x10\x02\x12\x13\n\x0f\x42w125Cr48Sf4096\x10\x03\"\x8b\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\"\n\x08settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x12\x1b\n\x04role\x18\x03 \x01(\x0e\x32\r.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42I\n\x13\x63om.geeksville.meshB\rChannelProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
       )
       
      @@ -58,28 +56,23 @@ _CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor(
         full_name='ChannelSettings.ModemConfig',
         filename=None,
         file=DESCRIPTOR,
      -  create_key=_descriptor._internal_create_key,
         values=[
           _descriptor.EnumValueDescriptor(
             name='Bw125Cr45Sf128', index=0, number=0,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
             name='Bw500Cr45Sf128', index=1, number=1,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
             name='Bw31_25Cr48Sf512', index=2, number=2,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
             name='Bw125Cr48Sf4096', index=3, number=3,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
         ],
         containing_type=None,
         serialized_options=None,
      @@ -93,23 +86,19 @@ _CHANNEL_ROLE = _descriptor.EnumDescriptor(
         full_name='Channel.Role',
         filename=None,
         file=DESCRIPTOR,
      -  create_key=_descriptor._internal_create_key,
         values=[
           _descriptor.EnumValueDescriptor(
             name='DISABLED', index=0, number=0,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
             name='PRIMARY', index=1, number=1,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
             name='SECONDARY', index=2, number=2,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
         ],
         containing_type=None,
         serialized_options=None,
      @@ -125,7 +114,6 @@ _CHANNELSETTINGS = _descriptor.Descriptor(
         filename=None,
         file=DESCRIPTOR,
         containing_type=None,
      -  create_key=_descriptor._internal_create_key,
         fields=[
           _descriptor.FieldDescriptor(
             name='tx_power', full_name='ChannelSettings.tx_power', index=0,
      @@ -133,77 +121,77 @@ _CHANNELSETTINGS = _descriptor.Descriptor(
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='modem_config', full_name='ChannelSettings.modem_config', index=1,
             number=3, type=14, cpp_type=8, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='bandwidth', full_name='ChannelSettings.bandwidth', index=2,
             number=6, type=13, cpp_type=3, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='spread_factor', full_name='ChannelSettings.spread_factor', index=3,
             number=7, type=13, cpp_type=3, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='coding_rate', full_name='ChannelSettings.coding_rate', index=4,
             number=8, type=13, cpp_type=3, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='channel_num', full_name='ChannelSettings.channel_num', index=5,
             number=9, type=13, cpp_type=3, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='psk', full_name='ChannelSettings.psk', index=6,
             number=4, type=12, cpp_type=9, label=1,
             has_default_value=False, default_value=b"",
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='name', full_name='ChannelSettings.name', index=7,
             number=5, type=9, cpp_type=9, label=1,
             has_default_value=False, default_value=b"".decode('utf-8'),
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='id', full_name='ChannelSettings.id', index=8,
             number=10, type=7, cpp_type=3, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='uplink_enabled', full_name='ChannelSettings.uplink_enabled', index=9,
             number=16, type=8, cpp_type=7, label=1,
             has_default_value=False, default_value=False,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='downlink_enabled', full_name='ChannelSettings.downlink_enabled', index=10,
             number=17, type=8, cpp_type=7, label=1,
             has_default_value=False, default_value=False,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
         ],
         extensions=[
         ],
      @@ -228,7 +216,6 @@ _CHANNEL = _descriptor.Descriptor(
         filename=None,
         file=DESCRIPTOR,
         containing_type=None,
      -  create_key=_descriptor._internal_create_key,
         fields=[
           _descriptor.FieldDescriptor(
             name='index', full_name='Channel.index', index=0,
      @@ -236,21 +223,21 @@ _CHANNEL = _descriptor.Descriptor(
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='settings', full_name='Channel.settings', index=1,
             number=2, type=11, cpp_type=10, label=1,
             has_default_value=False, default_value=None,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='role', full_name='Channel.role', index=2,
             number=3, type=14, cpp_type=8, label=1,
             has_default_value=False, default_value=0,
             message_type=None, enum_type=None, containing_type=None,
             is_extension=False, extension_scope=None,
      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
         ],
         extensions=[
         ],
      @@ -307,13 +294,16 @@ DESCRIPTOR._options = None
       
      class Channel -(*args, **kwargs) +(**kwargs)
      -

      A ProtocolMessage

      +

      Abstract base class for protocol messages.

      +

      Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

      Ancestors

        -
      • google.protobuf.pyext._message.CMessage
      • google.protobuf.message.Message

      Class variables

      @@ -326,10 +316,18 @@ DESCRIPTOR._options = None
      +
      var INDEX_FIELD_NUMBER
      +
      +
      +
      var PRIMARY
      +
      var ROLE_FIELD_NUMBER
      +
      +
      +
      var Role
      @@ -338,36 +336,577 @@ DESCRIPTOR._options = None
      +
      var SETTINGS_FIELD_NUMBER
      +
      +
      +
      +
      +

      Static methods

      +
      +
      +def FromString(s) +
      +
      +
      +
      + +Expand source code + +
      def FromString(s):
      +  message = cls()
      +  message.MergeFromString(s)
      +  return message
      +
      +
      +
      +def RegisterExtension(extension_handle) +
      +
      +
      +
      + +Expand source code + +
      def RegisterExtension(extension_handle):
      +  extension_handle.containing_type = cls.DESCRIPTOR
      +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
      +  # pylint: disable=protected-access
      +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
      +  _AttachFieldHelpers(cls, extension_handle)
      +
      +

      Instance variables

      var index
      -

      Field Channel.index

      +

      Getter for index.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var role
      -

      Field Channel.role

      +

      Getter for role.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var settings
      -

      Field Channel.settings

      +

      Getter for settings.

      +
      + +Expand source code + +
      def getter(self):
      +  field_value = self._fields.get(field)
      +  if field_value is None:
      +    # Construct a new object to represent this field.
      +    field_value = field._default_constructor(self)
      +
      +    # Atomically check if another thread has preempted us and, if not, swap
      +    # in the new object we just created.  If someone has preempted us, we
      +    # take that object and discard ours.
      +    # WARNING:  We are relying on setdefault() being atomic.  This is true
      +    #   in CPython but we haven't investigated others.  This warning appears
      +    #   in several other locations in this file.
      +    field_value = self._fields.setdefault(field, field_value)
      +  return field_value
      +
      +
      +
      +

      Methods

      +
      +
      +def ByteSize(self) +
      +
      +
      +
      + +Expand source code + +
      def ByteSize(self):
      +  if not self._cached_byte_size_dirty:
      +    return self._cached_byte_size
      +
      +  size = 0
      +  descriptor = self.DESCRIPTOR
      +  if descriptor.GetOptions().map_entry:
      +    # Fields of map entry should always be serialized.
      +    size = descriptor.fields_by_name['key']._sizer(self.key)
      +    size += descriptor.fields_by_name['value']._sizer(self.value)
      +  else:
      +    for field_descriptor, field_value in self.ListFields():
      +      size += field_descriptor._sizer(field_value)
      +    for tag_bytes, value_bytes in self._unknown_fields:
      +      size += len(tag_bytes) + len(value_bytes)
      +
      +  self._cached_byte_size = size
      +  self._cached_byte_size_dirty = False
      +  self._listener_for_children.dirty = False
      +  return size
      +
      +
      +
      +def Clear(self) +
      +
      +
      +
      + +Expand source code + +
      def _Clear(self):
      +  # Clear fields.
      +  self._fields = {}
      +  self._unknown_fields = ()
      +  # pylint: disable=protected-access
      +  if self._unknown_field_set is not None:
      +    self._unknown_field_set._clear()
      +    self._unknown_field_set = None
      +
      +  self._oneofs = {}
      +  self._Modified()
      +
      +
      +
      +def ClearField(self, field_name) +
      +
      +
      +
      + +Expand source code + +
      def ClearField(self, field_name):
      +  try:
      +    field = message_descriptor.fields_by_name[field_name]
      +  except KeyError:
      +    try:
      +      field = message_descriptor.oneofs_by_name[field_name]
      +      if field in self._oneofs:
      +        field = self._oneofs[field]
      +      else:
      +        return
      +    except KeyError:
      +      raise ValueError('Protocol message %s has no "%s" field.' %
      +                       (message_descriptor.name, field_name))
      +
      +  if field in self._fields:
      +    # To match the C++ implementation, we need to invalidate iterators
      +    # for map fields when ClearField() happens.
      +    if hasattr(self._fields[field], 'InvalidateIterators'):
      +      self._fields[field].InvalidateIterators()
      +
      +    # Note:  If the field is a sub-message, its listener will still point
      +    #   at us.  That's fine, because the worst than can happen is that it
      +    #   will call _Modified() and invalidate our byte size.  Big deal.
      +    del self._fields[field]
      +
      +    if self._oneofs.get(field.containing_oneof, None) is field:
      +      del self._oneofs[field.containing_oneof]
      +
      +  # Always call _Modified() -- even if nothing was changed, this is
      +  # a mutating method, and thus calling it should cause the field to become
      +  # present in the parent message.
      +  self._Modified()
      +
      +
      +
      +def DiscardUnknownFields(self) +
      +
      +
      +
      + +Expand source code + +
      def _DiscardUnknownFields(self):
      +  self._unknown_fields = []
      +  self._unknown_field_set = None      # pylint: disable=protected-access
      +  for field, value in self.ListFields():
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if _IsMapField(field):
      +        if _IsMessageMapField(field):
      +          for key in value:
      +            value[key].DiscardUnknownFields()
      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
      +        for sub_message in value:
      +          sub_message.DiscardUnknownFields()
      +      else:
      +        value.DiscardUnknownFields()
      +
      +
      +
      +def FindInitializationErrors(self) +
      +
      +

      Finds required fields which are not initialized.

      +

      Returns

      +

      A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

      +
      + +Expand source code + +
      def FindInitializationErrors(self):
      +  """Finds required fields which are not initialized.
      +
      +  Returns:
      +    A list of strings.  Each string is a path to an uninitialized field from
      +    the top-level message, e.g. "foo.bar[5].baz".
      +  """
      +
      +  errors = []  # simplify things
      +
      +  for field in required_fields:
      +    if not self.HasField(field.name):
      +      errors.append(field.name)
      +
      +  for field, value in self.ListFields():
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if field.is_extension:
      +        name = '(%s)' % field.full_name
      +      else:
      +        name = field.name
      +
      +      if _IsMapField(field):
      +        if _IsMessageMapField(field):
      +          for key in value:
      +            element = value[key]
      +            prefix = '%s[%s].' % (name, key)
      +            sub_errors = element.FindInitializationErrors()
      +            errors += [prefix + error for error in sub_errors]
      +        else:
      +          # ScalarMaps can't have any initialization errors.
      +          pass
      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
      +        for i in range(len(value)):
      +          element = value[i]
      +          prefix = '%s[%d].' % (name, i)
      +          sub_errors = element.FindInitializationErrors()
      +          errors += [prefix + error for error in sub_errors]
      +      else:
      +        prefix = name + '.'
      +        sub_errors = value.FindInitializationErrors()
      +        errors += [prefix + error for error in sub_errors]
      +
      +  return errors
      +
      +
      +
      +def HasField(self, field_name) +
      +
      +
      +
      + +Expand source code + +
      def HasField(self, field_name):
      +  try:
      +    field = hassable_fields[field_name]
      +  except KeyError:
      +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
      +
      +  if isinstance(field, descriptor_mod.OneofDescriptor):
      +    try:
      +      return HasField(self, self._oneofs[field].name)
      +    except KeyError:
      +      return False
      +  else:
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      value = self._fields.get(field)
      +      return value is not None and value._is_present_in_parent
      +    else:
      +      return field in self._fields
      +
      +
      +
      +def IsInitialized(self, errors=None) +
      +
      +

      Checks if all required fields of a message are set.

      +

      Args

      +
      +
      errors
      +
      A list which, if provided, will be populated with the field +paths of all missing required fields.
      +
      +

      Returns

      +

      True iff the specified message has all required fields set.

      +
      + +Expand source code + +
      def IsInitialized(self, errors=None):
      +  """Checks if all required fields of a message are set.
      +
      +  Args:
      +    errors:  A list which, if provided, will be populated with the field
      +             paths of all missing required fields.
      +
      +  Returns:
      +    True iff the specified message has all required fields set.
      +  """
      +
      +  # Performance is critical so we avoid HasField() and ListFields().
      +
      +  for field in required_fields:
      +    if (field not in self._fields or
      +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
      +         not self._fields[field]._is_present_in_parent)):
      +      if errors is not None:
      +        errors.extend(self.FindInitializationErrors())
      +      return False
      +
      +  for field, value in list(self._fields.items()):  # dict can change size!
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if field.label == _FieldDescriptor.LABEL_REPEATED:
      +        if (field.message_type.has_options and
      +            field.message_type.GetOptions().map_entry):
      +          continue
      +        for element in value:
      +          if not element.IsInitialized():
      +            if errors is not None:
      +              errors.extend(self.FindInitializationErrors())
      +            return False
      +      elif value._is_present_in_parent and not value.IsInitialized():
      +        if errors is not None:
      +          errors.extend(self.FindInitializationErrors())
      +        return False
      +
      +  return True
      +
      +
      +
      +def ListFields(self) +
      +
      +
      +
      + +Expand source code + +
      def ListFields(self):
      +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
      +  all_fields.sort(key = lambda item: item[0].number)
      +  return all_fields
      +
      +
      +
      +def MergeFrom(self, msg) +
      +
      +
      +
      + +Expand source code + +
      def MergeFrom(self, msg):
      +  if not isinstance(msg, cls):
      +    raise TypeError(
      +        'Parameter to MergeFrom() must be instance of same class: '
      +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
      +                                 _FullyQualifiedClassName(msg.__class__)))
      +
      +  assert msg is not self
      +  self._Modified()
      +
      +  fields = self._fields
      +
      +  for field, value in msg._fields.items():
      +    if field.label == LABEL_REPEATED:
      +      field_value = fields.get(field)
      +      if field_value is None:
      +        # Construct a new object to represent this field.
      +        field_value = field._default_constructor(self)
      +        fields[field] = field_value
      +      field_value.MergeFrom(value)
      +    elif field.cpp_type == CPPTYPE_MESSAGE:
      +      if value._is_present_in_parent:
      +        field_value = fields.get(field)
      +        if field_value is None:
      +          # Construct a new object to represent this field.
      +          field_value = field._default_constructor(self)
      +          fields[field] = field_value
      +        field_value.MergeFrom(value)
      +    else:
      +      self._fields[field] = value
      +      if field.containing_oneof:
      +        self._UpdateOneofState(field)
      +
      +  if msg._unknown_fields:
      +    if not self._unknown_fields:
      +      self._unknown_fields = []
      +    self._unknown_fields.extend(msg._unknown_fields)
      +    # pylint: disable=protected-access
      +    if self._unknown_field_set is None:
      +      self._unknown_field_set = containers.UnknownFieldSet()
      +    self._unknown_field_set._extend(msg._unknown_field_set)
      +
      +
      +
      +def MergeFromString(self, serialized) +
      +
      +
      +
      + +Expand source code + +
      def MergeFromString(self, serialized):
      +  serialized = memoryview(serialized)
      +  length = len(serialized)
      +  try:
      +    if self._InternalParse(serialized, 0, length) != length:
      +      # The only reason _InternalParse would return early is if it
      +      # encountered an end-group tag.
      +      raise message_mod.DecodeError('Unexpected end-group tag.')
      +  except (IndexError, TypeError):
      +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
      +    raise message_mod.DecodeError('Truncated message.')
      +  except struct.error as e:
      +    raise message_mod.DecodeError(e)
      +  return length   # Return this for legacy reasons.
      +
      +
      +
      +def SerializePartialToString(self, **kwargs) +
      +
      +
      +
      + +Expand source code + +
      def SerializePartialToString(self, **kwargs):
      +  out = BytesIO()
      +  self._InternalSerialize(out.write, **kwargs)
      +  return out.getvalue()
      +
      +
      +
      +def SerializeToString(self, **kwargs) +
      +
      +
      +
      + +Expand source code + +
      def SerializeToString(self, **kwargs):
      +  # Check if the message has all of its required fields set.
      +  if not self.IsInitialized():
      +    raise message_mod.EncodeError(
      +        'Message %s is missing required fields: %s' % (
      +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
      +  return self.SerializePartialToString(**kwargs)
      +
      +
      +
      +def SetInParent(self) +
      +
      +

      Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

      +
      + +Expand source code + +
      def Modified(self):
      +  """Sets the _cached_byte_size_dirty bit to true,
      +  and propagates this to our listener iff this was a state change.
      +  """
      +
      +  # Note:  Some callers check _cached_byte_size_dirty before calling
      +  #   _Modified() as an extra optimization.  So, if this method is ever
      +  #   changed such that it does stuff even when _cached_byte_size_dirty is
      +  #   already true, the callers need to be updated.
      +  if not self._cached_byte_size_dirty:
      +    self._cached_byte_size_dirty = True
      +    self._listener_for_children.dirty = True
      +    self._is_present_in_parent = True
      +    self._listener.Modified()
      +
      +
      +
      +def UnknownFields(self) +
      +
      +
      +
      + +Expand source code + +
      def _UnknownFields(self):
      +  if self._unknown_field_set is None:  # pylint: disable=protected-access
      +    # pylint: disable=protected-access
      +    self._unknown_field_set = containers.UnknownFieldSet()
      +  return self._unknown_field_set    # pylint: disable=protected-access
      +
      +
      +
      +def WhichOneof(self, oneof_name) +
      +
      +

      Returns the name of the currently set field inside a oneof, or None.

      +
      + +Expand source code + +
      def WhichOneof(self, oneof_name):
      +  """Returns the name of the currently set field inside a oneof, or None."""
      +  try:
      +    field = message_descriptor.oneofs_by_name[oneof_name]
      +  except KeyError:
      +    raise ValueError(
      +        'Protocol message has no oneof "%s" field.' % oneof_name)
      +
      +  nested_field = self._oneofs.get(field, None)
      +  if nested_field is not None and self.HasField(nested_field.name):
      +    return nested_field.name
      +  else:
      +    return None
      +
      class ChannelSettings -(*args, **kwargs) +(**kwargs)
      -

      A ProtocolMessage

      +

      Abstract base class for protocol messages.

      +

      Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

      Ancestors

        -
      • google.protobuf.pyext._message.CMessage
      • google.protobuf.message.Message

      Class variables

      +
      var BANDWIDTH_FIELD_NUMBER
      +
      +
      +
      var Bw125Cr45Sf128
      @@ -384,60 +923,692 @@ DESCRIPTOR._options = None
      +
      var CHANNEL_NUM_FIELD_NUMBER
      +
      +
      +
      +
      var CODING_RATE_FIELD_NUMBER
      +
      +
      +
      var DESCRIPTOR
      + +
      +
      +
      +
      var ID_FIELD_NUMBER
      +
      +
      +
      +
      var MODEM_CONFIG_FIELD_NUMBER
      +
      +
      +
      var ModemConfig
      +
      var NAME_FIELD_NUMBER
      +
      +
      +
      +
      var PSK_FIELD_NUMBER
      +
      +
      +
      +
      var SPREAD_FACTOR_FIELD_NUMBER
      +
      +
      +
      +
      var TX_POWER_FIELD_NUMBER
      +
      +
      +
      + +
      +
      +
      +
      +

      Static methods

      +
      +
      +def FromString(s) +
      +
      +
      +
      + +Expand source code + +
      def FromString(s):
      +  message = cls()
      +  message.MergeFromString(s)
      +  return message
      +
      +
      +
      +def RegisterExtension(extension_handle) +
      +
      +
      +
      + +Expand source code + +
      def RegisterExtension(extension_handle):
      +  extension_handle.containing_type = cls.DESCRIPTOR
      +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
      +  # pylint: disable=protected-access
      +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
      +  _AttachFieldHelpers(cls, extension_handle)
      +
      +

      Instance variables

      var bandwidth
      -

      Field ChannelSettings.bandwidth

      +

      Getter for bandwidth.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var channel_num
      -

      Field ChannelSettings.channel_num

      +

      Getter for channel_num.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var coding_rate
      -

      Field ChannelSettings.coding_rate

      +

      Getter for coding_rate.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      -

      Field ChannelSettings.downlink_enabled

      +

      Getter for downlink_enabled.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var id
      -

      Field ChannelSettings.id

      +

      Getter for id.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var modem_config
      -

      Field ChannelSettings.modem_config

      +

      Getter for modem_config.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var name
      -

      Field ChannelSettings.name

      +

      Getter for name.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var psk
      -

      Field ChannelSettings.psk

      +

      Getter for psk.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var spread_factor
      -

      Field ChannelSettings.spread_factor

      +

      Getter for spread_factor.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      var tx_power
      -

      Field ChannelSettings.tx_power

      +

      Getter for tx_power.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      -

      Field ChannelSettings.uplink_enabled

      +

      Getter for uplink_enabled.

      +
      + +Expand source code + +
      def getter(self):
      +  # TODO(protobuf-team): This may be broken since there may not be
      +  # default_value.  Combine with has_default_value somehow.
      +  return self._fields.get(field, default_value)
      +
      +
      +
      +

      Methods

      +
      +
      +def ByteSize(self) +
      +
      +
      +
      + +Expand source code + +
      def ByteSize(self):
      +  if not self._cached_byte_size_dirty:
      +    return self._cached_byte_size
      +
      +  size = 0
      +  descriptor = self.DESCRIPTOR
      +  if descriptor.GetOptions().map_entry:
      +    # Fields of map entry should always be serialized.
      +    size = descriptor.fields_by_name['key']._sizer(self.key)
      +    size += descriptor.fields_by_name['value']._sizer(self.value)
      +  else:
      +    for field_descriptor, field_value in self.ListFields():
      +      size += field_descriptor._sizer(field_value)
      +    for tag_bytes, value_bytes in self._unknown_fields:
      +      size += len(tag_bytes) + len(value_bytes)
      +
      +  self._cached_byte_size = size
      +  self._cached_byte_size_dirty = False
      +  self._listener_for_children.dirty = False
      +  return size
      +
      +
      +
      +def Clear(self) +
      +
      +
      +
      + +Expand source code + +
      def _Clear(self):
      +  # Clear fields.
      +  self._fields = {}
      +  self._unknown_fields = ()
      +  # pylint: disable=protected-access
      +  if self._unknown_field_set is not None:
      +    self._unknown_field_set._clear()
      +    self._unknown_field_set = None
      +
      +  self._oneofs = {}
      +  self._Modified()
      +
      +
      +
      +def ClearField(self, field_name) +
      +
      +
      +
      + +Expand source code + +
      def ClearField(self, field_name):
      +  try:
      +    field = message_descriptor.fields_by_name[field_name]
      +  except KeyError:
      +    try:
      +      field = message_descriptor.oneofs_by_name[field_name]
      +      if field in self._oneofs:
      +        field = self._oneofs[field]
      +      else:
      +        return
      +    except KeyError:
      +      raise ValueError('Protocol message %s has no "%s" field.' %
      +                       (message_descriptor.name, field_name))
      +
      +  if field in self._fields:
      +    # To match the C++ implementation, we need to invalidate iterators
      +    # for map fields when ClearField() happens.
      +    if hasattr(self._fields[field], 'InvalidateIterators'):
      +      self._fields[field].InvalidateIterators()
      +
      +    # Note:  If the field is a sub-message, its listener will still point
      +    #   at us.  That's fine, because the worst than can happen is that it
      +    #   will call _Modified() and invalidate our byte size.  Big deal.
      +    del self._fields[field]
      +
      +    if self._oneofs.get(field.containing_oneof, None) is field:
      +      del self._oneofs[field.containing_oneof]
      +
      +  # Always call _Modified() -- even if nothing was changed, this is
      +  # a mutating method, and thus calling it should cause the field to become
      +  # present in the parent message.
      +  self._Modified()
      +
      +
      +
      +def DiscardUnknownFields(self) +
      +
      +
      +
      + +Expand source code + +
      def _DiscardUnknownFields(self):
      +  self._unknown_fields = []
      +  self._unknown_field_set = None      # pylint: disable=protected-access
      +  for field, value in self.ListFields():
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if _IsMapField(field):
      +        if _IsMessageMapField(field):
      +          for key in value:
      +            value[key].DiscardUnknownFields()
      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
      +        for sub_message in value:
      +          sub_message.DiscardUnknownFields()
      +      else:
      +        value.DiscardUnknownFields()
      +
      +
      +
      +def FindInitializationErrors(self) +
      +
      +

      Finds required fields which are not initialized.

      +

      Returns

      +

      A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

      +
      + +Expand source code + +
      def FindInitializationErrors(self):
      +  """Finds required fields which are not initialized.
      +
      +  Returns:
      +    A list of strings.  Each string is a path to an uninitialized field from
      +    the top-level message, e.g. "foo.bar[5].baz".
      +  """
      +
      +  errors = []  # simplify things
      +
      +  for field in required_fields:
      +    if not self.HasField(field.name):
      +      errors.append(field.name)
      +
      +  for field, value in self.ListFields():
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if field.is_extension:
      +        name = '(%s)' % field.full_name
      +      else:
      +        name = field.name
      +
      +      if _IsMapField(field):
      +        if _IsMessageMapField(field):
      +          for key in value:
      +            element = value[key]
      +            prefix = '%s[%s].' % (name, key)
      +            sub_errors = element.FindInitializationErrors()
      +            errors += [prefix + error for error in sub_errors]
      +        else:
      +          # ScalarMaps can't have any initialization errors.
      +          pass
      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
      +        for i in range(len(value)):
      +          element = value[i]
      +          prefix = '%s[%d].' % (name, i)
      +          sub_errors = element.FindInitializationErrors()
      +          errors += [prefix + error for error in sub_errors]
      +      else:
      +        prefix = name + '.'
      +        sub_errors = value.FindInitializationErrors()
      +        errors += [prefix + error for error in sub_errors]
      +
      +  return errors
      +
      +
      +
      +def HasField(self, field_name) +
      +
      +
      +
      + +Expand source code + +
      def HasField(self, field_name):
      +  try:
      +    field = hassable_fields[field_name]
      +  except KeyError:
      +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
      +
      +  if isinstance(field, descriptor_mod.OneofDescriptor):
      +    try:
      +      return HasField(self, self._oneofs[field].name)
      +    except KeyError:
      +      return False
      +  else:
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      value = self._fields.get(field)
      +      return value is not None and value._is_present_in_parent
      +    else:
      +      return field in self._fields
      +
      +
      +
      +def IsInitialized(self, errors=None) +
      +
      +

      Checks if all required fields of a message are set.

      +

      Args

      +
      +
      errors
      +
      A list which, if provided, will be populated with the field +paths of all missing required fields.
      +
      +

      Returns

      +

      True iff the specified message has all required fields set.

      +
      + +Expand source code + +
      def IsInitialized(self, errors=None):
      +  """Checks if all required fields of a message are set.
      +
      +  Args:
      +    errors:  A list which, if provided, will be populated with the field
      +             paths of all missing required fields.
      +
      +  Returns:
      +    True iff the specified message has all required fields set.
      +  """
      +
      +  # Performance is critical so we avoid HasField() and ListFields().
      +
      +  for field in required_fields:
      +    if (field not in self._fields or
      +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
      +         not self._fields[field]._is_present_in_parent)):
      +      if errors is not None:
      +        errors.extend(self.FindInitializationErrors())
      +      return False
      +
      +  for field, value in list(self._fields.items()):  # dict can change size!
      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
      +      if field.label == _FieldDescriptor.LABEL_REPEATED:
      +        if (field.message_type.has_options and
      +            field.message_type.GetOptions().map_entry):
      +          continue
      +        for element in value:
      +          if not element.IsInitialized():
      +            if errors is not None:
      +              errors.extend(self.FindInitializationErrors())
      +            return False
      +      elif value._is_present_in_parent and not value.IsInitialized():
      +        if errors is not None:
      +          errors.extend(self.FindInitializationErrors())
      +        return False
      +
      +  return True
      +
      +
      +
      +def ListFields(self) +
      +
      +
      +
      + +Expand source code + +
      def ListFields(self):
      +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
      +  all_fields.sort(key = lambda item: item[0].number)
      +  return all_fields
      +
      +
      +
      +def MergeFrom(self, msg) +
      +
      +
      +
      + +Expand source code + +
      def MergeFrom(self, msg):
      +  if not isinstance(msg, cls):
      +    raise TypeError(
      +        'Parameter to MergeFrom() must be instance of same class: '
      +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
      +                                 _FullyQualifiedClassName(msg.__class__)))
      +
      +  assert msg is not self
      +  self._Modified()
      +
      +  fields = self._fields
      +
      +  for field, value in msg._fields.items():
      +    if field.label == LABEL_REPEATED:
      +      field_value = fields.get(field)
      +      if field_value is None:
      +        # Construct a new object to represent this field.
      +        field_value = field._default_constructor(self)
      +        fields[field] = field_value
      +      field_value.MergeFrom(value)
      +    elif field.cpp_type == CPPTYPE_MESSAGE:
      +      if value._is_present_in_parent:
      +        field_value = fields.get(field)
      +        if field_value is None:
      +          # Construct a new object to represent this field.
      +          field_value = field._default_constructor(self)
      +          fields[field] = field_value
      +        field_value.MergeFrom(value)
      +    else:
      +      self._fields[field] = value
      +      if field.containing_oneof:
      +        self._UpdateOneofState(field)
      +
      +  if msg._unknown_fields:
      +    if not self._unknown_fields:
      +      self._unknown_fields = []
      +    self._unknown_fields.extend(msg._unknown_fields)
      +    # pylint: disable=protected-access
      +    if self._unknown_field_set is None:
      +      self._unknown_field_set = containers.UnknownFieldSet()
      +    self._unknown_field_set._extend(msg._unknown_field_set)
      +
      +
      +
      +def MergeFromString(self, serialized) +
      +
      +
      +
      + +Expand source code + +
      def MergeFromString(self, serialized):
      +  serialized = memoryview(serialized)
      +  length = len(serialized)
      +  try:
      +    if self._InternalParse(serialized, 0, length) != length:
      +      # The only reason _InternalParse would return early is if it
      +      # encountered an end-group tag.
      +      raise message_mod.DecodeError('Unexpected end-group tag.')
      +  except (IndexError, TypeError):
      +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
      +    raise message_mod.DecodeError('Truncated message.')
      +  except struct.error as e:
      +    raise message_mod.DecodeError(e)
      +  return length   # Return this for legacy reasons.
      +
      +
      +
      +def SerializePartialToString(self, **kwargs) +
      +
      +
      +
      + +Expand source code + +
      def SerializePartialToString(self, **kwargs):
      +  out = BytesIO()
      +  self._InternalSerialize(out.write, **kwargs)
      +  return out.getvalue()
      +
      +
      +
      +def SerializeToString(self, **kwargs) +
      +
      +
      +
      + +Expand source code + +
      def SerializeToString(self, **kwargs):
      +  # Check if the message has all of its required fields set.
      +  if not self.IsInitialized():
      +    raise message_mod.EncodeError(
      +        'Message %s is missing required fields: %s' % (
      +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
      +  return self.SerializePartialToString(**kwargs)
      +
      +
      +
      +def SetInParent(self) +
      +
      +

      Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

      +
      + +Expand source code + +
      def Modified(self):
      +  """Sets the _cached_byte_size_dirty bit to true,
      +  and propagates this to our listener iff this was a state change.
      +  """
      +
      +  # Note:  Some callers check _cached_byte_size_dirty before calling
      +  #   _Modified() as an extra optimization.  So, if this method is ever
      +  #   changed such that it does stuff even when _cached_byte_size_dirty is
      +  #   already true, the callers need to be updated.
      +  if not self._cached_byte_size_dirty:
      +    self._cached_byte_size_dirty = True
      +    self._listener_for_children.dirty = True
      +    self._is_present_in_parent = True
      +    self._listener.Modified()
      +
      +
      +
      +def UnknownFields(self) +
      +
      +
      +
      + +Expand source code + +
      def _UnknownFields(self):
      +  if self._unknown_field_set is None:  # pylint: disable=protected-access
      +    # pylint: disable=protected-access
      +    self._unknown_field_set = containers.UnknownFieldSet()
      +  return self._unknown_field_set    # pylint: disable=protected-access
      +
      +
      +
      +def WhichOneof(self, oneof_name) +
      +
      +

      Returns the name of the currently set field inside a oneof, or None.

      +
      + +Expand source code + +
      def WhichOneof(self, oneof_name):
      +  """Returns the name of the currently set field inside a oneof, or None."""
      +  try:
      +    field = message_descriptor.oneofs_by_name[oneof_name]
      +  except KeyError:
      +    raise ValueError(
      +        'Protocol message has no oneof "%s" field.' % oneof_name)
      +
      +  nested_field = self._oneofs.get(field, None)
      +  if nested_field is not None and self.HasField(nested_field.name):
      +    return nested_field.name
      +  else:
      +    return None
      +
      @@ -459,12 +1630,32 @@ DESCRIPTOR._options = None
      • Channel

        -
          +
            +
          • ByteSize
          • +
          • Clear
          • +
          • ClearField
          • DESCRIPTOR
          • DISABLED
          • +
          • DiscardUnknownFields
          • +
          • FindInitializationErrors
          • +
          • FromString
          • +
          • HasField
          • +
          • INDEX_FIELD_NUMBER
          • +
          • IsInitialized
          • +
          • ListFields
          • +
          • MergeFrom
          • +
          • MergeFromString
          • PRIMARY
          • +
          • ROLE_FIELD_NUMBER
          • +
          • RegisterExtension
          • Role
          • SECONDARY
          • +
          • SETTINGS_FIELD_NUMBER
          • +
          • SerializePartialToString
          • +
          • SerializeToString
          • +
          • SetInParent
          • +
          • UnknownFields
          • +
          • WhichOneof
          • index
          • role
          • settings
          • @@ -472,13 +1663,41 @@ DESCRIPTOR._options = None
          • ChannelSettings

            -
              +
                +
              • BANDWIDTH_FIELD_NUMBER
              • Bw125Cr45Sf128
              • Bw125Cr48Sf4096
              • Bw31_25Cr48Sf512
              • Bw500Cr45Sf128
              • +
              • ByteSize
              • +
              • CHANNEL_NUM_FIELD_NUMBER
              • +
              • CODING_RATE_FIELD_NUMBER
              • +
              • Clear
              • +
              • ClearField
              • DESCRIPTOR
              • +
              • DOWNLINK_ENABLED_FIELD_NUMBER
              • +
              • DiscardUnknownFields
              • +
              • FindInitializationErrors
              • +
              • FromString
              • +
              • HasField
              • +
              • ID_FIELD_NUMBER
              • +
              • IsInitialized
              • +
              • ListFields
              • +
              • MODEM_CONFIG_FIELD_NUMBER
              • +
              • MergeFrom
              • +
              • MergeFromString
              • ModemConfig
              • +
              • NAME_FIELD_NUMBER
              • +
              • PSK_FIELD_NUMBER
              • +
              • RegisterExtension
              • +
              • SPREAD_FACTOR_FIELD_NUMBER
              • +
              • SerializePartialToString
              • +
              • SerializeToString
              • +
              • SetInParent
              • +
              • TX_POWER_FIELD_NUMBER
              • +
              • UPLINK_ENABLED_FIELD_NUMBER
              • +
              • UnknownFields
              • +
              • WhichOneof
              • bandwidth
              • channel_num
              • coding_rate
              • @@ -498,7 +1717,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/deviceonly_pb2.html b/docs/meshtastic/deviceonly_pb2.html index 7c48d74..09d7afc 100644 --- a/docs/meshtastic/deviceonly_pb2.html +++ b/docs/meshtastic/deviceonly_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.deviceonly_pb2 API documentation - + @@ -22,7 +22,6 @@

                Module meshtastic.deviceonly_pb2

                -

                Generated protocol buffer code.

                Expand source code @@ -30,7 +29,7 @@
                # -*- coding: utf-8 -*-
                 # Generated by the protocol buffer compiler.  DO NOT EDIT!
                 # source: deviceonly.proto
                -"""Generated protocol buffer code."""
                +
                 from google.protobuf import descriptor as _descriptor
                 from google.protobuf import message as _message
                 from google.protobuf import reflection as _reflection
                @@ -50,7 +49,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
                   package='',
                   syntax='proto3',
                   serialized_options=b'\n\023com.geeksville.meshB\nDeviceOnlyH\003Z!github.com/meshtastic/gomeshproto',
                -  create_key=_descriptor._internal_create_key,
                   serialized_pb=b'\n\x10\x64\x65viceonly.proto\x1a\nmesh.proto\x1a\rchannel.proto\x1a\x11radioconfig.proto\"\x80\x01\n\x11LegacyRadioConfig\x12\x39\n\x0bpreferences\x18\x01 \x01(\x0b\x32$.LegacyRadioConfig.LegacyPreferences\x1a\x30\n\x11LegacyPreferences\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\"\x8f\x02\n\x0b\x44\x65viceState\x12\'\n\x0blegacyRadio\x18\x01 \x01(\x0b\x32\x12.LegacyRadioConfig\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\x1a\n\x07node_db\x18\x04 \x03(\x0b\x32\t.NodeInfo\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07no_save\x18\t \x01(\x08\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08J\x04\x08\x0c\x10\r\")\n\x0b\x43hannelFile\x12\x1a\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x08.ChannelBF\n\x13\x63om.geeksville.meshB\nDeviceOnlyH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                   ,
                   dependencies=[mesh__pb2.DESCRIPTOR,channel__pb2.DESCRIPTOR,radioconfig__pb2.DESCRIPTOR,])
                @@ -64,7 +62,6 @@ _LEGACYRADIOCONFIG_LEGACYPREFERENCES = _descriptor.Descriptor(
                   filename=None,
                   file=DESCRIPTOR,
                   containing_type=None,
                -  create_key=_descriptor._internal_create_key,
                   fields=[
                     _descriptor.FieldDescriptor(
                       name='region', full_name='LegacyRadioConfig.LegacyPreferences.region', index=0,
                @@ -72,7 +69,7 @@ _LEGACYRADIOCONFIG_LEGACYPREFERENCES = _descriptor.Descriptor(
                       has_default_value=False, default_value=0,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                   ],
                   extensions=[
                   ],
                @@ -95,7 +92,6 @@ _LEGACYRADIOCONFIG = _descriptor.Descriptor(
                   filename=None,
                   file=DESCRIPTOR,
                   containing_type=None,
                -  create_key=_descriptor._internal_create_key,
                   fields=[
                     _descriptor.FieldDescriptor(
                       name='preferences', full_name='LegacyRadioConfig.preferences', index=0,
                @@ -103,7 +99,7 @@ _LEGACYRADIOCONFIG = _descriptor.Descriptor(
                       has_default_value=False, default_value=None,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                   ],
                   extensions=[
                   ],
                @@ -127,7 +123,6 @@ _DEVICESTATE = _descriptor.Descriptor(
                   filename=None,
                   file=DESCRIPTOR,
                   containing_type=None,
                -  create_key=_descriptor._internal_create_key,
                   fields=[
                     _descriptor.FieldDescriptor(
                       name='legacyRadio', full_name='DeviceState.legacyRadio', index=0,
                @@ -135,63 +130,63 @@ _DEVICESTATE = _descriptor.Descriptor(
                       has_default_value=False, default_value=None,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='my_node', full_name='DeviceState.my_node', index=1,
                       number=2, type=11, cpp_type=10, label=1,
                       has_default_value=False, default_value=None,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='owner', full_name='DeviceState.owner', index=2,
                       number=3, type=11, cpp_type=10, label=1,
                       has_default_value=False, default_value=None,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='node_db', full_name='DeviceState.node_db', index=3,
                       number=4, type=11, cpp_type=10, label=3,
                       has_default_value=False, default_value=[],
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='receive_queue', full_name='DeviceState.receive_queue', index=4,
                       number=5, type=11, cpp_type=10, label=3,
                       has_default_value=False, default_value=[],
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='version', full_name='DeviceState.version', index=5,
                       number=8, type=13, cpp_type=3, label=1,
                       has_default_value=False, default_value=0,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='rx_text_message', full_name='DeviceState.rx_text_message', index=6,
                       number=7, type=11, cpp_type=10, label=1,
                       has_default_value=False, default_value=None,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='no_save', full_name='DeviceState.no_save', index=7,
                       number=9, type=8, cpp_type=7, label=1,
                       has_default_value=False, default_value=False,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                     _descriptor.FieldDescriptor(
                       name='did_gps_reset', full_name='DeviceState.did_gps_reset', index=8,
                       number=11, type=8, cpp_type=7, label=1,
                       has_default_value=False, default_value=False,
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                   ],
                   extensions=[
                   ],
                @@ -215,7 +210,6 @@ _CHANNELFILE = _descriptor.Descriptor(
                   filename=None,
                   file=DESCRIPTOR,
                   containing_type=None,
                -  create_key=_descriptor._internal_create_key,
                   fields=[
                     _descriptor.FieldDescriptor(
                       name='channels', full_name='ChannelFile.channels', index=0,
                @@ -223,7 +217,7 @@ _CHANNELFILE = _descriptor.Descriptor(
                       has_default_value=False, default_value=[],
                       message_type=None, enum_type=None, containing_type=None,
                       is_extension=False, extension_scope=None,
                -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                +      serialized_options=None, file=DESCRIPTOR),
                   ],
                   extensions=[
                   ],
                @@ -300,39 +294,561 @@ DESCRIPTOR._options = None
                 
                class ChannelFile -(*args, **kwargs) +(**kwargs)
                -

                A ProtocolMessage

                +

                Abstract base class for protocol messages.

                +

                Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                Ancestors

                  -
                • google.protobuf.pyext._message.CMessage
                • google.protobuf.message.Message

                Class variables

                +
                var CHANNELS_FIELD_NUMBER
                +
                +
                +
                var DESCRIPTOR
                +

                Static methods

                +
                +
                +def FromString(s) +
                +
                +
                +
                + +Expand source code + +
                def FromString(s):
                +  message = cls()
                +  message.MergeFromString(s)
                +  return message
                +
                +
                +
                +def RegisterExtension(extension_handle) +
                +
                +
                +
                + +Expand source code + +
                def RegisterExtension(extension_handle):
                +  extension_handle.containing_type = cls.DESCRIPTOR
                +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
                +  # pylint: disable=protected-access
                +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
                +  _AttachFieldHelpers(cls, extension_handle)
                +
                +
                +

                Instance variables

                var channels
                -

                Field ChannelFile.channels

                +

                Getter for channels.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                +
                +
                +

                Methods

                +
                +
                +def ByteSize(self) +
                +
                +
                +
                + +Expand source code + +
                def ByteSize(self):
                +  if not self._cached_byte_size_dirty:
                +    return self._cached_byte_size
                +
                +  size = 0
                +  descriptor = self.DESCRIPTOR
                +  if descriptor.GetOptions().map_entry:
                +    # Fields of map entry should always be serialized.
                +    size = descriptor.fields_by_name['key']._sizer(self.key)
                +    size += descriptor.fields_by_name['value']._sizer(self.value)
                +  else:
                +    for field_descriptor, field_value in self.ListFields():
                +      size += field_descriptor._sizer(field_value)
                +    for tag_bytes, value_bytes in self._unknown_fields:
                +      size += len(tag_bytes) + len(value_bytes)
                +
                +  self._cached_byte_size = size
                +  self._cached_byte_size_dirty = False
                +  self._listener_for_children.dirty = False
                +  return size
                +
                +
                +
                +def Clear(self) +
                +
                +
                +
                + +Expand source code + +
                def _Clear(self):
                +  # Clear fields.
                +  self._fields = {}
                +  self._unknown_fields = ()
                +  # pylint: disable=protected-access
                +  if self._unknown_field_set is not None:
                +    self._unknown_field_set._clear()
                +    self._unknown_field_set = None
                +
                +  self._oneofs = {}
                +  self._Modified()
                +
                +
                +
                +def ClearField(self, field_name) +
                +
                +
                +
                + +Expand source code + +
                def ClearField(self, field_name):
                +  try:
                +    field = message_descriptor.fields_by_name[field_name]
                +  except KeyError:
                +    try:
                +      field = message_descriptor.oneofs_by_name[field_name]
                +      if field in self._oneofs:
                +        field = self._oneofs[field]
                +      else:
                +        return
                +    except KeyError:
                +      raise ValueError('Protocol message %s has no "%s" field.' %
                +                       (message_descriptor.name, field_name))
                +
                +  if field in self._fields:
                +    # To match the C++ implementation, we need to invalidate iterators
                +    # for map fields when ClearField() happens.
                +    if hasattr(self._fields[field], 'InvalidateIterators'):
                +      self._fields[field].InvalidateIterators()
                +
                +    # Note:  If the field is a sub-message, its listener will still point
                +    #   at us.  That's fine, because the worst than can happen is that it
                +    #   will call _Modified() and invalidate our byte size.  Big deal.
                +    del self._fields[field]
                +
                +    if self._oneofs.get(field.containing_oneof, None) is field:
                +      del self._oneofs[field.containing_oneof]
                +
                +  # Always call _Modified() -- even if nothing was changed, this is
                +  # a mutating method, and thus calling it should cause the field to become
                +  # present in the parent message.
                +  self._Modified()
                +
                +
                +
                +def DiscardUnknownFields(self) +
                +
                +
                +
                + +Expand source code + +
                def _DiscardUnknownFields(self):
                +  self._unknown_fields = []
                +  self._unknown_field_set = None      # pylint: disable=protected-access
                +  for field, value in self.ListFields():
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      if _IsMapField(field):
                +        if _IsMessageMapField(field):
                +          for key in value:
                +            value[key].DiscardUnknownFields()
                +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                +        for sub_message in value:
                +          sub_message.DiscardUnknownFields()
                +      else:
                +        value.DiscardUnknownFields()
                +
                +
                +
                +def FindInitializationErrors(self) +
                +
                +

                Finds required fields which are not initialized.

                +

                Returns

                +

                A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

                +
                + +Expand source code + +
                def FindInitializationErrors(self):
                +  """Finds required fields which are not initialized.
                +
                +  Returns:
                +    A list of strings.  Each string is a path to an uninitialized field from
                +    the top-level message, e.g. "foo.bar[5].baz".
                +  """
                +
                +  errors = []  # simplify things
                +
                +  for field in required_fields:
                +    if not self.HasField(field.name):
                +      errors.append(field.name)
                +
                +  for field, value in self.ListFields():
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      if field.is_extension:
                +        name = '(%s)' % field.full_name
                +      else:
                +        name = field.name
                +
                +      if _IsMapField(field):
                +        if _IsMessageMapField(field):
                +          for key in value:
                +            element = value[key]
                +            prefix = '%s[%s].' % (name, key)
                +            sub_errors = element.FindInitializationErrors()
                +            errors += [prefix + error for error in sub_errors]
                +        else:
                +          # ScalarMaps can't have any initialization errors.
                +          pass
                +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                +        for i in range(len(value)):
                +          element = value[i]
                +          prefix = '%s[%d].' % (name, i)
                +          sub_errors = element.FindInitializationErrors()
                +          errors += [prefix + error for error in sub_errors]
                +      else:
                +        prefix = name + '.'
                +        sub_errors = value.FindInitializationErrors()
                +        errors += [prefix + error for error in sub_errors]
                +
                +  return errors
                +
                +
                +
                +def HasField(self, field_name) +
                +
                +
                +
                + +Expand source code + +
                def HasField(self, field_name):
                +  try:
                +    field = hassable_fields[field_name]
                +  except KeyError:
                +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
                +
                +  if isinstance(field, descriptor_mod.OneofDescriptor):
                +    try:
                +      return HasField(self, self._oneofs[field].name)
                +    except KeyError:
                +      return False
                +  else:
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      value = self._fields.get(field)
                +      return value is not None and value._is_present_in_parent
                +    else:
                +      return field in self._fields
                +
                +
                +
                +def IsInitialized(self, errors=None) +
                +
                +

                Checks if all required fields of a message are set.

                +

                Args

                +
                +
                errors
                +
                A list which, if provided, will be populated with the field +paths of all missing required fields.
                +
                +

                Returns

                +

                True iff the specified message has all required fields set.

                +
                + +Expand source code + +
                def IsInitialized(self, errors=None):
                +  """Checks if all required fields of a message are set.
                +
                +  Args:
                +    errors:  A list which, if provided, will be populated with the field
                +             paths of all missing required fields.
                +
                +  Returns:
                +    True iff the specified message has all required fields set.
                +  """
                +
                +  # Performance is critical so we avoid HasField() and ListFields().
                +
                +  for field in required_fields:
                +    if (field not in self._fields or
                +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
                +         not self._fields[field]._is_present_in_parent)):
                +      if errors is not None:
                +        errors.extend(self.FindInitializationErrors())
                +      return False
                +
                +  for field, value in list(self._fields.items()):  # dict can change size!
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      if field.label == _FieldDescriptor.LABEL_REPEATED:
                +        if (field.message_type.has_options and
                +            field.message_type.GetOptions().map_entry):
                +          continue
                +        for element in value:
                +          if not element.IsInitialized():
                +            if errors is not None:
                +              errors.extend(self.FindInitializationErrors())
                +            return False
                +      elif value._is_present_in_parent and not value.IsInitialized():
                +        if errors is not None:
                +          errors.extend(self.FindInitializationErrors())
                +        return False
                +
                +  return True
                +
                +
                +
                +def ListFields(self) +
                +
                +
                +
                + +Expand source code + +
                def ListFields(self):
                +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
                +  all_fields.sort(key = lambda item: item[0].number)
                +  return all_fields
                +
                +
                +
                +def MergeFrom(self, msg) +
                +
                +
                +
                + +Expand source code + +
                def MergeFrom(self, msg):
                +  if not isinstance(msg, cls):
                +    raise TypeError(
                +        'Parameter to MergeFrom() must be instance of same class: '
                +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
                +                                 _FullyQualifiedClassName(msg.__class__)))
                +
                +  assert msg is not self
                +  self._Modified()
                +
                +  fields = self._fields
                +
                +  for field, value in msg._fields.items():
                +    if field.label == LABEL_REPEATED:
                +      field_value = fields.get(field)
                +      if field_value is None:
                +        # Construct a new object to represent this field.
                +        field_value = field._default_constructor(self)
                +        fields[field] = field_value
                +      field_value.MergeFrom(value)
                +    elif field.cpp_type == CPPTYPE_MESSAGE:
                +      if value._is_present_in_parent:
                +        field_value = fields.get(field)
                +        if field_value is None:
                +          # Construct a new object to represent this field.
                +          field_value = field._default_constructor(self)
                +          fields[field] = field_value
                +        field_value.MergeFrom(value)
                +    else:
                +      self._fields[field] = value
                +      if field.containing_oneof:
                +        self._UpdateOneofState(field)
                +
                +  if msg._unknown_fields:
                +    if not self._unknown_fields:
                +      self._unknown_fields = []
                +    self._unknown_fields.extend(msg._unknown_fields)
                +    # pylint: disable=protected-access
                +    if self._unknown_field_set is None:
                +      self._unknown_field_set = containers.UnknownFieldSet()
                +    self._unknown_field_set._extend(msg._unknown_field_set)
                +
                +
                +
                +def MergeFromString(self, serialized) +
                +
                +
                +
                + +Expand source code + +
                def MergeFromString(self, serialized):
                +  serialized = memoryview(serialized)
                +  length = len(serialized)
                +  try:
                +    if self._InternalParse(serialized, 0, length) != length:
                +      # The only reason _InternalParse would return early is if it
                +      # encountered an end-group tag.
                +      raise message_mod.DecodeError('Unexpected end-group tag.')
                +  except (IndexError, TypeError):
                +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
                +    raise message_mod.DecodeError('Truncated message.')
                +  except struct.error as e:
                +    raise message_mod.DecodeError(e)
                +  return length   # Return this for legacy reasons.
                +
                +
                +
                +def SerializePartialToString(self, **kwargs) +
                +
                +
                +
                + +Expand source code + +
                def SerializePartialToString(self, **kwargs):
                +  out = BytesIO()
                +  self._InternalSerialize(out.write, **kwargs)
                +  return out.getvalue()
                +
                +
                +
                +def SerializeToString(self, **kwargs) +
                +
                +
                +
                + +Expand source code + +
                def SerializeToString(self, **kwargs):
                +  # Check if the message has all of its required fields set.
                +  if not self.IsInitialized():
                +    raise message_mod.EncodeError(
                +        'Message %s is missing required fields: %s' % (
                +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
                +  return self.SerializePartialToString(**kwargs)
                +
                +
                +
                +def SetInParent(self) +
                +
                +

                Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

                +
                + +Expand source code + +
                def Modified(self):
                +  """Sets the _cached_byte_size_dirty bit to true,
                +  and propagates this to our listener iff this was a state change.
                +  """
                +
                +  # Note:  Some callers check _cached_byte_size_dirty before calling
                +  #   _Modified() as an extra optimization.  So, if this method is ever
                +  #   changed such that it does stuff even when _cached_byte_size_dirty is
                +  #   already true, the callers need to be updated.
                +  if not self._cached_byte_size_dirty:
                +    self._cached_byte_size_dirty = True
                +    self._listener_for_children.dirty = True
                +    self._is_present_in_parent = True
                +    self._listener.Modified()
                +
                +
                +
                +def UnknownFields(self) +
                +
                +
                +
                + +Expand source code + +
                def _UnknownFields(self):
                +  if self._unknown_field_set is None:  # pylint: disable=protected-access
                +    # pylint: disable=protected-access
                +    self._unknown_field_set = containers.UnknownFieldSet()
                +  return self._unknown_field_set    # pylint: disable=protected-access
                +
                +
                +
                +def WhichOneof(self, oneof_name) +
                +
                +

                Returns the name of the currently set field inside a oneof, or None.

                +
                + +Expand source code + +
                def WhichOneof(self, oneof_name):
                +  """Returns the name of the currently set field inside a oneof, or None."""
                +  try:
                +    field = message_descriptor.oneofs_by_name[oneof_name]
                +  except KeyError:
                +    raise ValueError(
                +        'Protocol message has no oneof "%s" field.' % oneof_name)
                +
                +  nested_field = self._oneofs.get(field, None)
                +  if nested_field is not None and self.HasField(nested_field.name):
                +    return nested_field.name
                +  else:
                +    return None
                +
                class DeviceState -(*args, **kwargs) +(**kwargs)
                -

                A ProtocolMessage

                +

                Abstract base class for protocol messages.

                +

                Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                Ancestors

                  -
                • google.protobuf.pyext._message.CMessage
                • google.protobuf.message.Message

                Class variables

                @@ -341,56 +857,729 @@ DESCRIPTOR._options = None
                +
                var DID_GPS_RESET_FIELD_NUMBER
                +
                +
                +
                +
                var LEGACYRADIO_FIELD_NUMBER
                +
                +
                +
                +
                var MY_NODE_FIELD_NUMBER
                +
                +
                +
                +
                var NODE_DB_FIELD_NUMBER
                +
                +
                +
                +
                var NO_SAVE_FIELD_NUMBER
                +
                +
                +
                +
                var OWNER_FIELD_NUMBER
                +
                +
                +
                +
                var RECEIVE_QUEUE_FIELD_NUMBER
                +
                +
                +
                +
                var RX_TEXT_MESSAGE_FIELD_NUMBER
                +
                +
                +
                +
                var VERSION_FIELD_NUMBER
                +
                +
                +
                +
                +

                Static methods

                +
                +
                +def FromString(s) +
                +
                +
                +
                + +Expand source code + +
                def FromString(s):
                +  message = cls()
                +  message.MergeFromString(s)
                +  return message
                +
                +
                +
                +def RegisterExtension(extension_handle) +
                +
                +
                +
                + +Expand source code + +
                def RegisterExtension(extension_handle):
                +  extension_handle.containing_type = cls.DESCRIPTOR
                +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
                +  # pylint: disable=protected-access
                +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
                +  _AttachFieldHelpers(cls, extension_handle)
                +
                +

                Instance variables

                var did_gps_reset
                -

                Field DeviceState.did_gps_reset

                +

                Getter for did_gps_reset.

                +
                + +Expand source code + +
                def getter(self):
                +  # TODO(protobuf-team): This may be broken since there may not be
                +  # default_value.  Combine with has_default_value somehow.
                +  return self._fields.get(field, default_value)
                +
                var legacyRadio
                -

                Field DeviceState.legacyRadio

                +

                Getter for legacyRadio.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                var my_node
                -

                Field DeviceState.my_node

                +

                Getter for my_node.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                var no_save
                -

                Field DeviceState.no_save

                +

                Getter for no_save.

                +
                + +Expand source code + +
                def getter(self):
                +  # TODO(protobuf-team): This may be broken since there may not be
                +  # default_value.  Combine with has_default_value somehow.
                +  return self._fields.get(field, default_value)
                +
                var node_db
                -

                Field DeviceState.node_db

                +

                Getter for node_db.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                var owner
                -

                Field DeviceState.owner

                +

                Getter for owner.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                var receive_queue
                -

                Field DeviceState.receive_queue

                +

                Getter for receive_queue.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                var rx_text_message
                -

                Field DeviceState.rx_text_message

                +

                Getter for rx_text_message.

                +
                + +Expand source code + +
                def getter(self):
                +  field_value = self._fields.get(field)
                +  if field_value is None:
                +    # Construct a new object to represent this field.
                +    field_value = field._default_constructor(self)
                +
                +    # Atomically check if another thread has preempted us and, if not, swap
                +    # in the new object we just created.  If someone has preempted us, we
                +    # take that object and discard ours.
                +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                +    #   in CPython but we haven't investigated others.  This warning appears
                +    #   in several other locations in this file.
                +    field_value = self._fields.setdefault(field, field_value)
                +  return field_value
                +
                var version
                -

                Field DeviceState.version

                +

                Getter for version.

                +
                + +Expand source code + +
                def getter(self):
                +  # TODO(protobuf-team): This may be broken since there may not be
                +  # default_value.  Combine with has_default_value somehow.
                +  return self._fields.get(field, default_value)
                +
                +
                +
                +

                Methods

                +
                +
                +def ByteSize(self) +
                +
                +
                +
                + +Expand source code + +
                def ByteSize(self):
                +  if not self._cached_byte_size_dirty:
                +    return self._cached_byte_size
                +
                +  size = 0
                +  descriptor = self.DESCRIPTOR
                +  if descriptor.GetOptions().map_entry:
                +    # Fields of map entry should always be serialized.
                +    size = descriptor.fields_by_name['key']._sizer(self.key)
                +    size += descriptor.fields_by_name['value']._sizer(self.value)
                +  else:
                +    for field_descriptor, field_value in self.ListFields():
                +      size += field_descriptor._sizer(field_value)
                +    for tag_bytes, value_bytes in self._unknown_fields:
                +      size += len(tag_bytes) + len(value_bytes)
                +
                +  self._cached_byte_size = size
                +  self._cached_byte_size_dirty = False
                +  self._listener_for_children.dirty = False
                +  return size
                +
                +
                +
                +def Clear(self) +
                +
                +
                +
                + +Expand source code + +
                def _Clear(self):
                +  # Clear fields.
                +  self._fields = {}
                +  self._unknown_fields = ()
                +  # pylint: disable=protected-access
                +  if self._unknown_field_set is not None:
                +    self._unknown_field_set._clear()
                +    self._unknown_field_set = None
                +
                +  self._oneofs = {}
                +  self._Modified()
                +
                +
                +
                +def ClearField(self, field_name) +
                +
                +
                +
                + +Expand source code + +
                def ClearField(self, field_name):
                +  try:
                +    field = message_descriptor.fields_by_name[field_name]
                +  except KeyError:
                +    try:
                +      field = message_descriptor.oneofs_by_name[field_name]
                +      if field in self._oneofs:
                +        field = self._oneofs[field]
                +      else:
                +        return
                +    except KeyError:
                +      raise ValueError('Protocol message %s has no "%s" field.' %
                +                       (message_descriptor.name, field_name))
                +
                +  if field in self._fields:
                +    # To match the C++ implementation, we need to invalidate iterators
                +    # for map fields when ClearField() happens.
                +    if hasattr(self._fields[field], 'InvalidateIterators'):
                +      self._fields[field].InvalidateIterators()
                +
                +    # Note:  If the field is a sub-message, its listener will still point
                +    #   at us.  That's fine, because the worst than can happen is that it
                +    #   will call _Modified() and invalidate our byte size.  Big deal.
                +    del self._fields[field]
                +
                +    if self._oneofs.get(field.containing_oneof, None) is field:
                +      del self._oneofs[field.containing_oneof]
                +
                +  # Always call _Modified() -- even if nothing was changed, this is
                +  # a mutating method, and thus calling it should cause the field to become
                +  # present in the parent message.
                +  self._Modified()
                +
                +
                +
                +def DiscardUnknownFields(self) +
                +
                +
                +
                + +Expand source code + +
                def _DiscardUnknownFields(self):
                +  self._unknown_fields = []
                +  self._unknown_field_set = None      # pylint: disable=protected-access
                +  for field, value in self.ListFields():
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      if _IsMapField(field):
                +        if _IsMessageMapField(field):
                +          for key in value:
                +            value[key].DiscardUnknownFields()
                +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                +        for sub_message in value:
                +          sub_message.DiscardUnknownFields()
                +      else:
                +        value.DiscardUnknownFields()
                +
                +
                +
                +def FindInitializationErrors(self) +
                +
                +

                Finds required fields which are not initialized.

                +

                Returns

                +

                A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

                +
                + +Expand source code + +
                def FindInitializationErrors(self):
                +  """Finds required fields which are not initialized.
                +
                +  Returns:
                +    A list of strings.  Each string is a path to an uninitialized field from
                +    the top-level message, e.g. "foo.bar[5].baz".
                +  """
                +
                +  errors = []  # simplify things
                +
                +  for field in required_fields:
                +    if not self.HasField(field.name):
                +      errors.append(field.name)
                +
                +  for field, value in self.ListFields():
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      if field.is_extension:
                +        name = '(%s)' % field.full_name
                +      else:
                +        name = field.name
                +
                +      if _IsMapField(field):
                +        if _IsMessageMapField(field):
                +          for key in value:
                +            element = value[key]
                +            prefix = '%s[%s].' % (name, key)
                +            sub_errors = element.FindInitializationErrors()
                +            errors += [prefix + error for error in sub_errors]
                +        else:
                +          # ScalarMaps can't have any initialization errors.
                +          pass
                +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                +        for i in range(len(value)):
                +          element = value[i]
                +          prefix = '%s[%d].' % (name, i)
                +          sub_errors = element.FindInitializationErrors()
                +          errors += [prefix + error for error in sub_errors]
                +      else:
                +        prefix = name + '.'
                +        sub_errors = value.FindInitializationErrors()
                +        errors += [prefix + error for error in sub_errors]
                +
                +  return errors
                +
                +
                +
                +def HasField(self, field_name) +
                +
                +
                +
                + +Expand source code + +
                def HasField(self, field_name):
                +  try:
                +    field = hassable_fields[field_name]
                +  except KeyError:
                +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
                +
                +  if isinstance(field, descriptor_mod.OneofDescriptor):
                +    try:
                +      return HasField(self, self._oneofs[field].name)
                +    except KeyError:
                +      return False
                +  else:
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      value = self._fields.get(field)
                +      return value is not None and value._is_present_in_parent
                +    else:
                +      return field in self._fields
                +
                +
                +
                +def IsInitialized(self, errors=None) +
                +
                +

                Checks if all required fields of a message are set.

                +

                Args

                +
                +
                errors
                +
                A list which, if provided, will be populated with the field +paths of all missing required fields.
                +
                +

                Returns

                +

                True iff the specified message has all required fields set.

                +
                + +Expand source code + +
                def IsInitialized(self, errors=None):
                +  """Checks if all required fields of a message are set.
                +
                +  Args:
                +    errors:  A list which, if provided, will be populated with the field
                +             paths of all missing required fields.
                +
                +  Returns:
                +    True iff the specified message has all required fields set.
                +  """
                +
                +  # Performance is critical so we avoid HasField() and ListFields().
                +
                +  for field in required_fields:
                +    if (field not in self._fields or
                +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
                +         not self._fields[field]._is_present_in_parent)):
                +      if errors is not None:
                +        errors.extend(self.FindInitializationErrors())
                +      return False
                +
                +  for field, value in list(self._fields.items()):  # dict can change size!
                +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                +      if field.label == _FieldDescriptor.LABEL_REPEATED:
                +        if (field.message_type.has_options and
                +            field.message_type.GetOptions().map_entry):
                +          continue
                +        for element in value:
                +          if not element.IsInitialized():
                +            if errors is not None:
                +              errors.extend(self.FindInitializationErrors())
                +            return False
                +      elif value._is_present_in_parent and not value.IsInitialized():
                +        if errors is not None:
                +          errors.extend(self.FindInitializationErrors())
                +        return False
                +
                +  return True
                +
                +
                +
                +def ListFields(self) +
                +
                +
                +
                + +Expand source code + +
                def ListFields(self):
                +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
                +  all_fields.sort(key = lambda item: item[0].number)
                +  return all_fields
                +
                +
                +
                +def MergeFrom(self, msg) +
                +
                +
                +
                + +Expand source code + +
                def MergeFrom(self, msg):
                +  if not isinstance(msg, cls):
                +    raise TypeError(
                +        'Parameter to MergeFrom() must be instance of same class: '
                +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
                +                                 _FullyQualifiedClassName(msg.__class__)))
                +
                +  assert msg is not self
                +  self._Modified()
                +
                +  fields = self._fields
                +
                +  for field, value in msg._fields.items():
                +    if field.label == LABEL_REPEATED:
                +      field_value = fields.get(field)
                +      if field_value is None:
                +        # Construct a new object to represent this field.
                +        field_value = field._default_constructor(self)
                +        fields[field] = field_value
                +      field_value.MergeFrom(value)
                +    elif field.cpp_type == CPPTYPE_MESSAGE:
                +      if value._is_present_in_parent:
                +        field_value = fields.get(field)
                +        if field_value is None:
                +          # Construct a new object to represent this field.
                +          field_value = field._default_constructor(self)
                +          fields[field] = field_value
                +        field_value.MergeFrom(value)
                +    else:
                +      self._fields[field] = value
                +      if field.containing_oneof:
                +        self._UpdateOneofState(field)
                +
                +  if msg._unknown_fields:
                +    if not self._unknown_fields:
                +      self._unknown_fields = []
                +    self._unknown_fields.extend(msg._unknown_fields)
                +    # pylint: disable=protected-access
                +    if self._unknown_field_set is None:
                +      self._unknown_field_set = containers.UnknownFieldSet()
                +    self._unknown_field_set._extend(msg._unknown_field_set)
                +
                +
                +
                +def MergeFromString(self, serialized) +
                +
                +
                +
                + +Expand source code + +
                def MergeFromString(self, serialized):
                +  serialized = memoryview(serialized)
                +  length = len(serialized)
                +  try:
                +    if self._InternalParse(serialized, 0, length) != length:
                +      # The only reason _InternalParse would return early is if it
                +      # encountered an end-group tag.
                +      raise message_mod.DecodeError('Unexpected end-group tag.')
                +  except (IndexError, TypeError):
                +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
                +    raise message_mod.DecodeError('Truncated message.')
                +  except struct.error as e:
                +    raise message_mod.DecodeError(e)
                +  return length   # Return this for legacy reasons.
                +
                +
                +
                +def SerializePartialToString(self, **kwargs) +
                +
                +
                +
                + +Expand source code + +
                def SerializePartialToString(self, **kwargs):
                +  out = BytesIO()
                +  self._InternalSerialize(out.write, **kwargs)
                +  return out.getvalue()
                +
                +
                +
                +def SerializeToString(self, **kwargs) +
                +
                +
                +
                + +Expand source code + +
                def SerializeToString(self, **kwargs):
                +  # Check if the message has all of its required fields set.
                +  if not self.IsInitialized():
                +    raise message_mod.EncodeError(
                +        'Message %s is missing required fields: %s' % (
                +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
                +  return self.SerializePartialToString(**kwargs)
                +
                +
                +
                +def SetInParent(self) +
                +
                +

                Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

                +
                + +Expand source code + +
                def Modified(self):
                +  """Sets the _cached_byte_size_dirty bit to true,
                +  and propagates this to our listener iff this was a state change.
                +  """
                +
                +  # Note:  Some callers check _cached_byte_size_dirty before calling
                +  #   _Modified() as an extra optimization.  So, if this method is ever
                +  #   changed such that it does stuff even when _cached_byte_size_dirty is
                +  #   already true, the callers need to be updated.
                +  if not self._cached_byte_size_dirty:
                +    self._cached_byte_size_dirty = True
                +    self._listener_for_children.dirty = True
                +    self._is_present_in_parent = True
                +    self._listener.Modified()
                +
                +
                +
                +def UnknownFields(self) +
                +
                +
                +
                + +Expand source code + +
                def _UnknownFields(self):
                +  if self._unknown_field_set is None:  # pylint: disable=protected-access
                +    # pylint: disable=protected-access
                +    self._unknown_field_set = containers.UnknownFieldSet()
                +  return self._unknown_field_set    # pylint: disable=protected-access
                +
                +
                +
                +def WhichOneof(self, oneof_name) +
                +
                +

                Returns the name of the currently set field inside a oneof, or None.

                +
                + +Expand source code + +
                def WhichOneof(self, oneof_name):
                +  """Returns the name of the currently set field inside a oneof, or None."""
                +  try:
                +    field = message_descriptor.oneofs_by_name[oneof_name]
                +  except KeyError:
                +    raise ValueError(
                +        'Protocol message has no oneof "%s" field.' % oneof_name)
                +
                +  nested_field = self._oneofs.get(field, None)
                +  if nested_field is not None and self.HasField(nested_field.name):
                +    return nested_field.name
                +  else:
                +    return None
                +
                class LegacyRadioConfig -(*args, **kwargs) +(**kwargs)
                -

                A ProtocolMessage

                +

                Abstract base class for protocol messages.

                +

                Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                Ancestors

                  -
                • google.protobuf.pyext._message.CMessage
                • google.protobuf.message.Message

                Class variables

                @@ -401,14 +1590,534 @@ DESCRIPTOR._options = None
                var LegacyPreferences
                -

                A ProtocolMessage

                +

                Abstract base class for protocol messages.

                +

                Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                +
                +
                var PREFERENCES_FIELD_NUMBER
                +
                +
                +
                +
  • +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +

    Instance variables

    var preferences
    -

    Field LegacyRadioConfig.preferences

    +

    Getter for preferences.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    @@ -431,14 +2140,58 @@ DESCRIPTOR._options = None
  • ChannelFile

  • DeviceState

    -
      +
        +
      • ByteSize
      • +
      • Clear
      • +
      • ClearField
      • DESCRIPTOR
      • +
      • DID_GPS_RESET_FIELD_NUMBER
      • +
      • DiscardUnknownFields
      • +
      • FindInitializationErrors
      • +
      • FromString
      • +
      • HasField
      • +
      • IsInitialized
      • +
      • LEGACYRADIO_FIELD_NUMBER
      • +
      • ListFields
      • +
      • MY_NODE_FIELD_NUMBER
      • +
      • MergeFrom
      • +
      • MergeFromString
      • +
      • NODE_DB_FIELD_NUMBER
      • +
      • NO_SAVE_FIELD_NUMBER
      • +
      • OWNER_FIELD_NUMBER
      • +
      • RECEIVE_QUEUE_FIELD_NUMBER
      • +
      • RX_TEXT_MESSAGE_FIELD_NUMBER
      • +
      • RegisterExtension
      • +
      • SerializePartialToString
      • +
      • SerializeToString
      • +
      • SetInParent
      • +
      • UnknownFields
      • +
      • VERSION_FIELD_NUMBER
      • +
      • WhichOneof
      • did_gps_reset
      • legacyRadio
      • my_node
      • @@ -453,8 +2206,26 @@ DESCRIPTOR._options = None
      • LegacyRadioConfig

      • @@ -464,7 +2235,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/environmental_measurement_pb2.html b/docs/meshtastic/environmental_measurement_pb2.html index f1732d1..e12dcf3 100644 --- a/docs/meshtastic/environmental_measurement_pb2.html +++ b/docs/meshtastic/environmental_measurement_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.environmental_measurement_pb2 API documentation - + @@ -22,7 +22,6 @@

        Module meshtastic.environmental_measurement_pb2

        -

        Generated protocol buffer code.

        Expand source code @@ -30,7 +29,7 @@
        # -*- coding: utf-8 -*-
         # Generated by the protocol buffer compiler.  DO NOT EDIT!
         # source: environmental_measurement.proto
        -"""Generated protocol buffer code."""
        +
         from google.protobuf import descriptor as _descriptor
         from google.protobuf import message as _message
         from google.protobuf import reflection as _reflection
        @@ -47,7 +46,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
           package='',
           syntax='proto3',
           serialized_options=b'Z!github.com/meshtastic/gomeshproto',
        -  create_key=_descriptor._internal_create_key,
           serialized_pb=b'\n\x1f\x65nvironmental_measurement.proto\"g\n\x18\x45nvironmentalMeasurement\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x42#Z!github.com/meshtastic/gomeshprotob\x06proto3'
         )
         
        @@ -60,7 +58,6 @@ _ENVIRONMENTALMEASUREMENT = _descriptor.Descriptor(
           filename=None,
           file=DESCRIPTOR,
           containing_type=None,
        -  create_key=_descriptor._internal_create_key,
           fields=[
             _descriptor.FieldDescriptor(
               name='temperature', full_name='EnvironmentalMeasurement.temperature', index=0,
        @@ -68,21 +65,21 @@ _ENVIRONMENTALMEASUREMENT = _descriptor.Descriptor(
               has_default_value=False, default_value=float(0),
               message_type=None, enum_type=None, containing_type=None,
               is_extension=False, extension_scope=None,
        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
        +      serialized_options=None, file=DESCRIPTOR),
             _descriptor.FieldDescriptor(
               name='relative_humidity', full_name='EnvironmentalMeasurement.relative_humidity', index=1,
               number=2, type=2, cpp_type=6, label=1,
               has_default_value=False, default_value=float(0),
               message_type=None, enum_type=None, containing_type=None,
               is_extension=False, extension_scope=None,
        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
        +      serialized_options=None, file=DESCRIPTOR),
             _descriptor.FieldDescriptor(
               name='barometric_pressure', full_name='EnvironmentalMeasurement.barometric_pressure', index=2,
               number=3, type=2, cpp_type=6, label=1,
               has_default_value=False, default_value=float(0),
               message_type=None, enum_type=None, containing_type=None,
               is_extension=False, extension_scope=None,
        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
        +      serialized_options=None, file=DESCRIPTOR),
           ],
           extensions=[
           ],
        @@ -125,35 +122,570 @@ DESCRIPTOR._options = None
         
        class EnvironmentalMeasurement -(*args, **kwargs) +(**kwargs)
        -

        A ProtocolMessage

        +

        Abstract base class for protocol messages.

        +

        Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

        Ancestors

          -
        • google.protobuf.pyext._message.CMessage
        • google.protobuf.message.Message

        Class variables

        +
        var BAROMETRIC_PRESSURE_FIELD_NUMBER
        +
        +
        +
        var DESCRIPTOR
        +
        var RELATIVE_HUMIDITY_FIELD_NUMBER
        +
        +
        +
        +
        var TEMPERATURE_FIELD_NUMBER
        +
        +
        +
        +
        +

        Static methods

        +
        +
        +def FromString(s) +
        +
        +
        +
        + +Expand source code + +
        def FromString(s):
        +  message = cls()
        +  message.MergeFromString(s)
        +  return message
        +
        +
        +
        +def RegisterExtension(extension_handle) +
        +
        +
        +
        + +Expand source code + +
        def RegisterExtension(extension_handle):
        +  extension_handle.containing_type = cls.DESCRIPTOR
        +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
        +  # pylint: disable=protected-access
        +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
        +  _AttachFieldHelpers(cls, extension_handle)
        +
        +

        Instance variables

        var barometric_pressure
        -

        Field EnvironmentalMeasurement.barometric_pressure

        +

        Getter for barometric_pressure.

        +
        + +Expand source code + +
        def getter(self):
        +  # TODO(protobuf-team): This may be broken since there may not be
        +  # default_value.  Combine with has_default_value somehow.
        +  return self._fields.get(field, default_value)
        +
        var relative_humidity
        -

        Field EnvironmentalMeasurement.relative_humidity

        +

        Getter for relative_humidity.

        +
        + +Expand source code + +
        def getter(self):
        +  # TODO(protobuf-team): This may be broken since there may not be
        +  # default_value.  Combine with has_default_value somehow.
        +  return self._fields.get(field, default_value)
        +
        var temperature
        -

        Field EnvironmentalMeasurement.temperature

        +

        Getter for temperature.

        +
        + +Expand source code + +
        def getter(self):
        +  # TODO(protobuf-team): This may be broken since there may not be
        +  # default_value.  Combine with has_default_value somehow.
        +  return self._fields.get(field, default_value)
        +
        +
        +
        +

        Methods

        +
        +
        +def ByteSize(self) +
        +
        +
        +
        + +Expand source code + +
        def ByteSize(self):
        +  if not self._cached_byte_size_dirty:
        +    return self._cached_byte_size
        +
        +  size = 0
        +  descriptor = self.DESCRIPTOR
        +  if descriptor.GetOptions().map_entry:
        +    # Fields of map entry should always be serialized.
        +    size = descriptor.fields_by_name['key']._sizer(self.key)
        +    size += descriptor.fields_by_name['value']._sizer(self.value)
        +  else:
        +    for field_descriptor, field_value in self.ListFields():
        +      size += field_descriptor._sizer(field_value)
        +    for tag_bytes, value_bytes in self._unknown_fields:
        +      size += len(tag_bytes) + len(value_bytes)
        +
        +  self._cached_byte_size = size
        +  self._cached_byte_size_dirty = False
        +  self._listener_for_children.dirty = False
        +  return size
        +
        +
        +
        +def Clear(self) +
        +
        +
        +
        + +Expand source code + +
        def _Clear(self):
        +  # Clear fields.
        +  self._fields = {}
        +  self._unknown_fields = ()
        +  # pylint: disable=protected-access
        +  if self._unknown_field_set is not None:
        +    self._unknown_field_set._clear()
        +    self._unknown_field_set = None
        +
        +  self._oneofs = {}
        +  self._Modified()
        +
        +
        +
        +def ClearField(self, field_name) +
        +
        +
        +
        + +Expand source code + +
        def ClearField(self, field_name):
        +  try:
        +    field = message_descriptor.fields_by_name[field_name]
        +  except KeyError:
        +    try:
        +      field = message_descriptor.oneofs_by_name[field_name]
        +      if field in self._oneofs:
        +        field = self._oneofs[field]
        +      else:
        +        return
        +    except KeyError:
        +      raise ValueError('Protocol message %s has no "%s" field.' %
        +                       (message_descriptor.name, field_name))
        +
        +  if field in self._fields:
        +    # To match the C++ implementation, we need to invalidate iterators
        +    # for map fields when ClearField() happens.
        +    if hasattr(self._fields[field], 'InvalidateIterators'):
        +      self._fields[field].InvalidateIterators()
        +
        +    # Note:  If the field is a sub-message, its listener will still point
        +    #   at us.  That's fine, because the worst than can happen is that it
        +    #   will call _Modified() and invalidate our byte size.  Big deal.
        +    del self._fields[field]
        +
        +    if self._oneofs.get(field.containing_oneof, None) is field:
        +      del self._oneofs[field.containing_oneof]
        +
        +  # Always call _Modified() -- even if nothing was changed, this is
        +  # a mutating method, and thus calling it should cause the field to become
        +  # present in the parent message.
        +  self._Modified()
        +
        +
        +
        +def DiscardUnknownFields(self) +
        +
        +
        +
        + +Expand source code + +
        def _DiscardUnknownFields(self):
        +  self._unknown_fields = []
        +  self._unknown_field_set = None      # pylint: disable=protected-access
        +  for field, value in self.ListFields():
        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
        +      if _IsMapField(field):
        +        if _IsMessageMapField(field):
        +          for key in value:
        +            value[key].DiscardUnknownFields()
        +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
        +        for sub_message in value:
        +          sub_message.DiscardUnknownFields()
        +      else:
        +        value.DiscardUnknownFields()
        +
        +
        +
        +def FindInitializationErrors(self) +
        +
        +

        Finds required fields which are not initialized.

        +

        Returns

        +

        A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

        +
        + +Expand source code + +
        def FindInitializationErrors(self):
        +  """Finds required fields which are not initialized.
        +
        +  Returns:
        +    A list of strings.  Each string is a path to an uninitialized field from
        +    the top-level message, e.g. "foo.bar[5].baz".
        +  """
        +
        +  errors = []  # simplify things
        +
        +  for field in required_fields:
        +    if not self.HasField(field.name):
        +      errors.append(field.name)
        +
        +  for field, value in self.ListFields():
        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
        +      if field.is_extension:
        +        name = '(%s)' % field.full_name
        +      else:
        +        name = field.name
        +
        +      if _IsMapField(field):
        +        if _IsMessageMapField(field):
        +          for key in value:
        +            element = value[key]
        +            prefix = '%s[%s].' % (name, key)
        +            sub_errors = element.FindInitializationErrors()
        +            errors += [prefix + error for error in sub_errors]
        +        else:
        +          # ScalarMaps can't have any initialization errors.
        +          pass
        +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
        +        for i in range(len(value)):
        +          element = value[i]
        +          prefix = '%s[%d].' % (name, i)
        +          sub_errors = element.FindInitializationErrors()
        +          errors += [prefix + error for error in sub_errors]
        +      else:
        +        prefix = name + '.'
        +        sub_errors = value.FindInitializationErrors()
        +        errors += [prefix + error for error in sub_errors]
        +
        +  return errors
        +
        +
        +
        +def HasField(self, field_name) +
        +
        +
        +
        + +Expand source code + +
        def HasField(self, field_name):
        +  try:
        +    field = hassable_fields[field_name]
        +  except KeyError:
        +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
        +
        +  if isinstance(field, descriptor_mod.OneofDescriptor):
        +    try:
        +      return HasField(self, self._oneofs[field].name)
        +    except KeyError:
        +      return False
        +  else:
        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
        +      value = self._fields.get(field)
        +      return value is not None and value._is_present_in_parent
        +    else:
        +      return field in self._fields
        +
        +
        +
        +def IsInitialized(self, errors=None) +
        +
        +

        Checks if all required fields of a message are set.

        +

        Args

        +
        +
        errors
        +
        A list which, if provided, will be populated with the field +paths of all missing required fields.
        +
        +

        Returns

        +

        True iff the specified message has all required fields set.

        +
        + +Expand source code + +
        def IsInitialized(self, errors=None):
        +  """Checks if all required fields of a message are set.
        +
        +  Args:
        +    errors:  A list which, if provided, will be populated with the field
        +             paths of all missing required fields.
        +
        +  Returns:
        +    True iff the specified message has all required fields set.
        +  """
        +
        +  # Performance is critical so we avoid HasField() and ListFields().
        +
        +  for field in required_fields:
        +    if (field not in self._fields or
        +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
        +         not self._fields[field]._is_present_in_parent)):
        +      if errors is not None:
        +        errors.extend(self.FindInitializationErrors())
        +      return False
        +
        +  for field, value in list(self._fields.items()):  # dict can change size!
        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
        +      if field.label == _FieldDescriptor.LABEL_REPEATED:
        +        if (field.message_type.has_options and
        +            field.message_type.GetOptions().map_entry):
        +          continue
        +        for element in value:
        +          if not element.IsInitialized():
        +            if errors is not None:
        +              errors.extend(self.FindInitializationErrors())
        +            return False
        +      elif value._is_present_in_parent and not value.IsInitialized():
        +        if errors is not None:
        +          errors.extend(self.FindInitializationErrors())
        +        return False
        +
        +  return True
        +
        +
        +
        +def ListFields(self) +
        +
        +
        +
        + +Expand source code + +
        def ListFields(self):
        +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
        +  all_fields.sort(key = lambda item: item[0].number)
        +  return all_fields
        +
        +
        +
        +def MergeFrom(self, msg) +
        +
        +
        +
        + +Expand source code + +
        def MergeFrom(self, msg):
        +  if not isinstance(msg, cls):
        +    raise TypeError(
        +        'Parameter to MergeFrom() must be instance of same class: '
        +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
        +                                 _FullyQualifiedClassName(msg.__class__)))
        +
        +  assert msg is not self
        +  self._Modified()
        +
        +  fields = self._fields
        +
        +  for field, value in msg._fields.items():
        +    if field.label == LABEL_REPEATED:
        +      field_value = fields.get(field)
        +      if field_value is None:
        +        # Construct a new object to represent this field.
        +        field_value = field._default_constructor(self)
        +        fields[field] = field_value
        +      field_value.MergeFrom(value)
        +    elif field.cpp_type == CPPTYPE_MESSAGE:
        +      if value._is_present_in_parent:
        +        field_value = fields.get(field)
        +        if field_value is None:
        +          # Construct a new object to represent this field.
        +          field_value = field._default_constructor(self)
        +          fields[field] = field_value
        +        field_value.MergeFrom(value)
        +    else:
        +      self._fields[field] = value
        +      if field.containing_oneof:
        +        self._UpdateOneofState(field)
        +
        +  if msg._unknown_fields:
        +    if not self._unknown_fields:
        +      self._unknown_fields = []
        +    self._unknown_fields.extend(msg._unknown_fields)
        +    # pylint: disable=protected-access
        +    if self._unknown_field_set is None:
        +      self._unknown_field_set = containers.UnknownFieldSet()
        +    self._unknown_field_set._extend(msg._unknown_field_set)
        +
        +
        +
        +def MergeFromString(self, serialized) +
        +
        +
        +
        + +Expand source code + +
        def MergeFromString(self, serialized):
        +  serialized = memoryview(serialized)
        +  length = len(serialized)
        +  try:
        +    if self._InternalParse(serialized, 0, length) != length:
        +      # The only reason _InternalParse would return early is if it
        +      # encountered an end-group tag.
        +      raise message_mod.DecodeError('Unexpected end-group tag.')
        +  except (IndexError, TypeError):
        +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
        +    raise message_mod.DecodeError('Truncated message.')
        +  except struct.error as e:
        +    raise message_mod.DecodeError(e)
        +  return length   # Return this for legacy reasons.
        +
        +
        +
        +def SerializePartialToString(self, **kwargs) +
        +
        +
        +
        + +Expand source code + +
        def SerializePartialToString(self, **kwargs):
        +  out = BytesIO()
        +  self._InternalSerialize(out.write, **kwargs)
        +  return out.getvalue()
        +
        +
        +
        +def SerializeToString(self, **kwargs) +
        +
        +
        +
        + +Expand source code + +
        def SerializeToString(self, **kwargs):
        +  # Check if the message has all of its required fields set.
        +  if not self.IsInitialized():
        +    raise message_mod.EncodeError(
        +        'Message %s is missing required fields: %s' % (
        +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
        +  return self.SerializePartialToString(**kwargs)
        +
        +
        +
        +def SetInParent(self) +
        +
        +

        Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

        +
        + +Expand source code + +
        def Modified(self):
        +  """Sets the _cached_byte_size_dirty bit to true,
        +  and propagates this to our listener iff this was a state change.
        +  """
        +
        +  # Note:  Some callers check _cached_byte_size_dirty before calling
        +  #   _Modified() as an extra optimization.  So, if this method is ever
        +  #   changed such that it does stuff even when _cached_byte_size_dirty is
        +  #   already true, the callers need to be updated.
        +  if not self._cached_byte_size_dirty:
        +    self._cached_byte_size_dirty = True
        +    self._listener_for_children.dirty = True
        +    self._is_present_in_parent = True
        +    self._listener.Modified()
        +
        +
        +
        +def UnknownFields(self) +
        +
        +
        +
        + +Expand source code + +
        def _UnknownFields(self):
        +  if self._unknown_field_set is None:  # pylint: disable=protected-access
        +    # pylint: disable=protected-access
        +    self._unknown_field_set = containers.UnknownFieldSet()
        +  return self._unknown_field_set    # pylint: disable=protected-access
        +
        +
        +
        +def WhichOneof(self, oneof_name) +
        +
        +

        Returns the name of the currently set field inside a oneof, or None.

        +
        + +Expand source code + +
        def WhichOneof(self, oneof_name):
        +  """Returns the name of the currently set field inside a oneof, or None."""
        +  try:
        +    field = message_descriptor.oneofs_by_name[oneof_name]
        +  except KeyError:
        +    raise ValueError(
        +        'Protocol message has no oneof "%s" field.' % oneof_name)
        +
        +  nested_field = self._oneofs.get(field, None)
        +  if nested_field is not None and self.HasField(nested_field.name):
        +    return nested_field.name
        +  else:
        +    return None
        +
        @@ -176,7 +708,27 @@ DESCRIPTOR._options = None
      • EnvironmentalMeasurement

          +
        • BAROMETRIC_PRESSURE_FIELD_NUMBER
        • +
        • ByteSize
        • +
        • Clear
        • +
        • ClearField
        • DESCRIPTOR
        • +
        • DiscardUnknownFields
        • +
        • FindInitializationErrors
        • +
        • FromString
        • +
        • HasField
        • +
        • IsInitialized
        • +
        • ListFields
        • +
        • MergeFrom
        • +
        • MergeFromString
        • +
        • RELATIVE_HUMIDITY_FIELD_NUMBER
        • +
        • RegisterExtension
        • +
        • SerializePartialToString
        • +
        • SerializeToString
        • +
        • SetInParent
        • +
        • TEMPERATURE_FIELD_NUMBER
        • +
        • UnknownFields
        • +
        • WhichOneof
        • barometric_pressure
        • relative_humidity
        • temperature
        • @@ -188,7 +740,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/index.html b/docs/meshtastic/index.html index 2a3ec1a..800f161 100644 --- a/docs/meshtastic/index.html +++ b/docs/meshtastic/index.html @@ -3,7 +3,7 @@ - + meshtastic API documentation @@ -257,13 +257,15 @@ class MeshInterface: def showInfo(self, file=sys.stdout): """Show human readable summary about this object""" - - print( - f"Owner: {self.getLongName()} ({self.getShortName()})", file=file) - print(f"\nMy info: {stripnl(MessageToJson(self.myInfo))}", file=file) - print("\nNodes in mesh:", file=file) + owner = f"Owner: {self.getLongName()} ({self.getShortName()})" + myinfo = f"\nMy info: {stripnl(MessageToJson(self.myInfo))}" + mesh = "\nNodes in mesh:" + nodes = "" for n in self.nodes.values(): - print(f" {stripnl(n)}", file=file) + nodes = nodes + f" {stripnl(n)}" + infos = owner + myinfo + mesh + nodes + print(infos) + return infos def showNodes(self, includeSelf=True, file=sys.stdout): """Show table summary of nodes in mesh""" @@ -314,8 +316,11 @@ class MeshInterface: for i, row in enumerate(rows): row['N'] = i+1 - print(tabulate(rows, headers='keys', missingval='N/A', - tablefmt='fancy_grid'), file=file) + table = tabulate(rows, headers='keys', missingval='N/A', + tablefmt='fancy_grid') + print(table) + return table + def getNode(self, nodeId): """Return a node object which contains device settings and channel info""" @@ -333,7 +338,8 @@ class MeshInterface: wantAck=False, wantResponse=False, hopLimit=defaultHopLimit, - onResponse=None): + onResponse=None, + channelIndex=0): """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. Arguments: @@ -352,7 +358,8 @@ class MeshInterface: wantAck=wantAck, wantResponse=wantResponse, hopLimit=hopLimit, - onResponse=onResponse) + onResponse=onResponse, + channelIndex=channelIndex); def sendData(self, data, destinationId=BROADCAST_ADDR, portNum=portnums_pb2.PortNum.PRIVATE_APP, wantAck=False, @@ -1154,11 +1161,11 @@ protocols = {
          meshtastic.admin_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.apponly_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.ble
          @@ -1166,23 +1173,23 @@ protocols = {
          meshtastic.channel_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.deviceonly_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.environmental_measurement_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.mesh_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.mqtt_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.node
          @@ -1190,11 +1197,11 @@ protocols = {
          meshtastic.portnums_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.radioconfig_pb2
          -

          Generated protocol buffer code.

          +
          meshtastic.remote_hardware
          @@ -1202,7 +1209,11 @@ protocols = {
          meshtastic.remote_hardware_pb2
          -

          Generated protocol buffer code.

          +
          +
          +
          meshtastic.storeforward_pb2
          +
          +
          meshtastic.test
          @@ -1417,13 +1428,15 @@ noProto – If True, don't try to run our protocol on the link - just be a d def showInfo(self, file=sys.stdout): """Show human readable summary about this object""" - - print( - f"Owner: {self.getLongName()} ({self.getShortName()})", file=file) - print(f"\nMy info: {stripnl(MessageToJson(self.myInfo))}", file=file) - print("\nNodes in mesh:", file=file) + owner = f"Owner: {self.getLongName()} ({self.getShortName()})" + myinfo = f"\nMy info: {stripnl(MessageToJson(self.myInfo))}" + mesh = "\nNodes in mesh:" + nodes = "" for n in self.nodes.values(): - print(f" {stripnl(n)}", file=file) + nodes = nodes + f" {stripnl(n)}" + infos = owner + myinfo + mesh + nodes + print(infos) + return infos def showNodes(self, includeSelf=True, file=sys.stdout): """Show table summary of nodes in mesh""" @@ -1474,8 +1487,11 @@ noProto – If True, don't try to run our protocol on the link - just be a d for i, row in enumerate(rows): row['N'] = i+1 - print(tabulate(rows, headers='keys', missingval='N/A', - tablefmt='fancy_grid'), file=file) + table = tabulate(rows, headers='keys', missingval='N/A', + tablefmt='fancy_grid') + print(table) + return table + def getNode(self, nodeId): """Return a node object which contains device settings and channel info""" @@ -1493,7 +1509,8 @@ noProto – If True, don't try to run our protocol on the link - just be a d wantAck=False, wantResponse=False, hopLimit=defaultHopLimit, - onResponse=None): + onResponse=None, + channelIndex=0): """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. Arguments: @@ -1512,7 +1529,8 @@ noProto – If True, don't try to run our protocol on the link - just be a d wantAck=wantAck, wantResponse=wantResponse, hopLimit=hopLimit, - onResponse=onResponse) + onResponse=onResponse, + channelIndex=channelIndex); def sendData(self, data, destinationId=BROADCAST_ADDR, portNum=portnums_pb2.PortNum.PRIVATE_APP, wantAck=False, @@ -2153,7 +2171,7 @@ the local position.

      • -def sendText(self, text: ~AnyStr, destinationId='^all', wantAck=False, wantResponse=False, hopLimit=3, onResponse=None) +def sendText(self, text: ~AnyStr, destinationId='^all', wantAck=False, wantResponse=False, hopLimit=3, onResponse=None, channelIndex=0)

        Send a utf8 string to some other node, if the node has a display it will also be shown on the device.

        @@ -2174,7 +2192,8 @@ wantResponse – True if you want the service on the other side to send an a wantAck=False, wantResponse=False, hopLimit=defaultHopLimit, - onResponse=None): + onResponse=None, + channelIndex=0): """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. Arguments: @@ -2193,7 +2212,8 @@ wantResponse – True if you want the service on the other side to send an a wantAck=wantAck, wantResponse=wantResponse, hopLimit=hopLimit, - onResponse=onResponse)
  • + onResponse=onResponse, + channelIndex=channelIndex);
    @@ -2207,13 +2227,15 @@ wantResponse – True if you want the service on the other side to send an a
    def showInfo(self, file=sys.stdout):
         """Show human readable summary about this object"""
    -
    -    print(
    -        f"Owner: {self.getLongName()} ({self.getShortName()})", file=file)
    -    print(f"\nMy info: {stripnl(MessageToJson(self.myInfo))}", file=file)
    -    print("\nNodes in mesh:", file=file)
    +    owner = f"Owner: {self.getLongName()} ({self.getShortName()})"
    +    myinfo = f"\nMy info: {stripnl(MessageToJson(self.myInfo))}"
    +    mesh = "\nNodes in mesh:"
    +    nodes = ""
         for n in self.nodes.values():
    -        print(f"  {stripnl(n)}", file=file)
    + nodes = nodes + f" {stripnl(n)}" + infos = owner + myinfo + mesh + nodes + print(infos) + return infos
    @@ -2274,8 +2296,10 @@ wantResponse – True if you want the service on the other side to send an a for i, row in enumerate(rows): row['N'] = i+1 - print(tabulate(rows, headers='keys', missingval='N/A', - tablefmt='fancy_grid'), file=file) + table = tabulate(rows, headers='keys', missingval='N/A', + tablefmt='fancy_grid') + print(table) + return table
    @@ -2787,6 +2811,7 @@ hostname {string} – Hostname/IP address of the device to connect to

    meshtastic.radioconfig_pb2
  • meshtastic.remote_hardware
  • meshtastic.remote_hardware_pb2
  • +
  • meshtastic.storeforward_pb2
  • meshtastic.test
  • meshtastic.tunnel
  • meshtastic.util
  • @@ -2854,7 +2879,7 @@ hostname {string} – Hostname/IP address of the device to connect to

    \ No newline at end of file diff --git a/docs/meshtastic/mesh_pb2.html b/docs/meshtastic/mesh_pb2.html index 20ffe8b..5bb5253 100644 --- a/docs/meshtastic/mesh_pb2.html +++ b/docs/meshtastic/mesh_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.mesh_pb2 API documentation - + @@ -22,7 +22,6 @@

    Module meshtastic.mesh_pb2

    -

    Generated protocol buffer code.

    Expand source code @@ -30,7 +29,7 @@
    # -*- coding: utf-8 -*-
     # Generated by the protocol buffer compiler.  DO NOT EDIT!
     # source: mesh.proto
    -"""Generated protocol buffer code."""
    +
     from google.protobuf.internal import enum_type_wrapper
     from google.protobuf import descriptor as _descriptor
     from google.protobuf import message as _message
    @@ -49,8 +48,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
       package='',
       syntax='proto3',
       serialized_options=b'\n\023com.geeksville.meshB\nMeshProtosH\003Z!github.com/meshtastic/gomeshproto',
    -  create_key=_descriptor._internal_create_key,
    -  serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"v\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\x81\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\x12 \n\x08hw_model\x18\x06 \x01(\x0e\x32\x0e.HardwareModel\x12\x13\n\x0bis_licensed\x18\x07 \x01(\x08\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x07\"\xc5\x02\n\x07Routing\x12(\n\rroute_request\x18\x01 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x0e.Routing.ErrorH\x00\"\xb4\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"{\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\"\xe0\x02\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12\x18\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x05.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x12&\n\x08priority\x18\x0c \x01(\x0e\x32\x14.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\r \x01(\x05\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\x42\x10\n\x0epayloadVariant\"j\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\x12\x12\n\nlast_heard\x18\x04 \x01(\x07\"\xcb\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x11\n\tnum_bands\x18\x03 \x01(\r\x12\x14\n\x0cmax_channels\x18\x0f \x01(\r\x12\x12\n\x06region\x18\x04 \x01(\tB\x02\x18\x01\x12\x1f\n\x13hw_model_deprecated\x18\x05 \x01(\tB\x02\x18\x01\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12&\n\nerror_code\x18\x07 \x01(\x0e\x32\x12.CriticalErrorCode\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x14\n\x0creboot_count\x18\n \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xb5\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x1f\n\x05level\x18\x04 \x01(\x0e\x32\x10.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"\xe9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x0b \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12 \n\nlog_record\x18\x07 \x01(\x0b\x32\n.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\x10\n\x0epayloadVariantJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\"\xe1\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12&\n\tpeer_info\x18\x03 \x01(\x0b\x32\x11.ToRadio.PeerInfoH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12\x14\n\ndisconnect\x18h \x01(\x08H\x00\x1a\x35\n\x08PeerInfo\x12\x13\n\x0b\x61pp_version\x18\x01 \x01(\r\x12\x14\n\x0cmqtt_gateway\x18\x02 \x01(\x08\x42\x10\n\x0epayloadVariantJ\x04\x08\x01\x10\x02J\x04\x08\x65\x10\x66J\x04\x08\x66\x10gJ\x04\x08g\x10h*\xa0\x02\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1p6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0c\n\x08TBEAM0p7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1p3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xe1\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04None\x10\x00\x12\x0e\n\nTxWatchdog\x10\x01\x12\x12\n\x0eSleepEnterWait\x10\x02\x12\x0b\n\x07NoRadio\x10\x03\x12\x0f\n\x0bUnspecified\x10\x04\x12\x13\n\x0fUBloxInitFailed\x10\x05\x12\x0c\n\x08NoAXP192\x10\x06\x12\x17\n\x13InvalidRadioSetting\x10\x07\x12\x12\n\x0eTransmitFailed\x10\x08\x12\x0c\n\x08\x42rownout\x10\t\x12\x11\n\rSX1262Failure\x10\n\x12\x0f\n\x0bRadioSpiBug\x10\x0b\x42\x46\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
    +  serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"\x94\x06\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07\x12,\n\x0flocation_source\x18\n \x01(\x0e\x32\x13.Position.LocSource\x12,\n\x0f\x61ltitude_source\x18\x0b \x01(\x0e\x32\x13.Position.AltSource\x12\x15\n\rpos_timestamp\x18\x0c \x01(\x07\x12\x17\n\x0fpos_time_millis\x18\r \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\x0e \x01(\x11\x12\x15\n\ralt_geoid_sep\x18\x0f \x01(\x11\x12\x0c\n\x04PDOP\x18\x10 \x01(\r\x12\x0c\n\x04HDOP\x18\x11 \x01(\r\x12\x0c\n\x04VDOP\x18\x12 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x13 \x01(\r\x12\x14\n\x0cground_speed\x18\x14 \x01(\r\x12\x14\n\x0cground_track\x18\x15 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x16 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x17 \x01(\r\x12\x14\n\x0csats_in_view\x18\x18 \x01(\r\x12\x11\n\tsensor_id\x18\x19 \x01(\r\x12\x17\n\x0fpos_next_update\x18( \x01(\r\x12\x16\n\x0epos_seq_number\x18) \x01(\r\"n\n\tLocSource\x12\x16\n\x12LOCSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13LOCSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13LOCSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13LOCSRC_GPS_EXTERNAL\x10\x03\"\x85\x01\n\tAltSource\x12\x16\n\x12\x41LTSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13\x41LTSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13\x41LTSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13\x41LTSRC_GPS_EXTERNAL\x10\x03\x12\x15\n\x11\x41LTSRC_BAROMETRIC\x10\x04J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\xd7\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\x12 \n\x08hw_model\x18\x06 \x01(\x0e\x32\x0e.HardwareModel\x12\x13\n\x0bis_licensed\x18\x07 \x01(\x08\x12\x13\n\x04team\x18\x08 \x01(\x0e\x32\x05.Team\x12\x14\n\x0ctx_power_dbm\x18\n \x01(\r\x12\x14\n\x0c\x61nt_gain_dbi\x18\x0b \x01(\r\x12\x13\n\x0b\x61nt_azimuth\x18\x0c \x01(\r\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x07\"\xc5\x02\n\x07Routing\x12(\n\rroute_request\x18\x01 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x0e.Routing.ErrorH\x00\"\xb4\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"{\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\"\xe0\x02\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12\x18\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x05.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x12&\n\x08priority\x18\x0c \x01(\x0e\x32\x14.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\r \x01(\x05\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\x42\x10\n\x0epayloadVariant\"j\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\x12\x12\n\nlast_heard\x18\x04 \x01(\x07\"\xcb\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x11\n\tnum_bands\x18\x03 \x01(\r\x12\x14\n\x0cmax_channels\x18\x0f \x01(\r\x12\x12\n\x06region\x18\x04 \x01(\tB\x02\x18\x01\x12\x1f\n\x13hw_model_deprecated\x18\x05 \x01(\tB\x02\x18\x01\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12&\n\nerror_code\x18\x07 \x01(\x0e\x32\x12.CriticalErrorCode\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x14\n\x0creboot_count\x18\n \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xb5\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x1f\n\x05level\x18\x04 \x01(\x0e\x32\x10.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"\xe9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x0b \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12 \n\nlog_record\x18\x07 \x01(\x0b\x32\n.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\x10\n\x0epayloadVariantJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\"\xe1\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12&\n\tpeer_info\x18\x03 \x01(\x0b\x32\x11.ToRadio.PeerInfoH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12\x14\n\ndisconnect\x18h \x01(\x08H\x00\x1a\x35\n\x08PeerInfo\x12\x13\n\x0b\x61pp_version\x18\x01 \x01(\r\x12\x14\n\x0cmqtt_gateway\x18\x02 \x01(\x08\x42\x10\n\x0epayloadVariantJ\x04\x08\x01\x10\x02J\x04\x08\x65\x10\x66J\x04\x08\x66\x10gJ\x04\x08g\x10h*\xac\x02\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1p6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0c\n\x08TBEAM0p7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1p3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'*\xb5\x01\n\x04Team\x12\t\n\x05\x43LEAR\x10\x00\x12\x08\n\x04\x43YAN\x10\x01\x12\t\n\x05WHITE\x10\x02\x12\n\n\x06YELLOW\x10\x03\x12\n\n\x06ORANGE\x10\x04\x12\x0b\n\x07MAGENTA\x10\x05\x12\x07\n\x03RED\x10\x06\x12\n\n\x06MAROON\x10\x07\x12\n\n\x06PURPLE\x10\x08\x12\r\n\tDARK_BLUE\x10\t\x12\x08\n\x04\x42LUE\x10\n\x12\x08\n\x04TEAL\x10\x0b\x12\t\n\x05GREEN\x10\x0c\x12\x0e\n\nDARK_GREEN\x10\r\x12\t\n\x05\x42ROWN\x10\x0e*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xe1\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04None\x10\x00\x12\x0e\n\nTxWatchdog\x10\x01\x12\x12\n\x0eSleepEnterWait\x10\x02\x12\x0b\n\x07NoRadio\x10\x03\x12\x0f\n\x0bUnspecified\x10\x04\x12\x13\n\x0fUBloxInitFailed\x10\x05\x12\x0c\n\x08NoAXP192\x10\x06\x12\x17\n\x13InvalidRadioSetting\x10\x07\x12\x12\n\x0eTransmitFailed\x10\x08\x12\x0c\n\x08\x42rownout\x10\t\x12\x11\n\rSX1262Failure\x10\n\x12\x0f\n\x0bRadioSpiBug\x10\x0b\x42\x46\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
       ,
       dependencies=[portnums__pb2.DESCRIPTOR,])
     
    @@ -59,129 +57,186 @@ _HARDWAREMODEL = _descriptor.EnumDescriptor(
       full_name='HardwareModel',
       filename=None,
       file=DESCRIPTOR,
    -  create_key=_descriptor._internal_create_key,
       values=[
         _descriptor.EnumValueDescriptor(
           name='UNSET', index=0, number=0,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TLORA_V2', index=1, number=1,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TLORA_V1', index=2, number=2,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TLORA_V2_1_1p6', index=3, number=3,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TBEAM', index=4, number=4,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='HELTEC_V2_0', index=5, number=5,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TBEAM0p7', index=6, number=6,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='T_ECHO', index=7, number=7,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TLORA_V1_1p3', index=8, number=8,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='RAK4631', index=9, number=9,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='HELTEC_V2_1', index=10, number=10,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='LORA_RELAY_V1', index=11, number=32,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NRF52840DK', index=12, number=33,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='PPR', index=13, number=34,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='GENIEBLOCKS', index=14, number=35,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NRF52_UNKNOWN', index=15, number=36,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='PORTDUINO', index=16, number=37,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='ANDROID_SIM', index=17, number=38,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='DIY_V1', index=18, number=39,
    +      serialized_options=None,
    +      type=None),
       ],
       containing_type=None,
       serialized_options=None,
    -  serialized_start=2214,
    -  serialized_end=2502,
    +  serialized_start=2971,
    +  serialized_end=3271,
     )
     _sym_db.RegisterEnumDescriptor(_HARDWAREMODEL)
     
     HardwareModel = enum_type_wrapper.EnumTypeWrapper(_HARDWAREMODEL)
    +_TEAM = _descriptor.EnumDescriptor(
    +  name='Team',
    +  full_name='Team',
    +  filename=None,
    +  file=DESCRIPTOR,
    +  values=[
    +    _descriptor.EnumValueDescriptor(
    +      name='CLEAR', index=0, number=0,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='CYAN', index=1, number=1,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='WHITE', index=2, number=2,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='YELLOW', index=3, number=3,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='ORANGE', index=4, number=4,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='MAGENTA', index=5, number=5,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='RED', index=6, number=6,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='MAROON', index=7, number=7,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='PURPLE', index=8, number=8,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='DARK_BLUE', index=9, number=9,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='BLUE', index=10, number=10,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='TEAL', index=11, number=11,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='GREEN', index=12, number=12,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='DARK_GREEN', index=13, number=13,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='BROWN', index=14, number=14,
    +      serialized_options=None,
    +      type=None),
    +  ],
    +  containing_type=None,
    +  serialized_options=None,
    +  serialized_start=3274,
    +  serialized_end=3455,
    +)
    +_sym_db.RegisterEnumDescriptor(_TEAM)
    +
    +Team = enum_type_wrapper.EnumTypeWrapper(_TEAM)
     _CONSTANTS = _descriptor.EnumDescriptor(
       name='Constants',
       full_name='Constants',
       filename=None,
       file=DESCRIPTOR,
    -  create_key=_descriptor._internal_create_key,
       values=[
         _descriptor.EnumValueDescriptor(
           name='Unused', index=0, number=0,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='DATA_PAYLOAD_LEN', index=1, number=237,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
       ],
       containing_type=None,
       serialized_options=None,
    -  serialized_start=2504,
    -  serialized_end=2550,
    +  serialized_start=3457,
    +  serialized_end=3503,
     )
     _sym_db.RegisterEnumDescriptor(_CONSTANTS)
     
    @@ -191,73 +246,60 @@ _CRITICALERRORCODE = _descriptor.EnumDescriptor(
       full_name='CriticalErrorCode',
       filename=None,
       file=DESCRIPTOR,
    -  create_key=_descriptor._internal_create_key,
       values=[
         _descriptor.EnumValueDescriptor(
           name='None', index=0, number=0,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TxWatchdog', index=1, number=1,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='SleepEnterWait', index=2, number=2,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NoRadio', index=3, number=3,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='Unspecified', index=4, number=4,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='UBloxInitFailed', index=5, number=5,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NoAXP192', index=6, number=6,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='InvalidRadioSetting', index=7, number=7,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TransmitFailed', index=8, number=8,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='Brownout', index=9, number=9,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='SX1262Failure', index=10, number=10,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='RadioSpiBug', index=11, number=11,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
       ],
       containing_type=None,
       serialized_options=None,
    -  serialized_start=2553,
    -  serialized_end=2778,
    +  serialized_start=3506,
    +  serialized_end=3731,
     )
     _sym_db.RegisterEnumDescriptor(_CRITICALERRORCODE)
     
    @@ -280,6 +322,22 @@ GENIEBLOCKS = 35
     NRF52_UNKNOWN = 36
     PORTDUINO = 37
     ANDROID_SIM = 38
    +DIY_V1 = 39
    +CLEAR = 0
    +CYAN = 1
    +WHITE = 2
    +YELLOW = 3
    +ORANGE = 4
    +MAGENTA = 5
    +RED = 6
    +MAROON = 7
    +PURPLE = 8
    +DARK_BLUE = 9
    +BLUE = 10
    +TEAL = 11
    +GREEN = 12
    +DARK_GREEN = 13
    +BROWN = 14
     Unused = 0
     DATA_PAYLOAD_LEN = 237
     globals()['None'] = 0
    @@ -296,73 +354,125 @@ SX1262Failure = 10
     RadioSpiBug = 11
     
     
    +_POSITION_LOCSOURCE = _descriptor.EnumDescriptor(
    +  name='LocSource',
    +  full_name='Position.LocSource',
    +  filename=None,
    +  file=DESCRIPTOR,
    +  values=[
    +    _descriptor.EnumValueDescriptor(
    +      name='LOCSRC_UNSPECIFIED', index=0, number=0,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='LOCSRC_MANUAL_ENTRY', index=1, number=1,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='LOCSRC_GPS_INTERNAL', index=2, number=2,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='LOCSRC_GPS_EXTERNAL', index=3, number=3,
    +      serialized_options=None,
    +      type=None),
    +  ],
    +  containing_type=None,
    +  serialized_options=None,
    +  serialized_start=561,
    +  serialized_end=671,
    +)
    +_sym_db.RegisterEnumDescriptor(_POSITION_LOCSOURCE)
    +
    +_POSITION_ALTSOURCE = _descriptor.EnumDescriptor(
    +  name='AltSource',
    +  full_name='Position.AltSource',
    +  filename=None,
    +  file=DESCRIPTOR,
    +  values=[
    +    _descriptor.EnumValueDescriptor(
    +      name='ALTSRC_UNSPECIFIED', index=0, number=0,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='ALTSRC_MANUAL_ENTRY', index=1, number=1,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='ALTSRC_GPS_INTERNAL', index=2, number=2,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='ALTSRC_GPS_EXTERNAL', index=3, number=3,
    +      serialized_options=None,
    +      type=None),
    +    _descriptor.EnumValueDescriptor(
    +      name='ALTSRC_BAROMETRIC', index=4, number=4,
    +      serialized_options=None,
    +      type=None),
    +  ],
    +  containing_type=None,
    +  serialized_options=None,
    +  serialized_start=674,
    +  serialized_end=807,
    +)
    +_sym_db.RegisterEnumDescriptor(_POSITION_ALTSOURCE)
    +
     _ROUTING_ERROR = _descriptor.EnumDescriptor(
       name='Error',
       full_name='Routing.Error',
       filename=None,
       file=DESCRIPTOR,
    -  create_key=_descriptor._internal_create_key,
       values=[
         _descriptor.EnumValueDescriptor(
           name='NONE', index=0, number=0,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NO_ROUTE', index=1, number=1,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='GOT_NAK', index=2, number=2,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TIMEOUT', index=3, number=3,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NO_INTERFACE', index=4, number=4,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='MAX_RETRANSMIT', index=5, number=5,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NO_CHANNEL', index=6, number=6,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TOO_LARGE', index=7, number=7,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NO_RESPONSE', index=8, number=8,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='BAD_REQUEST', index=9, number=32,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='NOT_AUTHORIZED', index=10, number=33,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
       ],
       containing_type=None,
       serialized_options=None,
    -  serialized_start=450,
    -  serialized_end=630,
    +  serialized_start=1207,
    +  serialized_end=1387,
     )
     _sym_db.RegisterEnumDescriptor(_ROUTING_ERROR)
     
    @@ -371,48 +481,40 @@ _MESHPACKET_PRIORITY = _descriptor.EnumDescriptor(
       full_name='MeshPacket.Priority',
       filename=None,
       file=DESCRIPTOR,
    -  create_key=_descriptor._internal_create_key,
       values=[
         _descriptor.EnumValueDescriptor(
           name='UNSET', index=0, number=0,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='MIN', index=1, number=1,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='BACKGROUND', index=2, number=10,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='DEFAULT', index=3, number=64,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='RELIABLE', index=4, number=70,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='ACK', index=5, number=120,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='MAX', index=6, number=127,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
       ],
       containing_type=None,
       serialized_options=None,
    -  serialized_start=1012,
    -  serialized_end=1103,
    +  serialized_start=1769,
    +  serialized_end=1860,
     )
     _sym_db.RegisterEnumDescriptor(_MESHPACKET_PRIORITY)
     
    @@ -421,48 +523,40 @@ _LOGRECORD_LEVEL = _descriptor.EnumDescriptor(
       full_name='LogRecord.Level',
       filename=None,
       file=DESCRIPTOR,
    -  create_key=_descriptor._internal_create_key,
       values=[
         _descriptor.EnumValueDescriptor(
           name='UNSET', index=0, number=0,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='CRITICAL', index=1, number=50,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='ERROR', index=2, number=40,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='WARNING', index=3, number=30,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='INFO', index=4, number=20,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='DEBUG', index=5, number=10,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
         _descriptor.EnumValueDescriptor(
           name='TRACE', index=6, number=5,
           serialized_options=None,
    -      type=None,
    -      create_key=_descriptor._internal_create_key),
    +      type=None),
       ],
       containing_type=None,
       serialized_options=None,
    -  serialized_start=1659,
    -  serialized_end=1747,
    +  serialized_start=2416,
    +  serialized_end=2504,
     )
     _sym_db.RegisterEnumDescriptor(_LOGRECORD_LEVEL)
     
    @@ -473,7 +567,6 @@ _POSITION = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='latitude_i', full_name='Position.latitude_i', index=0,
    @@ -481,40 +574,168 @@ _POSITION = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='longitude_i', full_name='Position.longitude_i', index=1,
           number=2, type=15, cpp_type=1, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='altitude', full_name='Position.altitude', index=2,
           number=3, type=5, cpp_type=1, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='battery_level', full_name='Position.battery_level', index=3,
           number=4, type=5, cpp_type=1, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='time', full_name='Position.time', index=4,
           number=9, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='location_source', full_name='Position.location_source', index=5,
    +      number=10, type=14, cpp_type=8, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='altitude_source', full_name='Position.altitude_source', index=6,
    +      number=11, type=14, cpp_type=8, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='pos_timestamp', full_name='Position.pos_timestamp', index=7,
    +      number=12, type=7, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='pos_time_millis', full_name='Position.pos_time_millis', index=8,
    +      number=13, type=5, cpp_type=1, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='altitude_hae', full_name='Position.altitude_hae', index=9,
    +      number=14, type=17, cpp_type=1, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='alt_geoid_sep', full_name='Position.alt_geoid_sep', index=10,
    +      number=15, type=17, cpp_type=1, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='PDOP', full_name='Position.PDOP', index=11,
    +      number=16, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='HDOP', full_name='Position.HDOP', index=12,
    +      number=17, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='VDOP', full_name='Position.VDOP', index=13,
    +      number=18, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='gps_accuracy', full_name='Position.gps_accuracy', index=14,
    +      number=19, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='ground_speed', full_name='Position.ground_speed', index=15,
    +      number=20, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='ground_track', full_name='Position.ground_track', index=16,
    +      number=21, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='fix_quality', full_name='Position.fix_quality', index=17,
    +      number=22, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='fix_type', full_name='Position.fix_type', index=18,
    +      number=23, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='sats_in_view', full_name='Position.sats_in_view', index=19,
    +      number=24, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='sensor_id', full_name='Position.sensor_id', index=20,
    +      number=25, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='pos_next_update', full_name='Position.pos_next_update', index=21,
    +      number=40, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='pos_seq_number', full_name='Position.pos_seq_number', index=22,
    +      number=41, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
       nested_types=[],
       enum_types=[
    +    _POSITION_LOCSOURCE,
    +    _POSITION_ALTSOURCE,
       ],
       serialized_options=None,
       is_extendable=False,
    @@ -522,8 +743,8 @@ _POSITION = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=30,
    -  serialized_end=148,
    +  serialized_start=31,
    +  serialized_end=819,
     )
     
     
    @@ -533,7 +754,6 @@ _USER = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='id', full_name='User.id', index=0,
    @@ -541,42 +761,70 @@ _USER = _descriptor.Descriptor(
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='long_name', full_name='User.long_name', index=1,
           number=2, type=9, cpp_type=9, label=1,
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='short_name', full_name='User.short_name', index=2,
           number=3, type=9, cpp_type=9, label=1,
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='macaddr', full_name='User.macaddr', index=3,
           number=4, type=12, cpp_type=9, label=1,
           has_default_value=False, default_value=b"",
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='hw_model', full_name='User.hw_model', index=4,
           number=6, type=14, cpp_type=8, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='is_licensed', full_name='User.is_licensed', index=5,
           number=7, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='team', full_name='User.team', index=6,
    +      number=8, type=14, cpp_type=8, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='tx_power_dbm', full_name='User.tx_power_dbm', index=7,
    +      number=10, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='ant_gain_dbi', full_name='User.ant_gain_dbi', index=8,
    +      number=11, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
    +    _descriptor.FieldDescriptor(
    +      name='ant_azimuth', full_name='User.ant_azimuth', index=9,
    +      number=12, type=13, cpp_type=3, label=1,
    +      has_default_value=False, default_value=0,
    +      message_type=None, enum_type=None, containing_type=None,
    +      is_extension=False, extension_scope=None,
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -589,8 +837,8 @@ _USER = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=151,
    -  serialized_end=280,
    +  serialized_start=822,
    +  serialized_end=1037,
     )
     
     
    @@ -600,7 +848,6 @@ _ROUTEDISCOVERY = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='route', full_name='RouteDiscovery.route', index=0,
    @@ -608,7 +855,7 @@ _ROUTEDISCOVERY = _descriptor.Descriptor(
           has_default_value=False, default_value=[],
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -621,8 +868,8 @@ _ROUTEDISCOVERY = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=282,
    -  serialized_end=313,
    +  serialized_start=1039,
    +  serialized_end=1070,
     )
     
     
    @@ -632,7 +879,6 @@ _ROUTING = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='route_request', full_name='Routing.route_request', index=0,
    @@ -640,21 +886,21 @@ _ROUTING = _descriptor.Descriptor(
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='route_reply', full_name='Routing.route_reply', index=1,
           number=2, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='error_reason', full_name='Routing.error_reason', index=2,
           number=3, type=14, cpp_type=8, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -669,12 +915,10 @@ _ROUTING = _descriptor.Descriptor(
       oneofs=[
         _descriptor.OneofDescriptor(
           name='variant', full_name='Routing.variant',
    -      index=0, containing_type=None,
    -      create_key=_descriptor._internal_create_key,
    -    fields=[]),
    +      index=0, containing_type=None, fields=[]),
       ],
    -  serialized_start=316,
    -  serialized_end=641,
    +  serialized_start=1073,
    +  serialized_end=1398,
     )
     
     
    @@ -684,7 +928,6 @@ _DATA = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='portnum', full_name='Data.portnum', index=0,
    @@ -692,42 +935,42 @@ _DATA = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='payload', full_name='Data.payload', index=1,
           number=2, type=12, cpp_type=9, label=1,
           has_default_value=False, default_value=b"",
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='want_response', full_name='Data.want_response', index=2,
           number=3, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='dest', full_name='Data.dest', index=3,
           number=4, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='source', full_name='Data.source', index=4,
           number=5, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='request_id', full_name='Data.request_id', index=5,
           number=6, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -740,8 +983,8 @@ _DATA = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=643,
    -  serialized_end=766,
    +  serialized_start=1400,
    +  serialized_end=1523,
     )
     
     
    @@ -751,7 +994,6 @@ _MESHPACKET = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='from', full_name='MeshPacket.from', index=0,
    @@ -759,84 +1001,84 @@ _MESHPACKET = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='to', full_name='MeshPacket.to', index=1,
           number=2, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='channel', full_name='MeshPacket.channel', index=2,
           number=3, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='decoded', full_name='MeshPacket.decoded', index=3,
           number=4, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='encrypted', full_name='MeshPacket.encrypted', index=4,
           number=5, type=12, cpp_type=9, label=1,
           has_default_value=False, default_value=b"",
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='id', full_name='MeshPacket.id', index=5,
           number=6, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='rx_time', full_name='MeshPacket.rx_time', index=6,
           number=7, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='rx_snr', full_name='MeshPacket.rx_snr', index=7,
           number=8, type=2, cpp_type=6, label=1,
           has_default_value=False, default_value=float(0),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='hop_limit', full_name='MeshPacket.hop_limit', index=8,
           number=10, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='want_ack', full_name='MeshPacket.want_ack', index=9,
           number=11, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='priority', full_name='MeshPacket.priority', index=10,
           number=12, type=14, cpp_type=8, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='rx_rssi', full_name='MeshPacket.rx_rssi', index=11,
           number=13, type=5, cpp_type=1, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -851,12 +1093,10 @@ _MESHPACKET = _descriptor.Descriptor(
       oneofs=[
         _descriptor.OneofDescriptor(
           name='payloadVariant', full_name='MeshPacket.payloadVariant',
    -      index=0, containing_type=None,
    -      create_key=_descriptor._internal_create_key,
    -    fields=[]),
    +      index=0, containing_type=None, fields=[]),
       ],
    -  serialized_start=769,
    -  serialized_end=1121,
    +  serialized_start=1526,
    +  serialized_end=1878,
     )
     
     
    @@ -866,7 +1106,6 @@ _NODEINFO = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='num', full_name='NodeInfo.num', index=0,
    @@ -874,35 +1113,35 @@ _NODEINFO = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='user', full_name='NodeInfo.user', index=1,
           number=2, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='position', full_name='NodeInfo.position', index=2,
           number=3, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='snr', full_name='NodeInfo.snr', index=3,
           number=7, type=2, cpp_type=6, label=1,
           has_default_value=False, default_value=float(0),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='last_heard', full_name='NodeInfo.last_heard', index=4,
           number=4, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -915,8 +1154,8 @@ _NODEINFO = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=1123,
    -  serialized_end=1229,
    +  serialized_start=1880,
    +  serialized_end=1986,
     )
     
     
    @@ -926,7 +1165,6 @@ _MYNODEINFO = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='my_node_num', full_name='MyNodeInfo.my_node_num', index=0,
    @@ -934,91 +1172,91 @@ _MYNODEINFO = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='has_gps', full_name='MyNodeInfo.has_gps', index=1,
           number=2, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='num_bands', full_name='MyNodeInfo.num_bands', index=2,
           number=3, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='max_channels', full_name='MyNodeInfo.max_channels', index=3,
           number=15, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='region', full_name='MyNodeInfo.region', index=4,
           number=4, type=9, cpp_type=9, label=1,
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=b'\030\001', file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='hw_model_deprecated', full_name='MyNodeInfo.hw_model_deprecated', index=5,
           number=5, type=9, cpp_type=9, label=1,
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=b'\030\001', file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='firmware_version', full_name='MyNodeInfo.firmware_version', index=6,
           number=6, type=9, cpp_type=9, label=1,
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='error_code', full_name='MyNodeInfo.error_code', index=7,
           number=7, type=14, cpp_type=8, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='error_address', full_name='MyNodeInfo.error_address', index=8,
           number=8, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='error_count', full_name='MyNodeInfo.error_count', index=9,
           number=9, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='reboot_count', full_name='MyNodeInfo.reboot_count', index=10,
           number=10, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=11,
           number=13, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='min_app_version', full_name='MyNodeInfo.min_app_version', index=12,
           number=14, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -1031,8 +1269,8 @@ _MYNODEINFO = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=1232,
    -  serialized_end=1563,
    +  serialized_start=1989,
    +  serialized_end=2320,
     )
     
     
    @@ -1042,7 +1280,6 @@ _LOGRECORD = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='message', full_name='LogRecord.message', index=0,
    @@ -1050,28 +1287,28 @@ _LOGRECORD = _descriptor.Descriptor(
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='time', full_name='LogRecord.time', index=1,
           number=2, type=7, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='source', full_name='LogRecord.source', index=2,
           number=3, type=9, cpp_type=9, label=1,
           has_default_value=False, default_value=b"".decode('utf-8'),
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='level', full_name='LogRecord.level', index=3,
           number=4, type=14, cpp_type=8, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -1085,8 +1322,8 @@ _LOGRECORD = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=1566,
    -  serialized_end=1747,
    +  serialized_start=2323,
    +  serialized_end=2504,
     )
     
     
    @@ -1096,7 +1333,6 @@ _FROMRADIO = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='num', full_name='FromRadio.num', index=0,
    @@ -1104,49 +1340,49 @@ _FROMRADIO = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='packet', full_name='FromRadio.packet', index=1,
           number=11, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='my_info', full_name='FromRadio.my_info', index=2,
           number=3, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='node_info', full_name='FromRadio.node_info', index=3,
           number=4, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='log_record', full_name='FromRadio.log_record', index=4,
           number=7, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='config_complete_id', full_name='FromRadio.config_complete_id', index=5,
           number=8, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='rebooted', full_name='FromRadio.rebooted', index=6,
           number=9, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -1160,12 +1396,10 @@ _FROMRADIO = _descriptor.Descriptor(
       oneofs=[
         _descriptor.OneofDescriptor(
           name='payloadVariant', full_name='FromRadio.payloadVariant',
    -      index=0, containing_type=None,
    -      create_key=_descriptor._internal_create_key,
    -    fields=[]),
    +      index=0, containing_type=None, fields=[]),
       ],
    -  serialized_start=1750,
    -  serialized_end=1983,
    +  serialized_start=2507,
    +  serialized_end=2740,
     )
     
     
    @@ -1175,7 +1409,6 @@ _TORADIO_PEERINFO = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='app_version', full_name='ToRadio.PeerInfo.app_version', index=0,
    @@ -1183,14 +1416,14 @@ _TORADIO_PEERINFO = _descriptor.Descriptor(
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='mqtt_gateway', full_name='ToRadio.PeerInfo.mqtt_gateway', index=1,
           number=2, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -1203,8 +1436,8 @@ _TORADIO_PEERINFO = _descriptor.Descriptor(
       extension_ranges=[],
       oneofs=[
       ],
    -  serialized_start=2116,
    -  serialized_end=2169,
    +  serialized_start=2873,
    +  serialized_end=2926,
     )
     
     _TORADIO = _descriptor.Descriptor(
    @@ -1213,7 +1446,6 @@ _TORADIO = _descriptor.Descriptor(
       filename=None,
       file=DESCRIPTOR,
       containing_type=None,
    -  create_key=_descriptor._internal_create_key,
       fields=[
         _descriptor.FieldDescriptor(
           name='packet', full_name='ToRadio.packet', index=0,
    @@ -1221,28 +1453,28 @@ _TORADIO = _descriptor.Descriptor(
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='peer_info', full_name='ToRadio.peer_info', index=1,
           number=3, type=11, cpp_type=10, label=1,
           has_default_value=False, default_value=None,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='want_config_id', full_name='ToRadio.want_config_id', index=2,
           number=100, type=13, cpp_type=3, label=1,
           has_default_value=False, default_value=0,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
         _descriptor.FieldDescriptor(
           name='disconnect', full_name='ToRadio.disconnect', index=3,
           number=104, type=8, cpp_type=7, label=1,
           has_default_value=False, default_value=False,
           message_type=None, enum_type=None, containing_type=None,
           is_extension=False, extension_scope=None,
    -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    +      serialized_options=None, file=DESCRIPTOR),
       ],
       extensions=[
       ],
    @@ -1256,15 +1488,18 @@ _TORADIO = _descriptor.Descriptor(
       oneofs=[
         _descriptor.OneofDescriptor(
           name='payloadVariant', full_name='ToRadio.payloadVariant',
    -      index=0, containing_type=None,
    -      create_key=_descriptor._internal_create_key,
    -    fields=[]),
    +      index=0, containing_type=None, fields=[]),
       ],
    -  serialized_start=1986,
    -  serialized_end=2211,
    +  serialized_start=2743,
    +  serialized_end=2968,
     )
     
    +_POSITION.fields_by_name['location_source'].enum_type = _POSITION_LOCSOURCE
    +_POSITION.fields_by_name['altitude_source'].enum_type = _POSITION_ALTSOURCE
    +_POSITION_LOCSOURCE.containing_type = _POSITION
    +_POSITION_ALTSOURCE.containing_type = _POSITION
     _USER.fields_by_name['hw_model'].enum_type = _HARDWAREMODEL
    +_USER.fields_by_name['team'].enum_type = _TEAM
     _ROUTING.fields_by_name['route_request'].message_type = _ROUTEDISCOVERY
     _ROUTING.fields_by_name['route_reply'].message_type = _ROUTEDISCOVERY
     _ROUTING.fields_by_name['error_reason'].enum_type = _ROUTING_ERROR
    @@ -1342,6 +1577,7 @@ DESCRIPTOR.message_types_by_name['LogRecord'] = _LOGRECORD
     DESCRIPTOR.message_types_by_name['FromRadio'] = _FROMRADIO
     DESCRIPTOR.message_types_by_name['ToRadio'] = _TORADIO
     DESCRIPTOR.enum_types_by_name['HardwareModel'] = _HARDWAREMODEL
    +DESCRIPTOR.enum_types_by_name['Team'] = _TEAM
     DESCRIPTOR.enum_types_by_name['Constants'] = _CONSTANTS
     DESCRIPTOR.enum_types_by_name['CriticalErrorCode'] = _CRITICALERRORCODE
     _sym_db.RegisterFileDescriptor(DESCRIPTOR)
    @@ -1449,13 +1685,16 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
     
    class Data -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1464,94 +1703,1295 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var DEST_FIELD_NUMBER
    +
    +
    +
    +
    var PAYLOAD_FIELD_NUMBER
    +
    +
    +
    +
    var PORTNUM_FIELD_NUMBER
    +
    +
    +
    +
    var REQUEST_ID_FIELD_NUMBER
    +
    +
    +
    +
    var SOURCE_FIELD_NUMBER
    +
    +
    +
    +
    var WANT_RESPONSE_FIELD_NUMBER
    +
    +
    +
    +
    +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    var dest
    -

    Field Data.dest

    +

    Getter for dest.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var payload
    -

    Field Data.payload

    +

    Getter for payload.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var portnum
    -

    Field Data.portnum

    +

    Getter for portnum.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var request_id
    -

    Field Data.request_id

    +

    Getter for request_id.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var source
    -

    Field Data.source

    +

    Getter for source.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var want_response
    -

    Field Data.want_response

    +

    Getter for want_response.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class FromRadio -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    +
    var CONFIG_COMPLETE_ID_FIELD_NUMBER
    +
    +
    +
    var DESCRIPTOR
    +
    var LOG_RECORD_FIELD_NUMBER
    +
    +
    +
    +
    var MY_INFO_FIELD_NUMBER
    +
    +
    +
    +
    var NODE_INFO_FIELD_NUMBER
    +
    +
    +
    +
    var NUM_FIELD_NUMBER
    +
    +
    +
    +
    var PACKET_FIELD_NUMBER
    +
    +
    +
    +
    var REBOOTED_FIELD_NUMBER
    +
    +
    +
    +
    +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    var config_complete_id
    -

    Field FromRadio.config_complete_id

    +

    Getter for config_complete_id.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var log_record
    -

    Field FromRadio.log_record

    +

    Getter for log_record.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var my_info
    -

    Field FromRadio.my_info

    +

    Getter for my_info.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var node_info
    -

    Field FromRadio.node_info

    +

    Getter for node_info.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var num
    -

    Field FromRadio.num

    +

    Getter for num.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var packet
    -

    Field FromRadio.packet

    +

    Getter for packet.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var rebooted
    -

    Field FromRadio.rebooted

    +

    Getter for rebooted.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class LogRecord -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1576,10 +3016,26 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var LEVEL_FIELD_NUMBER
    +
    +
    +
    var Level
    +
    var MESSAGE_FIELD_NUMBER
    +
    +
    +
    +
    var SOURCE_FIELD_NUMBER
    +
    +
    +
    +
    var TIME_FIELD_NUMBER
    +
    +
    +
    var TRACE
    @@ -1593,35 +3049,567 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +
    +

    Instance variables

    var level
    -

    Field LogRecord.level

    +

    Getter for level.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var message
    -

    Field LogRecord.message

    +

    Getter for message.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var source
    -

    Field LogRecord.source

    +

    Getter for source.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var time
    -

    Field LogRecord.time

    +

    Getter for time.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class MeshPacket -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1634,6 +3622,14 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var CHANNEL_FIELD_NUMBER
    +
    +
    +
    +
    var DECODED_FIELD_NUMBER
    +
    +
    +
    var DEFAULT
    @@ -1642,6 +3638,22 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var ENCRYPTED_FIELD_NUMBER
    +
    +
    +
    +
    var FROM_FIELD_NUMBER
    +
    +
    +
    +
    var HOP_LIMIT_FIELD_NUMBER
    +
    +
    +
    +
    var ID_FIELD_NUMBER
    +
    +
    +
    var MAX
    @@ -1650,6 +3662,10 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var PRIORITY_FIELD_NUMBER
    +
    +
    +
    var Priority
    @@ -1658,72 +3674,706 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var RX_RSSI_FIELD_NUMBER
    +
    +
    +
    +
    var RX_SNR_FIELD_NUMBER
    +
    +
    +
    +
    var RX_TIME_FIELD_NUMBER
    +
    +
    +
    +
    var TO_FIELD_NUMBER
    +
    +
    +
    var UNSET
    +
    var WANT_ACK_FIELD_NUMBER
    +
    +
    +
    + +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    var channel
    -

    Field MeshPacket.channel

    +

    Getter for channel.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var decoded
    -

    Field MeshPacket.decoded

    +

    Getter for decoded.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var encrypted
    -

    Field MeshPacket.encrypted

    +

    Getter for encrypted.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var from
    -

    Field MeshPacket.from

    +

    Getter for from.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var hop_limit
    -

    Field MeshPacket.hop_limit

    +

    Getter for hop_limit.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var id
    -

    Field MeshPacket.id

    +

    Getter for id.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var priority
    -

    Field MeshPacket.priority

    +

    Getter for priority.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var rx_rssi
    -

    Field MeshPacket.rx_rssi

    +

    Getter for rx_rssi.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var rx_snr
    -

    Field MeshPacket.rx_snr

    +

    Getter for rx_snr.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var rx_time
    -

    Field MeshPacket.rx_time

    +

    Getter for rx_time.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var to
    -

    Field MeshPacket.to

    +

    Getter for to.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var want_ack
    -

    Field MeshPacket.want_ack

    +

    Getter for want_ack.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class MyNodeInfo -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1732,72 +4382,737 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var ERROR_ADDRESS_FIELD_NUMBER
    +
    +
    +
    +
    var ERROR_CODE_FIELD_NUMBER
    +
    +
    +
    +
    var ERROR_COUNT_FIELD_NUMBER
    +
    +
    +
    +
    var FIRMWARE_VERSION_FIELD_NUMBER
    +
    +
    +
    +
    var HAS_GPS_FIELD_NUMBER
    +
    +
    +
    +
    var HW_MODEL_DEPRECATED_FIELD_NUMBER
    +
    +
    +
    +
    var MAX_CHANNELS_FIELD_NUMBER
    +
    +
    +
    +
    var MESSAGE_TIMEOUT_MSEC_FIELD_NUMBER
    +
    +
    +
    +
    var MIN_APP_VERSION_FIELD_NUMBER
    +
    +
    +
    +
    var MY_NODE_NUM_FIELD_NUMBER
    +
    +
    +
    +
    var NUM_BANDS_FIELD_NUMBER
    +
    +
    +
    +
    var REBOOT_COUNT_FIELD_NUMBER
    +
    +
    +
    +
    var REGION_FIELD_NUMBER
    +
    +
    +
    + +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    var error_address
    -

    Field MyNodeInfo.error_address

    +

    Getter for error_address.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var error_code
    -

    Field MyNodeInfo.error_code

    +

    Getter for error_code.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var error_count
    -

    Field MyNodeInfo.error_count

    +

    Getter for error_count.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var firmware_version
    -

    Field MyNodeInfo.firmware_version

    +

    Getter for firmware_version.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var has_gps
    -

    Field MyNodeInfo.has_gps

    +

    Getter for has_gps.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var hw_model_deprecated
    -

    Field MyNodeInfo.hw_model_deprecated

    +

    Getter for hw_model_deprecated.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var max_channels
    -

    Field MyNodeInfo.max_channels

    +

    Getter for max_channels.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var message_timeout_msec
    -

    Field MyNodeInfo.message_timeout_msec

    +

    Getter for message_timeout_msec.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var min_app_version
    -

    Field MyNodeInfo.min_app_version

    +

    Getter for min_app_version.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var my_node_num
    -

    Field MyNodeInfo.my_node_num

    +

    Getter for my_node_num.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var num_bands
    -

    Field MyNodeInfo.num_bands

    +

    Getter for num_bands.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var reboot_count
    -

    Field MyNodeInfo.reboot_count

    +

    Getter for reboot_count.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var region
    -

    Field MyNodeInfo.region

    +

    Getter for region.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class NodeInfo -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1806,82 +5121,1574 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var LAST_HEARD_FIELD_NUMBER
    +
    +
    +
    +
    var NUM_FIELD_NUMBER
    +
    +
    +
    +
    var POSITION_FIELD_NUMBER
    +
    +
    +
    +
    var SNR_FIELD_NUMBER
    +
    +
    +
    +
    var USER_FIELD_NUMBER
    +
    +
    +
    + +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    var last_heard
    -

    Field NodeInfo.last_heard

    +

    Getter for last_heard.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var num
    -

    Field NodeInfo.num

    +

    Getter for num.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var position
    -

    Field NodeInfo.position

    +

    Getter for position.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var snr
    -

    Field NodeInfo.snr

    +

    Getter for snr.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var user
    -

    Field NodeInfo.user

    +

    Getter for user.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class Position -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    +
    var ALTITUDE_FIELD_NUMBER
    +
    +
    +
    +
    var ALTITUDE_HAE_FIELD_NUMBER
    +
    +
    +
    +
    var ALTITUDE_SOURCE_FIELD_NUMBER
    +
    +
    +
    +
    var ALTSRC_BAROMETRIC
    +
    +
    +
    +
    var ALTSRC_GPS_EXTERNAL
    +
    +
    +
    +
    var ALTSRC_GPS_INTERNAL
    +
    +
    +
    +
    var ALTSRC_MANUAL_ENTRY
    +
    +
    +
    +
    var ALTSRC_UNSPECIFIED
    +
    +
    +
    +
    var ALT_GEOID_SEP_FIELD_NUMBER
    +
    +
    +
    +
    var AltSource
    +
    +
    +
    +
    var BATTERY_LEVEL_FIELD_NUMBER
    +
    +
    +
    var DESCRIPTOR
    +
    var FIX_QUALITY_FIELD_NUMBER
    +
    +
    +
    +
    var FIX_TYPE_FIELD_NUMBER
    +
    +
    +
    +
    var GPS_ACCURACY_FIELD_NUMBER
    +
    +
    +
    +
    var GROUND_SPEED_FIELD_NUMBER
    +
    +
    +
    +
    var GROUND_TRACK_FIELD_NUMBER
    +
    +
    +
    +
    var HDOP_FIELD_NUMBER
    +
    +
    +
    +
    var LATITUDE_I_FIELD_NUMBER
    +
    +
    +
    +
    var LOCATION_SOURCE_FIELD_NUMBER
    +
    +
    +
    +
    var LOCSRC_GPS_EXTERNAL
    +
    +
    +
    +
    var LOCSRC_GPS_INTERNAL
    +
    +
    +
    +
    var LOCSRC_MANUAL_ENTRY
    +
    +
    +
    +
    var LOCSRC_UNSPECIFIED
    +
    +
    +
    +
    var LONGITUDE_I_FIELD_NUMBER
    +
    +
    +
    +
    var LocSource
    +
    +
    +
    +
    var PDOP_FIELD_NUMBER
    +
    +
    +
    +
    var POS_NEXT_UPDATE_FIELD_NUMBER
    +
    +
    +
    +
    var POS_SEQ_NUMBER_FIELD_NUMBER
    +
    +
    +
    +
    var POS_TIMESTAMP_FIELD_NUMBER
    +
    +
    +
    +
    var POS_TIME_MILLIS_FIELD_NUMBER
    +
    +
    +
    +
    var SATS_IN_VIEW_FIELD_NUMBER
    +
    +
    +
    +
    var SENSOR_ID_FIELD_NUMBER
    +
    +
    +
    +
    var TIME_FIELD_NUMBER
    +
    +
    +
    +
    var VDOP_FIELD_NUMBER
    +
    +
    +
    +
    +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    +
    var HDOP
    +
    +

    Getter for HDOP.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var PDOP
    +
    +

    Getter for PDOP.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var VDOP
    +
    +

    Getter for VDOP.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var alt_geoid_sep
    +
    +

    Getter for alt_geoid_sep.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    var altitude
    -

    Field Position.altitude

    +

    Getter for altitude.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var altitude_hae
    +
    +

    Getter for altitude_hae.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var altitude_source
    +
    +

    Getter for altitude_source.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var battery_level
    -

    Field Position.battery_level

    +

    Getter for battery_level.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var fix_quality
    +
    +

    Getter for fix_quality.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var fix_type
    +
    +

    Getter for fix_type.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var gps_accuracy
    +
    +

    Getter for gps_accuracy.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var ground_speed
    +
    +

    Getter for ground_speed.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var ground_track
    +
    +

    Getter for ground_track.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var latitude_i
    -

    Field Position.latitude_i

    +

    Getter for latitude_i.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var location_source
    +
    +

    Getter for location_source.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var longitude_i
    -

    Field Position.longitude_i

    +

    Getter for longitude_i.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var pos_next_update
    +
    +

    Getter for pos_next_update.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var pos_seq_number
    +
    +

    Getter for pos_seq_number.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var pos_time_millis
    +
    +

    Getter for pos_time_millis.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var pos_timestamp
    +
    +

    Getter for pos_timestamp.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var sats_in_view
    +
    +

    Getter for sats_in_view.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var sensor_id
    +
    +

    Getter for sensor_id.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var time
    -

    Field Position.time

    +

    Getter for time.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class RouteDiscovery -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1890,24 +6697,543 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var ROUTE_FIELD_NUMBER
    +
    +
    +
    + +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    var route
    -

    Field RouteDiscovery.route

    +

    Getter for route.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class Routing -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1920,6 +7246,10 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var ERROR_REASON_FIELD_NUMBER
    +
    +
    +
    var Error
    @@ -1956,6 +7286,14 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var ROUTE_REPLY_FIELD_NUMBER
    +
    +
    +
    +
    var ROUTE_REQUEST_FIELD_NUMBER
    +
    +
    +
    var TIMEOUT
    @@ -1965,31 +7303,574 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +
    +

    Instance variables

    var error_reason
    -

    Field Routing.error_reason

    +

    Getter for error_reason.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var route_reply
    -

    Field Routing.route_reply

    +

    Getter for route_reply.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var route_request
    -

    Field Routing.route_request

    +

    Getter for route_request.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class ToRadio -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    @@ -1998,74 +7879,1285 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    +
    var DISCONNECT_FIELD_NUMBER
    +
    +
    +
    +
    var PACKET_FIELD_NUMBER
    +
    +
    +
    +
    var PEER_INFO_FIELD_NUMBER
    +
    +
    +
    var PeerInfo
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    +
    +
    var WANT_CONFIG_ID_FIELD_NUMBER
    +
    +
    +
    + +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +

    Instance variables

    var disconnect
    -

    Field ToRadio.disconnect

    +

    Getter for disconnect.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var packet
    -

    Field ToRadio.packet

    +

    Getter for packet.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var peer_info
    -

    Field ToRadio.peer_info

    +

    Getter for peer_info.

    +
    + +Expand source code + +
    def getter(self):
    +  field_value = self._fields.get(field)
    +  if field_value is None:
    +    # Construct a new object to represent this field.
    +    field_value = field._default_constructor(self)
    +
    +    # Atomically check if another thread has preempted us and, if not, swap
    +    # in the new object we just created.  If someone has preempted us, we
    +    # take that object and discard ours.
    +    # WARNING:  We are relying on setdefault() being atomic.  This is true
    +    #   in CPython but we haven't investigated others.  This warning appears
    +    #   in several other locations in this file.
    +    field_value = self._fields.setdefault(field, field_value)
    +  return field_value
    +
    var want_config_id
    -

    Field ToRadio.want_config_id

    +

    Getter for want_config_id.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    class User -(*args, **kwargs) +(**kwargs)
    -

    A ProtocolMessage

    +

    Abstract base class for protocol messages.

    +

    Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

    Ancestors

      -
    • google.protobuf.pyext._message.CMessage
    • google.protobuf.message.Message

    Class variables

    +
    var ANT_AZIMUTH_FIELD_NUMBER
    +
    +
    +
    +
    var ANT_GAIN_DBI_FIELD_NUMBER
    +
    +
    +
    var DESCRIPTOR
    +
    var HW_MODEL_FIELD_NUMBER
    +
    +
    +
    +
    var ID_FIELD_NUMBER
    +
    +
    +
    +
    var IS_LICENSED_FIELD_NUMBER
    +
    +
    +
    +
    var LONG_NAME_FIELD_NUMBER
    +
    +
    +
    +
    var MACADDR_FIELD_NUMBER
    +
    +
    +
    +
    var SHORT_NAME_FIELD_NUMBER
    +
    +
    +
    +
    var TEAM_FIELD_NUMBER
    +
    +
    +
    +
    var TX_POWER_DBM_FIELD_NUMBER
    +
    +
    +
    +
    +

    Static methods

    +
    +
    +def FromString(s) +
    +
    +
    +
    + +Expand source code + +
    def FromString(s):
    +  message = cls()
    +  message.MergeFromString(s)
    +  return message
    +
    +
    +
    +def RegisterExtension(extension_handle) +
    +
    +
    +
    + +Expand source code + +
    def RegisterExtension(extension_handle):
    +  extension_handle.containing_type = cls.DESCRIPTOR
    +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
    +  # pylint: disable=protected-access
    +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
    +  _AttachFieldHelpers(cls, extension_handle)
    +
    +

    Instance variables

    +
    var ant_azimuth
    +
    +

    Getter for ant_azimuth.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var ant_gain_dbi
    +
    +

    Getter for ant_gain_dbi.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    var hw_model
    -

    Field User.hw_model

    +

    Getter for hw_model.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var id
    -

    Field User.id

    +

    Getter for id.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var is_licensed
    -

    Field User.is_licensed

    +

    Getter for is_licensed.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var long_name
    -

    Field User.long_name

    +

    Getter for long_name.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var macaddr
    -

    Field User.macaddr

    +

    Getter for macaddr.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    var short_name
    -

    Field User.short_name

    +

    Getter for short_name.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var team
    +
    +

    Getter for team.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    var tx_power_dbm
    +
    +

    Getter for tx_power_dbm.

    +
    + +Expand source code + +
    def getter(self):
    +  # TODO(protobuf-team): This may be broken since there may not be
    +  # default_value.  Combine with has_default_value somehow.
    +  return self._fields.get(field, default_value)
    +
    +
    +
    +

    Methods

    +
    +
    +def ByteSize(self) +
    +
    +
    +
    + +Expand source code + +
    def ByteSize(self):
    +  if not self._cached_byte_size_dirty:
    +    return self._cached_byte_size
    +
    +  size = 0
    +  descriptor = self.DESCRIPTOR
    +  if descriptor.GetOptions().map_entry:
    +    # Fields of map entry should always be serialized.
    +    size = descriptor.fields_by_name['key']._sizer(self.key)
    +    size += descriptor.fields_by_name['value']._sizer(self.value)
    +  else:
    +    for field_descriptor, field_value in self.ListFields():
    +      size += field_descriptor._sizer(field_value)
    +    for tag_bytes, value_bytes in self._unknown_fields:
    +      size += len(tag_bytes) + len(value_bytes)
    +
    +  self._cached_byte_size = size
    +  self._cached_byte_size_dirty = False
    +  self._listener_for_children.dirty = False
    +  return size
    +
    +
    +
    +def Clear(self) +
    +
    +
    +
    + +Expand source code + +
    def _Clear(self):
    +  # Clear fields.
    +  self._fields = {}
    +  self._unknown_fields = ()
    +  # pylint: disable=protected-access
    +  if self._unknown_field_set is not None:
    +    self._unknown_field_set._clear()
    +    self._unknown_field_set = None
    +
    +  self._oneofs = {}
    +  self._Modified()
    +
    +
    +
    +def ClearField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def ClearField(self, field_name):
    +  try:
    +    field = message_descriptor.fields_by_name[field_name]
    +  except KeyError:
    +    try:
    +      field = message_descriptor.oneofs_by_name[field_name]
    +      if field in self._oneofs:
    +        field = self._oneofs[field]
    +      else:
    +        return
    +    except KeyError:
    +      raise ValueError('Protocol message %s has no "%s" field.' %
    +                       (message_descriptor.name, field_name))
    +
    +  if field in self._fields:
    +    # To match the C++ implementation, we need to invalidate iterators
    +    # for map fields when ClearField() happens.
    +    if hasattr(self._fields[field], 'InvalidateIterators'):
    +      self._fields[field].InvalidateIterators()
    +
    +    # Note:  If the field is a sub-message, its listener will still point
    +    #   at us.  That's fine, because the worst than can happen is that it
    +    #   will call _Modified() and invalidate our byte size.  Big deal.
    +    del self._fields[field]
    +
    +    if self._oneofs.get(field.containing_oneof, None) is field:
    +      del self._oneofs[field.containing_oneof]
    +
    +  # Always call _Modified() -- even if nothing was changed, this is
    +  # a mutating method, and thus calling it should cause the field to become
    +  # present in the parent message.
    +  self._Modified()
    +
    +
    +
    +def DiscardUnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _DiscardUnknownFields(self):
    +  self._unknown_fields = []
    +  self._unknown_field_set = None      # pylint: disable=protected-access
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            value[key].DiscardUnknownFields()
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for sub_message in value:
    +          sub_message.DiscardUnknownFields()
    +      else:
    +        value.DiscardUnknownFields()
    +
    +
    +
    +def FindInitializationErrors(self) +
    +
    +

    Finds required fields which are not initialized.

    +

    Returns

    +

    A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

    +
    + +Expand source code + +
    def FindInitializationErrors(self):
    +  """Finds required fields which are not initialized.
    +
    +  Returns:
    +    A list of strings.  Each string is a path to an uninitialized field from
    +    the top-level message, e.g. "foo.bar[5].baz".
    +  """
    +
    +  errors = []  # simplify things
    +
    +  for field in required_fields:
    +    if not self.HasField(field.name):
    +      errors.append(field.name)
    +
    +  for field, value in self.ListFields():
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.is_extension:
    +        name = '(%s)' % field.full_name
    +      else:
    +        name = field.name
    +
    +      if _IsMapField(field):
    +        if _IsMessageMapField(field):
    +          for key in value:
    +            element = value[key]
    +            prefix = '%s[%s].' % (name, key)
    +            sub_errors = element.FindInitializationErrors()
    +            errors += [prefix + error for error in sub_errors]
    +        else:
    +          # ScalarMaps can't have any initialization errors.
    +          pass
    +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
    +        for i in range(len(value)):
    +          element = value[i]
    +          prefix = '%s[%d].' % (name, i)
    +          sub_errors = element.FindInitializationErrors()
    +          errors += [prefix + error for error in sub_errors]
    +      else:
    +        prefix = name + '.'
    +        sub_errors = value.FindInitializationErrors()
    +        errors += [prefix + error for error in sub_errors]
    +
    +  return errors
    +
    +
    +
    +def HasField(self, field_name) +
    +
    +
    +
    + +Expand source code + +
    def HasField(self, field_name):
    +  try:
    +    field = hassable_fields[field_name]
    +  except KeyError:
    +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
    +
    +  if isinstance(field, descriptor_mod.OneofDescriptor):
    +    try:
    +      return HasField(self, self._oneofs[field].name)
    +    except KeyError:
    +      return False
    +  else:
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      value = self._fields.get(field)
    +      return value is not None and value._is_present_in_parent
    +    else:
    +      return field in self._fields
    +
    +
    +
    +def IsInitialized(self, errors=None) +
    +
    +

    Checks if all required fields of a message are set.

    +

    Args

    +
    +
    errors
    +
    A list which, if provided, will be populated with the field +paths of all missing required fields.
    +
    +

    Returns

    +

    True iff the specified message has all required fields set.

    +
    + +Expand source code + +
    def IsInitialized(self, errors=None):
    +  """Checks if all required fields of a message are set.
    +
    +  Args:
    +    errors:  A list which, if provided, will be populated with the field
    +             paths of all missing required fields.
    +
    +  Returns:
    +    True iff the specified message has all required fields set.
    +  """
    +
    +  # Performance is critical so we avoid HasField() and ListFields().
    +
    +  for field in required_fields:
    +    if (field not in self._fields or
    +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
    +         not self._fields[field]._is_present_in_parent)):
    +      if errors is not None:
    +        errors.extend(self.FindInitializationErrors())
    +      return False
    +
    +  for field, value in list(self._fields.items()):  # dict can change size!
    +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
    +      if field.label == _FieldDescriptor.LABEL_REPEATED:
    +        if (field.message_type.has_options and
    +            field.message_type.GetOptions().map_entry):
    +          continue
    +        for element in value:
    +          if not element.IsInitialized():
    +            if errors is not None:
    +              errors.extend(self.FindInitializationErrors())
    +            return False
    +      elif value._is_present_in_parent and not value.IsInitialized():
    +        if errors is not None:
    +          errors.extend(self.FindInitializationErrors())
    +        return False
    +
    +  return True
    +
    +
    +
    +def ListFields(self) +
    +
    +
    +
    + +Expand source code + +
    def ListFields(self):
    +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
    +  all_fields.sort(key = lambda item: item[0].number)
    +  return all_fields
    +
    +
    +
    +def MergeFrom(self, msg) +
    +
    +
    +
    + +Expand source code + +
    def MergeFrom(self, msg):
    +  if not isinstance(msg, cls):
    +    raise TypeError(
    +        'Parameter to MergeFrom() must be instance of same class: '
    +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
    +                                 _FullyQualifiedClassName(msg.__class__)))
    +
    +  assert msg is not self
    +  self._Modified()
    +
    +  fields = self._fields
    +
    +  for field, value in msg._fields.items():
    +    if field.label == LABEL_REPEATED:
    +      field_value = fields.get(field)
    +      if field_value is None:
    +        # Construct a new object to represent this field.
    +        field_value = field._default_constructor(self)
    +        fields[field] = field_value
    +      field_value.MergeFrom(value)
    +    elif field.cpp_type == CPPTYPE_MESSAGE:
    +      if value._is_present_in_parent:
    +        field_value = fields.get(field)
    +        if field_value is None:
    +          # Construct a new object to represent this field.
    +          field_value = field._default_constructor(self)
    +          fields[field] = field_value
    +        field_value.MergeFrom(value)
    +    else:
    +      self._fields[field] = value
    +      if field.containing_oneof:
    +        self._UpdateOneofState(field)
    +
    +  if msg._unknown_fields:
    +    if not self._unknown_fields:
    +      self._unknown_fields = []
    +    self._unknown_fields.extend(msg._unknown_fields)
    +    # pylint: disable=protected-access
    +    if self._unknown_field_set is None:
    +      self._unknown_field_set = containers.UnknownFieldSet()
    +    self._unknown_field_set._extend(msg._unknown_field_set)
    +
    +
    +
    +def MergeFromString(self, serialized) +
    +
    +
    +
    + +Expand source code + +
    def MergeFromString(self, serialized):
    +  serialized = memoryview(serialized)
    +  length = len(serialized)
    +  try:
    +    if self._InternalParse(serialized, 0, length) != length:
    +      # The only reason _InternalParse would return early is if it
    +      # encountered an end-group tag.
    +      raise message_mod.DecodeError('Unexpected end-group tag.')
    +  except (IndexError, TypeError):
    +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
    +    raise message_mod.DecodeError('Truncated message.')
    +  except struct.error as e:
    +    raise message_mod.DecodeError(e)
    +  return length   # Return this for legacy reasons.
    +
    +
    +
    +def SerializePartialToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializePartialToString(self, **kwargs):
    +  out = BytesIO()
    +  self._InternalSerialize(out.write, **kwargs)
    +  return out.getvalue()
    +
    +
    +
    +def SerializeToString(self, **kwargs) +
    +
    +
    +
    + +Expand source code + +
    def SerializeToString(self, **kwargs):
    +  # Check if the message has all of its required fields set.
    +  if not self.IsInitialized():
    +    raise message_mod.EncodeError(
    +        'Message %s is missing required fields: %s' % (
    +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
    +  return self.SerializePartialToString(**kwargs)
    +
    +
    +
    +def SetInParent(self) +
    +
    +

    Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

    +
    + +Expand source code + +
    def Modified(self):
    +  """Sets the _cached_byte_size_dirty bit to true,
    +  and propagates this to our listener iff this was a state change.
    +  """
    +
    +  # Note:  Some callers check _cached_byte_size_dirty before calling
    +  #   _Modified() as an extra optimization.  So, if this method is ever
    +  #   changed such that it does stuff even when _cached_byte_size_dirty is
    +  #   already true, the callers need to be updated.
    +  if not self._cached_byte_size_dirty:
    +    self._cached_byte_size_dirty = True
    +    self._listener_for_children.dirty = True
    +    self._is_present_in_parent = True
    +    self._listener.Modified()
    +
    +
    +
    +def UnknownFields(self) +
    +
    +
    +
    + +Expand source code + +
    def _UnknownFields(self):
    +  if self._unknown_field_set is None:  # pylint: disable=protected-access
    +    # pylint: disable=protected-access
    +    self._unknown_field_set = containers.UnknownFieldSet()
    +  return self._unknown_field_set    # pylint: disable=protected-access
    +
    +
    +
    +def WhichOneof(self, oneof_name) +
    +
    +

    Returns the name of the currently set field inside a oneof, or None.

    +
    + +Expand source code + +
    def WhichOneof(self, oneof_name):
    +  """Returns the name of the currently set field inside a oneof, or None."""
    +  try:
    +    field = message_descriptor.oneofs_by_name[oneof_name]
    +  except KeyError:
    +    raise ValueError(
    +        'Protocol message has no oneof "%s" field.' % oneof_name)
    +
    +  nested_field = self._oneofs.get(field, None)
    +  if nested_field is not None and self.HasField(nested_field.name):
    +    return nested_field.name
    +  else:
    +    return None
    +
    @@ -2087,8 +9179,31 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
    • Data

      -
        +
          +
        • ByteSize
        • +
        • Clear
        • +
        • ClearField
        • DESCRIPTOR
        • +
        • DEST_FIELD_NUMBER
        • +
        • DiscardUnknownFields
        • +
        • FindInitializationErrors
        • +
        • FromString
        • +
        • HasField
        • +
        • IsInitialized
        • +
        • ListFields
        • +
        • MergeFrom
        • +
        • MergeFromString
        • +
        • PAYLOAD_FIELD_NUMBER
        • +
        • PORTNUM_FIELD_NUMBER
        • +
        • REQUEST_ID_FIELD_NUMBER
        • +
        • RegisterExtension
        • +
        • SOURCE_FIELD_NUMBER
        • +
        • SerializePartialToString
        • +
        • SerializeToString
        • +
        • SetInParent
        • +
        • UnknownFields
        • +
        • WANT_RESPONSE_FIELD_NUMBER
        • +
        • WhichOneof
        • dest
        • payload
        • portnum
        • @@ -2099,8 +9214,32 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
        • FromRadio

          -
            +
              +
            • ByteSize
            • +
            • CONFIG_COMPLETE_ID_FIELD_NUMBER
            • +
            • Clear
            • +
            • ClearField
            • DESCRIPTOR
            • +
            • DiscardUnknownFields
            • +
            • FindInitializationErrors
            • +
            • FromString
            • +
            • HasField
            • +
            • IsInitialized
            • +
            • LOG_RECORD_FIELD_NUMBER
            • +
            • ListFields
            • +
            • MY_INFO_FIELD_NUMBER
            • +
            • MergeFrom
            • +
            • MergeFromString
            • +
            • NODE_INFO_FIELD_NUMBER
            • +
            • NUM_FIELD_NUMBER
            • +
            • PACKET_FIELD_NUMBER
            • +
            • REBOOTED_FIELD_NUMBER
            • +
            • RegisterExtension
            • +
            • SerializePartialToString
            • +
            • SerializeToString
            • +
            • SetInParent
            • +
            • UnknownFields
            • +
            • WhichOneof
            • config_complete_id
            • log_record
            • my_info
            • @@ -2112,16 +9251,37 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
            • LogRecord

              -
                +
                  +
                • ByteSize
                • CRITICAL
                • +
                • Clear
                • +
                • ClearField
                • DEBUG
                • DESCRIPTOR
                • +
                • DiscardUnknownFields
                • ERROR
                • +
                • FindInitializationErrors
                • +
                • FromString
                • +
                • HasField
                • INFO
                • +
                • IsInitialized
                • +
                • LEVEL_FIELD_NUMBER
                • Level
                • +
                • ListFields
                • +
                • MESSAGE_FIELD_NUMBER
                • +
                • MergeFrom
                • +
                • MergeFromString
                • +
                • RegisterExtension
                • +
                • SOURCE_FIELD_NUMBER
                • +
                • SerializePartialToString
                • +
                • SerializeToString
                • +
                • SetInParent
                • +
                • TIME_FIELD_NUMBER
                • TRACE
                • UNSET
                • +
                • UnknownFields
                • WARNING
                • +
                • WhichOneof
                • level
                • message
                • source
                • @@ -2130,16 +9290,45 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
                • MeshPacket

                  -
                    +
                    • ACK
                    • BACKGROUND
                    • +
                    • ByteSize
                    • +
                    • CHANNEL_FIELD_NUMBER
                    • +
                    • Clear
                    • +
                    • ClearField
                    • +
                    • DECODED_FIELD_NUMBER
                    • DEFAULT
                    • DESCRIPTOR
                    • +
                    • DiscardUnknownFields
                    • +
                    • ENCRYPTED_FIELD_NUMBER
                    • +
                    • FROM_FIELD_NUMBER
                    • +
                    • FindInitializationErrors
                    • +
                    • FromString
                    • +
                    • HOP_LIMIT_FIELD_NUMBER
                    • +
                    • HasField
                    • +
                    • ID_FIELD_NUMBER
                    • +
                    • IsInitialized
                    • +
                    • ListFields
                    • MAX
                    • MIN
                    • +
                    • MergeFrom
                    • +
                    • MergeFromString
                    • +
                    • PRIORITY_FIELD_NUMBER
                    • Priority
                    • RELIABLE
                    • +
                    • RX_RSSI_FIELD_NUMBER
                    • +
                    • RX_SNR_FIELD_NUMBER
                    • +
                    • RX_TIME_FIELD_NUMBER
                    • +
                    • RegisterExtension
                    • +
                    • SerializePartialToString
                    • +
                    • SerializeToString
                    • +
                    • SetInParent
                    • +
                    • TO_FIELD_NUMBER
                    • UNSET
                    • +
                    • UnknownFields
                    • +
                    • WANT_ACK_FIELD_NUMBER
                    • +
                    • WhichOneof
                    • channel
                    • decoded
                    • encrypted
                    • @@ -2157,7 +9346,37 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
                    • MyNodeInfo

                        +
                      • ByteSize
                      • +
                      • Clear
                      • +
                      • ClearField
                      • DESCRIPTOR
                      • +
                      • DiscardUnknownFields
                      • +
                      • ERROR_ADDRESS_FIELD_NUMBER
                      • +
                      • ERROR_CODE_FIELD_NUMBER
                      • +
                      • ERROR_COUNT_FIELD_NUMBER
                      • +
                      • FIRMWARE_VERSION_FIELD_NUMBER
                      • +
                      • FindInitializationErrors
                      • +
                      • FromString
                      • +
                      • HAS_GPS_FIELD_NUMBER
                      • +
                      • HW_MODEL_DEPRECATED_FIELD_NUMBER
                      • +
                      • HasField
                      • +
                      • IsInitialized
                      • +
                      • ListFields
                      • +
                      • MAX_CHANNELS_FIELD_NUMBER
                      • +
                      • MESSAGE_TIMEOUT_MSEC_FIELD_NUMBER
                      • +
                      • MIN_APP_VERSION_FIELD_NUMBER
                      • +
                      • MY_NODE_NUM_FIELD_NUMBER
                      • +
                      • MergeFrom
                      • +
                      • MergeFromString
                      • +
                      • NUM_BANDS_FIELD_NUMBER
                      • +
                      • REBOOT_COUNT_FIELD_NUMBER
                      • +
                      • REGION_FIELD_NUMBER
                      • +
                      • RegisterExtension
                      • +
                      • SerializePartialToString
                      • +
                      • SerializeToString
                      • +
                      • SetInParent
                      • +
                      • UnknownFields
                      • +
                      • WhichOneof
                      • error_address
                      • error_code
                      • error_count
                      • @@ -2175,8 +9394,30 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
                      • NodeInfo

                        -
                          +
                            +
                          • ByteSize
                          • +
                          • Clear
                          • +
                          • ClearField
                          • DESCRIPTOR
                          • +
                          • DiscardUnknownFields
                          • +
                          • FindInitializationErrors
                          • +
                          • FromString
                          • +
                          • HasField
                          • +
                          • IsInitialized
                          • +
                          • LAST_HEARD_FIELD_NUMBER
                          • +
                          • ListFields
                          • +
                          • MergeFrom
                          • +
                          • MergeFromString
                          • +
                          • NUM_FIELD_NUMBER
                          • +
                          • POSITION_FIELD_NUMBER
                          • +
                          • RegisterExtension
                          • +
                          • SNR_FIELD_NUMBER
                          • +
                          • SerializePartialToString
                          • +
                          • SerializeToString
                          • +
                          • SetInParent
                          • +
                          • USER_FIELD_NUMBER
                          • +
                          • UnknownFields
                          • +
                          • WhichOneof
                          • last_heard
                          • num
                          • position
                          • @@ -2186,38 +9427,145 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
                          • Position

                            -
                              +
                            • RouteDiscovery

                            • Routing

                              -
                                +
                                • BAD_REQUEST
                                • +
                                • ByteSize
                                • +
                                • Clear
                                • +
                                • ClearField
                                • DESCRIPTOR
                                • +
                                • DiscardUnknownFields
                                • +
                                • ERROR_REASON_FIELD_NUMBER
                                • Error
                                • +
                                • FindInitializationErrors
                                • +
                                • FromString
                                • GOT_NAK
                                • +
                                • HasField
                                • +
                                • IsInitialized
                                • +
                                • ListFields
                                • MAX_RETRANSMIT
                                • +
                                • MergeFrom
                                • +
                                • MergeFromString
                                • NONE
                                • NOT_AUTHORIZED
                                • NO_CHANNEL
                                • NO_INTERFACE
                                • NO_RESPONSE
                                • NO_ROUTE
                                • +
                                • ROUTE_REPLY_FIELD_NUMBER
                                • +
                                • ROUTE_REQUEST_FIELD_NUMBER
                                • +
                                • RegisterExtension
                                • +
                                • SerializePartialToString
                                • +
                                • SerializeToString
                                • +
                                • SetInParent
                                • TIMEOUT
                                • TOO_LARGE
                                • +
                                • UnknownFields
                                • +
                                • WhichOneof
                                • error_reason
                                • route_reply
                                • route_request
                                • @@ -2225,9 +9573,30 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
                                • ToRadio

                                  -
                                    +
                                      +
                                    • ByteSize
                                    • +
                                    • Clear
                                    • +
                                    • ClearField
                                    • DESCRIPTOR
                                    • +
                                    • DISCONNECT_FIELD_NUMBER
                                    • +
                                    • DiscardUnknownFields
                                    • +
                                    • FindInitializationErrors
                                    • +
                                    • FromString
                                    • +
                                    • HasField
                                    • +
                                    • IsInitialized
                                    • +
                                    • ListFields
                                    • +
                                    • MergeFrom
                                    • +
                                    • MergeFromString
                                    • +
                                    • PACKET_FIELD_NUMBER
                                    • +
                                    • PEER_INFO_FIELD_NUMBER
                                    • PeerInfo
                                    • +
                                    • RegisterExtension
                                    • +
                                    • SerializePartialToString
                                    • +
                                    • SerializeToString
                                    • +
                                    • SetInParent
                                    • +
                                    • UnknownFields
                                    • +
                                    • WANT_CONFIG_ID_FIELD_NUMBER
                                    • +
                                    • WhichOneof
                                    • disconnect
                                    • packet
                                    • peer_info
                                    • @@ -2236,14 +9605,45 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None
                                    • User

                                      - @@ -2252,7 +9652,7 @@ _MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None \ No newline at end of file diff --git a/docs/meshtastic/mqtt_pb2.html b/docs/meshtastic/mqtt_pb2.html index e3c8674..c18a637 100644 --- a/docs/meshtastic/mqtt_pb2.html +++ b/docs/meshtastic/mqtt_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.mqtt_pb2 API documentation - + @@ -22,7 +22,6 @@

                                      Module meshtastic.mqtt_pb2

                                      -

                                      Generated protocol buffer code.

                                      Expand source code @@ -30,7 +29,7 @@
                                      # -*- coding: utf-8 -*-
                                       # Generated by the protocol buffer compiler.  DO NOT EDIT!
                                       # source: mqtt.proto
                                      -"""Generated protocol buffer code."""
                                      +
                                       from google.protobuf import descriptor as _descriptor
                                       from google.protobuf import message as _message
                                       from google.protobuf import reflection as _reflection
                                      @@ -48,7 +47,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
                                         package='',
                                         syntax='proto3',
                                         serialized_options=b'\n\023com.geeksville.meshB\nMQTTProtosH\003Z!github.com/meshtastic/gomeshproto',
                                      -  create_key=_descriptor._internal_create_key,
                                         serialized_pb=b'\n\nmqtt.proto\x1a\nmesh.proto\"V\n\x0fServiceEnvelope\x12\x1b\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\tBF\n\x13\x63om.geeksville.meshB\nMQTTProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                         ,
                                         dependencies=[mesh__pb2.DESCRIPTOR,])
                                      @@ -62,7 +60,6 @@ _SERVICEENVELOPE = _descriptor.Descriptor(
                                         filename=None,
                                         file=DESCRIPTOR,
                                         containing_type=None,
                                      -  create_key=_descriptor._internal_create_key,
                                         fields=[
                                           _descriptor.FieldDescriptor(
                                             name='packet', full_name='ServiceEnvelope.packet', index=0,
                                      @@ -70,21 +67,21 @@ _SERVICEENVELOPE = _descriptor.Descriptor(
                                             has_default_value=False, default_value=None,
                                             message_type=None, enum_type=None, containing_type=None,
                                             is_extension=False, extension_scope=None,
                                      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                      +      serialized_options=None, file=DESCRIPTOR),
                                           _descriptor.FieldDescriptor(
                                             name='channel_id', full_name='ServiceEnvelope.channel_id', index=1,
                                             number=2, type=9, cpp_type=9, label=1,
                                             has_default_value=False, default_value=b"".decode('utf-8'),
                                             message_type=None, enum_type=None, containing_type=None,
                                             is_extension=False, extension_scope=None,
                                      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                      +      serialized_options=None, file=DESCRIPTOR),
                                           _descriptor.FieldDescriptor(
                                             name='gateway_id', full_name='ServiceEnvelope.gateway_id', index=2,
                                             number=3, type=9, cpp_type=9, label=1,
                                             has_default_value=False, default_value=b"".decode('utf-8'),
                                             message_type=None, enum_type=None, containing_type=None,
                                             is_extension=False, extension_scope=None,
                                      -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                      +      serialized_options=None, file=DESCRIPTOR),
                                         ],
                                         extensions=[
                                         ],
                                      @@ -128,35 +125,580 @@ DESCRIPTOR._options = None
                                       
                                      class ServiceEnvelope -(*args, **kwargs) +(**kwargs)
                                      -

                                      A ProtocolMessage

                                      +

                                      Abstract base class for protocol messages.

                                      +

                                      Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                      Ancestors

                                        -
                                      • google.protobuf.pyext._message.CMessage
                                      • google.protobuf.message.Message

                                      Class variables

                                      +
                                      var CHANNEL_ID_FIELD_NUMBER
                                      +
                                      +
                                      +
                                      var DESCRIPTOR
                                      +
                                      var GATEWAY_ID_FIELD_NUMBER
                                      +
                                      +
                                      +
                                      +
                                      var PACKET_FIELD_NUMBER
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Static methods

                                      +
                                      +
                                      +def FromString(s) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def FromString(s):
                                      +  message = cls()
                                      +  message.MergeFromString(s)
                                      +  return message
                                      +
                                      +
                                      +
                                      +def RegisterExtension(extension_handle) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def RegisterExtension(extension_handle):
                                      +  extension_handle.containing_type = cls.DESCRIPTOR
                                      +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
                                      +  # pylint: disable=protected-access
                                      +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
                                      +  _AttachFieldHelpers(cls, extension_handle)
                                      +
                                      +

                                      Instance variables

                                      var channel_id
                                      -

                                      Field ServiceEnvelope.channel_id

                                      +

                                      Getter for channel_id.

                                      +
                                      + +Expand source code + +
                                      def getter(self):
                                      +  # TODO(protobuf-team): This may be broken since there may not be
                                      +  # default_value.  Combine with has_default_value somehow.
                                      +  return self._fields.get(field, default_value)
                                      +
                                      var gateway_id
                                      -

                                      Field ServiceEnvelope.gateway_id

                                      +

                                      Getter for gateway_id.

                                      +
                                      + +Expand source code + +
                                      def getter(self):
                                      +  # TODO(protobuf-team): This may be broken since there may not be
                                      +  # default_value.  Combine with has_default_value somehow.
                                      +  return self._fields.get(field, default_value)
                                      +
                                      var packet
                                      -

                                      Field ServiceEnvelope.packet

                                      +

                                      Getter for packet.

                                      +
                                      + +Expand source code + +
                                      def getter(self):
                                      +  field_value = self._fields.get(field)
                                      +  if field_value is None:
                                      +    # Construct a new object to represent this field.
                                      +    field_value = field._default_constructor(self)
                                      +
                                      +    # Atomically check if another thread has preempted us and, if not, swap
                                      +    # in the new object we just created.  If someone has preempted us, we
                                      +    # take that object and discard ours.
                                      +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                                      +    #   in CPython but we haven't investigated others.  This warning appears
                                      +    #   in several other locations in this file.
                                      +    field_value = self._fields.setdefault(field, field_value)
                                      +  return field_value
                                      +
                                      +
                                      +
                                      +

                                      Methods

                                      +
                                      +
                                      +def ByteSize(self) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def ByteSize(self):
                                      +  if not self._cached_byte_size_dirty:
                                      +    return self._cached_byte_size
                                      +
                                      +  size = 0
                                      +  descriptor = self.DESCRIPTOR
                                      +  if descriptor.GetOptions().map_entry:
                                      +    # Fields of map entry should always be serialized.
                                      +    size = descriptor.fields_by_name['key']._sizer(self.key)
                                      +    size += descriptor.fields_by_name['value']._sizer(self.value)
                                      +  else:
                                      +    for field_descriptor, field_value in self.ListFields():
                                      +      size += field_descriptor._sizer(field_value)
                                      +    for tag_bytes, value_bytes in self._unknown_fields:
                                      +      size += len(tag_bytes) + len(value_bytes)
                                      +
                                      +  self._cached_byte_size = size
                                      +  self._cached_byte_size_dirty = False
                                      +  self._listener_for_children.dirty = False
                                      +  return size
                                      +
                                      +
                                      +
                                      +def Clear(self) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def _Clear(self):
                                      +  # Clear fields.
                                      +  self._fields = {}
                                      +  self._unknown_fields = ()
                                      +  # pylint: disable=protected-access
                                      +  if self._unknown_field_set is not None:
                                      +    self._unknown_field_set._clear()
                                      +    self._unknown_field_set = None
                                      +
                                      +  self._oneofs = {}
                                      +  self._Modified()
                                      +
                                      +
                                      +
                                      +def ClearField(self, field_name) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def ClearField(self, field_name):
                                      +  try:
                                      +    field = message_descriptor.fields_by_name[field_name]
                                      +  except KeyError:
                                      +    try:
                                      +      field = message_descriptor.oneofs_by_name[field_name]
                                      +      if field in self._oneofs:
                                      +        field = self._oneofs[field]
                                      +      else:
                                      +        return
                                      +    except KeyError:
                                      +      raise ValueError('Protocol message %s has no "%s" field.' %
                                      +                       (message_descriptor.name, field_name))
                                      +
                                      +  if field in self._fields:
                                      +    # To match the C++ implementation, we need to invalidate iterators
                                      +    # for map fields when ClearField() happens.
                                      +    if hasattr(self._fields[field], 'InvalidateIterators'):
                                      +      self._fields[field].InvalidateIterators()
                                      +
                                      +    # Note:  If the field is a sub-message, its listener will still point
                                      +    #   at us.  That's fine, because the worst than can happen is that it
                                      +    #   will call _Modified() and invalidate our byte size.  Big deal.
                                      +    del self._fields[field]
                                      +
                                      +    if self._oneofs.get(field.containing_oneof, None) is field:
                                      +      del self._oneofs[field.containing_oneof]
                                      +
                                      +  # Always call _Modified() -- even if nothing was changed, this is
                                      +  # a mutating method, and thus calling it should cause the field to become
                                      +  # present in the parent message.
                                      +  self._Modified()
                                      +
                                      +
                                      +
                                      +def DiscardUnknownFields(self) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def _DiscardUnknownFields(self):
                                      +  self._unknown_fields = []
                                      +  self._unknown_field_set = None      # pylint: disable=protected-access
                                      +  for field, value in self.ListFields():
                                      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                      +      if _IsMapField(field):
                                      +        if _IsMessageMapField(field):
                                      +          for key in value:
                                      +            value[key].DiscardUnknownFields()
                                      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                      +        for sub_message in value:
                                      +          sub_message.DiscardUnknownFields()
                                      +      else:
                                      +        value.DiscardUnknownFields()
                                      +
                                      +
                                      +
                                      +def FindInitializationErrors(self) +
                                      +
                                      +

                                      Finds required fields which are not initialized.

                                      +

                                      Returns

                                      +

                                      A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

                                      +
                                      + +Expand source code + +
                                      def FindInitializationErrors(self):
                                      +  """Finds required fields which are not initialized.
                                      +
                                      +  Returns:
                                      +    A list of strings.  Each string is a path to an uninitialized field from
                                      +    the top-level message, e.g. "foo.bar[5].baz".
                                      +  """
                                      +
                                      +  errors = []  # simplify things
                                      +
                                      +  for field in required_fields:
                                      +    if not self.HasField(field.name):
                                      +      errors.append(field.name)
                                      +
                                      +  for field, value in self.ListFields():
                                      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                      +      if field.is_extension:
                                      +        name = '(%s)' % field.full_name
                                      +      else:
                                      +        name = field.name
                                      +
                                      +      if _IsMapField(field):
                                      +        if _IsMessageMapField(field):
                                      +          for key in value:
                                      +            element = value[key]
                                      +            prefix = '%s[%s].' % (name, key)
                                      +            sub_errors = element.FindInitializationErrors()
                                      +            errors += [prefix + error for error in sub_errors]
                                      +        else:
                                      +          # ScalarMaps can't have any initialization errors.
                                      +          pass
                                      +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                      +        for i in range(len(value)):
                                      +          element = value[i]
                                      +          prefix = '%s[%d].' % (name, i)
                                      +          sub_errors = element.FindInitializationErrors()
                                      +          errors += [prefix + error for error in sub_errors]
                                      +      else:
                                      +        prefix = name + '.'
                                      +        sub_errors = value.FindInitializationErrors()
                                      +        errors += [prefix + error for error in sub_errors]
                                      +
                                      +  return errors
                                      +
                                      +
                                      +
                                      +def HasField(self, field_name) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def HasField(self, field_name):
                                      +  try:
                                      +    field = hassable_fields[field_name]
                                      +  except KeyError:
                                      +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
                                      +
                                      +  if isinstance(field, descriptor_mod.OneofDescriptor):
                                      +    try:
                                      +      return HasField(self, self._oneofs[field].name)
                                      +    except KeyError:
                                      +      return False
                                      +  else:
                                      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                      +      value = self._fields.get(field)
                                      +      return value is not None and value._is_present_in_parent
                                      +    else:
                                      +      return field in self._fields
                                      +
                                      +
                                      +
                                      +def IsInitialized(self, errors=None) +
                                      +
                                      +

                                      Checks if all required fields of a message are set.

                                      +

                                      Args

                                      +
                                      +
                                      errors
                                      +
                                      A list which, if provided, will be populated with the field +paths of all missing required fields.
                                      +
                                      +

                                      Returns

                                      +

                                      True iff the specified message has all required fields set.

                                      +
                                      + +Expand source code + +
                                      def IsInitialized(self, errors=None):
                                      +  """Checks if all required fields of a message are set.
                                      +
                                      +  Args:
                                      +    errors:  A list which, if provided, will be populated with the field
                                      +             paths of all missing required fields.
                                      +
                                      +  Returns:
                                      +    True iff the specified message has all required fields set.
                                      +  """
                                      +
                                      +  # Performance is critical so we avoid HasField() and ListFields().
                                      +
                                      +  for field in required_fields:
                                      +    if (field not in self._fields or
                                      +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
                                      +         not self._fields[field]._is_present_in_parent)):
                                      +      if errors is not None:
                                      +        errors.extend(self.FindInitializationErrors())
                                      +      return False
                                      +
                                      +  for field, value in list(self._fields.items()):  # dict can change size!
                                      +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                      +      if field.label == _FieldDescriptor.LABEL_REPEATED:
                                      +        if (field.message_type.has_options and
                                      +            field.message_type.GetOptions().map_entry):
                                      +          continue
                                      +        for element in value:
                                      +          if not element.IsInitialized():
                                      +            if errors is not None:
                                      +              errors.extend(self.FindInitializationErrors())
                                      +            return False
                                      +      elif value._is_present_in_parent and not value.IsInitialized():
                                      +        if errors is not None:
                                      +          errors.extend(self.FindInitializationErrors())
                                      +        return False
                                      +
                                      +  return True
                                      +
                                      +
                                      +
                                      +def ListFields(self) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def ListFields(self):
                                      +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
                                      +  all_fields.sort(key = lambda item: item[0].number)
                                      +  return all_fields
                                      +
                                      +
                                      +
                                      +def MergeFrom(self, msg) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def MergeFrom(self, msg):
                                      +  if not isinstance(msg, cls):
                                      +    raise TypeError(
                                      +        'Parameter to MergeFrom() must be instance of same class: '
                                      +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
                                      +                                 _FullyQualifiedClassName(msg.__class__)))
                                      +
                                      +  assert msg is not self
                                      +  self._Modified()
                                      +
                                      +  fields = self._fields
                                      +
                                      +  for field, value in msg._fields.items():
                                      +    if field.label == LABEL_REPEATED:
                                      +      field_value = fields.get(field)
                                      +      if field_value is None:
                                      +        # Construct a new object to represent this field.
                                      +        field_value = field._default_constructor(self)
                                      +        fields[field] = field_value
                                      +      field_value.MergeFrom(value)
                                      +    elif field.cpp_type == CPPTYPE_MESSAGE:
                                      +      if value._is_present_in_parent:
                                      +        field_value = fields.get(field)
                                      +        if field_value is None:
                                      +          # Construct a new object to represent this field.
                                      +          field_value = field._default_constructor(self)
                                      +          fields[field] = field_value
                                      +        field_value.MergeFrom(value)
                                      +    else:
                                      +      self._fields[field] = value
                                      +      if field.containing_oneof:
                                      +        self._UpdateOneofState(field)
                                      +
                                      +  if msg._unknown_fields:
                                      +    if not self._unknown_fields:
                                      +      self._unknown_fields = []
                                      +    self._unknown_fields.extend(msg._unknown_fields)
                                      +    # pylint: disable=protected-access
                                      +    if self._unknown_field_set is None:
                                      +      self._unknown_field_set = containers.UnknownFieldSet()
                                      +    self._unknown_field_set._extend(msg._unknown_field_set)
                                      +
                                      +
                                      +
                                      +def MergeFromString(self, serialized) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def MergeFromString(self, serialized):
                                      +  serialized = memoryview(serialized)
                                      +  length = len(serialized)
                                      +  try:
                                      +    if self._InternalParse(serialized, 0, length) != length:
                                      +      # The only reason _InternalParse would return early is if it
                                      +      # encountered an end-group tag.
                                      +      raise message_mod.DecodeError('Unexpected end-group tag.')
                                      +  except (IndexError, TypeError):
                                      +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
                                      +    raise message_mod.DecodeError('Truncated message.')
                                      +  except struct.error as e:
                                      +    raise message_mod.DecodeError(e)
                                      +  return length   # Return this for legacy reasons.
                                      +
                                      +
                                      +
                                      +def SerializePartialToString(self, **kwargs) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def SerializePartialToString(self, **kwargs):
                                      +  out = BytesIO()
                                      +  self._InternalSerialize(out.write, **kwargs)
                                      +  return out.getvalue()
                                      +
                                      +
                                      +
                                      +def SerializeToString(self, **kwargs) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def SerializeToString(self, **kwargs):
                                      +  # Check if the message has all of its required fields set.
                                      +  if not self.IsInitialized():
                                      +    raise message_mod.EncodeError(
                                      +        'Message %s is missing required fields: %s' % (
                                      +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
                                      +  return self.SerializePartialToString(**kwargs)
                                      +
                                      +
                                      +
                                      +def SetInParent(self) +
                                      +
                                      +

                                      Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

                                      +
                                      + +Expand source code + +
                                      def Modified(self):
                                      +  """Sets the _cached_byte_size_dirty bit to true,
                                      +  and propagates this to our listener iff this was a state change.
                                      +  """
                                      +
                                      +  # Note:  Some callers check _cached_byte_size_dirty before calling
                                      +  #   _Modified() as an extra optimization.  So, if this method is ever
                                      +  #   changed such that it does stuff even when _cached_byte_size_dirty is
                                      +  #   already true, the callers need to be updated.
                                      +  if not self._cached_byte_size_dirty:
                                      +    self._cached_byte_size_dirty = True
                                      +    self._listener_for_children.dirty = True
                                      +    self._is_present_in_parent = True
                                      +    self._listener.Modified()
                                      +
                                      +
                                      +
                                      +def UnknownFields(self) +
                                      +
                                      +
                                      +
                                      + +Expand source code + +
                                      def _UnknownFields(self):
                                      +  if self._unknown_field_set is None:  # pylint: disable=protected-access
                                      +    # pylint: disable=protected-access
                                      +    self._unknown_field_set = containers.UnknownFieldSet()
                                      +  return self._unknown_field_set    # pylint: disable=protected-access
                                      +
                                      +
                                      +
                                      +def WhichOneof(self, oneof_name) +
                                      +
                                      +

                                      Returns the name of the currently set field inside a oneof, or None.

                                      +
                                      + +Expand source code + +
                                      def WhichOneof(self, oneof_name):
                                      +  """Returns the name of the currently set field inside a oneof, or None."""
                                      +  try:
                                      +    field = message_descriptor.oneofs_by_name[oneof_name]
                                      +  except KeyError:
                                      +    raise ValueError(
                                      +        'Protocol message has no oneof "%s" field.' % oneof_name)
                                      +
                                      +  nested_field = self._oneofs.get(field, None)
                                      +  if nested_field is not None and self.HasField(nested_field.name):
                                      +    return nested_field.name
                                      +  else:
                                      +    return None
                                      +
                                      @@ -179,7 +721,27 @@ DESCRIPTOR._options = None
                                    • ServiceEnvelope

                                        +
                                      • ByteSize
                                      • +
                                      • CHANNEL_ID_FIELD_NUMBER
                                      • +
                                      • Clear
                                      • +
                                      • ClearField
                                      • DESCRIPTOR
                                      • +
                                      • DiscardUnknownFields
                                      • +
                                      • FindInitializationErrors
                                      • +
                                      • FromString
                                      • +
                                      • GATEWAY_ID_FIELD_NUMBER
                                      • +
                                      • HasField
                                      • +
                                      • IsInitialized
                                      • +
                                      • ListFields
                                      • +
                                      • MergeFrom
                                      • +
                                      • MergeFromString
                                      • +
                                      • PACKET_FIELD_NUMBER
                                      • +
                                      • RegisterExtension
                                      • +
                                      • SerializePartialToString
                                      • +
                                      • SerializeToString
                                      • +
                                      • SetInParent
                                      • +
                                      • UnknownFields
                                      • +
                                      • WhichOneof
                                      • channel_id
                                      • gateway_id
                                      • packet
                                      • @@ -191,7 +753,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/node.html b/docs/meshtastic/node.html index 7731b08..36df65b 100644 --- a/docs/meshtastic/node.html +++ b/docs/meshtastic/node.html @@ -3,7 +3,7 @@ - + meshtastic.node API documentation @@ -1225,7 +1225,7 @@ class Node: \ No newline at end of file diff --git a/docs/meshtastic/portnums_pb2.html b/docs/meshtastic/portnums_pb2.html index 2e4eb82..ee0c742 100644 --- a/docs/meshtastic/portnums_pb2.html +++ b/docs/meshtastic/portnums_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.portnums_pb2 API documentation - + @@ -22,7 +22,6 @@

                                        Module meshtastic.portnums_pb2

                                        -

                                        Generated protocol buffer code.

                                        Expand source code @@ -30,7 +29,7 @@
                                        # -*- coding: utf-8 -*-
                                         # Generated by the protocol buffer compiler.  DO NOT EDIT!
                                         # source: portnums.proto
                                        -"""Generated protocol buffer code."""
                                        +
                                         from google.protobuf.internal import enum_type_wrapper
                                         from google.protobuf import descriptor as _descriptor
                                         from google.protobuf import message as _message
                                        @@ -48,8 +47,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
                                           package='',
                                           syntax='proto3',
                                           serialized_options=b'\n\023com.geeksville.meshB\010PortnumsH\003Z!github.com/meshtastic/gomeshproto',
                                        -  create_key=_descriptor._internal_create_key,
                                        -  serialized_pb=b'\n\x0eportnums.proto*\xbe\x02\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12!\n\x1d\x45NVIRONMENTAL_MEASUREMENT_APP\x10\x43\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42\x44\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                        +  serialized_pb=b'\n\x0eportnums.proto*\xcb\x02\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12!\n\x1d\x45NVIRONMENTAL_MEASUREMENT_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42\x44\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                         )
                                         
                                         _PORTNUM = _descriptor.EnumDescriptor(
                                        @@ -57,93 +55,80 @@ _PORTNUM = _descriptor.EnumDescriptor(
                                           full_name='PortNum',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='UNKNOWN_APP', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='TEXT_MESSAGE_APP', index=1, number=1,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='REMOTE_HARDWARE_APP', index=2, number=2,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='POSITION_APP', index=3, number=3,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='NODEINFO_APP', index=4, number=4,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='ROUTING_APP', index=5, number=5,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='ADMIN_APP', index=6, number=6,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='REPLY_APP', index=7, number=32,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='IP_TUNNEL_APP', index=8, number=33,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='SERIAL_APP', index=9, number=64,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='STORE_FORWARD_APP', index=10, number=65,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='RANGE_TEST_APP', index=11, number=66,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='ENVIRONMENTAL_MEASUREMENT_APP', index=12, number=67,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                        -      name='PRIVATE_APP', index=13, number=256,
                                        +      name='ZPS_APP', index=13, number=68,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                        -      name='ATAK_FORWARDER', index=14, number=257,
                                        +      name='PRIVATE_APP', index=14, number=256,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                        -      name='MAX', index=15, number=511,
                                        +      name='ATAK_FORWARDER', index=15, number=257,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='MAX', index=16, number=511,
                                        +      serialized_options=None,
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                           serialized_start=19,
                                        -  serialized_end=337,
                                        +  serialized_end=350,
                                         )
                                         _sym_db.RegisterEnumDescriptor(_PORTNUM)
                                         
                                        @@ -161,6 +146,7 @@ SERIAL_APP = 64
                                         STORE_FORWARD_APP = 65
                                         RANGE_TEST_APP = 66
                                         ENVIRONMENTAL_MEASUREMENT_APP = 67
                                        +ZPS_APP = 68
                                         PRIVATE_APP = 256
                                         ATAK_FORWARDER = 257
                                         MAX = 511
                                        @@ -198,7 +184,7 @@ DESCRIPTOR._options = None
                                         
                                         
                                         
                                         
                                         
                                        \ No newline at end of file
                                        diff --git a/docs/meshtastic/radioconfig_pb2.html b/docs/meshtastic/radioconfig_pb2.html
                                        index a1463a3..9670823 100644
                                        --- a/docs/meshtastic/radioconfig_pb2.html
                                        +++ b/docs/meshtastic/radioconfig_pb2.html
                                        @@ -3,9 +3,9 @@
                                         
                                         
                                         
                                        -
                                        +
                                         meshtastic.radioconfig_pb2 API documentation
                                        -
                                        +
                                         
                                         
                                         
                                        @@ -22,7 +22,6 @@
                                         

                                        Module meshtastic.radioconfig_pb2

                                        -

                                        Generated protocol buffer code.

                                        Expand source code @@ -30,7 +29,7 @@
                                        # -*- coding: utf-8 -*-
                                         # Generated by the protocol buffer compiler.  DO NOT EDIT!
                                         # source: radioconfig.proto
                                        -"""Generated protocol buffer code."""
                                        +
                                         from google.protobuf.internal import enum_type_wrapper
                                         from google.protobuf import descriptor as _descriptor
                                         from google.protobuf import message as _message
                                        @@ -48,8 +47,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
                                           package='',
                                           syntax='proto3',
                                           serialized_options=b'\n\023com.geeksville.meshB\021RadioConfigProtosH\003Z!github.com/meshtastic/gomeshproto',
                                        -  create_key=_descriptor._internal_create_key,
                                        -  serialized_pb=b'\n\x11radioconfig.proto\"\x8c\x10\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x1a\xc9\x0f\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x11\n\twifi_ssid\x18\x0c \x01(\t\x12\x15\n\rwifi_password\x18\r \x01(\t\x12\x14\n\x0cwifi_ap_mode\x18\x0e \x01(\x08\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\x12&\n\x0e\x63harge_current\x18\x10 \x01(\x0e\x32\x0e.ChargeCurrent\x12\x11\n\tis_router\x18% \x01(\x08\x12\x14\n\x0cis_low_power\x18& \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\' \x01(\x08\x12\x17\n\x0fserial_disabled\x18( \x01(\x08\x12(\n\x0elocation_share\x18  \x01(\x0e\x32\x10.LocationSharing\x12$\n\rgps_operation\x18! \x01(\x0e\x32\r.GpsOperation\x12\x1b\n\x13gps_update_interval\x18\" \x01(\r\x12\x18\n\x10gps_attempt_time\x18$ \x01(\r\x12\x18\n\x10\x66requency_offset\x18) \x01(\x02\x12\x13\n\x0bmqtt_server\x18* \x01(\t\x12\x15\n\rmqtt_disabled\x18+ \x01(\x08\x12\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x1c\n\x14serialplugin_enabled\x18x \x01(\x08\x12\x19\n\x11serialplugin_echo\x18y \x01(\x08\x12\x18\n\x10serialplugin_rxd\x18z \x01(\r\x12\x18\n\x10serialplugin_txd\x18{ \x01(\r\x12\x1c\n\x14serialplugin_timeout\x18| \x01(\r\x12\x19\n\x11serialplugin_mode\x18} \x01(\r\x12\'\n\x1f\x65xt_notification_plugin_enabled\x18~ \x01(\x08\x12)\n!ext_notification_plugin_output_ms\x18\x7f \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_output\x18\x80\x01 \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_active\x18\x81\x01 \x01(\x08\x12.\n%ext_notification_plugin_alert_message\x18\x82\x01 \x01(\x08\x12+\n\"ext_notification_plugin_alert_bell\x18\x83\x01 \x01(\x08\x12\"\n\x19range_test_plugin_enabled\x18\x84\x01 \x01(\x08\x12!\n\x18range_test_plugin_sender\x18\x85\x01 \x01(\r\x12\x1f\n\x16range_test_plugin_save\x18\x86\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_enabled\x18\x94\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\x12=\n4environmental_measurement_plugin_measurement_enabled\x18\x8c\x01 \x01(\x08\x12\x38\n/environmental_measurement_plugin_screen_enabled\x18\x8d\x01 \x01(\x08\x12\x44\n;environmental_measurement_plugin_read_error_count_threshold\x18\x8e\x01 \x01(\r\x12\x39\n0environmental_measurement_plugin_update_interval\x18\x8f\x01 \x01(\r\x12;\n2environmental_measurement_plugin_recovery_interval\x18\x90\x01 \x01(\r\x12;\n2environmental_measurement_plugin_display_farenheit\x18\x91\x01 \x01(\x08\x12v\n,environmental_measurement_plugin_sensor_type\x18\x92\x01 \x01(\x0e\x32?.RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType\x12\x34\n+environmental_measurement_plugin_sensor_pin\x18\x93\x01 \x01(\r\"/\n\"EnvironmentalMeasurementSensorType\x12\t\n\x05\x44HT11\x10\x00J\x06\x08\x88\x01\x10\x89\x01*f\n\nRegionCode\x12\t\n\x05Unset\x10\x00\x12\x06\n\x02US\x10\x01\x12\t\n\x05\x45U433\x10\x02\x12\t\n\x05\x45U865\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t*\xd1\x01\n\rChargeCurrent\x12\x0b\n\x07MAUnset\x10\x00\x12\t\n\x05MA100\x10\x01\x12\t\n\x05MA190\x10\x02\x12\t\n\x05MA280\x10\x03\x12\t\n\x05MA360\x10\x04\x12\t\n\x05MA450\x10\x05\x12\t\n\x05MA550\x10\x06\x12\t\n\x05MA630\x10\x07\x12\t\n\x05MA700\x10\x08\x12\t\n\x05MA780\x10\t\x12\t\n\x05MA880\x10\n\x12\t\n\x05MA960\x10\x0b\x12\n\n\x06MA1000\x10\x0c\x12\n\n\x06MA1080\x10\r\x12\n\n\x06MA1160\x10\x0e\x12\n\n\x06MA1240\x10\x0f\x12\n\n\x06MA1320\x10\x10*j\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\x12\x13\n\x0fGpsOpStationary\x10\x01\x12\x0f\n\x0bGpsOpMobile\x10\x02\x12\x11\n\rGpsOpTimeOnly\x10\x03\x12\x11\n\rGpsOpDisabled\x10\x04*@\n\x0fLocationSharing\x12\x0c\n\x08LocUnset\x10\x00\x12\x0e\n\nLocEnabled\x10\x01\x12\x0f\n\x0bLocDisabled\x10\x02\x42M\n\x13\x63om.geeksville.meshB\x11RadioConfigProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                        +  serialized_pb=b'\n\x11radioconfig.proto\"\xfa\x12\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x1a\xb7\x12\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12 \n\x18position_broadcast_smart\x18\x11 \x01(\x08\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x11\n\twifi_ssid\x18\x0c \x01(\t\x12\x15\n\rwifi_password\x18\r \x01(\t\x12\x14\n\x0cwifi_ap_mode\x18\x0e \x01(\x08\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\x12&\n\x0e\x63harge_current\x18\x10 \x01(\x0e\x32\x0e.ChargeCurrent\x12\x11\n\tis_router\x18% \x01(\x08\x12\x14\n\x0cis_low_power\x18& \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\' \x01(\x08\x12\x17\n\x0fserial_disabled\x18( \x01(\x08\x12(\n\x0elocation_share\x18  \x01(\x0e\x32\x10.LocationSharing\x12$\n\rgps_operation\x18! \x01(\x0e\x32\r.GpsOperation\x12\x1b\n\x13gps_update_interval\x18\" \x01(\r\x12\x18\n\x10gps_attempt_time\x18$ \x01(\r\x12\x15\n\rgps_accept_2d\x18- \x01(\x08\x12\x13\n\x0bgps_max_dop\x18. \x01(\r\x12\x18\n\x10\x66requency_offset\x18) \x01(\x02\x12\x13\n\x0bmqtt_server\x18* \x01(\t\x12\x15\n\rmqtt_disabled\x18+ \x01(\x08\x12(\n\ngps_format\x18, \x01(\x0e\x32\x14.GpsCoordinateFormat\x12\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x1c\n\x14serialplugin_enabled\x18x \x01(\x08\x12\x19\n\x11serialplugin_echo\x18y \x01(\x08\x12\x18\n\x10serialplugin_rxd\x18z \x01(\r\x12\x18\n\x10serialplugin_txd\x18{ \x01(\r\x12\x1c\n\x14serialplugin_timeout\x18| \x01(\r\x12\x19\n\x11serialplugin_mode\x18} \x01(\r\x12\'\n\x1f\x65xt_notification_plugin_enabled\x18~ \x01(\x08\x12)\n!ext_notification_plugin_output_ms\x18\x7f \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_output\x18\x80\x01 \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_active\x18\x81\x01 \x01(\x08\x12.\n%ext_notification_plugin_alert_message\x18\x82\x01 \x01(\x08\x12+\n\"ext_notification_plugin_alert_bell\x18\x83\x01 \x01(\x08\x12\"\n\x19range_test_plugin_enabled\x18\x84\x01 \x01(\x08\x12!\n\x18range_test_plugin_sender\x18\x85\x01 \x01(\r\x12\x1f\n\x16range_test_plugin_save\x18\x86\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_enabled\x18\x94\x01 \x01(\x08\x12\'\n\x1estore_forward_plugin_heartbeat\x18\x95\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\x12\x30\n\'store_forward_plugin_history_return_max\x18\x8a\x01 \x01(\r\x12\x33\n*store_forward_plugin_history_return_window\x18\x8b\x01 \x01(\r\x12=\n4environmental_measurement_plugin_measurement_enabled\x18\x8c\x01 \x01(\x08\x12\x38\n/environmental_measurement_plugin_screen_enabled\x18\x8d\x01 \x01(\x08\x12\x44\n;environmental_measurement_plugin_read_error_count_threshold\x18\x8e\x01 \x01(\r\x12\x39\n0environmental_measurement_plugin_update_interval\x18\x8f\x01 \x01(\r\x12;\n2environmental_measurement_plugin_recovery_interval\x18\x90\x01 \x01(\r\x12;\n2environmental_measurement_plugin_display_farenheit\x18\x91\x01 \x01(\x08\x12v\n,environmental_measurement_plugin_sensor_type\x18\x92\x01 \x01(\x0e\x32?.RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType\x12\x34\n+environmental_measurement_plugin_sensor_pin\x18\x93\x01 \x01(\r\x12\x17\n\x0eposition_flags\x18\x96\x01 \x01(\r\x12\x1a\n\x11is_always_powered\x18\x97\x01 \x01(\x08\x12\"\n\x19\x61uto_screen_carousel_secs\x18\x98\x01 \x01(\r\"<\n\"EnvironmentalMeasurementSensorType\x12\t\n\x05\x44HT11\x10\x00\x12\x0b\n\x07\x44S18B20\x10\x01J\x06\x08\x88\x01\x10\x89\x01*f\n\nRegionCode\x12\t\n\x05Unset\x10\x00\x12\x06\n\x02US\x10\x01\x12\t\n\x05\x45U433\x10\x02\x12\t\n\x05\x45U865\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t*\xd1\x01\n\rChargeCurrent\x12\x0b\n\x07MAUnset\x10\x00\x12\t\n\x05MA100\x10\x01\x12\t\n\x05MA190\x10\x02\x12\t\n\x05MA280\x10\x03\x12\t\n\x05MA360\x10\x04\x12\t\n\x05MA450\x10\x05\x12\t\n\x05MA550\x10\x06\x12\t\n\x05MA630\x10\x07\x12\t\n\x05MA700\x10\x08\x12\t\n\x05MA780\x10\t\x12\t\n\x05MA880\x10\n\x12\t\n\x05MA960\x10\x0b\x12\n\n\x06MA1000\x10\x0c\x12\n\n\x06MA1080\x10\r\x12\n\n\x06MA1160\x10\x0e\x12\n\n\x06MA1240\x10\x0f\x12\n\n\x06MA1320\x10\x10*j\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\x12\x13\n\x0fGpsOpStationary\x10\x01\x12\x0f\n\x0bGpsOpMobile\x10\x02\x12\x11\n\rGpsOpTimeOnly\x10\x03\x12\x11\n\rGpsOpDisabled\x10\x04*\x83\x01\n\x13GpsCoordinateFormat\x12\x10\n\x0cGpsFormatDec\x10\x00\x12\x10\n\x0cGpsFormatDMS\x10\x01\x12\x10\n\x0cGpsFormatUTM\x10\x02\x12\x11\n\rGpsFormatMGRS\x10\x03\x12\x10\n\x0cGpsFormatOLC\x10\x04\x12\x11\n\rGpsFormatOSGR\x10\x05*@\n\x0fLocationSharing\x12\x0c\n\x08LocUnset\x10\x00\x12\x0e\n\nLocEnabled\x10\x01\x12\x0f\n\x0bLocDisabled\x10\x02*\xbc\x01\n\rPositionFlags\x12\x11\n\rPOS_UNDEFINED\x10\x00\x12\x10\n\x0cPOS_ALTITUDE\x10\x01\x12\x0f\n\x0bPOS_ALT_MSL\x10\x02\x12\x0f\n\x0bPOS_GEO_SEP\x10\x04\x12\x0b\n\x07POS_DOP\x10\x08\x12\r\n\tPOS_HVDOP\x10\x10\x12\x0f\n\x0bPOS_BATTERY\x10 \x12\x11\n\rPOS_SATINVIEW\x10@\x12\x10\n\x0bPOS_SEQ_NOS\x10\x80\x01\x12\x12\n\rPOS_TIMESTAMP\x10\x80\x02\x42M\n\x13\x63om.geeksville.meshB\x11RadioConfigProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                         )
                                         
                                         _REGIONCODE = _descriptor.EnumDescriptor(
                                        @@ -57,63 +55,52 @@ _REGIONCODE = _descriptor.EnumDescriptor(
                                           full_name='RegionCode',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='Unset', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='US', index=1, number=1,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='EU433', index=2, number=2,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='EU865', index=3, number=3,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='CN', index=4, number=4,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='JP', index=5, number=5,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='ANZ', index=6, number=6,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='KR', index=7, number=7,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='TW', index=8, number=8,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='RU', index=9, number=9,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                        -  serialized_start=2084,
                                        -  serialized_end=2186,
                                        +  serialized_start=2450,
                                        +  serialized_end=2552,
                                         )
                                         _sym_db.RegisterEnumDescriptor(_REGIONCODE)
                                         
                                        @@ -123,98 +110,80 @@ _CHARGECURRENT = _descriptor.EnumDescriptor(
                                           full_name='ChargeCurrent',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='MAUnset', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA100', index=1, number=1,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA190', index=2, number=2,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA280', index=3, number=3,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA360', index=4, number=4,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA450', index=5, number=5,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA550', index=6, number=6,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA630', index=7, number=7,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA700', index=8, number=8,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA780', index=9, number=9,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA880', index=10, number=10,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA960', index=11, number=11,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA1000', index=12, number=12,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA1080', index=13, number=13,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA1160', index=14, number=14,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA1240', index=15, number=15,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='MA1320', index=16, number=16,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                        -  serialized_start=2189,
                                        -  serialized_end=2398,
                                        +  serialized_start=2555,
                                        +  serialized_end=2764,
                                         )
                                         _sym_db.RegisterEnumDescriptor(_CHARGECURRENT)
                                         
                                        @@ -224,73 +193,157 @@ _GPSOPERATION = _descriptor.EnumDescriptor(
                                           full_name='GpsOperation',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='GpsOpUnset', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='GpsOpStationary', index=1, number=1,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='GpsOpMobile', index=2, number=2,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='GpsOpTimeOnly', index=3, number=3,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='GpsOpDisabled', index=4, number=4,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                        -  serialized_start=2400,
                                        -  serialized_end=2506,
                                        +  serialized_start=2766,
                                        +  serialized_end=2872,
                                         )
                                         _sym_db.RegisterEnumDescriptor(_GPSOPERATION)
                                         
                                         GpsOperation = enum_type_wrapper.EnumTypeWrapper(_GPSOPERATION)
                                        +_GPSCOORDINATEFORMAT = _descriptor.EnumDescriptor(
                                        +  name='GpsCoordinateFormat',
                                        +  full_name='GpsCoordinateFormat',
                                        +  filename=None,
                                        +  file=DESCRIPTOR,
                                        +  values=[
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='GpsFormatDec', index=0, number=0,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='GpsFormatDMS', index=1, number=1,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='GpsFormatUTM', index=2, number=2,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='GpsFormatMGRS', index=3, number=3,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='GpsFormatOLC', index=4, number=4,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='GpsFormatOSGR', index=5, number=5,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +  ],
                                        +  containing_type=None,
                                        +  serialized_options=None,
                                        +  serialized_start=2875,
                                        +  serialized_end=3006,
                                        +)
                                        +_sym_db.RegisterEnumDescriptor(_GPSCOORDINATEFORMAT)
                                        +
                                        +GpsCoordinateFormat = enum_type_wrapper.EnumTypeWrapper(_GPSCOORDINATEFORMAT)
                                         _LOCATIONSHARING = _descriptor.EnumDescriptor(
                                           name='LocationSharing',
                                           full_name='LocationSharing',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='LocUnset', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='LocEnabled', index=1, number=1,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='LocDisabled', index=2, number=2,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                        -  serialized_start=2508,
                                        -  serialized_end=2572,
                                        +  serialized_start=3008,
                                        +  serialized_end=3072,
                                         )
                                         _sym_db.RegisterEnumDescriptor(_LOCATIONSHARING)
                                         
                                         LocationSharing = enum_type_wrapper.EnumTypeWrapper(_LOCATIONSHARING)
                                        +_POSITIONFLAGS = _descriptor.EnumDescriptor(
                                        +  name='PositionFlags',
                                        +  full_name='PositionFlags',
                                        +  filename=None,
                                        +  file=DESCRIPTOR,
                                        +  values=[
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_UNDEFINED', index=0, number=0,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_ALTITUDE', index=1, number=1,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_ALT_MSL', index=2, number=2,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_GEO_SEP', index=3, number=4,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_DOP', index=4, number=8,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_HVDOP', index=5, number=16,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_BATTERY', index=6, number=32,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_SATINVIEW', index=7, number=64,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_SEQ_NOS', index=8, number=128,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='POS_TIMESTAMP', index=9, number=256,
                                        +      serialized_options=None,
                                        +      type=None),
                                        +  ],
                                        +  containing_type=None,
                                        +  serialized_options=None,
                                        +  serialized_start=3075,
                                        +  serialized_end=3263,
                                        +)
                                        +_sym_db.RegisterEnumDescriptor(_POSITIONFLAGS)
                                        +
                                        +PositionFlags = enum_type_wrapper.EnumTypeWrapper(_POSITIONFLAGS)
                                         Unset = 0
                                         US = 1
                                         EU433 = 2
                                        @@ -323,9 +376,25 @@ GpsOpStationary = 1
                                         GpsOpMobile = 2
                                         GpsOpTimeOnly = 3
                                         GpsOpDisabled = 4
                                        +GpsFormatDec = 0
                                        +GpsFormatDMS = 1
                                        +GpsFormatUTM = 2
                                        +GpsFormatMGRS = 3
                                        +GpsFormatOLC = 4
                                        +GpsFormatOSGR = 5
                                         LocUnset = 0
                                         LocEnabled = 1
                                         LocDisabled = 2
                                        +POS_UNDEFINED = 0
                                        +POS_ALTITUDE = 1
                                        +POS_ALT_MSL = 2
                                        +POS_GEO_SEP = 4
                                        +POS_DOP = 8
                                        +POS_HVDOP = 16
                                        +POS_BATTERY = 32
                                        +POS_SATINVIEW = 64
                                        +POS_SEQ_NOS = 128
                                        +POS_TIMESTAMP = 256
                                         
                                         
                                         _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE = _descriptor.EnumDescriptor(
                                        @@ -333,18 +402,20 @@ _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE = _descriptor.En
                                           full_name='RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='DHT11', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                        +    _descriptor.EnumValueDescriptor(
                                        +      name='DS18B20', index=1, number=1,
                                        +      serialized_options=None,
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                        -  serialized_start=2027,
                                        -  serialized_end=2074,
                                        +  serialized_start=2380,
                                        +  serialized_end=2440,
                                         )
                                         _sym_db.RegisterEnumDescriptor(_RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE)
                                         
                                        @@ -355,7 +426,6 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor(
                                           filename=None,
                                           file=DESCRIPTOR,
                                           containing_type=None,
                                        -  create_key=_descriptor._internal_create_key,
                                           fields=[
                                             _descriptor.FieldDescriptor(
                                               name='position_broadcast_secs', full_name='RadioConfig.UserPreferences.position_broadcast_secs', index=0,
                                        @@ -363,378 +433,448 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor(
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='send_owner_interval', full_name='RadioConfig.UserPreferences.send_owner_interval', index=1,
                                        +      name='position_broadcast_smart', full_name='RadioConfig.UserPreferences.position_broadcast_smart', index=1,
                                        +      number=17, type=8, cpp_type=7, label=1,
                                        +      has_default_value=False, default_value=False,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='send_owner_interval', full_name='RadioConfig.UserPreferences.send_owner_interval', index=2,
                                               number=2, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='wait_bluetooth_secs', full_name='RadioConfig.UserPreferences.wait_bluetooth_secs', index=2,
                                        +      name='wait_bluetooth_secs', full_name='RadioConfig.UserPreferences.wait_bluetooth_secs', index=3,
                                               number=4, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='screen_on_secs', full_name='RadioConfig.UserPreferences.screen_on_secs', index=3,
                                        +      name='screen_on_secs', full_name='RadioConfig.UserPreferences.screen_on_secs', index=4,
                                               number=5, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='phone_timeout_secs', full_name='RadioConfig.UserPreferences.phone_timeout_secs', index=4,
                                        +      name='phone_timeout_secs', full_name='RadioConfig.UserPreferences.phone_timeout_secs', index=5,
                                               number=6, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='phone_sds_timeout_sec', full_name='RadioConfig.UserPreferences.phone_sds_timeout_sec', index=5,
                                        +      name='phone_sds_timeout_sec', full_name='RadioConfig.UserPreferences.phone_sds_timeout_sec', index=6,
                                               number=7, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='mesh_sds_timeout_secs', full_name='RadioConfig.UserPreferences.mesh_sds_timeout_secs', index=6,
                                        +      name='mesh_sds_timeout_secs', full_name='RadioConfig.UserPreferences.mesh_sds_timeout_secs', index=7,
                                               number=8, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='sds_secs', full_name='RadioConfig.UserPreferences.sds_secs', index=7,
                                        +      name='sds_secs', full_name='RadioConfig.UserPreferences.sds_secs', index=8,
                                               number=9, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ls_secs', full_name='RadioConfig.UserPreferences.ls_secs', index=8,
                                        +      name='ls_secs', full_name='RadioConfig.UserPreferences.ls_secs', index=9,
                                               number=10, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='min_wake_secs', full_name='RadioConfig.UserPreferences.min_wake_secs', index=9,
                                        +      name='min_wake_secs', full_name='RadioConfig.UserPreferences.min_wake_secs', index=10,
                                               number=11, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='wifi_ssid', full_name='RadioConfig.UserPreferences.wifi_ssid', index=10,
                                        +      name='wifi_ssid', full_name='RadioConfig.UserPreferences.wifi_ssid', index=11,
                                               number=12, type=9, cpp_type=9, label=1,
                                               has_default_value=False, default_value=b"".decode('utf-8'),
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='wifi_password', full_name='RadioConfig.UserPreferences.wifi_password', index=11,
                                        +      name='wifi_password', full_name='RadioConfig.UserPreferences.wifi_password', index=12,
                                               number=13, type=9, cpp_type=9, label=1,
                                               has_default_value=False, default_value=b"".decode('utf-8'),
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='wifi_ap_mode', full_name='RadioConfig.UserPreferences.wifi_ap_mode', index=12,
                                        +      name='wifi_ap_mode', full_name='RadioConfig.UserPreferences.wifi_ap_mode', index=13,
                                               number=14, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='region', full_name='RadioConfig.UserPreferences.region', index=13,
                                        +      name='region', full_name='RadioConfig.UserPreferences.region', index=14,
                                               number=15, type=14, cpp_type=8, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=14,
                                        +      name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=15,
                                               number=16, type=14, cpp_type=8, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='is_router', full_name='RadioConfig.UserPreferences.is_router', index=15,
                                        +      name='is_router', full_name='RadioConfig.UserPreferences.is_router', index=16,
                                               number=37, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=16,
                                        +      name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=17,
                                               number=38, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=17,
                                        +      name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=18,
                                               number=39, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serial_disabled', full_name='RadioConfig.UserPreferences.serial_disabled', index=18,
                                        +      name='serial_disabled', full_name='RadioConfig.UserPreferences.serial_disabled', index=19,
                                               number=40, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='location_share', full_name='RadioConfig.UserPreferences.location_share', index=19,
                                        +      name='location_share', full_name='RadioConfig.UserPreferences.location_share', index=20,
                                               number=32, type=14, cpp_type=8, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='gps_operation', full_name='RadioConfig.UserPreferences.gps_operation', index=20,
                                        +      name='gps_operation', full_name='RadioConfig.UserPreferences.gps_operation', index=21,
                                               number=33, type=14, cpp_type=8, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='gps_update_interval', full_name='RadioConfig.UserPreferences.gps_update_interval', index=21,
                                        +      name='gps_update_interval', full_name='RadioConfig.UserPreferences.gps_update_interval', index=22,
                                               number=34, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='gps_attempt_time', full_name='RadioConfig.UserPreferences.gps_attempt_time', index=22,
                                        +      name='gps_attempt_time', full_name='RadioConfig.UserPreferences.gps_attempt_time', index=23,
                                               number=36, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='frequency_offset', full_name='RadioConfig.UserPreferences.frequency_offset', index=23,
                                        +      name='gps_accept_2d', full_name='RadioConfig.UserPreferences.gps_accept_2d', index=24,
                                        +      number=45, type=8, cpp_type=7, label=1,
                                        +      has_default_value=False, default_value=False,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='gps_max_dop', full_name='RadioConfig.UserPreferences.gps_max_dop', index=25,
                                        +      number=46, type=13, cpp_type=3, label=1,
                                        +      has_default_value=False, default_value=0,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='frequency_offset', full_name='RadioConfig.UserPreferences.frequency_offset', index=26,
                                               number=41, type=2, cpp_type=6, label=1,
                                               has_default_value=False, default_value=float(0),
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='mqtt_server', full_name='RadioConfig.UserPreferences.mqtt_server', index=24,
                                        +      name='mqtt_server', full_name='RadioConfig.UserPreferences.mqtt_server', index=27,
                                               number=42, type=9, cpp_type=9, label=1,
                                               has_default_value=False, default_value=b"".decode('utf-8'),
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='mqtt_disabled', full_name='RadioConfig.UserPreferences.mqtt_disabled', index=25,
                                        +      name='mqtt_disabled', full_name='RadioConfig.UserPreferences.mqtt_disabled', index=28,
                                               number=43, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=26,
                                        +      name='gps_format', full_name='RadioConfig.UserPreferences.gps_format', index=29,
                                        +      number=44, type=14, cpp_type=8, label=1,
                                        +      has_default_value=False, default_value=0,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=30,
                                               number=100, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=27,
                                        +      name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=31,
                                               number=101, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=28,
                                        +      name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=32,
                                               number=103, type=13, cpp_type=3, label=3,
                                               has_default_value=False, default_value=[],
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serialplugin_enabled', full_name='RadioConfig.UserPreferences.serialplugin_enabled', index=29,
                                        +      name='serialplugin_enabled', full_name='RadioConfig.UserPreferences.serialplugin_enabled', index=33,
                                               number=120, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serialplugin_echo', full_name='RadioConfig.UserPreferences.serialplugin_echo', index=30,
                                        +      name='serialplugin_echo', full_name='RadioConfig.UserPreferences.serialplugin_echo', index=34,
                                               number=121, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serialplugin_rxd', full_name='RadioConfig.UserPreferences.serialplugin_rxd', index=31,
                                        +      name='serialplugin_rxd', full_name='RadioConfig.UserPreferences.serialplugin_rxd', index=35,
                                               number=122, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serialplugin_txd', full_name='RadioConfig.UserPreferences.serialplugin_txd', index=32,
                                        +      name='serialplugin_txd', full_name='RadioConfig.UserPreferences.serialplugin_txd', index=36,
                                               number=123, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serialplugin_timeout', full_name='RadioConfig.UserPreferences.serialplugin_timeout', index=33,
                                        +      name='serialplugin_timeout', full_name='RadioConfig.UserPreferences.serialplugin_timeout', index=37,
                                               number=124, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='serialplugin_mode', full_name='RadioConfig.UserPreferences.serialplugin_mode', index=34,
                                        +      name='serialplugin_mode', full_name='RadioConfig.UserPreferences.serialplugin_mode', index=38,
                                               number=125, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ext_notification_plugin_enabled', full_name='RadioConfig.UserPreferences.ext_notification_plugin_enabled', index=35,
                                        +      name='ext_notification_plugin_enabled', full_name='RadioConfig.UserPreferences.ext_notification_plugin_enabled', index=39,
                                               number=126, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ext_notification_plugin_output_ms', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output_ms', index=36,
                                        +      name='ext_notification_plugin_output_ms', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output_ms', index=40,
                                               number=127, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ext_notification_plugin_output', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output', index=37,
                                        +      name='ext_notification_plugin_output', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output', index=41,
                                               number=128, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ext_notification_plugin_active', full_name='RadioConfig.UserPreferences.ext_notification_plugin_active', index=38,
                                        +      name='ext_notification_plugin_active', full_name='RadioConfig.UserPreferences.ext_notification_plugin_active', index=42,
                                               number=129, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ext_notification_plugin_alert_message', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_message', index=39,
                                        +      name='ext_notification_plugin_alert_message', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_message', index=43,
                                               number=130, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='ext_notification_plugin_alert_bell', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_bell', index=40,
                                        +      name='ext_notification_plugin_alert_bell', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_bell', index=44,
                                               number=131, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='range_test_plugin_enabled', full_name='RadioConfig.UserPreferences.range_test_plugin_enabled', index=41,
                                        +      name='range_test_plugin_enabled', full_name='RadioConfig.UserPreferences.range_test_plugin_enabled', index=45,
                                               number=132, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='range_test_plugin_sender', full_name='RadioConfig.UserPreferences.range_test_plugin_sender', index=42,
                                        +      name='range_test_plugin_sender', full_name='RadioConfig.UserPreferences.range_test_plugin_sender', index=46,
                                               number=133, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='range_test_plugin_save', full_name='RadioConfig.UserPreferences.range_test_plugin_save', index=43,
                                        +      name='range_test_plugin_save', full_name='RadioConfig.UserPreferences.range_test_plugin_save', index=47,
                                               number=134, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='store_forward_plugin_enabled', full_name='RadioConfig.UserPreferences.store_forward_plugin_enabled', index=44,
                                        +      name='store_forward_plugin_enabled', full_name='RadioConfig.UserPreferences.store_forward_plugin_enabled', index=48,
                                               number=148, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='store_forward_plugin_records', full_name='RadioConfig.UserPreferences.store_forward_plugin_records', index=45,
                                        +      name='store_forward_plugin_heartbeat', full_name='RadioConfig.UserPreferences.store_forward_plugin_heartbeat', index=49,
                                        +      number=149, type=8, cpp_type=7, label=1,
                                        +      has_default_value=False, default_value=False,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='store_forward_plugin_records', full_name='RadioConfig.UserPreferences.store_forward_plugin_records', index=50,
                                               number=137, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_measurement_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_measurement_enabled', index=46,
                                        +      name='store_forward_plugin_history_return_max', full_name='RadioConfig.UserPreferences.store_forward_plugin_history_return_max', index=51,
                                        +      number=138, type=13, cpp_type=3, label=1,
                                        +      has_default_value=False, default_value=0,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='store_forward_plugin_history_return_window', full_name='RadioConfig.UserPreferences.store_forward_plugin_history_return_window', index=52,
                                        +      number=139, type=13, cpp_type=3, label=1,
                                        +      has_default_value=False, default_value=0,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='environmental_measurement_plugin_measurement_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_measurement_enabled', index=53,
                                               number=140, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_screen_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_screen_enabled', index=47,
                                        +      name='environmental_measurement_plugin_screen_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_screen_enabled', index=54,
                                               number=141, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_read_error_count_threshold', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_read_error_count_threshold', index=48,
                                        +      name='environmental_measurement_plugin_read_error_count_threshold', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_read_error_count_threshold', index=55,
                                               number=142, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_update_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_update_interval', index=49,
                                        +      name='environmental_measurement_plugin_update_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_update_interval', index=56,
                                               number=143, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_recovery_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_recovery_interval', index=50,
                                        +      name='environmental_measurement_plugin_recovery_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_recovery_interval', index=57,
                                               number=144, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_display_farenheit', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_display_farenheit', index=51,
                                        +      name='environmental_measurement_plugin_display_farenheit', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_display_farenheit', index=58,
                                               number=145, type=8, cpp_type=7, label=1,
                                               has_default_value=False, default_value=False,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_sensor_type', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_type', index=52,
                                        +      name='environmental_measurement_plugin_sensor_type', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_type', index=59,
                                               number=146, type=14, cpp_type=8, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                        -      name='environmental_measurement_plugin_sensor_pin', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_pin', index=53,
                                        +      name='environmental_measurement_plugin_sensor_pin', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_pin', index=60,
                                               number=147, type=13, cpp_type=3, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='position_flags', full_name='RadioConfig.UserPreferences.position_flags', index=61,
                                        +      number=150, type=13, cpp_type=3, label=1,
                                        +      has_default_value=False, default_value=0,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='is_always_powered', full_name='RadioConfig.UserPreferences.is_always_powered', index=62,
                                        +      number=151, type=8, cpp_type=7, label=1,
                                        +      has_default_value=False, default_value=False,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                        +    _descriptor.FieldDescriptor(
                                        +      name='auto_screen_carousel_secs', full_name='RadioConfig.UserPreferences.auto_screen_carousel_secs', index=63,
                                        +      number=152, type=13, cpp_type=3, label=1,
                                        +      has_default_value=False, default_value=0,
                                        +      message_type=None, enum_type=None, containing_type=None,
                                        +      is_extension=False, extension_scope=None,
                                        +      serialized_options=None, file=DESCRIPTOR),
                                           ],
                                           extensions=[
                                           ],
                                        @@ -749,7 +889,7 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor(
                                           oneofs=[
                                           ],
                                           serialized_start=89,
                                        -  serialized_end=2082,
                                        +  serialized_end=2448,
                                         )
                                         
                                         _RADIOCONFIG = _descriptor.Descriptor(
                                        @@ -758,7 +898,6 @@ _RADIOCONFIG = _descriptor.Descriptor(
                                           filename=None,
                                           file=DESCRIPTOR,
                                           containing_type=None,
                                        -  create_key=_descriptor._internal_create_key,
                                           fields=[
                                             _descriptor.FieldDescriptor(
                                               name='preferences', full_name='RadioConfig.preferences', index=0,
                                        @@ -766,7 +905,7 @@ _RADIOCONFIG = _descriptor.Descriptor(
                                               has_default_value=False, default_value=None,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                           ],
                                           extensions=[
                                           ],
                                        @@ -780,13 +919,14 @@ _RADIOCONFIG = _descriptor.Descriptor(
                                           oneofs=[
                                           ],
                                           serialized_start=22,
                                        -  serialized_end=2082,
                                        +  serialized_end=2448,
                                         )
                                         
                                         _RADIOCONFIG_USERPREFERENCES.fields_by_name['region'].enum_type = _REGIONCODE
                                         _RADIOCONFIG_USERPREFERENCES.fields_by_name['charge_current'].enum_type = _CHARGECURRENT
                                         _RADIOCONFIG_USERPREFERENCES.fields_by_name['location_share'].enum_type = _LOCATIONSHARING
                                         _RADIOCONFIG_USERPREFERENCES.fields_by_name['gps_operation'].enum_type = _GPSOPERATION
                                        +_RADIOCONFIG_USERPREFERENCES.fields_by_name['gps_format'].enum_type = _GPSCOORDINATEFORMAT
                                         _RADIOCONFIG_USERPREFERENCES.fields_by_name['environmental_measurement_plugin_sensor_type'].enum_type = _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE
                                         _RADIOCONFIG_USERPREFERENCES.containing_type = _RADIOCONFIG
                                         _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE.containing_type = _RADIOCONFIG_USERPREFERENCES
                                        @@ -795,7 +935,9 @@ DESCRIPTOR.message_types_by_name['RadioConfig'] = _RADIOCONFIG
                                         DESCRIPTOR.enum_types_by_name['RegionCode'] = _REGIONCODE
                                         DESCRIPTOR.enum_types_by_name['ChargeCurrent'] = _CHARGECURRENT
                                         DESCRIPTOR.enum_types_by_name['GpsOperation'] = _GPSOPERATION
                                        +DESCRIPTOR.enum_types_by_name['GpsCoordinateFormat'] = _GPSCOORDINATEFORMAT
                                         DESCRIPTOR.enum_types_by_name['LocationSharing'] = _LOCATIONSHARING
                                        +DESCRIPTOR.enum_types_by_name['PositionFlags'] = _POSITIONFLAGS
                                         _sym_db.RegisterFileDescriptor(DESCRIPTOR)
                                         
                                         RadioConfig = _reflection.GeneratedProtocolMessageType('RadioConfig', (_message.Message,), {
                                        @@ -829,13 +971,16 @@ DESCRIPTOR._options = None
                                         
                                        class RadioConfig -(*args, **kwargs) +(**kwargs)
                                        -

                                        A ProtocolMessage

                                        +

                                        Abstract base class for protocol messages.

                                        +

                                        Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                        Ancestors

                                          -
                                        • google.protobuf.pyext._message.CMessage
                                        • google.protobuf.message.Message

                                        Class variables

                                        @@ -844,16 +989,536 @@ DESCRIPTOR._options = None
                                        +
                                        var PREFERENCES_FIELD_NUMBER
                                        +
                                        +
                                        +
                                        var UserPreferences
                                        -

                                        A ProtocolMessage

                                        +

                                        Abstract base class for protocol messages.

                                        +

                                        Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                        +
                                        +
                                        +

                                        Static methods

                                        +
                                        +
                                        +def FromString(s) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def FromString(s):
                                        +  message = cls()
                                        +  message.MergeFromString(s)
                                        +  return message
                                        +
                                        +
                                        +
                                        +def RegisterExtension(extension_handle) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def RegisterExtension(extension_handle):
                                        +  extension_handle.containing_type = cls.DESCRIPTOR
                                        +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
                                        +  # pylint: disable=protected-access
                                        +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
                                        +  _AttachFieldHelpers(cls, extension_handle)
                                        +

                                        Instance variables

                                        var preferences
                                        -

                                        Field RadioConfig.preferences

                                        +

                                        Getter for preferences.

                                        +
                                        + +Expand source code + +
                                        def getter(self):
                                        +  field_value = self._fields.get(field)
                                        +  if field_value is None:
                                        +    # Construct a new object to represent this field.
                                        +    field_value = field._default_constructor(self)
                                        +
                                        +    # Atomically check if another thread has preempted us and, if not, swap
                                        +    # in the new object we just created.  If someone has preempted us, we
                                        +    # take that object and discard ours.
                                        +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                                        +    #   in CPython but we haven't investigated others.  This warning appears
                                        +    #   in several other locations in this file.
                                        +    field_value = self._fields.setdefault(field, field_value)
                                        +  return field_value
                                        +
                                        +
                                        +
                                        +

                                        Methods

                                        +
                                        +
                                        +def ByteSize(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def ByteSize(self):
                                        +  if not self._cached_byte_size_dirty:
                                        +    return self._cached_byte_size
                                        +
                                        +  size = 0
                                        +  descriptor = self.DESCRIPTOR
                                        +  if descriptor.GetOptions().map_entry:
                                        +    # Fields of map entry should always be serialized.
                                        +    size = descriptor.fields_by_name['key']._sizer(self.key)
                                        +    size += descriptor.fields_by_name['value']._sizer(self.value)
                                        +  else:
                                        +    for field_descriptor, field_value in self.ListFields():
                                        +      size += field_descriptor._sizer(field_value)
                                        +    for tag_bytes, value_bytes in self._unknown_fields:
                                        +      size += len(tag_bytes) + len(value_bytes)
                                        +
                                        +  self._cached_byte_size = size
                                        +  self._cached_byte_size_dirty = False
                                        +  self._listener_for_children.dirty = False
                                        +  return size
                                        +
                                        +
                                        +
                                        +def Clear(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def _Clear(self):
                                        +  # Clear fields.
                                        +  self._fields = {}
                                        +  self._unknown_fields = ()
                                        +  # pylint: disable=protected-access
                                        +  if self._unknown_field_set is not None:
                                        +    self._unknown_field_set._clear()
                                        +    self._unknown_field_set = None
                                        +
                                        +  self._oneofs = {}
                                        +  self._Modified()
                                        +
                                        +
                                        +
                                        +def ClearField(self, field_name) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def ClearField(self, field_name):
                                        +  try:
                                        +    field = message_descriptor.fields_by_name[field_name]
                                        +  except KeyError:
                                        +    try:
                                        +      field = message_descriptor.oneofs_by_name[field_name]
                                        +      if field in self._oneofs:
                                        +        field = self._oneofs[field]
                                        +      else:
                                        +        return
                                        +    except KeyError:
                                        +      raise ValueError('Protocol message %s has no "%s" field.' %
                                        +                       (message_descriptor.name, field_name))
                                        +
                                        +  if field in self._fields:
                                        +    # To match the C++ implementation, we need to invalidate iterators
                                        +    # for map fields when ClearField() happens.
                                        +    if hasattr(self._fields[field], 'InvalidateIterators'):
                                        +      self._fields[field].InvalidateIterators()
                                        +
                                        +    # Note:  If the field is a sub-message, its listener will still point
                                        +    #   at us.  That's fine, because the worst than can happen is that it
                                        +    #   will call _Modified() and invalidate our byte size.  Big deal.
                                        +    del self._fields[field]
                                        +
                                        +    if self._oneofs.get(field.containing_oneof, None) is field:
                                        +      del self._oneofs[field.containing_oneof]
                                        +
                                        +  # Always call _Modified() -- even if nothing was changed, this is
                                        +  # a mutating method, and thus calling it should cause the field to become
                                        +  # present in the parent message.
                                        +  self._Modified()
                                        +
                                        +
                                        +
                                        +def DiscardUnknownFields(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def _DiscardUnknownFields(self):
                                        +  self._unknown_fields = []
                                        +  self._unknown_field_set = None      # pylint: disable=protected-access
                                        +  for field, value in self.ListFields():
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      if _IsMapField(field):
                                        +        if _IsMessageMapField(field):
                                        +          for key in value:
                                        +            value[key].DiscardUnknownFields()
                                        +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                        +        for sub_message in value:
                                        +          sub_message.DiscardUnknownFields()
                                        +      else:
                                        +        value.DiscardUnknownFields()
                                        +
                                        +
                                        +
                                        +def FindInitializationErrors(self) +
                                        +
                                        +

                                        Finds required fields which are not initialized.

                                        +

                                        Returns

                                        +

                                        A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

                                        +
                                        + +Expand source code + +
                                        def FindInitializationErrors(self):
                                        +  """Finds required fields which are not initialized.
                                        +
                                        +  Returns:
                                        +    A list of strings.  Each string is a path to an uninitialized field from
                                        +    the top-level message, e.g. "foo.bar[5].baz".
                                        +  """
                                        +
                                        +  errors = []  # simplify things
                                        +
                                        +  for field in required_fields:
                                        +    if not self.HasField(field.name):
                                        +      errors.append(field.name)
                                        +
                                        +  for field, value in self.ListFields():
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      if field.is_extension:
                                        +        name = '(%s)' % field.full_name
                                        +      else:
                                        +        name = field.name
                                        +
                                        +      if _IsMapField(field):
                                        +        if _IsMessageMapField(field):
                                        +          for key in value:
                                        +            element = value[key]
                                        +            prefix = '%s[%s].' % (name, key)
                                        +            sub_errors = element.FindInitializationErrors()
                                        +            errors += [prefix + error for error in sub_errors]
                                        +        else:
                                        +          # ScalarMaps can't have any initialization errors.
                                        +          pass
                                        +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                        +        for i in range(len(value)):
                                        +          element = value[i]
                                        +          prefix = '%s[%d].' % (name, i)
                                        +          sub_errors = element.FindInitializationErrors()
                                        +          errors += [prefix + error for error in sub_errors]
                                        +      else:
                                        +        prefix = name + '.'
                                        +        sub_errors = value.FindInitializationErrors()
                                        +        errors += [prefix + error for error in sub_errors]
                                        +
                                        +  return errors
                                        +
                                        +
                                        +
                                        +def HasField(self, field_name) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def HasField(self, field_name):
                                        +  try:
                                        +    field = hassable_fields[field_name]
                                        +  except KeyError:
                                        +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
                                        +
                                        +  if isinstance(field, descriptor_mod.OneofDescriptor):
                                        +    try:
                                        +      return HasField(self, self._oneofs[field].name)
                                        +    except KeyError:
                                        +      return False
                                        +  else:
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      value = self._fields.get(field)
                                        +      return value is not None and value._is_present_in_parent
                                        +    else:
                                        +      return field in self._fields
                                        +
                                        +
                                        +
                                        +def IsInitialized(self, errors=None) +
                                        +
                                        +

                                        Checks if all required fields of a message are set.

                                        +

                                        Args

                                        +
                                        +
                                        errors
                                        +
                                        A list which, if provided, will be populated with the field +paths of all missing required fields.
                                        +
                                        +

                                        Returns

                                        +

                                        True iff the specified message has all required fields set.

                                        +
                                        + +Expand source code + +
                                        def IsInitialized(self, errors=None):
                                        +  """Checks if all required fields of a message are set.
                                        +
                                        +  Args:
                                        +    errors:  A list which, if provided, will be populated with the field
                                        +             paths of all missing required fields.
                                        +
                                        +  Returns:
                                        +    True iff the specified message has all required fields set.
                                        +  """
                                        +
                                        +  # Performance is critical so we avoid HasField() and ListFields().
                                        +
                                        +  for field in required_fields:
                                        +    if (field not in self._fields or
                                        +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
                                        +         not self._fields[field]._is_present_in_parent)):
                                        +      if errors is not None:
                                        +        errors.extend(self.FindInitializationErrors())
                                        +      return False
                                        +
                                        +  for field, value in list(self._fields.items()):  # dict can change size!
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      if field.label == _FieldDescriptor.LABEL_REPEATED:
                                        +        if (field.message_type.has_options and
                                        +            field.message_type.GetOptions().map_entry):
                                        +          continue
                                        +        for element in value:
                                        +          if not element.IsInitialized():
                                        +            if errors is not None:
                                        +              errors.extend(self.FindInitializationErrors())
                                        +            return False
                                        +      elif value._is_present_in_parent and not value.IsInitialized():
                                        +        if errors is not None:
                                        +          errors.extend(self.FindInitializationErrors())
                                        +        return False
                                        +
                                        +  return True
                                        +
                                        +
                                        +
                                        +def ListFields(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def ListFields(self):
                                        +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
                                        +  all_fields.sort(key = lambda item: item[0].number)
                                        +  return all_fields
                                        +
                                        +
                                        +
                                        +def MergeFrom(self, msg) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def MergeFrom(self, msg):
                                        +  if not isinstance(msg, cls):
                                        +    raise TypeError(
                                        +        'Parameter to MergeFrom() must be instance of same class: '
                                        +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
                                        +                                 _FullyQualifiedClassName(msg.__class__)))
                                        +
                                        +  assert msg is not self
                                        +  self._Modified()
                                        +
                                        +  fields = self._fields
                                        +
                                        +  for field, value in msg._fields.items():
                                        +    if field.label == LABEL_REPEATED:
                                        +      field_value = fields.get(field)
                                        +      if field_value is None:
                                        +        # Construct a new object to represent this field.
                                        +        field_value = field._default_constructor(self)
                                        +        fields[field] = field_value
                                        +      field_value.MergeFrom(value)
                                        +    elif field.cpp_type == CPPTYPE_MESSAGE:
                                        +      if value._is_present_in_parent:
                                        +        field_value = fields.get(field)
                                        +        if field_value is None:
                                        +          # Construct a new object to represent this field.
                                        +          field_value = field._default_constructor(self)
                                        +          fields[field] = field_value
                                        +        field_value.MergeFrom(value)
                                        +    else:
                                        +      self._fields[field] = value
                                        +      if field.containing_oneof:
                                        +        self._UpdateOneofState(field)
                                        +
                                        +  if msg._unknown_fields:
                                        +    if not self._unknown_fields:
                                        +      self._unknown_fields = []
                                        +    self._unknown_fields.extend(msg._unknown_fields)
                                        +    # pylint: disable=protected-access
                                        +    if self._unknown_field_set is None:
                                        +      self._unknown_field_set = containers.UnknownFieldSet()
                                        +    self._unknown_field_set._extend(msg._unknown_field_set)
                                        +
                                        +
                                        +
                                        +def MergeFromString(self, serialized) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def MergeFromString(self, serialized):
                                        +  serialized = memoryview(serialized)
                                        +  length = len(serialized)
                                        +  try:
                                        +    if self._InternalParse(serialized, 0, length) != length:
                                        +      # The only reason _InternalParse would return early is if it
                                        +      # encountered an end-group tag.
                                        +      raise message_mod.DecodeError('Unexpected end-group tag.')
                                        +  except (IndexError, TypeError):
                                        +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
                                        +    raise message_mod.DecodeError('Truncated message.')
                                        +  except struct.error as e:
                                        +    raise message_mod.DecodeError(e)
                                        +  return length   # Return this for legacy reasons.
                                        +
                                        +
                                        +
                                        +def SerializePartialToString(self, **kwargs) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def SerializePartialToString(self, **kwargs):
                                        +  out = BytesIO()
                                        +  self._InternalSerialize(out.write, **kwargs)
                                        +  return out.getvalue()
                                        +
                                        +
                                        +
                                        +def SerializeToString(self, **kwargs) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def SerializeToString(self, **kwargs):
                                        +  # Check if the message has all of its required fields set.
                                        +  if not self.IsInitialized():
                                        +    raise message_mod.EncodeError(
                                        +        'Message %s is missing required fields: %s' % (
                                        +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
                                        +  return self.SerializePartialToString(**kwargs)
                                        +
                                        +
                                        +
                                        +def SetInParent(self) +
                                        +
                                        +

                                        Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

                                        +
                                        + +Expand source code + +
                                        def Modified(self):
                                        +  """Sets the _cached_byte_size_dirty bit to true,
                                        +  and propagates this to our listener iff this was a state change.
                                        +  """
                                        +
                                        +  # Note:  Some callers check _cached_byte_size_dirty before calling
                                        +  #   _Modified() as an extra optimization.  So, if this method is ever
                                        +  #   changed such that it does stuff even when _cached_byte_size_dirty is
                                        +  #   already true, the callers need to be updated.
                                        +  if not self._cached_byte_size_dirty:
                                        +    self._cached_byte_size_dirty = True
                                        +    self._listener_for_children.dirty = True
                                        +    self._is_present_in_parent = True
                                        +    self._listener.Modified()
                                        +
                                        +
                                        +
                                        +def UnknownFields(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def _UnknownFields(self):
                                        +  if self._unknown_field_set is None:  # pylint: disable=protected-access
                                        +    # pylint: disable=protected-access
                                        +    self._unknown_field_set = containers.UnknownFieldSet()
                                        +  return self._unknown_field_set    # pylint: disable=protected-access
                                        +
                                        +
                                        +
                                        +def WhichOneof(self, oneof_name) +
                                        +
                                        +

                                        Returns the name of the currently set field inside a oneof, or None.

                                        +
                                        + +Expand source code + +
                                        def WhichOneof(self, oneof_name):
                                        +  """Returns the name of the currently set field inside a oneof, or None."""
                                        +  try:
                                        +    field = message_descriptor.oneofs_by_name[oneof_name]
                                        +  except KeyError:
                                        +    raise ValueError(
                                        +        'Protocol message has no oneof "%s" field.' % oneof_name)
                                        +
                                        +  nested_field = self._oneofs.get(field, None)
                                        +  if nested_field is not None and self.HasField(nested_field.name):
                                        +    return nested_field.name
                                        +  else:
                                        +    return None
                                        +
                                        @@ -876,8 +1541,26 @@ DESCRIPTOR._options = None
                                      • RadioConfig

                                      • @@ -887,7 +1570,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/remote_hardware.html b/docs/meshtastic/remote_hardware.html index 8835c7d..f059454 100644 --- a/docs/meshtastic/remote_hardware.html +++ b/docs/meshtastic/remote_hardware.html @@ -3,7 +3,7 @@ - + meshtastic.remote_hardware API documentation @@ -290,7 +290,7 @@ are 1 will be changed

                                        \ No newline at end of file diff --git a/docs/meshtastic/remote_hardware_pb2.html b/docs/meshtastic/remote_hardware_pb2.html index 4752053..ff58876 100644 --- a/docs/meshtastic/remote_hardware_pb2.html +++ b/docs/meshtastic/remote_hardware_pb2.html @@ -3,9 +3,9 @@ - + meshtastic.remote_hardware_pb2 API documentation - + @@ -22,7 +22,6 @@

                                        Module meshtastic.remote_hardware_pb2

                                        -

                                        Generated protocol buffer code.

                                        Expand source code @@ -30,7 +29,7 @@
                                        # -*- coding: utf-8 -*-
                                         # Generated by the protocol buffer compiler.  DO NOT EDIT!
                                         # source: remote_hardware.proto
                                        -"""Generated protocol buffer code."""
                                        +
                                         from google.protobuf import descriptor as _descriptor
                                         from google.protobuf import message as _message
                                         from google.protobuf import reflection as _reflection
                                        @@ -47,7 +46,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
                                           package='',
                                           syntax='proto3',
                                           serialized_options=b'\n\023com.geeksville.meshB\016RemoteHardwareH\003Z!github.com/meshtastic/gomeshproto',
                                        -  create_key=_descriptor._internal_create_key,
                                           serialized_pb=b'\n\x15remote_hardware.proto\"\xca\x01\n\x0fHardwareMessage\x12\"\n\x03typ\x18\x01 \x01(\x0e\x32\x15.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42J\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                         )
                                         
                                        @@ -58,38 +56,31 @@ _HARDWAREMESSAGE_TYPE = _descriptor.EnumDescriptor(
                                           full_name='HardwareMessage.Type',
                                           filename=None,
                                           file=DESCRIPTOR,
                                        -  create_key=_descriptor._internal_create_key,
                                           values=[
                                             _descriptor.EnumValueDescriptor(
                                               name='UNSET', index=0, number=0,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='WRITE_GPIOS', index=1, number=1,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='WATCH_GPIOS', index=2, number=2,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='GPIOS_CHANGED', index=3, number=3,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='READ_GPIOS', index=4, number=4,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                             _descriptor.EnumValueDescriptor(
                                               name='READ_GPIOS_REPLY', index=5, number=5,
                                               serialized_options=None,
                                        -      type=None,
                                        -      create_key=_descriptor._internal_create_key),
                                        +      type=None),
                                           ],
                                           containing_type=None,
                                           serialized_options=None,
                                        @@ -105,7 +96,6 @@ _HARDWAREMESSAGE = _descriptor.Descriptor(
                                           filename=None,
                                           file=DESCRIPTOR,
                                           containing_type=None,
                                        -  create_key=_descriptor._internal_create_key,
                                           fields=[
                                             _descriptor.FieldDescriptor(
                                               name='typ', full_name='HardwareMessage.typ', index=0,
                                        @@ -113,21 +103,21 @@ _HARDWAREMESSAGE = _descriptor.Descriptor(
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                               name='gpio_mask', full_name='HardwareMessage.gpio_mask', index=1,
                                               number=2, type=4, cpp_type=4, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                             _descriptor.FieldDescriptor(
                                               name='gpio_value', full_name='HardwareMessage.gpio_value', index=2,
                                               number=3, type=4, cpp_type=4, label=1,
                                               has_default_value=False, default_value=0,
                                               message_type=None, enum_type=None, containing_type=None,
                                               is_extension=False, extension_scope=None,
                                        -      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
                                        +      serialized_options=None, file=DESCRIPTOR),
                                           ],
                                           extensions=[
                                           ],
                                        @@ -173,13 +163,16 @@ DESCRIPTOR._options = None
                                         
                                        class HardwareMessage -(*args, **kwargs) +(**kwargs)
                                        -

                                        A ProtocolMessage

                                        +

                                        Abstract base class for protocol messages.

                                        +

                                        Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                        Ancestors

                                          -
                                        • google.protobuf.pyext._message.CMessage
                                        • google.protobuf.message.Message

                                        Class variables

                                        @@ -192,6 +185,14 @@ DESCRIPTOR._options = None
                                        +
                                        var GPIO_MASK_FIELD_NUMBER
                                        +
                                        +
                                        +
                                        +
                                        var GPIO_VALUE_FIELD_NUMBER
                                        +
                                        +
                                        +
                                        var READ_GPIOS
                                        @@ -200,6 +201,10 @@ DESCRIPTOR._options = None
                                        +
                                        var TYP_FIELD_NUMBER
                                        +
                                        +
                                        +
                                        var Type
                                        @@ -217,19 +222,539 @@ DESCRIPTOR._options = None
                                        +

                                        Static methods

                                        +
                                        +
                                        +def FromString(s) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def FromString(s):
                                        +  message = cls()
                                        +  message.MergeFromString(s)
                                        +  return message
                                        +
                                        +
                                        +
                                        +def RegisterExtension(extension_handle) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def RegisterExtension(extension_handle):
                                        +  extension_handle.containing_type = cls.DESCRIPTOR
                                        +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
                                        +  # pylint: disable=protected-access
                                        +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
                                        +  _AttachFieldHelpers(cls, extension_handle)
                                        +
                                        +
                                        +

                                        Instance variables

                                        var gpio_mask
                                        -

                                        Field HardwareMessage.gpio_mask

                                        +

                                        Getter for gpio_mask.

                                        +
                                        + +Expand source code + +
                                        def getter(self):
                                        +  # TODO(protobuf-team): This may be broken since there may not be
                                        +  # default_value.  Combine with has_default_value somehow.
                                        +  return self._fields.get(field, default_value)
                                        +
                                        var gpio_value
                                        -

                                        Field HardwareMessage.gpio_value

                                        +

                                        Getter for gpio_value.

                                        +
                                        + +Expand source code + +
                                        def getter(self):
                                        +  # TODO(protobuf-team): This may be broken since there may not be
                                        +  # default_value.  Combine with has_default_value somehow.
                                        +  return self._fields.get(field, default_value)
                                        +
                                        var typ
                                        -

                                        Field HardwareMessage.typ

                                        +

                                        Getter for typ.

                                        +
                                        + +Expand source code + +
                                        def getter(self):
                                        +  # TODO(protobuf-team): This may be broken since there may not be
                                        +  # default_value.  Combine with has_default_value somehow.
                                        +  return self._fields.get(field, default_value)
                                        +
                                        +
                                        +
                                        +

                                        Methods

                                        +
                                        +
                                        +def ByteSize(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def ByteSize(self):
                                        +  if not self._cached_byte_size_dirty:
                                        +    return self._cached_byte_size
                                        +
                                        +  size = 0
                                        +  descriptor = self.DESCRIPTOR
                                        +  if descriptor.GetOptions().map_entry:
                                        +    # Fields of map entry should always be serialized.
                                        +    size = descriptor.fields_by_name['key']._sizer(self.key)
                                        +    size += descriptor.fields_by_name['value']._sizer(self.value)
                                        +  else:
                                        +    for field_descriptor, field_value in self.ListFields():
                                        +      size += field_descriptor._sizer(field_value)
                                        +    for tag_bytes, value_bytes in self._unknown_fields:
                                        +      size += len(tag_bytes) + len(value_bytes)
                                        +
                                        +  self._cached_byte_size = size
                                        +  self._cached_byte_size_dirty = False
                                        +  self._listener_for_children.dirty = False
                                        +  return size
                                        +
                                        +
                                        +
                                        +def Clear(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def _Clear(self):
                                        +  # Clear fields.
                                        +  self._fields = {}
                                        +  self._unknown_fields = ()
                                        +  # pylint: disable=protected-access
                                        +  if self._unknown_field_set is not None:
                                        +    self._unknown_field_set._clear()
                                        +    self._unknown_field_set = None
                                        +
                                        +  self._oneofs = {}
                                        +  self._Modified()
                                        +
                                        +
                                        +
                                        +def ClearField(self, field_name) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def ClearField(self, field_name):
                                        +  try:
                                        +    field = message_descriptor.fields_by_name[field_name]
                                        +  except KeyError:
                                        +    try:
                                        +      field = message_descriptor.oneofs_by_name[field_name]
                                        +      if field in self._oneofs:
                                        +        field = self._oneofs[field]
                                        +      else:
                                        +        return
                                        +    except KeyError:
                                        +      raise ValueError('Protocol message %s has no "%s" field.' %
                                        +                       (message_descriptor.name, field_name))
                                        +
                                        +  if field in self._fields:
                                        +    # To match the C++ implementation, we need to invalidate iterators
                                        +    # for map fields when ClearField() happens.
                                        +    if hasattr(self._fields[field], 'InvalidateIterators'):
                                        +      self._fields[field].InvalidateIterators()
                                        +
                                        +    # Note:  If the field is a sub-message, its listener will still point
                                        +    #   at us.  That's fine, because the worst than can happen is that it
                                        +    #   will call _Modified() and invalidate our byte size.  Big deal.
                                        +    del self._fields[field]
                                        +
                                        +    if self._oneofs.get(field.containing_oneof, None) is field:
                                        +      del self._oneofs[field.containing_oneof]
                                        +
                                        +  # Always call _Modified() -- even if nothing was changed, this is
                                        +  # a mutating method, and thus calling it should cause the field to become
                                        +  # present in the parent message.
                                        +  self._Modified()
                                        +
                                        +
                                        +
                                        +def DiscardUnknownFields(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def _DiscardUnknownFields(self):
                                        +  self._unknown_fields = []
                                        +  self._unknown_field_set = None      # pylint: disable=protected-access
                                        +  for field, value in self.ListFields():
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      if _IsMapField(field):
                                        +        if _IsMessageMapField(field):
                                        +          for key in value:
                                        +            value[key].DiscardUnknownFields()
                                        +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                        +        for sub_message in value:
                                        +          sub_message.DiscardUnknownFields()
                                        +      else:
                                        +        value.DiscardUnknownFields()
                                        +
                                        +
                                        +
                                        +def FindInitializationErrors(self) +
                                        +
                                        +

                                        Finds required fields which are not initialized.

                                        +

                                        Returns

                                        +

                                        A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

                                        +
                                        + +Expand source code + +
                                        def FindInitializationErrors(self):
                                        +  """Finds required fields which are not initialized.
                                        +
                                        +  Returns:
                                        +    A list of strings.  Each string is a path to an uninitialized field from
                                        +    the top-level message, e.g. "foo.bar[5].baz".
                                        +  """
                                        +
                                        +  errors = []  # simplify things
                                        +
                                        +  for field in required_fields:
                                        +    if not self.HasField(field.name):
                                        +      errors.append(field.name)
                                        +
                                        +  for field, value in self.ListFields():
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      if field.is_extension:
                                        +        name = '(%s)' % field.full_name
                                        +      else:
                                        +        name = field.name
                                        +
                                        +      if _IsMapField(field):
                                        +        if _IsMessageMapField(field):
                                        +          for key in value:
                                        +            element = value[key]
                                        +            prefix = '%s[%s].' % (name, key)
                                        +            sub_errors = element.FindInitializationErrors()
                                        +            errors += [prefix + error for error in sub_errors]
                                        +        else:
                                        +          # ScalarMaps can't have any initialization errors.
                                        +          pass
                                        +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                        +        for i in range(len(value)):
                                        +          element = value[i]
                                        +          prefix = '%s[%d].' % (name, i)
                                        +          sub_errors = element.FindInitializationErrors()
                                        +          errors += [prefix + error for error in sub_errors]
                                        +      else:
                                        +        prefix = name + '.'
                                        +        sub_errors = value.FindInitializationErrors()
                                        +        errors += [prefix + error for error in sub_errors]
                                        +
                                        +  return errors
                                        +
                                        +
                                        +
                                        +def HasField(self, field_name) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def HasField(self, field_name):
                                        +  try:
                                        +    field = hassable_fields[field_name]
                                        +  except KeyError:
                                        +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
                                        +
                                        +  if isinstance(field, descriptor_mod.OneofDescriptor):
                                        +    try:
                                        +      return HasField(self, self._oneofs[field].name)
                                        +    except KeyError:
                                        +      return False
                                        +  else:
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      value = self._fields.get(field)
                                        +      return value is not None and value._is_present_in_parent
                                        +    else:
                                        +      return field in self._fields
                                        +
                                        +
                                        +
                                        +def IsInitialized(self, errors=None) +
                                        +
                                        +

                                        Checks if all required fields of a message are set.

                                        +

                                        Args

                                        +
                                        +
                                        errors
                                        +
                                        A list which, if provided, will be populated with the field +paths of all missing required fields.
                                        +
                                        +

                                        Returns

                                        +

                                        True iff the specified message has all required fields set.

                                        +
                                        + +Expand source code + +
                                        def IsInitialized(self, errors=None):
                                        +  """Checks if all required fields of a message are set.
                                        +
                                        +  Args:
                                        +    errors:  A list which, if provided, will be populated with the field
                                        +             paths of all missing required fields.
                                        +
                                        +  Returns:
                                        +    True iff the specified message has all required fields set.
                                        +  """
                                        +
                                        +  # Performance is critical so we avoid HasField() and ListFields().
                                        +
                                        +  for field in required_fields:
                                        +    if (field not in self._fields or
                                        +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
                                        +         not self._fields[field]._is_present_in_parent)):
                                        +      if errors is not None:
                                        +        errors.extend(self.FindInitializationErrors())
                                        +      return False
                                        +
                                        +  for field, value in list(self._fields.items()):  # dict can change size!
                                        +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                        +      if field.label == _FieldDescriptor.LABEL_REPEATED:
                                        +        if (field.message_type.has_options and
                                        +            field.message_type.GetOptions().map_entry):
                                        +          continue
                                        +        for element in value:
                                        +          if not element.IsInitialized():
                                        +            if errors is not None:
                                        +              errors.extend(self.FindInitializationErrors())
                                        +            return False
                                        +      elif value._is_present_in_parent and not value.IsInitialized():
                                        +        if errors is not None:
                                        +          errors.extend(self.FindInitializationErrors())
                                        +        return False
                                        +
                                        +  return True
                                        +
                                        +
                                        +
                                        +def ListFields(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def ListFields(self):
                                        +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
                                        +  all_fields.sort(key = lambda item: item[0].number)
                                        +  return all_fields
                                        +
                                        +
                                        +
                                        +def MergeFrom(self, msg) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def MergeFrom(self, msg):
                                        +  if not isinstance(msg, cls):
                                        +    raise TypeError(
                                        +        'Parameter to MergeFrom() must be instance of same class: '
                                        +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
                                        +                                 _FullyQualifiedClassName(msg.__class__)))
                                        +
                                        +  assert msg is not self
                                        +  self._Modified()
                                        +
                                        +  fields = self._fields
                                        +
                                        +  for field, value in msg._fields.items():
                                        +    if field.label == LABEL_REPEATED:
                                        +      field_value = fields.get(field)
                                        +      if field_value is None:
                                        +        # Construct a new object to represent this field.
                                        +        field_value = field._default_constructor(self)
                                        +        fields[field] = field_value
                                        +      field_value.MergeFrom(value)
                                        +    elif field.cpp_type == CPPTYPE_MESSAGE:
                                        +      if value._is_present_in_parent:
                                        +        field_value = fields.get(field)
                                        +        if field_value is None:
                                        +          # Construct a new object to represent this field.
                                        +          field_value = field._default_constructor(self)
                                        +          fields[field] = field_value
                                        +        field_value.MergeFrom(value)
                                        +    else:
                                        +      self._fields[field] = value
                                        +      if field.containing_oneof:
                                        +        self._UpdateOneofState(field)
                                        +
                                        +  if msg._unknown_fields:
                                        +    if not self._unknown_fields:
                                        +      self._unknown_fields = []
                                        +    self._unknown_fields.extend(msg._unknown_fields)
                                        +    # pylint: disable=protected-access
                                        +    if self._unknown_field_set is None:
                                        +      self._unknown_field_set = containers.UnknownFieldSet()
                                        +    self._unknown_field_set._extend(msg._unknown_field_set)
                                        +
                                        +
                                        +
                                        +def MergeFromString(self, serialized) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def MergeFromString(self, serialized):
                                        +  serialized = memoryview(serialized)
                                        +  length = len(serialized)
                                        +  try:
                                        +    if self._InternalParse(serialized, 0, length) != length:
                                        +      # The only reason _InternalParse would return early is if it
                                        +      # encountered an end-group tag.
                                        +      raise message_mod.DecodeError('Unexpected end-group tag.')
                                        +  except (IndexError, TypeError):
                                        +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
                                        +    raise message_mod.DecodeError('Truncated message.')
                                        +  except struct.error as e:
                                        +    raise message_mod.DecodeError(e)
                                        +  return length   # Return this for legacy reasons.
                                        +
                                        +
                                        +
                                        +def SerializePartialToString(self, **kwargs) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def SerializePartialToString(self, **kwargs):
                                        +  out = BytesIO()
                                        +  self._InternalSerialize(out.write, **kwargs)
                                        +  return out.getvalue()
                                        +
                                        +
                                        +
                                        +def SerializeToString(self, **kwargs) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def SerializeToString(self, **kwargs):
                                        +  # Check if the message has all of its required fields set.
                                        +  if not self.IsInitialized():
                                        +    raise message_mod.EncodeError(
                                        +        'Message %s is missing required fields: %s' % (
                                        +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
                                        +  return self.SerializePartialToString(**kwargs)
                                        +
                                        +
                                        +
                                        +def SetInParent(self) +
                                        +
                                        +

                                        Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

                                        +
                                        + +Expand source code + +
                                        def Modified(self):
                                        +  """Sets the _cached_byte_size_dirty bit to true,
                                        +  and propagates this to our listener iff this was a state change.
                                        +  """
                                        +
                                        +  # Note:  Some callers check _cached_byte_size_dirty before calling
                                        +  #   _Modified() as an extra optimization.  So, if this method is ever
                                        +  #   changed such that it does stuff even when _cached_byte_size_dirty is
                                        +  #   already true, the callers need to be updated.
                                        +  if not self._cached_byte_size_dirty:
                                        +    self._cached_byte_size_dirty = True
                                        +    self._listener_for_children.dirty = True
                                        +    self._is_present_in_parent = True
                                        +    self._listener.Modified()
                                        +
                                        +
                                        +
                                        +def UnknownFields(self) +
                                        +
                                        +
                                        +
                                        + +Expand source code + +
                                        def _UnknownFields(self):
                                        +  if self._unknown_field_set is None:  # pylint: disable=protected-access
                                        +    # pylint: disable=protected-access
                                        +    self._unknown_field_set = containers.UnknownFieldSet()
                                        +  return self._unknown_field_set    # pylint: disable=protected-access
                                        +
                                        +
                                        +
                                        +def WhichOneof(self, oneof_name) +
                                        +
                                        +

                                        Returns the name of the currently set field inside a oneof, or None.

                                        +
                                        + +Expand source code + +
                                        def WhichOneof(self, oneof_name):
                                        +  """Returns the name of the currently set field inside a oneof, or None."""
                                        +  try:
                                        +    field = message_descriptor.oneofs_by_name[oneof_name]
                                        +  except KeyError:
                                        +    raise ValueError(
                                        +        'Protocol message has no oneof "%s" field.' % oneof_name)
                                        +
                                        +  nested_field = self._oneofs.get(field, None)
                                        +  if nested_field is not None and self.HasField(nested_field.name):
                                        +    return nested_field.name
                                        +  else:
                                        +    return None
                                        +
                                        @@ -251,15 +776,35 @@ DESCRIPTOR._options = None
                                        • HardwareMessage

                                          -
                                            +
                                              +
                                            • ByteSize
                                            • +
                                            • Clear
                                            • +
                                            • ClearField
                                            • DESCRIPTOR
                                            • +
                                            • DiscardUnknownFields
                                            • +
                                            • FindInitializationErrors
                                            • +
                                            • FromString
                                            • GPIOS_CHANGED
                                            • +
                                            • GPIO_MASK_FIELD_NUMBER
                                            • +
                                            • GPIO_VALUE_FIELD_NUMBER
                                            • +
                                            • HasField
                                            • +
                                            • IsInitialized
                                            • +
                                            • ListFields
                                            • +
                                            • MergeFrom
                                            • +
                                            • MergeFromString
                                            • READ_GPIOS
                                            • READ_GPIOS_REPLY
                                            • +
                                            • RegisterExtension
                                            • +
                                            • SerializePartialToString
                                            • +
                                            • SerializeToString
                                            • +
                                            • SetInParent
                                            • +
                                            • TYP_FIELD_NUMBER
                                            • Type
                                            • UNSET
                                            • +
                                            • UnknownFields
                                            • WATCH_GPIOS
                                            • WRITE_GPIOS
                                            • +
                                            • WhichOneof
                                            • gpio_mask
                                            • gpio_value
                                            • typ
                                            • @@ -271,7 +816,7 @@ DESCRIPTOR._options = None \ No newline at end of file diff --git a/docs/meshtastic/storeforward_pb2.html b/docs/meshtastic/storeforward_pb2.html new file mode 100644 index 0000000..0e162c9 --- /dev/null +++ b/docs/meshtastic/storeforward_pb2.html @@ -0,0 +1,1057 @@ + + + + + + +meshtastic.storeforward_pb2 API documentation + + + + + + + + + + + +
                                              +
                                              +
                                              +

                                              Module meshtastic.storeforward_pb2

                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              # -*- coding: utf-8 -*-
                                              +# Generated by the protocol buffer compiler.  DO NOT EDIT!
                                              +# source: storeforward.proto
                                              +
                                              +from google.protobuf import descriptor as _descriptor
                                              +from google.protobuf import message as _message
                                              +from google.protobuf import reflection as _reflection
                                              +from google.protobuf import symbol_database as _symbol_database
                                              +# @@protoc_insertion_point(imports)
                                              +
                                              +_sym_db = _symbol_database.Default()
                                              +
                                              +
                                              +
                                              +
                                              +DESCRIPTOR = _descriptor.FileDescriptor(
                                              +  name='storeforward.proto',
                                              +  package='',
                                              +  syntax='proto3',
                                              +  serialized_options=b'\n\023com.geeksville.meshB\017StoreAndForwardH\003Z!github.com/meshtastic/gomeshproto',
                                              +  serialized_pb=b'\n\x12storeforward.proto\"\x8d\x05\n\x16StoreAndForwardMessage\x12\x33\n\x02rr\x18\x01 \x01(\x0e\x32\'.StoreAndForwardMessage.RequestResponse\x12\x31\n\x05stats\x18\x02 \x01(\x0b\x32\".StoreAndForwardMessage.Statistics\x12\x30\n\x07history\x18\x03 \x01(\x0b\x32\x1f.StoreAndForwardMessage.History\x1a\xc6\x01\n\nStatistics\x12\x15\n\rMessagesTotal\x18\x01 \x01(\r\x12\x15\n\rMessagesSaved\x18\x02 \x01(\r\x12\x13\n\x0bMessagesMax\x18\x03 \x01(\r\x12\x0e\n\x06UpTime\x18\x04 \x01(\r\x12\x10\n\x08Requests\x18\x05 \x01(\r\x12\x17\n\x0fRequestsHistory\x18\x06 \x01(\r\x12\x11\n\tHeartbeat\x18\x07 \x01(\x08\x12\x11\n\tReturnMax\x18\x08 \x01(\r\x12\x14\n\x0cReturnWindow\x18\t \x01(\r\x1a\x32\n\x07History\x12\x17\n\x0fHistoryMessages\x18\x01 \x01(\r\x12\x0e\n\x06Window\x18\x02 \x01(\r\"\xdb\x01\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x10\n\x0c\x43LIENT_ERROR\x10\x65\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x66\x12\x10\n\x0c\x43LIENT_STATS\x10g\x12\x0f\n\x0b\x43LIENT_PING\x10h\x12\x0f\n\x0b\x43LIENT_PONG\x10i\x12\x08\n\x03MAX\x10\xff\x01\x42K\n\x13\x63om.geeksville.meshB\x0fStoreAndForwardH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3'
                                              +)
                                              +
                                              +
                                              +
                                              +_STOREANDFORWARDMESSAGE_REQUESTRESPONSE = _descriptor.EnumDescriptor(
                                              +  name='RequestResponse',
                                              +  full_name='StoreAndForwardMessage.RequestResponse',
                                              +  filename=None,
                                              +  file=DESCRIPTOR,
                                              +  values=[
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='UNSET', index=0, number=0,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='ROUTER_ERROR', index=1, number=1,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='ROUTER_HEARTBEAT', index=2, number=2,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='ROUTER_PING', index=3, number=3,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='ROUTER_PONG', index=4, number=4,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='ROUTER_BUSY', index=5, number=5,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='CLIENT_ERROR', index=6, number=101,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='CLIENT_HISTORY', index=7, number=102,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='CLIENT_STATS', index=8, number=103,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='CLIENT_PING', index=9, number=104,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='CLIENT_PONG', index=10, number=105,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +    _descriptor.EnumValueDescriptor(
                                              +      name='MAX', index=11, number=255,
                                              +      serialized_options=None,
                                              +      type=None),
                                              +  ],
                                              +  containing_type=None,
                                              +  serialized_options=None,
                                              +  serialized_start=457,
                                              +  serialized_end=676,
                                              +)
                                              +_sym_db.RegisterEnumDescriptor(_STOREANDFORWARDMESSAGE_REQUESTRESPONSE)
                                              +
                                              +
                                              +_STOREANDFORWARDMESSAGE_STATISTICS = _descriptor.Descriptor(
                                              +  name='Statistics',
                                              +  full_name='StoreAndForwardMessage.Statistics',
                                              +  filename=None,
                                              +  file=DESCRIPTOR,
                                              +  containing_type=None,
                                              +  fields=[
                                              +    _descriptor.FieldDescriptor(
                                              +      name='MessagesTotal', full_name='StoreAndForwardMessage.Statistics.MessagesTotal', index=0,
                                              +      number=1, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='MessagesSaved', full_name='StoreAndForwardMessage.Statistics.MessagesSaved', index=1,
                                              +      number=2, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='MessagesMax', full_name='StoreAndForwardMessage.Statistics.MessagesMax', index=2,
                                              +      number=3, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='UpTime', full_name='StoreAndForwardMessage.Statistics.UpTime', index=3,
                                              +      number=4, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='Requests', full_name='StoreAndForwardMessage.Statistics.Requests', index=4,
                                              +      number=5, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='RequestsHistory', full_name='StoreAndForwardMessage.Statistics.RequestsHistory', index=5,
                                              +      number=6, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='Heartbeat', full_name='StoreAndForwardMessage.Statistics.Heartbeat', index=6,
                                              +      number=7, type=8, cpp_type=7, label=1,
                                              +      has_default_value=False, default_value=False,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='ReturnMax', full_name='StoreAndForwardMessage.Statistics.ReturnMax', index=7,
                                              +      number=8, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='ReturnWindow', full_name='StoreAndForwardMessage.Statistics.ReturnWindow', index=8,
                                              +      number=9, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +  ],
                                              +  extensions=[
                                              +  ],
                                              +  nested_types=[],
                                              +  enum_types=[
                                              +  ],
                                              +  serialized_options=None,
                                              +  is_extendable=False,
                                              +  syntax='proto3',
                                              +  extension_ranges=[],
                                              +  oneofs=[
                                              +  ],
                                              +  serialized_start=204,
                                              +  serialized_end=402,
                                              +)
                                              +
                                              +_STOREANDFORWARDMESSAGE_HISTORY = _descriptor.Descriptor(
                                              +  name='History',
                                              +  full_name='StoreAndForwardMessage.History',
                                              +  filename=None,
                                              +  file=DESCRIPTOR,
                                              +  containing_type=None,
                                              +  fields=[
                                              +    _descriptor.FieldDescriptor(
                                              +      name='HistoryMessages', full_name='StoreAndForwardMessage.History.HistoryMessages', index=0,
                                              +      number=1, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='Window', full_name='StoreAndForwardMessage.History.Window', index=1,
                                              +      number=2, type=13, cpp_type=3, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +  ],
                                              +  extensions=[
                                              +  ],
                                              +  nested_types=[],
                                              +  enum_types=[
                                              +  ],
                                              +  serialized_options=None,
                                              +  is_extendable=False,
                                              +  syntax='proto3',
                                              +  extension_ranges=[],
                                              +  oneofs=[
                                              +  ],
                                              +  serialized_start=404,
                                              +  serialized_end=454,
                                              +)
                                              +
                                              +_STOREANDFORWARDMESSAGE = _descriptor.Descriptor(
                                              +  name='StoreAndForwardMessage',
                                              +  full_name='StoreAndForwardMessage',
                                              +  filename=None,
                                              +  file=DESCRIPTOR,
                                              +  containing_type=None,
                                              +  fields=[
                                              +    _descriptor.FieldDescriptor(
                                              +      name='rr', full_name='StoreAndForwardMessage.rr', index=0,
                                              +      number=1, type=14, cpp_type=8, label=1,
                                              +      has_default_value=False, default_value=0,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='stats', full_name='StoreAndForwardMessage.stats', index=1,
                                              +      number=2, type=11, cpp_type=10, label=1,
                                              +      has_default_value=False, default_value=None,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +    _descriptor.FieldDescriptor(
                                              +      name='history', full_name='StoreAndForwardMessage.history', index=2,
                                              +      number=3, type=11, cpp_type=10, label=1,
                                              +      has_default_value=False, default_value=None,
                                              +      message_type=None, enum_type=None, containing_type=None,
                                              +      is_extension=False, extension_scope=None,
                                              +      serialized_options=None, file=DESCRIPTOR),
                                              +  ],
                                              +  extensions=[
                                              +  ],
                                              +  nested_types=[_STOREANDFORWARDMESSAGE_STATISTICS, _STOREANDFORWARDMESSAGE_HISTORY, ],
                                              +  enum_types=[
                                              +    _STOREANDFORWARDMESSAGE_REQUESTRESPONSE,
                                              +  ],
                                              +  serialized_options=None,
                                              +  is_extendable=False,
                                              +  syntax='proto3',
                                              +  extension_ranges=[],
                                              +  oneofs=[
                                              +  ],
                                              +  serialized_start=23,
                                              +  serialized_end=676,
                                              +)
                                              +
                                              +_STOREANDFORWARDMESSAGE_STATISTICS.containing_type = _STOREANDFORWARDMESSAGE
                                              +_STOREANDFORWARDMESSAGE_HISTORY.containing_type = _STOREANDFORWARDMESSAGE
                                              +_STOREANDFORWARDMESSAGE.fields_by_name['rr'].enum_type = _STOREANDFORWARDMESSAGE_REQUESTRESPONSE
                                              +_STOREANDFORWARDMESSAGE.fields_by_name['stats'].message_type = _STOREANDFORWARDMESSAGE_STATISTICS
                                              +_STOREANDFORWARDMESSAGE.fields_by_name['history'].message_type = _STOREANDFORWARDMESSAGE_HISTORY
                                              +_STOREANDFORWARDMESSAGE_REQUESTRESPONSE.containing_type = _STOREANDFORWARDMESSAGE
                                              +DESCRIPTOR.message_types_by_name['StoreAndForwardMessage'] = _STOREANDFORWARDMESSAGE
                                              +_sym_db.RegisterFileDescriptor(DESCRIPTOR)
                                              +
                                              +StoreAndForwardMessage = _reflection.GeneratedProtocolMessageType('StoreAndForwardMessage', (_message.Message,), {
                                              +
                                              +  'Statistics' : _reflection.GeneratedProtocolMessageType('Statistics', (_message.Message,), {
                                              +    'DESCRIPTOR' : _STOREANDFORWARDMESSAGE_STATISTICS,
                                              +    '__module__' : 'storeforward_pb2'
                                              +    # @@protoc_insertion_point(class_scope:StoreAndForwardMessage.Statistics)
                                              +    })
                                              +  ,
                                              +
                                              +  'History' : _reflection.GeneratedProtocolMessageType('History', (_message.Message,), {
                                              +    'DESCRIPTOR' : _STOREANDFORWARDMESSAGE_HISTORY,
                                              +    '__module__' : 'storeforward_pb2'
                                              +    # @@protoc_insertion_point(class_scope:StoreAndForwardMessage.History)
                                              +    })
                                              +  ,
                                              +  'DESCRIPTOR' : _STOREANDFORWARDMESSAGE,
                                              +  '__module__' : 'storeforward_pb2'
                                              +  # @@protoc_insertion_point(class_scope:StoreAndForwardMessage)
                                              +  })
                                              +_sym_db.RegisterMessage(StoreAndForwardMessage)
                                              +_sym_db.RegisterMessage(StoreAndForwardMessage.Statistics)
                                              +_sym_db.RegisterMessage(StoreAndForwardMessage.History)
                                              +
                                              +
                                              +DESCRIPTOR._options = None
                                              +# @@protoc_insertion_point(module_scope)
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +

                                              Classes

                                              +
                                              +
                                              +class StoreAndForwardMessage +(**kwargs) +
                                              +
                                              +

                                              Abstract base class for protocol messages.

                                              +

                                              Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                              +

                                              Ancestors

                                              +
                                                +
                                              • google.protobuf.message.Message
                                              • +
                                              +

                                              Class variables

                                              +
                                              +
                                              var CLIENT_ERROR
                                              +
                                              +
                                              +
                                              +
                                              var CLIENT_HISTORY
                                              +
                                              +
                                              +
                                              +
                                              var CLIENT_PING
                                              +
                                              +
                                              +
                                              +
                                              var CLIENT_PONG
                                              +
                                              +
                                              +
                                              +
                                              var CLIENT_STATS
                                              +
                                              +
                                              +
                                              +
                                              var DESCRIPTOR
                                              +
                                              +
                                              +
                                              +
                                              var HISTORY_FIELD_NUMBER
                                              +
                                              +
                                              +
                                              +
                                              var History
                                              +
                                              +

                                              Abstract base class for protocol messages.

                                              +

                                              Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                              +
                                              +
                                              var MAX
                                              +
                                              +
                                              +
                                              +
                                              var ROUTER_BUSY
                                              +
                                              +
                                              +
                                              +
                                              var ROUTER_ERROR
                                              +
                                              +
                                              +
                                              +
                                              var ROUTER_HEARTBEAT
                                              +
                                              +
                                              +
                                              +
                                              var ROUTER_PING
                                              +
                                              +
                                              +
                                              +
                                              var ROUTER_PONG
                                              +
                                              +
                                              +
                                              +
                                              var RR_FIELD_NUMBER
                                              +
                                              +
                                              +
                                              +
                                              var RequestResponse
                                              +
                                              +
                                              +
                                              +
                                              var STATS_FIELD_NUMBER
                                              +
                                              +
                                              +
                                              +
                                              var Statistics
                                              +
                                              +

                                              Abstract base class for protocol messages.

                                              +

                                              Protocol message classes are almost always generated by the protocol +compiler. +These generated types subclass Message and implement the methods +shown below.

                                              +
                                              +
                                              var UNSET
                                              +
                                              +
                                              +
                                              +
                                              +

                                              Static methods

                                              +
                                              +
                                              +def FromString(s) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def FromString(s):
                                              +  message = cls()
                                              +  message.MergeFromString(s)
                                              +  return message
                                              +
                                              +
                                              +
                                              +def RegisterExtension(extension_handle) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def RegisterExtension(extension_handle):
                                              +  extension_handle.containing_type = cls.DESCRIPTOR
                                              +  # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available.
                                              +  # pylint: disable=protected-access
                                              +  cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(extension_handle)
                                              +  _AttachFieldHelpers(cls, extension_handle)
                                              +
                                              +
                                              +
                                              +

                                              Instance variables

                                              +
                                              +
                                              var history
                                              +
                                              +

                                              Getter for history.

                                              +
                                              + +Expand source code + +
                                              def getter(self):
                                              +  field_value = self._fields.get(field)
                                              +  if field_value is None:
                                              +    # Construct a new object to represent this field.
                                              +    field_value = field._default_constructor(self)
                                              +
                                              +    # Atomically check if another thread has preempted us and, if not, swap
                                              +    # in the new object we just created.  If someone has preempted us, we
                                              +    # take that object and discard ours.
                                              +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                                              +    #   in CPython but we haven't investigated others.  This warning appears
                                              +    #   in several other locations in this file.
                                              +    field_value = self._fields.setdefault(field, field_value)
                                              +  return field_value
                                              +
                                              +
                                              +
                                              var rr
                                              +
                                              +

                                              Getter for rr.

                                              +
                                              + +Expand source code + +
                                              def getter(self):
                                              +  # TODO(protobuf-team): This may be broken since there may not be
                                              +  # default_value.  Combine with has_default_value somehow.
                                              +  return self._fields.get(field, default_value)
                                              +
                                              +
                                              +
                                              var stats
                                              +
                                              +

                                              Getter for stats.

                                              +
                                              + +Expand source code + +
                                              def getter(self):
                                              +  field_value = self._fields.get(field)
                                              +  if field_value is None:
                                              +    # Construct a new object to represent this field.
                                              +    field_value = field._default_constructor(self)
                                              +
                                              +    # Atomically check if another thread has preempted us and, if not, swap
                                              +    # in the new object we just created.  If someone has preempted us, we
                                              +    # take that object and discard ours.
                                              +    # WARNING:  We are relying on setdefault() being atomic.  This is true
                                              +    #   in CPython but we haven't investigated others.  This warning appears
                                              +    #   in several other locations in this file.
                                              +    field_value = self._fields.setdefault(field, field_value)
                                              +  return field_value
                                              +
                                              +
                                              +
                                              +

                                              Methods

                                              +
                                              +
                                              +def ByteSize(self) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def ByteSize(self):
                                              +  if not self._cached_byte_size_dirty:
                                              +    return self._cached_byte_size
                                              +
                                              +  size = 0
                                              +  descriptor = self.DESCRIPTOR
                                              +  if descriptor.GetOptions().map_entry:
                                              +    # Fields of map entry should always be serialized.
                                              +    size = descriptor.fields_by_name['key']._sizer(self.key)
                                              +    size += descriptor.fields_by_name['value']._sizer(self.value)
                                              +  else:
                                              +    for field_descriptor, field_value in self.ListFields():
                                              +      size += field_descriptor._sizer(field_value)
                                              +    for tag_bytes, value_bytes in self._unknown_fields:
                                              +      size += len(tag_bytes) + len(value_bytes)
                                              +
                                              +  self._cached_byte_size = size
                                              +  self._cached_byte_size_dirty = False
                                              +  self._listener_for_children.dirty = False
                                              +  return size
                                              +
                                              +
                                              +
                                              +def Clear(self) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def _Clear(self):
                                              +  # Clear fields.
                                              +  self._fields = {}
                                              +  self._unknown_fields = ()
                                              +  # pylint: disable=protected-access
                                              +  if self._unknown_field_set is not None:
                                              +    self._unknown_field_set._clear()
                                              +    self._unknown_field_set = None
                                              +
                                              +  self._oneofs = {}
                                              +  self._Modified()
                                              +
                                              +
                                              +
                                              +def ClearField(self, field_name) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def ClearField(self, field_name):
                                              +  try:
                                              +    field = message_descriptor.fields_by_name[field_name]
                                              +  except KeyError:
                                              +    try:
                                              +      field = message_descriptor.oneofs_by_name[field_name]
                                              +      if field in self._oneofs:
                                              +        field = self._oneofs[field]
                                              +      else:
                                              +        return
                                              +    except KeyError:
                                              +      raise ValueError('Protocol message %s has no "%s" field.' %
                                              +                       (message_descriptor.name, field_name))
                                              +
                                              +  if field in self._fields:
                                              +    # To match the C++ implementation, we need to invalidate iterators
                                              +    # for map fields when ClearField() happens.
                                              +    if hasattr(self._fields[field], 'InvalidateIterators'):
                                              +      self._fields[field].InvalidateIterators()
                                              +
                                              +    # Note:  If the field is a sub-message, its listener will still point
                                              +    #   at us.  That's fine, because the worst than can happen is that it
                                              +    #   will call _Modified() and invalidate our byte size.  Big deal.
                                              +    del self._fields[field]
                                              +
                                              +    if self._oneofs.get(field.containing_oneof, None) is field:
                                              +      del self._oneofs[field.containing_oneof]
                                              +
                                              +  # Always call _Modified() -- even if nothing was changed, this is
                                              +  # a mutating method, and thus calling it should cause the field to become
                                              +  # present in the parent message.
                                              +  self._Modified()
                                              +
                                              +
                                              +
                                              +def DiscardUnknownFields(self) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def _DiscardUnknownFields(self):
                                              +  self._unknown_fields = []
                                              +  self._unknown_field_set = None      # pylint: disable=protected-access
                                              +  for field, value in self.ListFields():
                                              +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                              +      if _IsMapField(field):
                                              +        if _IsMessageMapField(field):
                                              +          for key in value:
                                              +            value[key].DiscardUnknownFields()
                                              +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                              +        for sub_message in value:
                                              +          sub_message.DiscardUnknownFields()
                                              +      else:
                                              +        value.DiscardUnknownFields()
                                              +
                                              +
                                              +
                                              +def FindInitializationErrors(self) +
                                              +
                                              +

                                              Finds required fields which are not initialized.

                                              +

                                              Returns

                                              +

                                              A list of strings. +Each string is a path to an uninitialized field from +the top-level message, e.g. "foo.bar[5].baz".

                                              +
                                              + +Expand source code + +
                                              def FindInitializationErrors(self):
                                              +  """Finds required fields which are not initialized.
                                              +
                                              +  Returns:
                                              +    A list of strings.  Each string is a path to an uninitialized field from
                                              +    the top-level message, e.g. "foo.bar[5].baz".
                                              +  """
                                              +
                                              +  errors = []  # simplify things
                                              +
                                              +  for field in required_fields:
                                              +    if not self.HasField(field.name):
                                              +      errors.append(field.name)
                                              +
                                              +  for field, value in self.ListFields():
                                              +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                              +      if field.is_extension:
                                              +        name = '(%s)' % field.full_name
                                              +      else:
                                              +        name = field.name
                                              +
                                              +      if _IsMapField(field):
                                              +        if _IsMessageMapField(field):
                                              +          for key in value:
                                              +            element = value[key]
                                              +            prefix = '%s[%s].' % (name, key)
                                              +            sub_errors = element.FindInitializationErrors()
                                              +            errors += [prefix + error for error in sub_errors]
                                              +        else:
                                              +          # ScalarMaps can't have any initialization errors.
                                              +          pass
                                              +      elif field.label == _FieldDescriptor.LABEL_REPEATED:
                                              +        for i in range(len(value)):
                                              +          element = value[i]
                                              +          prefix = '%s[%d].' % (name, i)
                                              +          sub_errors = element.FindInitializationErrors()
                                              +          errors += [prefix + error for error in sub_errors]
                                              +      else:
                                              +        prefix = name + '.'
                                              +        sub_errors = value.FindInitializationErrors()
                                              +        errors += [prefix + error for error in sub_errors]
                                              +
                                              +  return errors
                                              +
                                              +
                                              +
                                              +def HasField(self, field_name) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def HasField(self, field_name):
                                              +  try:
                                              +    field = hassable_fields[field_name]
                                              +  except KeyError:
                                              +    raise ValueError(error_msg % (message_descriptor.full_name, field_name))
                                              +
                                              +  if isinstance(field, descriptor_mod.OneofDescriptor):
                                              +    try:
                                              +      return HasField(self, self._oneofs[field].name)
                                              +    except KeyError:
                                              +      return False
                                              +  else:
                                              +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                              +      value = self._fields.get(field)
                                              +      return value is not None and value._is_present_in_parent
                                              +    else:
                                              +      return field in self._fields
                                              +
                                              +
                                              +
                                              +def IsInitialized(self, errors=None) +
                                              +
                                              +

                                              Checks if all required fields of a message are set.

                                              +

                                              Args

                                              +
                                              +
                                              errors
                                              +
                                              A list which, if provided, will be populated with the field +paths of all missing required fields.
                                              +
                                              +

                                              Returns

                                              +

                                              True iff the specified message has all required fields set.

                                              +
                                              + +Expand source code + +
                                              def IsInitialized(self, errors=None):
                                              +  """Checks if all required fields of a message are set.
                                              +
                                              +  Args:
                                              +    errors:  A list which, if provided, will be populated with the field
                                              +             paths of all missing required fields.
                                              +
                                              +  Returns:
                                              +    True iff the specified message has all required fields set.
                                              +  """
                                              +
                                              +  # Performance is critical so we avoid HasField() and ListFields().
                                              +
                                              +  for field in required_fields:
                                              +    if (field not in self._fields or
                                              +        (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and
                                              +         not self._fields[field]._is_present_in_parent)):
                                              +      if errors is not None:
                                              +        errors.extend(self.FindInitializationErrors())
                                              +      return False
                                              +
                                              +  for field, value in list(self._fields.items()):  # dict can change size!
                                              +    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:
                                              +      if field.label == _FieldDescriptor.LABEL_REPEATED:
                                              +        if (field.message_type.has_options and
                                              +            field.message_type.GetOptions().map_entry):
                                              +          continue
                                              +        for element in value:
                                              +          if not element.IsInitialized():
                                              +            if errors is not None:
                                              +              errors.extend(self.FindInitializationErrors())
                                              +            return False
                                              +      elif value._is_present_in_parent and not value.IsInitialized():
                                              +        if errors is not None:
                                              +          errors.extend(self.FindInitializationErrors())
                                              +        return False
                                              +
                                              +  return True
                                              +
                                              +
                                              +
                                              +def ListFields(self) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def ListFields(self):
                                              +  all_fields = [item for item in self._fields.items() if _IsPresent(item)]
                                              +  all_fields.sort(key = lambda item: item[0].number)
                                              +  return all_fields
                                              +
                                              +
                                              +
                                              +def MergeFrom(self, msg) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def MergeFrom(self, msg):
                                              +  if not isinstance(msg, cls):
                                              +    raise TypeError(
                                              +        'Parameter to MergeFrom() must be instance of same class: '
                                              +        'expected %s got %s.' % (_FullyQualifiedClassName(cls),
                                              +                                 _FullyQualifiedClassName(msg.__class__)))
                                              +
                                              +  assert msg is not self
                                              +  self._Modified()
                                              +
                                              +  fields = self._fields
                                              +
                                              +  for field, value in msg._fields.items():
                                              +    if field.label == LABEL_REPEATED:
                                              +      field_value = fields.get(field)
                                              +      if field_value is None:
                                              +        # Construct a new object to represent this field.
                                              +        field_value = field._default_constructor(self)
                                              +        fields[field] = field_value
                                              +      field_value.MergeFrom(value)
                                              +    elif field.cpp_type == CPPTYPE_MESSAGE:
                                              +      if value._is_present_in_parent:
                                              +        field_value = fields.get(field)
                                              +        if field_value is None:
                                              +          # Construct a new object to represent this field.
                                              +          field_value = field._default_constructor(self)
                                              +          fields[field] = field_value
                                              +        field_value.MergeFrom(value)
                                              +    else:
                                              +      self._fields[field] = value
                                              +      if field.containing_oneof:
                                              +        self._UpdateOneofState(field)
                                              +
                                              +  if msg._unknown_fields:
                                              +    if not self._unknown_fields:
                                              +      self._unknown_fields = []
                                              +    self._unknown_fields.extend(msg._unknown_fields)
                                              +    # pylint: disable=protected-access
                                              +    if self._unknown_field_set is None:
                                              +      self._unknown_field_set = containers.UnknownFieldSet()
                                              +    self._unknown_field_set._extend(msg._unknown_field_set)
                                              +
                                              +
                                              +
                                              +def MergeFromString(self, serialized) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def MergeFromString(self, serialized):
                                              +  serialized = memoryview(serialized)
                                              +  length = len(serialized)
                                              +  try:
                                              +    if self._InternalParse(serialized, 0, length) != length:
                                              +      # The only reason _InternalParse would return early is if it
                                              +      # encountered an end-group tag.
                                              +      raise message_mod.DecodeError('Unexpected end-group tag.')
                                              +  except (IndexError, TypeError):
                                              +    # Now ord(buf[p:p+1]) == ord('') gets TypeError.
                                              +    raise message_mod.DecodeError('Truncated message.')
                                              +  except struct.error as e:
                                              +    raise message_mod.DecodeError(e)
                                              +  return length   # Return this for legacy reasons.
                                              +
                                              +
                                              +
                                              +def SerializePartialToString(self, **kwargs) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def SerializePartialToString(self, **kwargs):
                                              +  out = BytesIO()
                                              +  self._InternalSerialize(out.write, **kwargs)
                                              +  return out.getvalue()
                                              +
                                              +
                                              +
                                              +def SerializeToString(self, **kwargs) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def SerializeToString(self, **kwargs):
                                              +  # Check if the message has all of its required fields set.
                                              +  if not self.IsInitialized():
                                              +    raise message_mod.EncodeError(
                                              +        'Message %s is missing required fields: %s' % (
                                              +        self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors())))
                                              +  return self.SerializePartialToString(**kwargs)
                                              +
                                              +
                                              +
                                              +def SetInParent(self) +
                                              +
                                              +

                                              Sets the _cached_byte_size_dirty bit to true, +and propagates this to our listener iff this was a state change.

                                              +
                                              + +Expand source code + +
                                              def Modified(self):
                                              +  """Sets the _cached_byte_size_dirty bit to true,
                                              +  and propagates this to our listener iff this was a state change.
                                              +  """
                                              +
                                              +  # Note:  Some callers check _cached_byte_size_dirty before calling
                                              +  #   _Modified() as an extra optimization.  So, if this method is ever
                                              +  #   changed such that it does stuff even when _cached_byte_size_dirty is
                                              +  #   already true, the callers need to be updated.
                                              +  if not self._cached_byte_size_dirty:
                                              +    self._cached_byte_size_dirty = True
                                              +    self._listener_for_children.dirty = True
                                              +    self._is_present_in_parent = True
                                              +    self._listener.Modified()
                                              +
                                              +
                                              +
                                              +def UnknownFields(self) +
                                              +
                                              +
                                              +
                                              + +Expand source code + +
                                              def _UnknownFields(self):
                                              +  if self._unknown_field_set is None:  # pylint: disable=protected-access
                                              +    # pylint: disable=protected-access
                                              +    self._unknown_field_set = containers.UnknownFieldSet()
                                              +  return self._unknown_field_set    # pylint: disable=protected-access
                                              +
                                              +
                                              +
                                              +def WhichOneof(self, oneof_name) +
                                              +
                                              +

                                              Returns the name of the currently set field inside a oneof, or None.

                                              +
                                              + +Expand source code + +
                                              def WhichOneof(self, oneof_name):
                                              +  """Returns the name of the currently set field inside a oneof, or None."""
                                              +  try:
                                              +    field = message_descriptor.oneofs_by_name[oneof_name]
                                              +  except KeyError:
                                              +    raise ValueError(
                                              +        'Protocol message has no oneof "%s" field.' % oneof_name)
                                              +
                                              +  nested_field = self._oneofs.get(field, None)
                                              +  if nested_field is not None and self.HasField(nested_field.name):
                                              +    return nested_field.name
                                              +  else:
                                              +    return None
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +
                                              +
                                              + +
                                              + + + \ No newline at end of file diff --git a/docs/meshtastic/test.html b/docs/meshtastic/test.html index 574087f..d2242c1 100644 --- a/docs/meshtastic/test.html +++ b/docs/meshtastic/test.html @@ -3,7 +3,7 @@ - + meshtastic.test API documentation @@ -529,7 +529,7 @@ python3 -c 'from meshtastic.test import testSimulator; testSimulator()'

                                              \ No newline at end of file diff --git a/docs/meshtastic/tunnel.html b/docs/meshtastic/tunnel.html index d54193c..d952a92 100644 --- a/docs/meshtastic/tunnel.html +++ b/docs/meshtastic/tunnel.html @@ -3,7 +3,7 @@ - + meshtastic.tunnel API documentation @@ -584,7 +584,7 @@ subnet is used to construct our network number (normally 10.115.x.x)

                                              \ No newline at end of file diff --git a/docs/meshtastic/util.html b/docs/meshtastic/util.html index edab453..78f3f55 100644 --- a/docs/meshtastic/util.html +++ b/docs/meshtastic/util.html @@ -3,7 +3,7 @@ - + meshtastic.util API documentation @@ -380,7 +380,7 @@ class DeferredExecution(): \ No newline at end of file diff --git a/meshtastic/__init__.py-E b/meshtastic/__init__.py-E new file mode 100644 index 0000000..58b4354 --- /dev/null +++ b/meshtastic/__init__.py-E @@ -0,0 +1,1069 @@ +""" +# an API for Meshtastic devices + +Primary class: SerialInterface +Install with pip: "[pip3 install meshtastic](https://pypi.org/project/meshtastic/)" +Source code on [github](https://github.com/meshtastic/Meshtastic-python) + +properties of SerialInterface: + +- radioConfig - Current radio configuration and device settings, if you write to this the new settings will be applied to +the device. +- nodes - The database of received nodes. Includes always up-to-date location and username information for each +node in the mesh. This is a read-only datastructure. +- nodesByNum - like "nodes" but keyed by nodeNum instead of nodeId +- myInfo - Contains read-only information about the local radio device (software version, hardware version, etc) + +# Published PubSub topics + +We use a [publish-subscribe](https://pypubsub.readthedocs.io/en/v4.0.3/) model to communicate asynchronous events. Available +topics: + +- meshtastic.connection.established - published once we've successfully connected to the radio and downloaded the node DB +- meshtastic.connection.lost - published once we've lost our link to the radio +- meshtastic.receive.text(packet) - delivers a received packet as a dictionary, if you only care about a particular +type of packet, you should subscribe to the full topic name. If you want to see all packets, simply subscribe to "meshtastic.receive". +- meshtastic.receive.position(packet) +- meshtastic.receive.user(packet) +- meshtastic.receive.data.portnum(packet) (where portnum is an integer or well known PortNum enum) +- meshtastic.node.updated(node = NodeInfo) - published when a node in the DB changes (appears, location changed, username changed, etc...) + +We receive position, user, or data packets from the mesh. You probably only care about meshtastic.receive.data. The first argument for +that publish will be the packet. Text or binary data packets (from sendData or sendText) will both arrive this way. If you print packet +you'll see the fields in the dictionary. decoded.data.payload will contain the raw bytes that were sent. If the packet was sent with +sendText, decoded.data.text will **also** be populated with the decoded string. For ASCII these two strings will be the same, but for +unicode scripts they can be different. + +# Example Usage +``` +import meshtastic +from pubsub import pub + +def onReceive(packet, interface): # called when a packet arrives + print(f"Received: {packet}") + +def onConnection(interface, topic=pub.AUTO_TOPIC): # called when we (re)connect to the radio + # defaults to broadcast, specify a destination ID if you wish + interface.sendText("hello mesh") + +pub.subscribe(onReceive, "meshtastic.receive") +pub.subscribe(onConnection, "meshtastic.connection.established") +# By default will try to find a meshtastic device, otherwise provide a device path like /dev/ttyUSB0 +interface = meshtastic.SerialInterface() + +``` + +""" + +import pygatt +import google.protobuf.json_format +import serial +import threading +import logging +import sys +import random +import traceback +import time +import base64 +import platform +import socket +import timeago +import os +import stat +from . import mesh_pb2, portnums_pb2, apponly_pb2, admin_pb2, environmental_measurement_pb2, remote_hardware_pb2, channel_pb2, radioconfig_pb2, util +from .util import fixme, catchAndIgnore, stripnl, DeferredExecution, Timeout +from .node import Node +from pubsub import pub +from dotmap import DotMap +from datetime import datetime +from tabulate import tabulate +from typing import * +from google.protobuf.json_format import MessageToJson + +START1 = 0x94 +START2 = 0xc3 +HEADER_LEN = 4 +MAX_TO_FROM_RADIO_SIZE = 512 +defaultHopLimit = 3 + +"""A special ID that means broadcast""" +BROADCAST_ADDR = "^all" + +"""A special ID that means the local node""" +LOCAL_ADDR = "^local" + +# if using 8 bit nodenums this will be shortend on the target +BROADCAST_NUM = 0xffffffff + +"""The numeric buildnumber (shared with android apps) specifying the level of device code we are guaranteed to understand + +format is Mmmss (where M is 1+the numeric major number. i.e. 20120 means 1.1.20 +""" +OUR_APP_VERSION = 20200 + +publishingThread = DeferredExecution("publishing") + + +class ResponseHandler(NamedTuple): + """A pending response callback, waiting for a response to one of our messages""" + # requestId: int - used only as a key + callback: Callable + # FIXME, add timestamp and age out old requests + + +class KnownProtocol(NamedTuple): + """Used to automatically decode known protocol payloads""" + name: str + # portnum: int, now a key + # If set, will be called to prase as a protocol buffer + protobufFactory: Callable = None + # If set, invoked as onReceive(interface, packet) + onReceive: Callable = None + + +class MeshInterface: + """Interface class for meshtastic devices + + Properties: + + isConnected + nodes + debugOut + """ + + def __init__(self, debugOut=None, noProto=False): + """Constructor + + Keyword Arguments: + noProto -- If True, don't try to run our protocol on the link - just be a dumb serial client. + """ + self.debugOut = debugOut + self.nodes = None # FIXME + self.isConnected = threading.Event() + self.noProto = noProto + self.localNode = Node(self, -1) # We fixup nodenum later + self.myInfo = None # We don't have device info yet + self.responseHandlers = {} # A map from request ID to the handler + self.failure = None # If we've encountered a fatal exception it will be kept here + self._timeout = Timeout() + self.heartbeatTimer = None + random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it + self.currentPacketId = random.randint(0, 0xffffffff) + + def close(self): + """Shutdown this interface""" + if self.heartbeatTimer: + self.heartbeatTimer.cancel() + + self._sendDisconnect() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + if exc_type is not None and exc_value is not None: + logging.error( + f'An exception of type {exc_type} with value {exc_value} has occurred') + if traceback is not None: + logging.error(f'Traceback: {traceback}') + self.close() + + def showInfo(self, file=sys.stdout): + """Show human readable summary about this object""" + owner = f"Owner: {self.getLongName()} ({self.getShortName()})" + myinfo = f"\nMy info: {stripnl(MessageToJson(self.myInfo))}" + mesh = "\nNodes in mesh:" + nodes = "" + for n in self.nodes.values(): + nodes = nodes + f" {stripnl(n)}" + infos = owner + myinfo + mesh + nodes + print(infos) + return infos + + def showNodes(self, includeSelf=True, file=sys.stdout): + """Show table summary of nodes in mesh""" + def formatFloat(value, precision=2, unit=''): + return f'{value:.{precision}f}{unit}' if value else None + + def getLH(ts): + return datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') if ts else None + + def getTimeAgo(ts): + return timeago.format(datetime.fromtimestamp(ts), datetime.now()) if ts else None + + rows = [] + for node in self.nodes.values(): + if not includeSelf and node['num'] == self.localNode.nodeNum: + continue + + row = {"N": 0} + + user = node.get('user') + if user: + row.update({ + "User": user['longName'], + "AKA": user['shortName'], + "ID": user['id'], + }) + + pos = node.get('position') + if pos: + row.update({ + "Latitude": formatFloat(pos.get("latitude"), 4, "°"), + "Longitude": formatFloat(pos.get("longitude"), 4, "°"), + "Altitude": formatFloat(pos.get("altitude"), 0, " m"), + "Battery": formatFloat(pos.get("batteryLevel"), 2, "%"), + }) + + row.update({ + "SNR": formatFloat(node.get("snr"), 2, " dB"), + "LastHeard": getLH(node.get("lastHeard")), + "Since": getTimeAgo(node.get("lastHeard")), + }) + + rows.append(row) + + # Why doesn't this way work? + #rows.sort(key=lambda r: r.get('LastHeard', '0000'), reverse=True) + rows.sort(key=lambda r: r.get('LastHeard') or '0000', reverse=True) + for i, row in enumerate(rows): + row['N'] = i+1 + + table = tabulate(rows, headers='keys', missingval='N/A', + tablefmt='fancy_grid') + print(table) + return table + + + def getNode(self, nodeId): + """Return a node object which contains device settings and channel info""" + if nodeId == LOCAL_ADDR: + return self.localNode + else: + n = Node(self, nodeId) + n.requestConfig() + if not n.waitForConfig(): + raise Exception("Timed out waiting for node config") + return n + + def sendText(self, text: AnyStr, + destinationId=BROADCAST_ADDR, + wantAck=False, + wantResponse=False, + hopLimit=defaultHopLimit, + onResponse=None, + channelIndex=0): + """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. + + Arguments: + text {string} -- The text to send + + Keyword Arguments: + destinationId {nodeId or nodeNum} -- where to send this message (default: {BROADCAST_ADDR}) + portNum -- the application portnum (similar to IP port numbers) of the destination, see portnums.proto for a list + wantAck -- True if you want the message sent in a reliable manner (with retries and ack/nak provided for delivery) + wantResponse -- True if you want the service on the other side to send an application layer response + + Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. + """ + return self.sendData(text.encode("utf-8"), destinationId, + portNum=portnums_pb2.PortNum.TEXT_MESSAGE_APP, + wantAck=wantAck, + wantResponse=wantResponse, + hopLimit=hopLimit, + onResponse=onResponse, + channelIndex=channelIndex); + + def sendData(self, data, destinationId=BROADCAST_ADDR, + portNum=portnums_pb2.PortNum.PRIVATE_APP, wantAck=False, + wantResponse=False, + hopLimit=defaultHopLimit, + onResponse=None, + channelIndex=0): + """Send a data packet to some other node + + Keyword Arguments: + data -- the data to send, either as an array of bytes or as a protobuf (which will be automatically serialized to bytes) + destinationId {nodeId or nodeNum} -- where to send this message (default: {BROADCAST_ADDR}) + portNum -- the application portnum (similar to IP port numbers) of the destination, see portnums.proto for a list + wantAck -- True if you want the message sent in a reliable manner (with retries and ack/nak provided for delivery) + wantResponse -- True if you want the service on the other side to send an application layer response + onResponse -- A closure of the form funct(packet), that will be called when a response packet arrives (or the transaction is NAKed due to non receipt) + + Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. + """ + if getattr(data, "SerializeToString", None): + logging.debug(f"Serializing protobuf as data: {stripnl(data)}") + data = data.SerializeToString() + + if len(data) > mesh_pb2.Constants.DATA_PAYLOAD_LEN: + raise Exception("Data payload too big") + + if portNum == portnums_pb2.PortNum.UNKNOWN_APP: # we are now more strict wrt port numbers + raise Exception("A non-zero port number must be specified") + + meshPacket = mesh_pb2.MeshPacket() + meshPacket.channel = channelIndex + meshPacket.decoded.payload = data + meshPacket.decoded.portnum = portNum + meshPacket.decoded.want_response = wantResponse + + p = self._sendPacket(meshPacket, destinationId, + wantAck=wantAck, hopLimit=hopLimit) + if onResponse is not None: + self._addResponseHandler(p.id, onResponse) + return p + + def sendPosition(self, latitude=0.0, longitude=0.0, altitude=0, timeSec=0, destinationId=BROADCAST_ADDR, wantAck=False, wantResponse=False): + """ + Send a position packet to some other node (normally a broadcast) + + Also, the device software will notice this packet and use it to automatically set its notion of + the local position. + + If timeSec is not specified (recommended), we will use the local machine time. + + Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. + """ + p = mesh_pb2.Position() + if(latitude != 0.0): + p.latitude_i = int(latitude / 1e-7) + + if(longitude != 0.0): + p.longitude_i = int(longitude / 1e-7) + + if(altitude != 0): + p.altitude = int(altitude) + + if timeSec == 0: + timeSec = time.time() # returns unix timestamp in seconds + p.time = int(timeSec) + + return self.sendData(p, destinationId, + portNum=portnums_pb2.PortNum.POSITION_APP, + wantAck=wantAck, + wantResponse=wantResponse) + + def _addResponseHandler(self, requestId, callback): + self.responseHandlers[requestId] = ResponseHandler(callback) + + def _sendPacket(self, meshPacket, + destinationId=BROADCAST_ADDR, + wantAck=False, hopLimit=defaultHopLimit): + """Send a MeshPacket to the specified node (or if unspecified, broadcast). + You probably don't want this - use sendData instead. + + Returns the sent packet. The id field will be populated in this packet and + can be used to track future message acks/naks. + """ + + # We allow users to talk to the local node before we've completed the full connection flow... + if(self.myInfo is not None and destinationId != self.myInfo.my_node_num): + self._waitConnected() + + toRadio = mesh_pb2.ToRadio() + + if destinationId is None: + raise Exception("destinationId must not be None") + elif isinstance(destinationId, int): + nodeNum = destinationId + elif destinationId == BROADCAST_ADDR: + nodeNum = BROADCAST_NUM + elif destinationId == LOCAL_ADDR: + nodeNum = self.myInfo.my_node_num + # A simple hex style nodeid - we can parse this without needing the DB + elif destinationId.startswith("!"): + nodeNum = int(destinationId[1:], 16) + else: + node = self.nodes.get(destinationId) + if not node: + raise Exception(f"NodeId {destinationId} not found in DB") + nodeNum = node['num'] + + meshPacket.to = nodeNum + meshPacket.want_ack = wantAck + meshPacket.hop_limit = hopLimit + + # if the user hasn't set an ID for this packet (likely and recommended), we should pick a new unique ID + # so the message can be tracked. + if meshPacket.id == 0: + meshPacket.id = self._generatePacketId() + + toRadio.packet.CopyFrom(meshPacket) + #logging.debug(f"Sending packet: {stripnl(meshPacket)}") + self._sendToRadio(toRadio) + return meshPacket + + def waitForConfig(self): + """Block until radio config is received. Returns True if config has been received.""" + success = self._timeout.waitForSet(self, attrs=('myInfo', 'nodes') + ) and self.localNode.waitForConfig() + if not success: + raise Exception("Timed out waiting for interface config") + + def getMyNodeInfo(self): + if self.myInfo is None: + return None + return self.nodesByNum.get(self.myInfo.my_node_num) + + def getMyUser(self): + nodeInfo = self.getMyNodeInfo() + if nodeInfo is not None: + return nodeInfo.get('user') + return None + + def getLongName(self): + user = self.getMyUser() + if user is not None: + return user.get('longName', None) + return None + + def getShortName(self): + user = self.getMyUser() + if user is not None: + return user.get('shortName', None) + return None + + def _waitConnected(self): + """Block until the initial node db download is complete, or timeout + and raise an exception""" + if not self.isConnected.wait(10.0): # timeout after 10 seconds + raise Exception("Timed out waiting for connection completion") + + # If we failed while connecting, raise the connection to the client + if self.failure: + raise self.failure + + def _generatePacketId(self): + """Get a new unique packet ID""" + if self.currentPacketId is None: + raise Exception("Not connected yet, can not generate packet") + else: + self.currentPacketId = (self.currentPacketId + 1) & 0xffffffff + return self.currentPacketId + + def _disconnected(self): + """Called by subclasses to tell clients this interface has disconnected""" + self.isConnected.clear() + publishingThread.queueWork(lambda: pub.sendMessage( + "meshtastic.connection.lost", interface=self)) + + def _startHeartbeat(self): + """We need to send a heartbeat message to the device every X seconds""" + def callback(): + self.heartbeatTimer = None + prefs = self.localNode.radioConfig.preferences + i = prefs.phone_timeout_secs / 2 + logging.debug(f"Sending heartbeat, interval {i}") + if i != 0: + self.heartbeatTimer = threading.Timer(i, callback) + self.heartbeatTimer.start() + p = mesh_pb2.ToRadio() + self._sendToRadio(p) + + callback() # run our periodic callback now, it will make another timer if necessary + + def _connected(self): + """Called by this class to tell clients we are now fully connected to a node + """ + # (because I'm lazy) _connected might be called when remote Node + # objects complete their config reads, don't generate redundant isConnected + # for the local interface + if not self.isConnected.is_set(): + self.isConnected.set() + self._startHeartbeat() + publishingThread.queueWork(lambda: pub.sendMessage( + "meshtastic.connection.established", interface=self)) + + def _startConfig(self): + """Start device packets flowing""" + self.myInfo = None + self.nodes = {} # nodes keyed by ID + self.nodesByNum = {} # nodes keyed by nodenum + + startConfig = mesh_pb2.ToRadio() + self.configId = random.randint(0, 0xffffffff) + startConfig.want_config_id = self.configId + self._sendToRadio(startConfig) + + def _sendDisconnect(self): + """Tell device we are done using it""" + m = mesh_pb2.ToRadio() + m.disconnect = True + self._sendToRadio(m) + + def _sendToRadio(self, toRadio): + """Send a ToRadio protobuf to the device""" + if self.noProto: + logging.warn( + f"Not sending packet because protocol use is disabled by noProto") + else: + #logging.debug(f"Sending toRadio: {stripnl(toRadio)}") + self._sendToRadioImpl(toRadio) + + def _sendToRadioImpl(self, toRadio): + """Send a ToRadio protobuf to the device""" + logging.error(f"Subclass must provide toradio: {toRadio}") + + def _handleConfigComplete(self): + """ + Done with initial config messages, now send regular MeshPackets to ask for settings and channels + """ + self.localNode.requestConfig() + + def _handleFromRadio(self, fromRadioBytes): + """ + Handle a packet that arrived from the radio(update model and publish events) + + Called by subclasses.""" + fromRadio = mesh_pb2.FromRadio() + fromRadio.ParseFromString(fromRadioBytes) + asDict = google.protobuf.json_format.MessageToDict(fromRadio) + #logging.debug(f"Received from radio: {fromRadio}") + if fromRadio.HasField("my_info"): + self.myInfo = fromRadio.my_info + self.localNode.nodeNum = self.myInfo.my_node_num + logging.debug(f"Received myinfo: {stripnl(fromRadio.my_info)}") + + failmsg = None + # Check for app too old + if self.myInfo.min_app_version > OUR_APP_VERSION: + failmsg = "This device needs a newer python client, please \"pip install --upgrade meshtastic\". For more information see https://tinyurl.com/5bjsxu32" + + # check for firmware too old + if self.myInfo.max_channels == 0: + failmsg = "This version of meshtastic-python requires device firmware version 1.2 or later. For more information see https://tinyurl.com/5bjsxu32" + + if failmsg: + self.failure = Exception(failmsg) + self.isConnected.set() # let waitConnected return this exception + self.close() + + elif fromRadio.HasField("node_info"): + node = asDict["nodeInfo"] + try: + self._fixupPosition(node["position"]) + except: + logging.debug("Node without position") + + logging.debug(f"Received nodeinfo: {node}") + + self.nodesByNum[node["num"]] = node + if "user" in node: # Some nodes might not have user/ids assigned yet + self.nodes[node["user"]["id"]] = node + publishingThread.queueWork(lambda: pub.sendMessage("meshtastic.node.updated", + node=node, interface=self)) + elif fromRadio.config_complete_id == self.configId: + # we ignore the config_complete_id, it is unneeded for our stream API fromRadio.config_complete_id + logging.debug(f"Config complete ID {self.configId}") + self._handleConfigComplete() + elif fromRadio.HasField("packet"): + self._handlePacketFromRadio(fromRadio.packet) + elif fromRadio.rebooted: + # Tell clients the device went away. Careful not to call the overridden subclass version that closes the serial port + MeshInterface._disconnected(self) + + self._startConfig() # redownload the node db etc... + else: + logging.debug("Unexpected FromRadio payload") + + def _fixupPosition(self, position): + """Convert integer lat/lon into floats + + Arguments: + position {Position dictionary} -- object ot fix up + """ + if "latitudeI" in position: + position["latitude"] = position["latitudeI"] * 1e-7 + if "longitudeI" in position: + position["longitude"] = position["longitudeI"] * 1e-7 + + def _nodeNumToId(self, num): + """Map a node node number to a node ID + + Arguments: + num {int} -- Node number + + Returns: + string -- Node ID + """ + if num == BROADCAST_NUM: + return BROADCAST_ADDR + + try: + return self.nodesByNum[num]["user"]["id"] + except: + logging.debug(f"Node {num} not found for fromId") + return None + + def _getOrCreateByNum(self, nodeNum): + """Given a nodenum find the NodeInfo in the DB (or create if necessary)""" + if nodeNum == BROADCAST_NUM: + raise Exception("Can not create/find nodenum by the broadcast num") + + if nodeNum in self.nodesByNum: + return self.nodesByNum[nodeNum] + else: + n = {"num": nodeNum} # Create a minimial node db entry + self.nodesByNum[nodeNum] = n + return n + + def _handlePacketFromRadio(self, meshPacket): + """Handle a MeshPacket that just arrived from the radio + + Will publish one of the following events: + - meshtastic.receive.text(packet = MeshPacket dictionary) + - meshtastic.receive.position(packet = MeshPacket dictionary) + - meshtastic.receive.user(packet = MeshPacket dictionary) + - meshtastic.receive.data(packet = MeshPacket dictionary) + """ + + asDict = google.protobuf.json_format.MessageToDict(meshPacket) + + # We normally decompose the payload into a dictionary so that the client + # doesn't need to understand protobufs. But advanced clients might + # want the raw protobuf, so we provide it in "raw" + asDict["raw"] = meshPacket + + # from might be missing if the nodenum was zero. + if not "from" in asDict: + asDict["from"] = 0 + logging.error( + f"Device returned a packet we sent, ignoring: {stripnl(asDict)}") + return + if not "to" in asDict: + asDict["to"] = 0 + + # /add fromId and toId fields based on the node ID + try: + asDict["fromId"] = self._nodeNumToId(asDict["from"]) + except Exception as ex: + logging.warn(f"Not populating fromId {ex}") + try: + asDict["toId"] = self._nodeNumToId(asDict["to"]) + except Exception as ex: + logging.warn(f"Not populating toId {ex}") + + # We could provide our objects as DotMaps - which work with . notation or as dictionaries + # asObj = DotMap(asDict) + topic = "meshtastic.receive" # Generic unknown packet type + + decoded = asDict["decoded"] + # The default MessageToDict converts byte arrays into base64 strings. + # We don't want that - it messes up data payload. So slam in the correct + # byte array. + decoded["payload"] = meshPacket.decoded.payload + + # UNKNOWN_APP is the default protobuf portnum value, and therefore if not set it will not be populated at all + # to make API usage easier, set it to prevent confusion + if not "portnum" in decoded: + decoded["portnum"] = portnums_pb2.PortNum.Name( + portnums_pb2.PortNum.UNKNOWN_APP) + + portnum = decoded["portnum"] + + topic = f"meshtastic.receive.data.{portnum}" + + # decode position protobufs and update nodedb, provide decoded version as "position" in the published msg + # move the following into a 'decoders' API that clients could register? + portNumInt = meshPacket.decoded.portnum # we want portnum as an int + handler = protocols.get(portNumInt) + # The decoded protobuf as a dictionary (if we understand this message) + p = None + if handler is not None: + topic = f"meshtastic.receive.{handler.name}" + + # Convert to protobuf if possible + if handler.protobufFactory is not None: + pb = handler.protobufFactory() + pb.ParseFromString(meshPacket.decoded.payload) + p = google.protobuf.json_format.MessageToDict(pb) + asDict["decoded"][handler.name] = p + # Also provide the protobuf raw + asDict["decoded"][handler.name]["raw"] = pb + + # Call specialized onReceive if necessary + if handler.onReceive is not None: + handler.onReceive(self, asDict) + + # Is this message in response to a request, if so, look for a handler + requestId = decoded.get("requestId") + if requestId is not None: + # We ignore ACK packets, but send NAKs and data responses to the handlers + routing = decoded.get("routing") + isAck = routing is not None and ("errorReason" not in routing) + if not isAck: + # we keep the responseHandler in dict until we get a non ack + handler = self.responseHandlers.pop(requestId, None) + if handler is not None: + handler.callback(asDict) + + logging.debug(f"Publishing {topic}: packet={stripnl(asDict)} ") + publishingThread.queueWork(lambda: pub.sendMessage( + topic, packet=asDict, interface=self)) + + +# Our standard BLE characteristics +TORADIO_UUID = "f75c76d2-129e-4dad-a1dd-7866124401e7" +FROMRADIO_UUID = "8ba2bcc2-ee02-4a55-a531-c525c5e454d5" +FROMNUM_UUID = "ed9da18c-a800-4f66-a670-aa7547e34453" + + +class BLEInterface(MeshInterface): + """A not quite ready - FIXME - BLE interface to devices""" + + def __init__(self, address, debugOut=None): + self.address = address + self.adapter = pygatt.GATTToolBackend() # BGAPIBackend() + self.adapter.start() + logging.debug(f"Connecting to {self.address}") + self.device = self.adapter.connect(address) + logging.debug("Connected to device") + # fromradio = self.device.char_read(FROMRADIO_UUID) + MeshInterface.__init__(self, debugOut=debugOut) + + self._readFromRadio() # read the initial responses + + def handle_data(handle, data): + self._handleFromRadio(data) + + self.device.subscribe(FROMNUM_UUID, callback=handle_data) + + def _sendToRadioImpl(self, toRadio): + """Send a ToRadio protobuf to the device""" + #logging.debug(f"Sending: {stripnl(toRadio)}") + b = toRadio.SerializeToString() + self.device.char_write(TORADIO_UUID, b) + + def close(self): + MeshInterface.close(self) + self.adapter.stop() + + def _readFromRadio(self): + wasEmpty = False + while not wasEmpty: + b = self.device.char_read(FROMRADIO_UUID) + wasEmpty = len(b) == 0 + if not wasEmpty: + self._handleFromRadio(b) + + +class StreamInterface(MeshInterface): + """Interface class for meshtastic devices over a stream link (serial, TCP, etc)""" + + def __init__(self, debugOut=None, noProto=False, connectNow=True): + """Constructor, opens a connection to self.stream + + Keyword Arguments: + devPath {string} -- A filepath to a device, i.e. /dev/ttyUSB0 (default: {None}) + debugOut {stream} -- If a stream is provided, any debug serial output from the device will be emitted to that stream. (default: {None}) + + Raises: + Exception: [description] + Exception: [description] + """ + + if not hasattr(self, 'stream'): + raise Exception( + "StreamInterface is now abstract (to update existing code create SerialInterface instead)") + self._rxBuf = bytes() # empty + self._wantExit = False + + # FIXME, figure out why daemon=True causes reader thread to exit too early + self._rxThread = threading.Thread( + target=self.__reader, args=(), daemon=True) + + MeshInterface.__init__(self, debugOut=debugOut, noProto=noProto) + + # Start the reader thread after superclass constructor completes init + if connectNow: + self.connect() + if not noProto: + self.waitForConfig() + + def connect(self): + """Connect to our radio + + Normally this is called automatically by the constructor, but if you passed in connectNow=False you can manually + start the reading thread later. + """ + + # Send some bogus UART characters to force a sleeping device to wake, and if the reading statemachine was parsing a bad packet make sure + # we write enought start bytes to force it to resync (we don't use START1 because we want to ensure it is looking for START1) + p = bytearray([START2] * 32) + self._writeBytes(p) + time.sleep(0.1) # wait 100ms to give device time to start running + + self._rxThread.start() + + self._startConfig() + + if not self.noProto: # Wait for the db download if using the protocol + self._waitConnected() + + def _disconnected(self): + """We override the superclass implementation to close our port""" + MeshInterface._disconnected(self) + + logging.debug("Closing our port") + if not self.stream is None: + self.stream.close() + self.stream = None + + def _writeBytes(self, b): + """Write an array of bytes to our stream and flush""" + if self.stream: # ignore writes when stream is closed + self.stream.write(b) + self.stream.flush() + + def _readBytes(self, len): + """Read an array of bytes from our stream""" + return self.stream.read(len) + + def _sendToRadioImpl(self, toRadio): + """Send a ToRadio protobuf to the device""" + logging.debug(f"Sending: {stripnl(toRadio)}") + b = toRadio.SerializeToString() + bufLen = len(b) + # We convert into a string, because the TCP code doesn't work with byte arrays + header = bytes([START1, START2, (bufLen >> 8) & 0xff, bufLen & 0xff]) + self._writeBytes(header + b) + + def close(self): + """Close a connection to the device""" + logging.debug("Closing stream") + MeshInterface.close(self) + # pyserial cancel_read doesn't seem to work, therefore we ask the reader thread to close things for us + self._wantExit = True + if self._rxThread != threading.current_thread(): + self._rxThread.join() # wait for it to exit + + def __reader(self): + """The reader thread that reads bytes from our stream""" + empty = bytes() + + try: + while not self._wantExit: + # logging.debug("reading character") + b = self._readBytes(1) + # logging.debug("In reader loop") + # logging.debug(f"read returned {b}") + if len(b) > 0: + c = b[0] + ptr = len(self._rxBuf) + + # Assume we want to append this byte, fixme use bytearray instead + self._rxBuf = self._rxBuf + b + + if ptr == 0: # looking for START1 + if c != START1: + self._rxBuf = empty # failed to find start + if self.debugOut != None: + try: + self.debugOut.write(b.decode("utf-8")) + except: + self.debugOut.write('?') + + elif ptr == 1: # looking for START2 + if c != START2: + self._rxBuf = empty # failed to find start2 + elif ptr >= HEADER_LEN - 1: # we've at least got a header + # big endian length follos header + packetlen = (self._rxBuf[2] << 8) + self._rxBuf[3] + + if ptr == HEADER_LEN - 1: # we _just_ finished reading the header, validate length + if packetlen > MAX_TO_FROM_RADIO_SIZE: + self._rxBuf = empty # length ws out out bounds, restart + + if len(self._rxBuf) != 0 and ptr + 1 >= packetlen + HEADER_LEN: + try: + self._handleFromRadio(self._rxBuf[HEADER_LEN:]) + except Exception as ex: + logging.error( + f"Error while handling message from radio {ex}") + traceback.print_exc() + self._rxBuf = empty + else: + # logging.debug(f"timeout") + pass + except serial.SerialException as ex: + if not self._wantExit: # We might intentionally get an exception during shutdown + logging.warn( + f"Meshtastic serial port disconnected, disconnecting... {ex}") + except OSError as ex: + if not self._wantExit: # We might intentionally get an exception during shutdown + logging.error( + f"Unexpected OSError, terminating meshtastic reader... {ex}") + except Exception as ex: + logging.error( + f"Unexpected exception, terminating meshtastic reader... {ex}") + finally: + logging.debug("reader is exiting") + self._disconnected() + + +class SerialInterface(StreamInterface): + """Interface class for meshtastic devices over a serial link""" + + def __init__(self, devPath=None, debugOut=None, noProto=False, connectNow=True): + """Constructor, opens a connection to a specified serial port, or if unspecified try to + find one Meshtastic device by probing + + Keyword Arguments: + devPath {string} -- A filepath to a device, i.e. /dev/ttyUSB0 (default: {None}) + debugOut {stream} -- If a stream is provided, any debug serial output from the device will be emitted to that stream. (default: {None}) + """ + + if devPath is None: + ports = util.findPorts() + if len(ports) == 0: + raise Exception("No Meshtastic devices detected") + elif len(ports) > 1: + raise Exception( + f"Multiple ports detected, you must specify a device, such as {ports[0]}") + else: + devPath = ports[0] + + logging.debug(f"Connecting to {devPath}") + + # Note: we provide None for port here, because we will be opening it later + self.stream = serial.Serial( + None, 921600, exclusive=True, timeout=0.5, write_timeout=0) + + # rts=False Needed to prevent TBEAMs resetting on OSX, because rts is connected to reset + self.stream.port = devPath + + # HACK: If the platform driving the serial port is unable to leave the RTS pin in high-impedance + # mode, set RTS to false so that the device platform won't be reset spuriously. + # Linux does this properly, so don't apply this hack on Linux (because it makes the reset button not work). + if self._hostPlatformAlwaysDrivesUartRts(): + self.stream.rts = False + self.stream.open() + + StreamInterface.__init__( + self, debugOut=debugOut, noProto=noProto, connectNow=connectNow) + + """true if platform driving the serial port is Windows Subsystem for Linux 1.""" + def _isWsl1(self): + # WSL1 identifies itself as Linux, but has a special char device at /dev/lxss for use with session control, + # e.g. /init. We should treat WSL1 as Windows for the RTS-driving hack because the underlying platfrom + # serial driver for the CP21xx still exhibits the buggy behavior. + # WSL2 is not covered here, as it does not (as of 2021-May-25) support the appropriate functionality to + # share or pass-through serial ports. + try: + # Claims to be Linux, but has /dev/lxss; must be WSL 1 + return platform.system() == 'Linux' and stat.S_ISCHR(os.stat('/dev/lxss').st_mode); + except: + # Couldn't stat /dev/lxss special device; not WSL1 + return False; + + def _hostPlatformAlwaysDrivesUartRts(self): + # OS-X/Windows seems to have a bug in its CP21xx serial drivers. It ignores that we asked for no RTSCTS + # control and will always drive RTS either high or low (rather than letting the CP102 leave + # it as an open-collector floating pin). + # TODO: When WSL2 supports USB passthrough, this will get messier. If/when WSL2 gets virtual serial + # ports that "share" the Windows serial port (and thus the Windows drivers), this code will need to be + # updated to reflect that as well -- or if T-Beams get made with an alternate USB to UART bridge that has + # a less buggy driver. + return platform.system() != 'Linux' or self._isWsl1(); + +class TCPInterface(StreamInterface): + """Interface class for meshtastic devices over a TCP link""" + + def __init__(self, hostname: AnyStr, debugOut=None, noProto=False, connectNow=True, portNumber=4403): + """Constructor, opens a connection to a specified IP address/hostname + + Keyword Arguments: + hostname {string} -- Hostname/IP address of the device to connect to + """ + + logging.debug(f"Connecting to {hostname}") + + server_address = (hostname, portNumber) + sock = socket.create_connection(server_address) + + # Instead of wrapping as a stream, we use the native socket API + # self.stream = sock.makefile('rw') + self.stream = None + self.socket = sock + + StreamInterface.__init__( + self, debugOut=debugOut, noProto=noProto, connectNow=connectNow) + + def close(self): + """Close a connection to the device""" + logging.debug("Closing TCP stream") + StreamInterface.close(self) + # Sometimes the socket read might be blocked in the reader thread. Therefore we force the shutdown by closing + # the socket here + self._wantExit = True + if not self.socket is None: + try: + self.socket.shutdown(socket.SHUT_RDWR) + except: + pass # Ignore errors in shutdown, because we might have a race with the server + self.socket.close() + + def _writeBytes(self, b): + """Write an array of bytes to our stream and flush""" + self.socket.send(b) + + def _readBytes(self, len): + """Read an array of bytes from our stream""" + return self.socket.recv(len) + + +def _onTextReceive(iface, asDict): + """Special text auto parsing for received messages""" + # We don't throw if the utf8 is invalid in the text message. Instead we just don't populate + # the decoded.data.text and we log an error message. This at least allows some delivery to + # the app and the app can deal with the missing decoded representation. + # + # Usually btw this problem is caused by apps sending binary data but setting the payload type to + # text. + try: + asBytes = asDict["decoded"]["payload"] + asDict["decoded"]["text"] = asBytes.decode("utf-8") + except Exception as ex: + logging.error(f"Malformatted utf8 in text message: {ex}") + _receiveInfoUpdate(iface, asDict) + + +def _onPositionReceive(iface, asDict): + """Special auto parsing for received messages""" + p = asDict["decoded"]["position"] + iface._fixupPosition(p) + # update node DB as needed + iface._getOrCreateByNum(asDict["from"])["position"] = p + + +def _onNodeInfoReceive(iface, asDict): + """Special auto parsing for received messages""" + p = asDict["decoded"]["user"] + # decode user protobufs and update nodedb, provide decoded version as "position" in the published msg + # update node DB as needed + n = iface._getOrCreateByNum(asDict["from"]) + n["user"] = p + # We now have a node ID, make sure it is uptodate in that table + iface.nodes[p["id"]] = n + _receiveInfoUpdate(iface, asDict) + + +def _receiveInfoUpdate(iface, asDict): + iface._getOrCreateByNum(asDict["from"])["lastReceived"] = asDict + iface._getOrCreateByNum(asDict["from"])["lastHeard"] = asDict.get("rxTime") + iface._getOrCreateByNum(asDict["from"])["snr"] = asDict.get("rxSnr") + iface._getOrCreateByNum(asDict["from"])["hopLimit"] = asDict.get("hopLimit") + + +"""Well known message payloads can register decoders for automatic protobuf parsing""" +protocols = { + portnums_pb2.PortNum.TEXT_MESSAGE_APP: KnownProtocol("text", onReceive=_onTextReceive), + portnums_pb2.PortNum.POSITION_APP: KnownProtocol("position", mesh_pb2.Position, _onPositionReceive), + portnums_pb2.PortNum.NODEINFO_APP: KnownProtocol("user", mesh_pb2.User, _onNodeInfoReceive), + portnums_pb2.PortNum.ADMIN_APP: KnownProtocol("admin", admin_pb2.AdminMessage), + portnums_pb2.PortNum.ROUTING_APP: KnownProtocol("routing", mesh_pb2.Routing), + portnums_pb2.PortNum.ENVIRONMENTAL_MEASUREMENT_APP: KnownProtocol("environmental", environmental_measurement_pb2.EnvironmentalMeasurement), + portnums_pb2.PortNum.REMOTE_HARDWARE_APP: KnownProtocol( + "remotehw", remote_hardware_pb2.HardwareMessage) +} diff --git a/meshtastic/__main__.py-E b/meshtastic/__main__.py-E new file mode 100644 index 0000000..193ef02 --- /dev/null +++ b/meshtastic/__main__.py-E @@ -0,0 +1,675 @@ +#!python3 + +import argparse +import platform +import logging +import sys +import codecs +import time +import base64 +import os +from . import SerialInterface, TCPInterface, BLEInterface, test, remote_hardware +from pubsub import pub +from . import mesh_pb2, portnums_pb2, channel_pb2 +from .util import stripnl +import google.protobuf.json_format +import pyqrcode +import traceback +import pkg_resources + +"""We only import the tunnel code if we are on a platform that can run it""" +have_tunnel = platform.system() == 'Linux' + +"""The command line arguments""" +args = None + +"""The parser for arguments""" +parser = argparse.ArgumentParser() + +channelIndex = 0 + + +def onReceive(packet, interface): + """Callback invoked when a packet arrives""" + try: + d = packet.get('decoded') + + # Exit once we receive a reply + if args.sendtext and packet["to"] == interface.myInfo.my_node_num and d["portnum"] == portnums_pb2.PortNum.TEXT_MESSAGE_APP: + interface.close() # after running command then exit + + # Reply to every received message with some stats + if args.reply: + msg = d.get('text') + if msg: + #shortName = packet['decoded']['shortName'] + rxSnr = packet['rxSnr'] + hopLimit = packet['hopLimit'] + print(f"message: {msg}") + reply = "got msg \'{}\' with rxSnr: {} and hopLimit: {}".format( + msg, rxSnr, hopLimit) + print("Sending reply: ", reply) + interface.sendText(reply) + + except Exception as ex: + print(ex) + + +def onConnection(interface, topic=pub.AUTO_TOPIC): + """Callback invoked when we connect/disconnect from a radio""" + print(f"Connection changed: {topic.getName()}") + + +trueTerms = {"t", "true", "yes"} +falseTerms = {"f", "false", "no"} + + +def genPSK256(): + return os.urandom(32) + + +def fromPSK(valstr): + """A special version of fromStr that assumes the user is trying to set a PSK. + In that case we also allow "none", "default" or "random" (to have python generate one), or simpleN + """ + if valstr == "random": + return genPSK256() + elif valstr == "none": + return bytes([0]) # Use the 'no encryption' PSK + elif valstr == "default": + return bytes([1]) # Use default channel psk + elif valstr.startswith("simple"): + # Use one of the single byte encodings + return bytes([int(valstr[6:]) + 1]) + else: + return fromStr(valstr) + + +def fromStr(valstr): + """try to parse as int, float or bool (and fallback to a string as last resort) + + Returns: an int, bool, float, str or byte array (for strings of hex digits) + + Args: + valstr (string): A user provided string + """ + if(len(valstr) == 0): # Treat an emptystring as an empty bytes + val = bytes() + elif(valstr.startswith('0x')): + # if needed convert to string with asBytes.decode('utf-8') + val = bytes.fromhex(valstr[2:]) + elif valstr in trueTerms: + val = True + elif valstr in falseTerms: + val = False + else: + try: + val = int(valstr) + except ValueError: + try: + val = float(valstr) + except ValueError: + val = valstr # Not a float or an int, assume string + + return val + + +never = 0xffffffff +oneday = 24 * 60 * 60 + + +def getPref(attributes, name): + """Get a channel or preferences value""" + + objDesc = attributes.DESCRIPTOR + field = objDesc.fields_by_name.get(name) + if not field: + print(f"{attributes.__class__.__name__} doesn't have an attribute called {name}, so you can not get it.") + print(f"Choices are:") + for f in objDesc.fields: + print(f" {f.name}") + return + + # okay - try to read the value + try: + try: + val = getattr(attributes, name) + except TypeError as ex: + # The getter didn't like our arg type guess try again as a string + val = getattr(attributes, name) + + # succeeded! + print(f"{name}: {str(val)}") + except Exception as ex: + print(f"Can't get {name} due to {ex}") + + +def setPref(attributes, name, valStr): + """Set a channel or preferences value""" + + objDesc = attributes.DESCRIPTOR + field = objDesc.fields_by_name.get(name) + if not field: + print(f"{attributes.__class__.__name__} doesn't have an attribute called {name}, so you can not set it.") + print(f"Choices are:") + for f in objDesc.fields: + print(f" {f.name}") + return + + val = fromStr(valStr) + + enumType = field.enum_type + if enumType and type(val) == str: + # We've failed so far to convert this string into an enum, try to find it by reflection + e = enumType.values_by_name.get(val) + if e: + val = e.number + else: + print(f"{name} doesn't have an enum called {val}, so you can not set it.") + print(f"Choices are:") + for f in enumType.values: + print(f" {f.name}") + return + + # okay - try to read the value + try: + try: + setattr(attributes, name, val) + except TypeError as ex: + # The setter didn't like our arg type guess try again as a string + setattr(attributes, name, valStr) + + # succeeded! + print(f"Set {name} to {valStr}") + except Exception as ex: + print(f"Can't set {name} due to {ex}") + + +targetNode = None + + +def onConnected(interface): + """Callback invoked when we connect to a radio""" + closeNow = False # Should we drop the connection after we finish? + try: + global args + print("Connected to radio") + + def getNode(): + """This operation could be expensive, so we try to cache the results""" + global targetNode + if not targetNode: + targetNode = interface.getNode(args.destOrLocal) + return targetNode + + if args.setlat or args.setlon or args.setalt: + closeNow = True + + alt = 0 + lat = 0.0 + lon = 0.0 + time = 0 # always set time, but based on the local clock + prefs = interface.localNode.radioConfig.preferences + if args.setalt: + alt = int(args.setalt) + prefs.fixed_position = True + print(f"Fixing altitude at {alt} meters") + if args.setlat: + lat = float(args.setlat) + prefs.fixed_position = True + print(f"Fixing latitude at {lat} degrees") + if args.setlon: + lon = float(args.setlon) + prefs.fixed_position = True + print(f"Fixing longitude at {lon} degrees") + + print("Setting device position") + # can include lat/long/alt etc: latitude = 37.5, longitude = -122.1 + interface.sendPosition(lat, lon, alt, time) + interface.localNode.writeConfig() + elif not args.no_time: + # We normally provide a current time to the mesh when we connect + interface.sendPosition() + + if args.set_owner: + closeNow = True + print(f"Setting device owner to {args.set_owner}") + getNode().setOwner(args.set_owner) + + if args.set_ham: + closeNow = True + print( + f"Setting HAM ID to {args.set_ham} and turning off encryption") + getNode().setOwner(args.set_ham, is_licensed=True) + # Must turn off crypt on primary channel + ch = getNode().channels[0] + ch.settings.psk = fromPSK("none") + print(f"Writing modified channels to device") + getNode().writeChannel(0) + + if args.reboot: + closeNow = True + getNode().reboot() + + if args.sendtext: + closeNow = True + print(f"Sending text message {args.sendtext} to {args.destOrAll}") + interface.sendText(args.sendtext, args.destOrAll, + wantAck=True) + + if args.sendping: + print(f"Sending ping message {args.sendtext} to {args.destOrAll}") + payload = str.encode("test string") + interface.sendData(payload, args.destOrAll, portNum=portnums_pb2.PortNum.REPLY_APP, + wantAck=True, wantResponse=True) + + if args.gpio_wrb or args.gpio_rd or args.gpio_watch: + rhc = remote_hardware.RemoteHardwareClient(interface) + + if args.gpio_wrb: + bitmask = 0 + bitval = 0 + for wrpair in (args.gpio_wrb or []): + bitmask |= 1 << int(wrpair[0]) + bitval |= int(wrpair[1]) << int(wrpair[0]) + print( + f"Writing GPIO mask 0x{bitmask:x} with value 0x{bitval:x} to {args.dest}") + rhc.writeGPIOs(args.dest, bitmask, bitval) + closeNow = True + + if args.gpio_rd: + bitmask = int(args.gpio_rd, 16) + print(f"Reading GPIO mask 0x{bitmask:x} from {args.dest}") + + def onResponse(packet): + """A closure to handle the response packet""" + hw = packet["decoded"]["remotehw"] + print(f'GPIO read response gpio_value={hw["gpioValue"]}') + sys.exit(0) # Just force an exit (FIXME - ugly) + + rhc.readGPIOs(args.dest, bitmask, onResponse) + + if args.gpio_watch: + bitmask = int(args.gpio_watch, 16) + print(f"Watching GPIO mask 0x{bitmask:x} from {args.dest}") + rhc.watchGPIOs(args.dest, bitmask) + + # handle settings + if args.set: + closeNow = True + prefs = getNode().radioConfig.preferences + + # Handle the int/float/bool arguments + for pref in args.set: + setPref( + prefs, pref[0], pref[1]) + + print("Writing modified preferences to device") + getNode().writeConfig() + + + if args.seturl: + closeNow = True + getNode().setURL(args.seturl) + + # handle changing channels + + if args.ch_add: + closeNow = True + n = getNode() + ch = n.getChannelByName(args.ch_add) + if ch: + logging.error( + f"This node already has a '{args.ch_add}' channel - no changes.") + else: + ch = n.getDisabledChannel() + if not ch: + raise Exception("No free channels were found") + chs = channel_pb2.ChannelSettings() + chs.psk = genPSK256() + chs.name = args.ch_add + ch.settings.CopyFrom(chs) + ch.role = channel_pb2.Channel.Role.SECONDARY + print(f"Writing modified channels to device") + n.writeChannel(ch.index) + + if args.ch_del: + closeNow = True + + print(f"Deleting channel {channelIndex}") + ch = getNode().deleteChannel(channelIndex) + + if args.ch_set or args.ch_longslow or args.ch_shortfast: + closeNow = True + + ch = getNode().channels[channelIndex] + + enable = args.ch_enable # should we enable this channel? + + if args.ch_longslow or args.ch_shortfast: + if channelIndex != 0: + raise Exception( + "standard channel settings can only be applied to the PRIMARY channel") + + enable = True # force enable + + def setSimpleChannel(modem_config): + """Set one of the simple modem_config only based channels""" + + # Completely new channel settings + chs = channel_pb2.ChannelSettings() + chs.modem_config = modem_config + chs.psk = bytes([1]) # Use default channel psk 1 + + ch.settings.CopyFrom(chs) + + # handle the simple channel set commands + if args.ch_longslow: + setSimpleChannel( + channel_pb2.ChannelSettings.ModemConfig.Bw125Cr48Sf4096) + + if args.ch_shortfast: + setSimpleChannel( + channel_pb2.ChannelSettings.ModemConfig.Bw500Cr45Sf128) + + # Handle the channel settings + for pref in (args.ch_set or []): + if pref[0] == "psk": + ch.settings.psk = fromPSK(pref[1]) + else: + setPref(ch.settings, pref[0], pref[1]) + enable = True # If we set any pref, assume the user wants to enable the channel + + if enable: + ch.role = channel_pb2.Channel.Role.PRIMARY if ( + channelIndex == 0) else channel_pb2.Channel.Role.SECONDARY + else: + ch.role = channel_pb2.Channel.Role.DISABLED + + print(f"Writing modified channels to device") + getNode().writeChannel(channelIndex) + + if args.info: + print("") + if not args.dest: # If we aren't trying to talk to our local node, don't show it + interface.showInfo() + + print("") + getNode().showInfo() + closeNow = True # FIXME, for now we leave the link up while talking to remote nodes + print("") + + if args.get: + closeNow = True + prefs = getNode().radioConfig.preferences + + # Handle the int/float/bool arguments + for pref in args.get: + getPref( + prefs, pref[0]) + + print("Completed getting preferences") + + if args.nodes: + closeNow = True + interface.showNodes() + + if args.qr: + closeNow = True + url = interface.localNode.getURL(includeAll=False) + print(f"Primary channel URL {url}") + qr = pyqrcode.create(url) + print(qr.terminal()) + + if have_tunnel and args.tunnel: + from . import tunnel + # Even if others said we could close, stay open if the user asked for a tunnel + closeNow = False + tunnel.Tunnel(interface, subnet=args.tunnel_net) + + # if the user didn't ask for serial debugging output, we might want to exit after we've done our operation + if (not args.seriallog) and closeNow: + interface.close() # after running command then exit + + except Exception as ex: + print(f"Aborting due to: {ex}") + interface.close() # close the connection now, so that our app exits + + +def onNode(node): + """Callback invoked when the node DB changes""" + print(f"Node changed: {node}") + + +def subscribe(): + """Subscribe to the topics the user probably wants to see, prints output to stdout""" + pub.subscribe(onReceive, "meshtastic.receive") + # pub.subscribe(onConnection, "meshtastic.connection") + + # We now call onConnected from main + # pub.subscribe(onConnected, "meshtastic.connection.established") + + # pub.subscribe(onNode, "meshtastic.node") + + +def common(): + """Shared code for all of our command line wrappers""" + global args + logging.basicConfig(level=logging.DEBUG if args.debug else logging.INFO) + + if len(sys.argv) == 1: + parser.print_help(sys.stderr) + sys.exit(1) + else: + if args.ch_index is not None: + global channelIndex + channelIndex = int(args.ch_index) + + # Some commands require dest to be set, so we now use destOrAll/destOrLocal for more lenient commands + if not args.dest: + args.destOrAll = "^all" + args.destOrLocal = "^local" + else: + args.destOrAll = args.dest + args.destOrLocal = args.dest # FIXME, temp hack for debugging remove + + if not args.seriallog: + if args.noproto: + args.seriallog = "stdout" + else: + args.seriallog = "none" # assume no debug output in this case + + if args.deprecated != None: + logging.error( + 'This option has been deprecated, see help below for the correct replacement...') + parser.print_help(sys.stderr) + sys.exit(1) + elif args.test: + test.testAll() + else: + if args.seriallog == "stdout": + logfile = sys.stdout + elif args.seriallog == "none": + args.seriallog = None + logging.debug("Not logging serial output") + logfile = None + else: + logging.info(f"Logging serial output to {args.seriallog}") + logfile = open(args.seriallog, 'w+', + buffering=1) # line buffering + + subscribe() + if args.ble: + client = BLEInterface(args.ble, debugOut=logfile) + elif args.host: + client = TCPInterface( + args.host, debugOut=logfile, noProto=args.noproto) + else: + client = SerialInterface( + args.port, debugOut=logfile, noProto=args.noproto) + + # We assume client is fully connected now + onConnected(client) + + if args.noproto or (have_tunnel and args.tunnel): # loop until someone presses ctrlc + while True: + time.sleep(1000) + + # don't call exit, background threads might be running still + # sys.exit(0) + + +def initParser(): + global parser, args + + parser.add_argument( + "--port", + help="The port the Meshtastic device is connected to, i.e. /dev/ttyUSB0. If unspecified, we'll try to find it.", + default=None) + + parser.add_argument( + "--host", + help="The hostname/ipaddr of the device to connect to (over TCP)", + default=None) + + parser.add_argument( + "--seriallog", + help="Log device serial output to either 'stdout', 'none' or a filename to append to.") + + parser.add_argument("--info", help="Read and display the radio config information", + action="store_true") + + parser.add_argument("--nodes", help="Print Node List in a pretty formatted table", + action="store_true") + + parser.add_argument("--qr", help="Display the QR code that corresponds to the current channel", + action="store_true") + + parser.add_argument( + "--get", help="Get a preferences field", nargs=1, action='append') + + parser.add_argument( + "--set", help="Set a preferences field", nargs=2, action='append') + + parser.add_argument( + "--seturl", help="Set a channel URL", action="store") + + parser.add_argument( + "--ch-index", help="Set the specified channel index", action="store") + + parser.add_argument( + "--ch-add", help="Add a secondary channel, you must specify a channel name", default=None) + + parser.add_argument( + "--ch-del", help="Delete the ch-index channel", action='store_true') + + parser.add_argument( + "--ch-enable", help="Enable the specified channel", action="store_true", dest="ch_enable") + + parser.add_argument( + "--ch-disable", help="Disable the specified channel", action="store_false", dest="ch_enable") + + parser.add_argument( + "--ch-set", help="Set a channel parameter", nargs=2, action='append') + + parser.add_argument( + "--ch-longslow", help="Change to the standard long-range (but slow) channel", action='store_true') + + parser.add_argument( + "--ch-shortfast", help="Change to the standard fast (but short range) channel", action='store_true') + + parser.add_argument( + "--set-owner", help="Set device owner name", action="store") + + parser.add_argument( + "--set-ham", help="Set licensed HAM ID and turn off encryption", action="store") + + parser.add_argument( + "--dest", help="The destination node id for any sent commands, if not set '^all' or '^local' is assumed as appropriate", default=None) + + parser.add_argument( + "--sendtext", help="Send a text message") + + parser.add_argument( + "--sendping", help="Send a ping message (which requests a reply)", action="store_true") + + parser.add_argument( + "--reboot", help="Tell the destination node to reboot", action="store_true") + + # parser.add_argument( + # "--repeat", help="Normally the send commands send only one message, use this option to request repeated sends") + + parser.add_argument( + "--reply", help="Reply to received messages", + action="store_true") + + parser.add_argument( + "--gpio-wrb", nargs=2, help="Set a particlar GPIO # to 1 or 0", action='append') + + parser.add_argument( + "--gpio-rd", help="Read from a GPIO mask") + + parser.add_argument( + "--gpio-watch", help="Start watching a GPIO mask for changes") + + parser.add_argument( + "--no-time", help="Suppress sending the current time to the mesh", action="store_true") + + parser.add_argument( + "--setalt", help="Set device altitude (allows use without GPS)") + + parser.add_argument( + "--setlat", help="Set device latitude (allows use without GPS)") + + parser.add_argument( + "--setlon", help="Set device longitude (allows use without GPS)") + + parser.add_argument("--debug", help="Show API library debug log messages", + action="store_true") + + parser.add_argument("--test", help="Run stress test against all connected Meshtastic devices", + action="store_true") + + parser.add_argument("--ble", help="BLE mac address to connect to (BLE is not yet supported for this tool)", + default=None) + + parser.add_argument("--noproto", help="Don't start the API, just function as a dumb serial terminal.", + action="store_true") + + parser.add_argument('--setchan', dest='deprecated', nargs=2, action='append', + help='Deprecated, use "--ch-set param value" instead') + parser.add_argument('--set-router', dest='deprecated', + action='store_true', help='Deprecated, use "--set is_router true" instead') + parser.add_argument('--unset-router', dest='deprecated', + action='store_false', help='Deprecated, use "--set is_router false" instead') + + if have_tunnel: + parser.add_argument('--tunnel', + action='store_true', help="Create a TUN tunnel device for forwarding IP packets over the mesh") + parser.add_argument( + "--subnet", dest='tunnel_net', help="Sets the local-end subnet address for the TUN IP bridge", default=None) + + parser.set_defaults(deprecated=None) + + parser.add_argument('--version', action='version', + version=f"{pkg_resources.require('meshtastic')[0].version}") + + args = parser.parse_args() + + +def main(): + """Perform command line meshtastic operations""" + initParser() + common() + + +def tunnelMain(): + """Run a meshtastic IP tunnel""" + global args + initParser() + args.tunnel = True + common() + + +if __name__ == "__main__": + main() diff --git a/meshtastic/admin_pb2.py b/meshtastic/admin_pb2.py index dd473d7..f5b8cab 100644 --- a/meshtastic/admin_pb2.py +++ b/meshtastic/admin_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: admin.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -21,7 +21,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\013AdminProtosH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\x0b\x61\x64min.proto\x1a\nmesh.proto\x1a\x11radioconfig.proto\x1a\rchannel.proto\"\xfb\x02\n\x0c\x41\x64minMessage\x12!\n\tset_radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x02 \x01(\x0b\x32\x05.UserH\x00\x12\x1f\n\x0bset_channel\x18\x03 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1b\n\x11get_radio_request\x18\x04 \x01(\x08H\x00\x12*\n\x12get_radio_response\x18\x05 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1d\n\x13get_channel_request\x18\x06 \x01(\rH\x00\x12(\n\x14get_channel_response\x18\x07 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1d\n\x13\x63onfirm_set_channel\x18 \x01(\x08H\x00\x12\x1b\n\x11\x63onfirm_set_radio\x18! \x01(\x08H\x00\x12\x18\n\x0e\x65xit_simulator\x18\" \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18# \x01(\x05H\x00\x42\t\n\x07variantBG\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' , dependencies=[mesh__pb2.DESCRIPTOR,radioconfig__pb2.DESCRIPTOR,channel__pb2.DESCRIPTOR,]) @@ -35,7 +34,6 @@ _ADMINMESSAGE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='set_radio', full_name='AdminMessage.set_radio', index=0, @@ -43,77 +41,77 @@ _ADMINMESSAGE = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='set_owner', full_name='AdminMessage.set_owner', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='set_channel', full_name='AdminMessage.set_channel', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='get_radio_request', full_name='AdminMessage.get_radio_request', index=3, number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='get_radio_response', full_name='AdminMessage.get_radio_response', index=4, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='get_channel_request', full_name='AdminMessage.get_channel_request', index=5, number=6, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='get_channel_response', full_name='AdminMessage.get_channel_response', index=6, number=7, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='confirm_set_channel', full_name='AdminMessage.confirm_set_channel', index=7, number=32, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='confirm_set_radio', full_name='AdminMessage.confirm_set_radio', index=8, number=33, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='exit_simulator', full_name='AdminMessage.exit_simulator', index=9, number=34, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='reboot_seconds', full_name='AdminMessage.reboot_seconds', index=10, number=35, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -127,9 +125,7 @@ _ADMINMESSAGE = _descriptor.Descriptor( oneofs=[ _descriptor.OneofDescriptor( name='variant', full_name='AdminMessage.variant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + index=0, containing_type=None, fields=[]), ], serialized_start=62, serialized_end=441, diff --git a/meshtastic/admin_pb2.py-E b/meshtastic/admin_pb2.py-E new file mode 100644 index 0000000..2bed559 --- /dev/null +++ b/meshtastic/admin_pb2.py-E @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: admin.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import mesh_pb2 as mesh__pb2 +import radioconfig_pb2 as radioconfig__pb2 +import channel_pb2 as channel__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='admin.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\013AdminProtosH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x0b\x61\x64min.proto\x1a\nmesh.proto\x1a\x11radioconfig.proto\x1a\rchannel.proto\"\xfb\x02\n\x0c\x41\x64minMessage\x12!\n\tset_radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x02 \x01(\x0b\x32\x05.UserH\x00\x12\x1f\n\x0bset_channel\x18\x03 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1b\n\x11get_radio_request\x18\x04 \x01(\x08H\x00\x12*\n\x12get_radio_response\x18\x05 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1d\n\x13get_channel_request\x18\x06 \x01(\rH\x00\x12(\n\x14get_channel_response\x18\x07 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1d\n\x13\x63onfirm_set_channel\x18 \x01(\x08H\x00\x12\x1b\n\x11\x63onfirm_set_radio\x18! \x01(\x08H\x00\x12\x18\n\x0e\x65xit_simulator\x18\" \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18# \x01(\x05H\x00\x42\t\n\x07variantBG\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + , + dependencies=[mesh__pb2.DESCRIPTOR,radioconfig__pb2.DESCRIPTOR,channel__pb2.DESCRIPTOR,]) + + + + +_ADMINMESSAGE = _descriptor.Descriptor( + name='AdminMessage', + full_name='AdminMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='set_radio', full_name='AdminMessage.set_radio', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='set_owner', full_name='AdminMessage.set_owner', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='set_channel', full_name='AdminMessage.set_channel', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='get_radio_request', full_name='AdminMessage.get_radio_request', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='get_radio_response', full_name='AdminMessage.get_radio_response', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='get_channel_request', full_name='AdminMessage.get_channel_request', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='get_channel_response', full_name='AdminMessage.get_channel_response', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='confirm_set_channel', full_name='AdminMessage.confirm_set_channel', index=7, + number=32, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='confirm_set_radio', full_name='AdminMessage.confirm_set_radio', index=8, + number=33, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='exit_simulator', full_name='AdminMessage.exit_simulator', index=9, + number=34, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='reboot_seconds', full_name='AdminMessage.reboot_seconds', index=10, + number=35, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='variant', full_name='AdminMessage.variant', + index=0, containing_type=None, fields=[]), + ], + serialized_start=62, + serialized_end=441, +) + +_ADMINMESSAGE.fields_by_name['set_radio'].message_type = radioconfig__pb2._RADIOCONFIG +_ADMINMESSAGE.fields_by_name['set_owner'].message_type = mesh__pb2._USER +_ADMINMESSAGE.fields_by_name['set_channel'].message_type = channel__pb2._CHANNEL +_ADMINMESSAGE.fields_by_name['get_radio_response'].message_type = radioconfig__pb2._RADIOCONFIG +_ADMINMESSAGE.fields_by_name['get_channel_response'].message_type = channel__pb2._CHANNEL +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['set_radio']) +_ADMINMESSAGE.fields_by_name['set_radio'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['set_owner']) +_ADMINMESSAGE.fields_by_name['set_owner'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['set_channel']) +_ADMINMESSAGE.fields_by_name['set_channel'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['get_radio_request']) +_ADMINMESSAGE.fields_by_name['get_radio_request'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['get_radio_response']) +_ADMINMESSAGE.fields_by_name['get_radio_response'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['get_channel_request']) +_ADMINMESSAGE.fields_by_name['get_channel_request'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['get_channel_response']) +_ADMINMESSAGE.fields_by_name['get_channel_response'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['confirm_set_channel']) +_ADMINMESSAGE.fields_by_name['confirm_set_channel'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['confirm_set_radio']) +_ADMINMESSAGE.fields_by_name['confirm_set_radio'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['exit_simulator']) +_ADMINMESSAGE.fields_by_name['exit_simulator'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +_ADMINMESSAGE.oneofs_by_name['variant'].fields.append( + _ADMINMESSAGE.fields_by_name['reboot_seconds']) +_ADMINMESSAGE.fields_by_name['reboot_seconds'].containing_oneof = _ADMINMESSAGE.oneofs_by_name['variant'] +DESCRIPTOR.message_types_by_name['AdminMessage'] = _ADMINMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +AdminMessage = _reflection.GeneratedProtocolMessageType('AdminMessage', (_message.Message,), { + 'DESCRIPTOR' : _ADMINMESSAGE, + '__module__' : 'admin_pb2' + # @@protoc_insertion_point(class_scope:AdminMessage) + }) +_sym_db.RegisterMessage(AdminMessage) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/apponly_pb2.py b/meshtastic/apponly_pb2.py index 21930d9..df6b84a 100644 --- a/meshtastic/apponly_pb2.py +++ b/meshtastic/apponly_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: apponly.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -19,7 +19,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\rAppOnlyProtosH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\rapponly.proto\x1a\rchannel.proto\"0\n\nChannelSet\x12\"\n\x08settings\x18\x01 \x03(\x0b\x32\x10.ChannelSettingsBI\n\x13\x63om.geeksville.meshB\rAppOnlyProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' , dependencies=[channel__pb2.DESCRIPTOR,]) @@ -33,7 +32,6 @@ _CHANNELSET = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='settings', full_name='ChannelSet.settings', index=0, @@ -41,7 +39,7 @@ _CHANNELSET = _descriptor.Descriptor( has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], diff --git a/meshtastic/apponly_pb2.py-E b/meshtastic/apponly_pb2.py-E new file mode 100644 index 0000000..3f2bee9 --- /dev/null +++ b/meshtastic/apponly_pb2.py-E @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: apponly.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import channel_pb2 as channel__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='apponly.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\rAppOnlyProtosH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\rapponly.proto\x1a\rchannel.proto\"0\n\nChannelSet\x12\"\n\x08settings\x18\x01 \x03(\x0b\x32\x10.ChannelSettingsBI\n\x13\x63om.geeksville.meshB\rAppOnlyProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + , + dependencies=[channel__pb2.DESCRIPTOR,]) + + + + +_CHANNELSET = _descriptor.Descriptor( + name='ChannelSet', + full_name='ChannelSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='settings', full_name='ChannelSet.settings', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=32, + serialized_end=80, +) + +_CHANNELSET.fields_by_name['settings'].message_type = channel__pb2._CHANNELSETTINGS +DESCRIPTOR.message_types_by_name['ChannelSet'] = _CHANNELSET +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ChannelSet = _reflection.GeneratedProtocolMessageType('ChannelSet', (_message.Message,), { + 'DESCRIPTOR' : _CHANNELSET, + '__module__' : 'apponly_pb2' + # @@protoc_insertion_point(class_scope:ChannelSet) + }) +_sym_db.RegisterMessage(ChannelSet) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/ble.py-E b/meshtastic/ble.py-E new file mode 100644 index 0000000..e69de29 diff --git a/meshtastic/channel_pb2.py b/meshtastic/channel_pb2.py index b3af6d6..43ae666 100644 --- a/meshtastic/channel_pb2.py +++ b/meshtastic/channel_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: channel.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -18,7 +18,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\rChannelProtosH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\rchannel.proto\"\xe6\x02\n\x0f\x43hannelSettings\x12\x10\n\x08tx_power\x18\x01 \x01(\x05\x12\x32\n\x0cmodem_config\x18\x03 \x01(\x0e\x32\x1c.ChannelSettings.ModemConfig\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x15\n\rspread_factor\x18\x07 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x08 \x01(\r\x12\x13\n\x0b\x63hannel_num\x18\t \x01(\r\x12\x0b\n\x03psk\x18\x04 \x01(\x0c\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\n\n\x02id\x18\n \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x10 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x11 \x01(\x08\"`\n\x0bModemConfig\x12\x12\n\x0e\x42w125Cr45Sf128\x10\x00\x12\x12\n\x0e\x42w500Cr45Sf128\x10\x01\x12\x14\n\x10\x42w31_25Cr48Sf512\x10\x02\x12\x13\n\x0f\x42w125Cr48Sf4096\x10\x03\"\x8b\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\"\n\x08settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x12\x1b\n\x04role\x18\x03 \x01(\x0e\x32\r.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42I\n\x13\x63om.geeksville.meshB\rChannelProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' ) @@ -29,28 +28,23 @@ _CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor( full_name='ChannelSettings.ModemConfig', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='Bw125Cr45Sf128', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='Bw500Cr45Sf128', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='Bw31_25Cr48Sf512', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='Bw125Cr48Sf4096', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, @@ -64,23 +58,19 @@ _CHANNEL_ROLE = _descriptor.EnumDescriptor( full_name='Channel.Role', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='DISABLED', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='PRIMARY', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='SECONDARY', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, @@ -96,7 +86,6 @@ _CHANNELSETTINGS = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='tx_power', full_name='ChannelSettings.tx_power', index=0, @@ -104,77 +93,77 @@ _CHANNELSETTINGS = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='modem_config', full_name='ChannelSettings.modem_config', index=1, number=3, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='bandwidth', full_name='ChannelSettings.bandwidth', index=2, number=6, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='spread_factor', full_name='ChannelSettings.spread_factor', index=3, number=7, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='coding_rate', full_name='ChannelSettings.coding_rate', index=4, number=8, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='channel_num', full_name='ChannelSettings.channel_num', index=5, number=9, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='psk', full_name='ChannelSettings.psk', index=6, number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='name', full_name='ChannelSettings.name', index=7, number=5, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='id', full_name='ChannelSettings.id', index=8, number=10, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='uplink_enabled', full_name='ChannelSettings.uplink_enabled', index=9, number=16, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='downlink_enabled', full_name='ChannelSettings.downlink_enabled', index=10, number=17, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -199,7 +188,6 @@ _CHANNEL = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='index', full_name='Channel.index', index=0, @@ -207,21 +195,21 @@ _CHANNEL = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='settings', full_name='Channel.settings', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='role', full_name='Channel.role', index=2, number=3, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], diff --git a/meshtastic/channel_pb2.py-E b/meshtastic/channel_pb2.py-E new file mode 100644 index 0000000..43ae666 --- /dev/null +++ b/meshtastic/channel_pb2.py-E @@ -0,0 +1,255 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: channel.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='channel.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\rChannelProtosH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\rchannel.proto\"\xe6\x02\n\x0f\x43hannelSettings\x12\x10\n\x08tx_power\x18\x01 \x01(\x05\x12\x32\n\x0cmodem_config\x18\x03 \x01(\x0e\x32\x1c.ChannelSettings.ModemConfig\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x15\n\rspread_factor\x18\x07 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x08 \x01(\r\x12\x13\n\x0b\x63hannel_num\x18\t \x01(\r\x12\x0b\n\x03psk\x18\x04 \x01(\x0c\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\n\n\x02id\x18\n \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x10 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x11 \x01(\x08\"`\n\x0bModemConfig\x12\x12\n\x0e\x42w125Cr45Sf128\x10\x00\x12\x12\n\x0e\x42w500Cr45Sf128\x10\x01\x12\x14\n\x10\x42w31_25Cr48Sf512\x10\x02\x12\x13\n\x0f\x42w125Cr48Sf4096\x10\x03\"\x8b\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\"\n\x08settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x12\x1b\n\x04role\x18\x03 \x01(\x0e\x32\r.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42I\n\x13\x63om.geeksville.meshB\rChannelProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + + + +_CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor( + name='ModemConfig', + full_name='ChannelSettings.ModemConfig', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='Bw125Cr45Sf128', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Bw500Cr45Sf128', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Bw31_25Cr48Sf512', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Bw125Cr48Sf4096', index=3, number=3, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=280, + serialized_end=376, +) +_sym_db.RegisterEnumDescriptor(_CHANNELSETTINGS_MODEMCONFIG) + +_CHANNEL_ROLE = _descriptor.EnumDescriptor( + name='Role', + full_name='Channel.Role', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DISABLED', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PRIMARY', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SECONDARY', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=470, + serialized_end=518, +) +_sym_db.RegisterEnumDescriptor(_CHANNEL_ROLE) + + +_CHANNELSETTINGS = _descriptor.Descriptor( + name='ChannelSettings', + full_name='ChannelSettings', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tx_power', full_name='ChannelSettings.tx_power', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='modem_config', full_name='ChannelSettings.modem_config', index=1, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='bandwidth', full_name='ChannelSettings.bandwidth', index=2, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='spread_factor', full_name='ChannelSettings.spread_factor', index=3, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='coding_rate', full_name='ChannelSettings.coding_rate', index=4, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='channel_num', full_name='ChannelSettings.channel_num', index=5, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='psk', full_name='ChannelSettings.psk', index=6, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ChannelSettings.name', index=7, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='ChannelSettings.id', index=8, + number=10, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='uplink_enabled', full_name='ChannelSettings.uplink_enabled', index=9, + number=16, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='downlink_enabled', full_name='ChannelSettings.downlink_enabled', index=10, + number=17, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CHANNELSETTINGS_MODEMCONFIG, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=18, + serialized_end=376, +) + + +_CHANNEL = _descriptor.Descriptor( + name='Channel', + full_name='Channel', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='index', full_name='Channel.index', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='settings', full_name='Channel.settings', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='role', full_name='Channel.role', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CHANNEL_ROLE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=379, + serialized_end=518, +) + +_CHANNELSETTINGS.fields_by_name['modem_config'].enum_type = _CHANNELSETTINGS_MODEMCONFIG +_CHANNELSETTINGS_MODEMCONFIG.containing_type = _CHANNELSETTINGS +_CHANNEL.fields_by_name['settings'].message_type = _CHANNELSETTINGS +_CHANNEL.fields_by_name['role'].enum_type = _CHANNEL_ROLE +_CHANNEL_ROLE.containing_type = _CHANNEL +DESCRIPTOR.message_types_by_name['ChannelSettings'] = _CHANNELSETTINGS +DESCRIPTOR.message_types_by_name['Channel'] = _CHANNEL +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ChannelSettings = _reflection.GeneratedProtocolMessageType('ChannelSettings', (_message.Message,), { + 'DESCRIPTOR' : _CHANNELSETTINGS, + '__module__' : 'channel_pb2' + # @@protoc_insertion_point(class_scope:ChannelSettings) + }) +_sym_db.RegisterMessage(ChannelSettings) + +Channel = _reflection.GeneratedProtocolMessageType('Channel', (_message.Message,), { + 'DESCRIPTOR' : _CHANNEL, + '__module__' : 'channel_pb2' + # @@protoc_insertion_point(class_scope:Channel) + }) +_sym_db.RegisterMessage(Channel) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/deviceonly_pb2.py b/meshtastic/deviceonly_pb2.py index f387adf..ee22006 100644 --- a/meshtastic/deviceonly_pb2.py +++ b/meshtastic/deviceonly_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: deviceonly.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -21,7 +21,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\nDeviceOnlyH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\x10\x64\x65viceonly.proto\x1a\nmesh.proto\x1a\rchannel.proto\x1a\x11radioconfig.proto\"\x80\x01\n\x11LegacyRadioConfig\x12\x39\n\x0bpreferences\x18\x01 \x01(\x0b\x32$.LegacyRadioConfig.LegacyPreferences\x1a\x30\n\x11LegacyPreferences\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\"\x8f\x02\n\x0b\x44\x65viceState\x12\'\n\x0blegacyRadio\x18\x01 \x01(\x0b\x32\x12.LegacyRadioConfig\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\x1a\n\x07node_db\x18\x04 \x03(\x0b\x32\t.NodeInfo\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07no_save\x18\t \x01(\x08\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08J\x04\x08\x0c\x10\r\")\n\x0b\x43hannelFile\x12\x1a\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x08.ChannelBF\n\x13\x63om.geeksville.meshB\nDeviceOnlyH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' , dependencies=[mesh__pb2.DESCRIPTOR,channel__pb2.DESCRIPTOR,radioconfig__pb2.DESCRIPTOR,]) @@ -35,7 +34,6 @@ _LEGACYRADIOCONFIG_LEGACYPREFERENCES = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='region', full_name='LegacyRadioConfig.LegacyPreferences.region', index=0, @@ -43,7 +41,7 @@ _LEGACYRADIOCONFIG_LEGACYPREFERENCES = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -66,7 +64,6 @@ _LEGACYRADIOCONFIG = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='preferences', full_name='LegacyRadioConfig.preferences', index=0, @@ -74,7 +71,7 @@ _LEGACYRADIOCONFIG = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -98,7 +95,6 @@ _DEVICESTATE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='legacyRadio', full_name='DeviceState.legacyRadio', index=0, @@ -106,63 +102,63 @@ _DEVICESTATE = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='my_node', full_name='DeviceState.my_node', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='owner', full_name='DeviceState.owner', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='node_db', full_name='DeviceState.node_db', index=3, number=4, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='receive_queue', full_name='DeviceState.receive_queue', index=4, number=5, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='version', full_name='DeviceState.version', index=5, number=8, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='rx_text_message', full_name='DeviceState.rx_text_message', index=6, number=7, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='no_save', full_name='DeviceState.no_save', index=7, number=9, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='did_gps_reset', full_name='DeviceState.did_gps_reset', index=8, number=11, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -186,7 +182,6 @@ _CHANNELFILE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='channels', full_name='ChannelFile.channels', index=0, @@ -194,7 +189,7 @@ _CHANNELFILE = _descriptor.Descriptor( has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], diff --git a/meshtastic/deviceonly_pb2.py-E b/meshtastic/deviceonly_pb2.py-E new file mode 100644 index 0000000..8a4580a --- /dev/null +++ b/meshtastic/deviceonly_pb2.py-E @@ -0,0 +1,255 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: deviceonly.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import mesh_pb2 as mesh__pb2 +import channel_pb2 as channel__pb2 +import radioconfig_pb2 as radioconfig__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='deviceonly.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\nDeviceOnlyH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x10\x64\x65viceonly.proto\x1a\nmesh.proto\x1a\rchannel.proto\x1a\x11radioconfig.proto\"\x80\x01\n\x11LegacyRadioConfig\x12\x39\n\x0bpreferences\x18\x01 \x01(\x0b\x32$.LegacyRadioConfig.LegacyPreferences\x1a\x30\n\x11LegacyPreferences\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\"\x8f\x02\n\x0b\x44\x65viceState\x12\'\n\x0blegacyRadio\x18\x01 \x01(\x0b\x32\x12.LegacyRadioConfig\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\x1a\n\x07node_db\x18\x04 \x03(\x0b\x32\t.NodeInfo\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07no_save\x18\t \x01(\x08\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08J\x04\x08\x0c\x10\r\")\n\x0b\x43hannelFile\x12\x1a\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x08.ChannelBF\n\x13\x63om.geeksville.meshB\nDeviceOnlyH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + , + dependencies=[mesh__pb2.DESCRIPTOR,channel__pb2.DESCRIPTOR,radioconfig__pb2.DESCRIPTOR,]) + + + + +_LEGACYRADIOCONFIG_LEGACYPREFERENCES = _descriptor.Descriptor( + name='LegacyPreferences', + full_name='LegacyRadioConfig.LegacyPreferences', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='region', full_name='LegacyRadioConfig.LegacyPreferences.region', index=0, + number=15, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=147, + serialized_end=195, +) + +_LEGACYRADIOCONFIG = _descriptor.Descriptor( + name='LegacyRadioConfig', + full_name='LegacyRadioConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='preferences', full_name='LegacyRadioConfig.preferences', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_LEGACYRADIOCONFIG_LEGACYPREFERENCES, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=67, + serialized_end=195, +) + + +_DEVICESTATE = _descriptor.Descriptor( + name='DeviceState', + full_name='DeviceState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='legacyRadio', full_name='DeviceState.legacyRadio', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='my_node', full_name='DeviceState.my_node', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='owner', full_name='DeviceState.owner', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_db', full_name='DeviceState.node_db', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='receive_queue', full_name='DeviceState.receive_queue', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='version', full_name='DeviceState.version', index=5, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rx_text_message', full_name='DeviceState.rx_text_message', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='no_save', full_name='DeviceState.no_save', index=7, + number=9, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='did_gps_reset', full_name='DeviceState.did_gps_reset', index=8, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=198, + serialized_end=469, +) + + +_CHANNELFILE = _descriptor.Descriptor( + name='ChannelFile', + full_name='ChannelFile', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='channels', full_name='ChannelFile.channels', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=471, + serialized_end=512, +) + +_LEGACYRADIOCONFIG_LEGACYPREFERENCES.fields_by_name['region'].enum_type = radioconfig__pb2._REGIONCODE +_LEGACYRADIOCONFIG_LEGACYPREFERENCES.containing_type = _LEGACYRADIOCONFIG +_LEGACYRADIOCONFIG.fields_by_name['preferences'].message_type = _LEGACYRADIOCONFIG_LEGACYPREFERENCES +_DEVICESTATE.fields_by_name['legacyRadio'].message_type = _LEGACYRADIOCONFIG +_DEVICESTATE.fields_by_name['my_node'].message_type = mesh__pb2._MYNODEINFO +_DEVICESTATE.fields_by_name['owner'].message_type = mesh__pb2._USER +_DEVICESTATE.fields_by_name['node_db'].message_type = mesh__pb2._NODEINFO +_DEVICESTATE.fields_by_name['receive_queue'].message_type = mesh__pb2._MESHPACKET +_DEVICESTATE.fields_by_name['rx_text_message'].message_type = mesh__pb2._MESHPACKET +_CHANNELFILE.fields_by_name['channels'].message_type = channel__pb2._CHANNEL +DESCRIPTOR.message_types_by_name['LegacyRadioConfig'] = _LEGACYRADIOCONFIG +DESCRIPTOR.message_types_by_name['DeviceState'] = _DEVICESTATE +DESCRIPTOR.message_types_by_name['ChannelFile'] = _CHANNELFILE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +LegacyRadioConfig = _reflection.GeneratedProtocolMessageType('LegacyRadioConfig', (_message.Message,), { + + 'LegacyPreferences' : _reflection.GeneratedProtocolMessageType('LegacyPreferences', (_message.Message,), { + 'DESCRIPTOR' : _LEGACYRADIOCONFIG_LEGACYPREFERENCES, + '__module__' : 'deviceonly_pb2' + # @@protoc_insertion_point(class_scope:LegacyRadioConfig.LegacyPreferences) + }) + , + 'DESCRIPTOR' : _LEGACYRADIOCONFIG, + '__module__' : 'deviceonly_pb2' + # @@protoc_insertion_point(class_scope:LegacyRadioConfig) + }) +_sym_db.RegisterMessage(LegacyRadioConfig) +_sym_db.RegisterMessage(LegacyRadioConfig.LegacyPreferences) + +DeviceState = _reflection.GeneratedProtocolMessageType('DeviceState', (_message.Message,), { + 'DESCRIPTOR' : _DEVICESTATE, + '__module__' : 'deviceonly_pb2' + # @@protoc_insertion_point(class_scope:DeviceState) + }) +_sym_db.RegisterMessage(DeviceState) + +ChannelFile = _reflection.GeneratedProtocolMessageType('ChannelFile', (_message.Message,), { + 'DESCRIPTOR' : _CHANNELFILE, + '__module__' : 'deviceonly_pb2' + # @@protoc_insertion_point(class_scope:ChannelFile) + }) +_sym_db.RegisterMessage(ChannelFile) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/environmental_measurement_pb2.py b/meshtastic/environmental_measurement_pb2.py index 788c9c1..302fc24 100644 --- a/meshtastic/environmental_measurement_pb2.py +++ b/meshtastic/environmental_measurement_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: environmental_measurement.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -18,7 +18,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\x1f\x65nvironmental_measurement.proto\"g\n\x18\x45nvironmentalMeasurement\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x42#Z!github.com/meshtastic/gomeshprotob\x06proto3' ) @@ -31,7 +30,6 @@ _ENVIRONMENTALMEASUREMENT = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='temperature', full_name='EnvironmentalMeasurement.temperature', index=0, @@ -39,21 +37,21 @@ _ENVIRONMENTALMEASUREMENT = _descriptor.Descriptor( has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='relative_humidity', full_name='EnvironmentalMeasurement.relative_humidity', index=1, number=2, type=2, cpp_type=6, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='barometric_pressure', full_name='EnvironmentalMeasurement.barometric_pressure', index=2, number=3, type=2, cpp_type=6, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], diff --git a/meshtastic/environmental_measurement_pb2.py-E b/meshtastic/environmental_measurement_pb2.py-E new file mode 100644 index 0000000..302fc24 --- /dev/null +++ b/meshtastic/environmental_measurement_pb2.py-E @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: environmental_measurement.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='environmental_measurement.proto', + package='', + syntax='proto3', + serialized_options=b'Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x1f\x65nvironmental_measurement.proto\"g\n\x18\x45nvironmentalMeasurement\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x42#Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + + + + +_ENVIRONMENTALMEASUREMENT = _descriptor.Descriptor( + name='EnvironmentalMeasurement', + full_name='EnvironmentalMeasurement', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='temperature', full_name='EnvironmentalMeasurement.temperature', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='relative_humidity', full_name='EnvironmentalMeasurement.relative_humidity', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='barometric_pressure', full_name='EnvironmentalMeasurement.barometric_pressure', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=35, + serialized_end=138, +) + +DESCRIPTOR.message_types_by_name['EnvironmentalMeasurement'] = _ENVIRONMENTALMEASUREMENT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +EnvironmentalMeasurement = _reflection.GeneratedProtocolMessageType('EnvironmentalMeasurement', (_message.Message,), { + 'DESCRIPTOR' : _ENVIRONMENTALMEASUREMENT, + '__module__' : 'environmental_measurement_pb2' + # @@protoc_insertion_point(class_scope:EnvironmentalMeasurement) + }) +_sym_db.RegisterMessage(EnvironmentalMeasurement) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/mesh_pb2.py b/meshtastic/mesh_pb2.py index d9ad018..d3f965b 100644 --- a/meshtastic/mesh_pb2.py +++ b/meshtastic/mesh_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: mesh.proto -"""Generated protocol buffer code.""" + from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message @@ -20,8 +20,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\nMeshProtosH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"\x94\x06\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07\x12,\n\x0flocation_source\x18\n \x01(\x0e\x32\x13.Position.LocSource\x12,\n\x0f\x61ltitude_source\x18\x0b \x01(\x0e\x32\x13.Position.AltSource\x12\x15\n\rpos_timestamp\x18\x0c \x01(\x07\x12\x17\n\x0fpos_time_millis\x18\r \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\x0e \x01(\x11\x12\x15\n\ralt_geoid_sep\x18\x0f \x01(\x11\x12\x0c\n\x04PDOP\x18\x10 \x01(\r\x12\x0c\n\x04HDOP\x18\x11 \x01(\r\x12\x0c\n\x04VDOP\x18\x12 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x13 \x01(\r\x12\x14\n\x0cground_speed\x18\x14 \x01(\r\x12\x14\n\x0cground_track\x18\x15 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x16 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x17 \x01(\r\x12\x14\n\x0csats_in_view\x18\x18 \x01(\r\x12\x11\n\tsensor_id\x18\x19 \x01(\r\x12\x17\n\x0fpos_next_update\x18( \x01(\r\x12\x16\n\x0epos_seq_number\x18) \x01(\r\"n\n\tLocSource\x12\x16\n\x12LOCSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13LOCSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13LOCSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13LOCSRC_GPS_EXTERNAL\x10\x03\"\x85\x01\n\tAltSource\x12\x16\n\x12\x41LTSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13\x41LTSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13\x41LTSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13\x41LTSRC_GPS_EXTERNAL\x10\x03\x12\x15\n\x11\x41LTSRC_BAROMETRIC\x10\x04J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\x96\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\x12 \n\x08hw_model\x18\x06 \x01(\x0e\x32\x0e.HardwareModel\x12\x13\n\x0bis_licensed\x18\x07 \x01(\x08\x12\x13\n\x04team\x18\x08 \x01(\x0e\x32\x05.Team\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x07\"\xc5\x02\n\x07Routing\x12(\n\rroute_request\x18\x01 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x0e.Routing.ErrorH\x00\"\xb4\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"{\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\"\xe0\x02\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12\x18\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x05.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x12&\n\x08priority\x18\x0c \x01(\x0e\x32\x14.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\r \x01(\x05\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\x42\x10\n\x0epayloadVariant\"j\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\x12\x12\n\nlast_heard\x18\x04 \x01(\x07\"\xcb\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x11\n\tnum_bands\x18\x03 \x01(\r\x12\x14\n\x0cmax_channels\x18\x0f \x01(\r\x12\x12\n\x06region\x18\x04 \x01(\tB\x02\x18\x01\x12\x1f\n\x13hw_model_deprecated\x18\x05 \x01(\tB\x02\x18\x01\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12&\n\nerror_code\x18\x07 \x01(\x0e\x32\x12.CriticalErrorCode\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x14\n\x0creboot_count\x18\n \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xb5\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x1f\n\x05level\x18\x04 \x01(\x0e\x32\x10.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"\xe9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x0b \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12 \n\nlog_record\x18\x07 \x01(\x0b\x32\n.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\x10\n\x0epayloadVariantJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\"\xe1\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12&\n\tpeer_info\x18\x03 \x01(\x0b\x32\x11.ToRadio.PeerInfoH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12\x14\n\ndisconnect\x18h \x01(\x08H\x00\x1a\x35\n\x08PeerInfo\x12\x13\n\x0b\x61pp_version\x18\x01 \x01(\r\x12\x14\n\x0cmqtt_gateway\x18\x02 \x01(\x08\x42\x10\n\x0epayloadVariantJ\x04\x08\x01\x10\x02J\x04\x08\x65\x10\x66J\x04\x08\x66\x10gJ\x04\x08g\x10h*\xac\x02\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1p6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0c\n\x08TBEAM0p7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1p3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'*\xb5\x01\n\x04Team\x12\t\n\x05\x43LEAR\x10\x00\x12\x08\n\x04\x43YAN\x10\x01\x12\t\n\x05WHITE\x10\x02\x12\n\n\x06YELLOW\x10\x03\x12\n\n\x06ORANGE\x10\x04\x12\x0b\n\x07MAGENTA\x10\x05\x12\x07\n\x03RED\x10\x06\x12\n\n\x06MAROON\x10\x07\x12\n\n\x06PURPLE\x10\x08\x12\r\n\tDARK_BLUE\x10\t\x12\x08\n\x04\x42LUE\x10\n\x12\x08\n\x04TEAL\x10\x0b\x12\t\n\x05GREEN\x10\x0c\x12\x0e\n\nDARK_GREEN\x10\r\x12\t\n\x05\x42ROWN\x10\x0e*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xe1\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04None\x10\x00\x12\x0e\n\nTxWatchdog\x10\x01\x12\x12\n\x0eSleepEnterWait\x10\x02\x12\x0b\n\x07NoRadio\x10\x03\x12\x0f\n\x0bUnspecified\x10\x04\x12\x13\n\x0fUBloxInitFailed\x10\x05\x12\x0c\n\x08NoAXP192\x10\x06\x12\x17\n\x13InvalidRadioSetting\x10\x07\x12\x12\n\x0eTransmitFailed\x10\x08\x12\x0c\n\x08\x42rownout\x10\t\x12\x11\n\rSX1262Failure\x10\n\x12\x0f\n\x0bRadioSpiBug\x10\x0b\x42\x46\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"\x94\x06\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07\x12,\n\x0flocation_source\x18\n \x01(\x0e\x32\x13.Position.LocSource\x12,\n\x0f\x61ltitude_source\x18\x0b \x01(\x0e\x32\x13.Position.AltSource\x12\x15\n\rpos_timestamp\x18\x0c \x01(\x07\x12\x17\n\x0fpos_time_millis\x18\r \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\x0e \x01(\x11\x12\x15\n\ralt_geoid_sep\x18\x0f \x01(\x11\x12\x0c\n\x04PDOP\x18\x10 \x01(\r\x12\x0c\n\x04HDOP\x18\x11 \x01(\r\x12\x0c\n\x04VDOP\x18\x12 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x13 \x01(\r\x12\x14\n\x0cground_speed\x18\x14 \x01(\r\x12\x14\n\x0cground_track\x18\x15 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x16 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x17 \x01(\r\x12\x14\n\x0csats_in_view\x18\x18 \x01(\r\x12\x11\n\tsensor_id\x18\x19 \x01(\r\x12\x17\n\x0fpos_next_update\x18( \x01(\r\x12\x16\n\x0epos_seq_number\x18) \x01(\r\"n\n\tLocSource\x12\x16\n\x12LOCSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13LOCSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13LOCSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13LOCSRC_GPS_EXTERNAL\x10\x03\"\x85\x01\n\tAltSource\x12\x16\n\x12\x41LTSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13\x41LTSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13\x41LTSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13\x41LTSRC_GPS_EXTERNAL\x10\x03\x12\x15\n\x11\x41LTSRC_BAROMETRIC\x10\x04J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\xd7\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\x12 \n\x08hw_model\x18\x06 \x01(\x0e\x32\x0e.HardwareModel\x12\x13\n\x0bis_licensed\x18\x07 \x01(\x08\x12\x13\n\x04team\x18\x08 \x01(\x0e\x32\x05.Team\x12\x14\n\x0ctx_power_dbm\x18\n \x01(\r\x12\x14\n\x0c\x61nt_gain_dbi\x18\x0b \x01(\r\x12\x13\n\x0b\x61nt_azimuth\x18\x0c \x01(\r\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x07\"\xc5\x02\n\x07Routing\x12(\n\rroute_request\x18\x01 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x0e.Routing.ErrorH\x00\"\xb4\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"{\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\"\xe0\x02\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12\x18\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x05.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x12&\n\x08priority\x18\x0c \x01(\x0e\x32\x14.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\r \x01(\x05\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\x42\x10\n\x0epayloadVariant\"j\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\x12\x12\n\nlast_heard\x18\x04 \x01(\x07\"\xcb\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x11\n\tnum_bands\x18\x03 \x01(\r\x12\x14\n\x0cmax_channels\x18\x0f \x01(\r\x12\x12\n\x06region\x18\x04 \x01(\tB\x02\x18\x01\x12\x1f\n\x13hw_model_deprecated\x18\x05 \x01(\tB\x02\x18\x01\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12&\n\nerror_code\x18\x07 \x01(\x0e\x32\x12.CriticalErrorCode\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x14\n\x0creboot_count\x18\n \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xb5\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x1f\n\x05level\x18\x04 \x01(\x0e\x32\x10.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"\xe9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x0b \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12 \n\nlog_record\x18\x07 \x01(\x0b\x32\n.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\x10\n\x0epayloadVariantJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\"\xe1\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12&\n\tpeer_info\x18\x03 \x01(\x0b\x32\x11.ToRadio.PeerInfoH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12\x14\n\ndisconnect\x18h \x01(\x08H\x00\x1a\x35\n\x08PeerInfo\x12\x13\n\x0b\x61pp_version\x18\x01 \x01(\r\x12\x14\n\x0cmqtt_gateway\x18\x02 \x01(\x08\x42\x10\n\x0epayloadVariantJ\x04\x08\x01\x10\x02J\x04\x08\x65\x10\x66J\x04\x08\x66\x10gJ\x04\x08g\x10h*\xac\x02\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1p6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0c\n\x08TBEAM0p7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1p3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'*\xb5\x01\n\x04Team\x12\t\n\x05\x43LEAR\x10\x00\x12\x08\n\x04\x43YAN\x10\x01\x12\t\n\x05WHITE\x10\x02\x12\n\n\x06YELLOW\x10\x03\x12\n\n\x06ORANGE\x10\x04\x12\x0b\n\x07MAGENTA\x10\x05\x12\x07\n\x03RED\x10\x06\x12\n\n\x06MAROON\x10\x07\x12\n\n\x06PURPLE\x10\x08\x12\r\n\tDARK_BLUE\x10\t\x12\x08\n\x04\x42LUE\x10\n\x12\x08\n\x04TEAL\x10\x0b\x12\t\n\x05GREEN\x10\x0c\x12\x0e\n\nDARK_GREEN\x10\r\x12\t\n\x05\x42ROWN\x10\x0e*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xe1\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04None\x10\x00\x12\x0e\n\nTxWatchdog\x10\x01\x12\x12\n\x0eSleepEnterWait\x10\x02\x12\x0b\n\x07NoRadio\x10\x03\x12\x0f\n\x0bUnspecified\x10\x04\x12\x13\n\x0fUBloxInitFailed\x10\x05\x12\x0c\n\x08NoAXP192\x10\x06\x12\x17\n\x13InvalidRadioSetting\x10\x07\x12\x12\n\x0eTransmitFailed\x10\x08\x12\x0c\n\x08\x42rownout\x10\t\x12\x11\n\rSX1262Failure\x10\n\x12\x0f\n\x0bRadioSpiBug\x10\x0b\x42\x46\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' , dependencies=[portnums__pb2.DESCRIPTOR,]) @@ -30,108 +29,88 @@ _HARDWAREMODEL = _descriptor.EnumDescriptor( full_name='HardwareModel', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='UNSET', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TLORA_V2', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TLORA_V1', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TLORA_V2_1_1p6', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TBEAM', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='HELTEC_V2_0', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TBEAM0p7', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='T_ECHO', index=7, number=7, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TLORA_V1_1p3', index=8, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='RAK4631', index=9, number=9, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='HELTEC_V2_1', index=10, number=10, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='LORA_RELAY_V1', index=11, number=32, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NRF52840DK', index=12, number=33, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='PPR', index=13, number=34, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GENIEBLOCKS', index=14, number=35, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NRF52_UNKNOWN', index=15, number=36, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='PORTDUINO', index=16, number=37, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ANDROID_SIM', index=17, number=38, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DIY_V1', index=18, number=39, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2906, - serialized_end=3206, + serialized_start=2971, + serialized_end=3271, ) _sym_db.RegisterEnumDescriptor(_HARDWAREMODEL) @@ -141,88 +120,72 @@ _TEAM = _descriptor.EnumDescriptor( full_name='Team', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='CLEAR', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='CYAN', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='WHITE', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='YELLOW', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ORANGE', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MAGENTA', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='RED', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MAROON', index=7, number=7, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='PURPLE', index=8, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DARK_BLUE', index=9, number=9, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='BLUE', index=10, number=10, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TEAL', index=11, number=11, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GREEN', index=12, number=12, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DARK_GREEN', index=13, number=13, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='BROWN', index=14, number=14, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=3209, - serialized_end=3390, + serialized_start=3274, + serialized_end=3455, ) _sym_db.RegisterEnumDescriptor(_TEAM) @@ -232,23 +195,20 @@ _CONSTANTS = _descriptor.EnumDescriptor( full_name='Constants', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='Unused', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DATA_PAYLOAD_LEN', index=1, number=237, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=3392, - serialized_end=3438, + serialized_start=3457, + serialized_end=3503, ) _sym_db.RegisterEnumDescriptor(_CONSTANTS) @@ -258,73 +218,60 @@ _CRITICALERRORCODE = _descriptor.EnumDescriptor( full_name='CriticalErrorCode', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='None', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TxWatchdog', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='SleepEnterWait', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NoRadio', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='Unspecified', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='UBloxInitFailed', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NoAXP192', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='InvalidRadioSetting', index=7, number=7, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TransmitFailed', index=8, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='Brownout', index=9, number=9, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='SX1262Failure', index=10, number=10, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='RadioSpiBug', index=11, number=11, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=3441, - serialized_end=3666, + serialized_start=3506, + serialized_end=3731, ) _sym_db.RegisterEnumDescriptor(_CRITICALERRORCODE) @@ -384,28 +331,23 @@ _POSITION_LOCSOURCE = _descriptor.EnumDescriptor( full_name='Position.LocSource', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='LOCSRC_UNSPECIFIED', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='LOCSRC_MANUAL_ENTRY', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='LOCSRC_GPS_INTERNAL', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='LOCSRC_GPS_EXTERNAL', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, @@ -419,33 +361,27 @@ _POSITION_ALTSOURCE = _descriptor.EnumDescriptor( full_name='Position.AltSource', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='ALTSRC_UNSPECIFIED', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ALTSRC_MANUAL_ENTRY', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ALTSRC_GPS_INTERNAL', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ALTSRC_GPS_EXTERNAL', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ALTSRC_BAROMETRIC', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, @@ -459,68 +395,56 @@ _ROUTING_ERROR = _descriptor.EnumDescriptor( full_name='Routing.Error', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='NONE', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NO_ROUTE', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GOT_NAK', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TIMEOUT', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NO_INTERFACE', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MAX_RETRANSMIT', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NO_CHANNEL', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TOO_LARGE', index=7, number=7, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NO_RESPONSE', index=8, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='BAD_REQUEST', index=9, number=32, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NOT_AUTHORIZED', index=10, number=33, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=1142, - serialized_end=1322, + serialized_start=1207, + serialized_end=1387, ) _sym_db.RegisterEnumDescriptor(_ROUTING_ERROR) @@ -529,48 +453,40 @@ _MESHPACKET_PRIORITY = _descriptor.EnumDescriptor( full_name='MeshPacket.Priority', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='UNSET', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MIN', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='BACKGROUND', index=2, number=10, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DEFAULT', index=3, number=64, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='RELIABLE', index=4, number=70, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ACK', index=5, number=120, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MAX', index=6, number=127, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=1704, - serialized_end=1795, + serialized_start=1769, + serialized_end=1860, ) _sym_db.RegisterEnumDescriptor(_MESHPACKET_PRIORITY) @@ -579,48 +495,40 @@ _LOGRECORD_LEVEL = _descriptor.EnumDescriptor( full_name='LogRecord.Level', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='UNSET', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='CRITICAL', index=1, number=50, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ERROR', index=2, number=40, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='WARNING', index=3, number=30, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='INFO', index=4, number=20, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DEBUG', index=5, number=10, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TRACE', index=6, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2351, - serialized_end=2439, + serialized_start=2416, + serialized_end=2504, ) _sym_db.RegisterEnumDescriptor(_LOGRECORD_LEVEL) @@ -631,7 +539,6 @@ _POSITION = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='latitude_i', full_name='Position.latitude_i', index=0, @@ -639,161 +546,161 @@ _POSITION = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='longitude_i', full_name='Position.longitude_i', index=1, number=2, type=15, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='altitude', full_name='Position.altitude', index=2, number=3, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='battery_level', full_name='Position.battery_level', index=3, number=4, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='time', full_name='Position.time', index=4, number=9, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='location_source', full_name='Position.location_source', index=5, number=10, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='altitude_source', full_name='Position.altitude_source', index=6, number=11, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='pos_timestamp', full_name='Position.pos_timestamp', index=7, number=12, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='pos_time_millis', full_name='Position.pos_time_millis', index=8, number=13, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='altitude_hae', full_name='Position.altitude_hae', index=9, number=14, type=17, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='alt_geoid_sep', full_name='Position.alt_geoid_sep', index=10, number=15, type=17, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='PDOP', full_name='Position.PDOP', index=11, number=16, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='HDOP', full_name='Position.HDOP', index=12, number=17, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='VDOP', full_name='Position.VDOP', index=13, number=18, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='gps_accuracy', full_name='Position.gps_accuracy', index=14, number=19, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='ground_speed', full_name='Position.ground_speed', index=15, number=20, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='ground_track', full_name='Position.ground_track', index=16, number=21, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='fix_quality', full_name='Position.fix_quality', index=17, number=22, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='fix_type', full_name='Position.fix_type', index=18, number=23, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='sats_in_view', full_name='Position.sats_in_view', index=19, number=24, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='sensor_id', full_name='Position.sensor_id', index=20, number=25, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='pos_next_update', full_name='Position.pos_next_update', index=21, number=40, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='pos_seq_number', full_name='Position.pos_seq_number', index=22, number=41, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -819,7 +726,6 @@ _USER = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='id', full_name='User.id', index=0, @@ -827,49 +733,70 @@ _USER = _descriptor.Descriptor( has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='long_name', full_name='User.long_name', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='short_name', full_name='User.short_name', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='macaddr', full_name='User.macaddr', index=3, number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='hw_model', full_name='User.hw_model', index=4, number=6, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='is_licensed', full_name='User.is_licensed', index=5, number=7, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='team', full_name='User.team', index=6, number=8, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tx_power_dbm', full_name='User.tx_power_dbm', index=7, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ant_gain_dbi', full_name='User.ant_gain_dbi', index=8, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ant_azimuth', full_name='User.ant_azimuth', index=9, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -883,7 +810,7 @@ _USER = _descriptor.Descriptor( oneofs=[ ], serialized_start=822, - serialized_end=972, + serialized_end=1037, ) @@ -893,7 +820,6 @@ _ROUTEDISCOVERY = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='route', full_name='RouteDiscovery.route', index=0, @@ -901,7 +827,7 @@ _ROUTEDISCOVERY = _descriptor.Descriptor( has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -914,8 +840,8 @@ _ROUTEDISCOVERY = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=974, - serialized_end=1005, + serialized_start=1039, + serialized_end=1070, ) @@ -925,7 +851,6 @@ _ROUTING = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='route_request', full_name='Routing.route_request', index=0, @@ -933,21 +858,21 @@ _ROUTING = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='route_reply', full_name='Routing.route_reply', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='error_reason', full_name='Routing.error_reason', index=2, number=3, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -962,12 +887,10 @@ _ROUTING = _descriptor.Descriptor( oneofs=[ _descriptor.OneofDescriptor( name='variant', full_name='Routing.variant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + index=0, containing_type=None, fields=[]), ], - serialized_start=1008, - serialized_end=1333, + serialized_start=1073, + serialized_end=1398, ) @@ -977,7 +900,6 @@ _DATA = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='portnum', full_name='Data.portnum', index=0, @@ -985,42 +907,42 @@ _DATA = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='payload', full_name='Data.payload', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='want_response', full_name='Data.want_response', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='dest', full_name='Data.dest', index=3, number=4, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='source', full_name='Data.source', index=4, number=5, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='request_id', full_name='Data.request_id', index=5, number=6, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1033,8 +955,8 @@ _DATA = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1335, - serialized_end=1458, + serialized_start=1400, + serialized_end=1523, ) @@ -1044,7 +966,6 @@ _MESHPACKET = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='from', full_name='MeshPacket.from', index=0, @@ -1052,84 +973,84 @@ _MESHPACKET = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='to', full_name='MeshPacket.to', index=1, number=2, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='channel', full_name='MeshPacket.channel', index=2, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='decoded', full_name='MeshPacket.decoded', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='encrypted', full_name='MeshPacket.encrypted', index=4, number=5, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='id', full_name='MeshPacket.id', index=5, number=6, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='rx_time', full_name='MeshPacket.rx_time', index=6, number=7, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='rx_snr', full_name='MeshPacket.rx_snr', index=7, number=8, type=2, cpp_type=6, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='hop_limit', full_name='MeshPacket.hop_limit', index=8, number=10, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='want_ack', full_name='MeshPacket.want_ack', index=9, number=11, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='priority', full_name='MeshPacket.priority', index=10, number=12, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='rx_rssi', full_name='MeshPacket.rx_rssi', index=11, number=13, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1144,12 +1065,10 @@ _MESHPACKET = _descriptor.Descriptor( oneofs=[ _descriptor.OneofDescriptor( name='payloadVariant', full_name='MeshPacket.payloadVariant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + index=0, containing_type=None, fields=[]), ], - serialized_start=1461, - serialized_end=1813, + serialized_start=1526, + serialized_end=1878, ) @@ -1159,7 +1078,6 @@ _NODEINFO = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='num', full_name='NodeInfo.num', index=0, @@ -1167,35 +1085,35 @@ _NODEINFO = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='user', full_name='NodeInfo.user', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='position', full_name='NodeInfo.position', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='snr', full_name='NodeInfo.snr', index=3, number=7, type=2, cpp_type=6, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='last_heard', full_name='NodeInfo.last_heard', index=4, number=4, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1208,8 +1126,8 @@ _NODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1815, - serialized_end=1921, + serialized_start=1880, + serialized_end=1986, ) @@ -1219,7 +1137,6 @@ _MYNODEINFO = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='my_node_num', full_name='MyNodeInfo.my_node_num', index=0, @@ -1227,91 +1144,91 @@ _MYNODEINFO = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='has_gps', full_name='MyNodeInfo.has_gps', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='num_bands', full_name='MyNodeInfo.num_bands', index=2, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='max_channels', full_name='MyNodeInfo.max_channels', index=3, number=15, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='region', full_name='MyNodeInfo.region', index=4, number=4, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'\030\001', file=DESCRIPTOR), _descriptor.FieldDescriptor( name='hw_model_deprecated', full_name='MyNodeInfo.hw_model_deprecated', index=5, number=5, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'\030\001', file=DESCRIPTOR), _descriptor.FieldDescriptor( name='firmware_version', full_name='MyNodeInfo.firmware_version', index=6, number=6, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='error_code', full_name='MyNodeInfo.error_code', index=7, number=7, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='error_address', full_name='MyNodeInfo.error_address', index=8, number=8, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='error_count', full_name='MyNodeInfo.error_count', index=9, number=9, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='reboot_count', full_name='MyNodeInfo.reboot_count', index=10, number=10, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=11, number=13, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='min_app_version', full_name='MyNodeInfo.min_app_version', index=12, number=14, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1324,8 +1241,8 @@ _MYNODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1924, - serialized_end=2255, + serialized_start=1989, + serialized_end=2320, ) @@ -1335,7 +1252,6 @@ _LOGRECORD = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='message', full_name='LogRecord.message', index=0, @@ -1343,28 +1259,28 @@ _LOGRECORD = _descriptor.Descriptor( has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='time', full_name='LogRecord.time', index=1, number=2, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='source', full_name='LogRecord.source', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='level', full_name='LogRecord.level', index=3, number=4, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1378,8 +1294,8 @@ _LOGRECORD = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2258, - serialized_end=2439, + serialized_start=2323, + serialized_end=2504, ) @@ -1389,7 +1305,6 @@ _FROMRADIO = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='num', full_name='FromRadio.num', index=0, @@ -1397,49 +1312,49 @@ _FROMRADIO = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='packet', full_name='FromRadio.packet', index=1, number=11, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='my_info', full_name='FromRadio.my_info', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='node_info', full_name='FromRadio.node_info', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='log_record', full_name='FromRadio.log_record', index=4, number=7, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='config_complete_id', full_name='FromRadio.config_complete_id', index=5, number=8, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='rebooted', full_name='FromRadio.rebooted', index=6, number=9, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1453,12 +1368,10 @@ _FROMRADIO = _descriptor.Descriptor( oneofs=[ _descriptor.OneofDescriptor( name='payloadVariant', full_name='FromRadio.payloadVariant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + index=0, containing_type=None, fields=[]), ], - serialized_start=2442, - serialized_end=2675, + serialized_start=2507, + serialized_end=2740, ) @@ -1468,7 +1381,6 @@ _TORADIO_PEERINFO = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='app_version', full_name='ToRadio.PeerInfo.app_version', index=0, @@ -1476,14 +1388,14 @@ _TORADIO_PEERINFO = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='mqtt_gateway', full_name='ToRadio.PeerInfo.mqtt_gateway', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1496,8 +1408,8 @@ _TORADIO_PEERINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2808, - serialized_end=2861, + serialized_start=2873, + serialized_end=2926, ) _TORADIO = _descriptor.Descriptor( @@ -1506,7 +1418,6 @@ _TORADIO = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='packet', full_name='ToRadio.packet', index=0, @@ -1514,28 +1425,28 @@ _TORADIO = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='peer_info', full_name='ToRadio.peer_info', index=1, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='want_config_id', full_name='ToRadio.want_config_id', index=2, number=100, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='disconnect', full_name='ToRadio.disconnect', index=3, number=104, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1549,12 +1460,10 @@ _TORADIO = _descriptor.Descriptor( oneofs=[ _descriptor.OneofDescriptor( name='payloadVariant', full_name='ToRadio.payloadVariant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + index=0, containing_type=None, fields=[]), ], - serialized_start=2678, - serialized_end=2903, + serialized_start=2743, + serialized_end=2968, ) _POSITION.fields_by_name['location_source'].enum_type = _POSITION_LOCSOURCE diff --git a/meshtastic/mesh_pb2.py-E b/meshtastic/mesh_pb2.py-E new file mode 100644 index 0000000..17e45a8 --- /dev/null +++ b/meshtastic/mesh_pb2.py-E @@ -0,0 +1,1646 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: mesh.proto + +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import portnums_pb2 as portnums__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='mesh.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\nMeshProtosH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"\x94\x06\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07\x12,\n\x0flocation_source\x18\n \x01(\x0e\x32\x13.Position.LocSource\x12,\n\x0f\x61ltitude_source\x18\x0b \x01(\x0e\x32\x13.Position.AltSource\x12\x15\n\rpos_timestamp\x18\x0c \x01(\x07\x12\x17\n\x0fpos_time_millis\x18\r \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\x0e \x01(\x11\x12\x15\n\ralt_geoid_sep\x18\x0f \x01(\x11\x12\x0c\n\x04PDOP\x18\x10 \x01(\r\x12\x0c\n\x04HDOP\x18\x11 \x01(\r\x12\x0c\n\x04VDOP\x18\x12 \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x13 \x01(\r\x12\x14\n\x0cground_speed\x18\x14 \x01(\r\x12\x14\n\x0cground_track\x18\x15 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x16 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x17 \x01(\r\x12\x14\n\x0csats_in_view\x18\x18 \x01(\r\x12\x11\n\tsensor_id\x18\x19 \x01(\r\x12\x17\n\x0fpos_next_update\x18( \x01(\r\x12\x16\n\x0epos_seq_number\x18) \x01(\r\"n\n\tLocSource\x12\x16\n\x12LOCSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13LOCSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13LOCSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13LOCSRC_GPS_EXTERNAL\x10\x03\"\x85\x01\n\tAltSource\x12\x16\n\x12\x41LTSRC_UNSPECIFIED\x10\x00\x12\x17\n\x13\x41LTSRC_MANUAL_ENTRY\x10\x01\x12\x17\n\x13\x41LTSRC_GPS_INTERNAL\x10\x02\x12\x17\n\x13\x41LTSRC_GPS_EXTERNAL\x10\x03\x12\x15\n\x11\x41LTSRC_BAROMETRIC\x10\x04J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\xd7\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\x12 \n\x08hw_model\x18\x06 \x01(\x0e\x32\x0e.HardwareModel\x12\x13\n\x0bis_licensed\x18\x07 \x01(\x08\x12\x13\n\x04team\x18\x08 \x01(\x0e\x32\x05.Team\x12\x14\n\x0ctx_power_dbm\x18\n \x01(\r\x12\x14\n\x0c\x61nt_gain_dbi\x18\x0b \x01(\r\x12\x13\n\x0b\x61nt_azimuth\x18\x0c \x01(\r\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x07\"\xc5\x02\n\x07Routing\x12(\n\rroute_request\x18\x01 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x0e.Routing.ErrorH\x00\"\xb4\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"{\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\"\xe0\x02\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12\x18\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x05.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x12&\n\x08priority\x18\x0c \x01(\x0e\x32\x14.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\r \x01(\x05\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\x42\x10\n\x0epayloadVariant\"j\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\x12\x12\n\nlast_heard\x18\x04 \x01(\x07\"\xcb\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x11\n\tnum_bands\x18\x03 \x01(\r\x12\x14\n\x0cmax_channels\x18\x0f \x01(\r\x12\x12\n\x06region\x18\x04 \x01(\tB\x02\x18\x01\x12\x1f\n\x13hw_model_deprecated\x18\x05 \x01(\tB\x02\x18\x01\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12&\n\nerror_code\x18\x07 \x01(\x0e\x32\x12.CriticalErrorCode\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x14\n\x0creboot_count\x18\n \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xb5\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x1f\n\x05level\x18\x04 \x01(\x0e\x32\x10.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"\xe9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x0b \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12 \n\nlog_record\x18\x07 \x01(\x0b\x32\n.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\x10\n\x0epayloadVariantJ\x04\x08\x02\x10\x03J\x04\x08\x06\x10\x07\"\xe1\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12&\n\tpeer_info\x18\x03 \x01(\x0b\x32\x11.ToRadio.PeerInfoH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12\x14\n\ndisconnect\x18h \x01(\x08H\x00\x1a\x35\n\x08PeerInfo\x12\x13\n\x0b\x61pp_version\x18\x01 \x01(\r\x12\x14\n\x0cmqtt_gateway\x18\x02 \x01(\x08\x42\x10\n\x0epayloadVariantJ\x04\x08\x01\x10\x02J\x04\x08\x65\x10\x66J\x04\x08\x66\x10gJ\x04\x08g\x10h*\xac\x02\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1p6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0c\n\x08TBEAM0p7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1p3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'*\xb5\x01\n\x04Team\x12\t\n\x05\x43LEAR\x10\x00\x12\x08\n\x04\x43YAN\x10\x01\x12\t\n\x05WHITE\x10\x02\x12\n\n\x06YELLOW\x10\x03\x12\n\n\x06ORANGE\x10\x04\x12\x0b\n\x07MAGENTA\x10\x05\x12\x07\n\x03RED\x10\x06\x12\n\n\x06MAROON\x10\x07\x12\n\n\x06PURPLE\x10\x08\x12\r\n\tDARK_BLUE\x10\t\x12\x08\n\x04\x42LUE\x10\n\x12\x08\n\x04TEAL\x10\x0b\x12\t\n\x05GREEN\x10\x0c\x12\x0e\n\nDARK_GREEN\x10\r\x12\t\n\x05\x42ROWN\x10\x0e*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xe1\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04None\x10\x00\x12\x0e\n\nTxWatchdog\x10\x01\x12\x12\n\x0eSleepEnterWait\x10\x02\x12\x0b\n\x07NoRadio\x10\x03\x12\x0f\n\x0bUnspecified\x10\x04\x12\x13\n\x0fUBloxInitFailed\x10\x05\x12\x0c\n\x08NoAXP192\x10\x06\x12\x17\n\x13InvalidRadioSetting\x10\x07\x12\x12\n\x0eTransmitFailed\x10\x08\x12\x0c\n\x08\x42rownout\x10\t\x12\x11\n\rSX1262Failure\x10\n\x12\x0f\n\x0bRadioSpiBug\x10\x0b\x42\x46\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + , + dependencies=[portnums__pb2.DESCRIPTOR,]) + +_HARDWAREMODEL = _descriptor.EnumDescriptor( + name='HardwareModel', + full_name='HardwareModel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNSET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TLORA_V2', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TLORA_V1', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TLORA_V2_1_1p6', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TBEAM', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HELTEC_V2_0', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TBEAM0p7', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='T_ECHO', index=7, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TLORA_V1_1p3', index=8, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RAK4631', index=9, number=9, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HELTEC_V2_1', index=10, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LORA_RELAY_V1', index=11, number=32, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NRF52840DK', index=12, number=33, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PPR', index=13, number=34, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GENIEBLOCKS', index=14, number=35, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NRF52_UNKNOWN', index=15, number=36, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PORTDUINO', index=16, number=37, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ANDROID_SIM', index=17, number=38, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DIY_V1', index=18, number=39, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2971, + serialized_end=3271, +) +_sym_db.RegisterEnumDescriptor(_HARDWAREMODEL) + +HardwareModel = enum_type_wrapper.EnumTypeWrapper(_HARDWAREMODEL) +_TEAM = _descriptor.EnumDescriptor( + name='Team', + full_name='Team', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='CLEAR', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CYAN', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WHITE', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='YELLOW', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ORANGE', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAGENTA', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RED', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAROON', index=7, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PURPLE', index=8, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DARK_BLUE', index=9, number=9, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BLUE', index=10, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TEAL', index=11, number=11, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GREEN', index=12, number=12, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DARK_GREEN', index=13, number=13, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BROWN', index=14, number=14, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3274, + serialized_end=3455, +) +_sym_db.RegisterEnumDescriptor(_TEAM) + +Team = enum_type_wrapper.EnumTypeWrapper(_TEAM) +_CONSTANTS = _descriptor.EnumDescriptor( + name='Constants', + full_name='Constants', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='Unused', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DATA_PAYLOAD_LEN', index=1, number=237, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3457, + serialized_end=3503, +) +_sym_db.RegisterEnumDescriptor(_CONSTANTS) + +Constants = enum_type_wrapper.EnumTypeWrapper(_CONSTANTS) +_CRITICALERRORCODE = _descriptor.EnumDescriptor( + name='CriticalErrorCode', + full_name='CriticalErrorCode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='None', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TxWatchdog', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SleepEnterWait', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NoRadio', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Unspecified', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='UBloxInitFailed', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NoAXP192', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='InvalidRadioSetting', index=7, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TransmitFailed', index=8, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Brownout', index=9, number=9, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SX1262Failure', index=10, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RadioSpiBug', index=11, number=11, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3506, + serialized_end=3731, +) +_sym_db.RegisterEnumDescriptor(_CRITICALERRORCODE) + +CriticalErrorCode = enum_type_wrapper.EnumTypeWrapper(_CRITICALERRORCODE) +UNSET = 0 +TLORA_V2 = 1 +TLORA_V1 = 2 +TLORA_V2_1_1p6 = 3 +TBEAM = 4 +HELTEC_V2_0 = 5 +TBEAM0p7 = 6 +T_ECHO = 7 +TLORA_V1_1p3 = 8 +RAK4631 = 9 +HELTEC_V2_1 = 10 +LORA_RELAY_V1 = 32 +NRF52840DK = 33 +PPR = 34 +GENIEBLOCKS = 35 +NRF52_UNKNOWN = 36 +PORTDUINO = 37 +ANDROID_SIM = 38 +DIY_V1 = 39 +CLEAR = 0 +CYAN = 1 +WHITE = 2 +YELLOW = 3 +ORANGE = 4 +MAGENTA = 5 +RED = 6 +MAROON = 7 +PURPLE = 8 +DARK_BLUE = 9 +BLUE = 10 +TEAL = 11 +GREEN = 12 +DARK_GREEN = 13 +BROWN = 14 +Unused = 0 +DATA_PAYLOAD_LEN = 237 +globals()['None'] = 0 +TxWatchdog = 1 +SleepEnterWait = 2 +NoRadio = 3 +Unspecified = 4 +UBloxInitFailed = 5 +NoAXP192 = 6 +InvalidRadioSetting = 7 +TransmitFailed = 8 +Brownout = 9 +SX1262Failure = 10 +RadioSpiBug = 11 + + +_POSITION_LOCSOURCE = _descriptor.EnumDescriptor( + name='LocSource', + full_name='Position.LocSource', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LOCSRC_UNSPECIFIED', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LOCSRC_MANUAL_ENTRY', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LOCSRC_GPS_INTERNAL', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LOCSRC_GPS_EXTERNAL', index=3, number=3, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=561, + serialized_end=671, +) +_sym_db.RegisterEnumDescriptor(_POSITION_LOCSOURCE) + +_POSITION_ALTSOURCE = _descriptor.EnumDescriptor( + name='AltSource', + full_name='Position.AltSource', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ALTSRC_UNSPECIFIED', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ALTSRC_MANUAL_ENTRY', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ALTSRC_GPS_INTERNAL', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ALTSRC_GPS_EXTERNAL', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ALTSRC_BAROMETRIC', index=4, number=4, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=674, + serialized_end=807, +) +_sym_db.RegisterEnumDescriptor(_POSITION_ALTSOURCE) + +_ROUTING_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='Routing.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NONE', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NO_ROUTE', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GOT_NAK', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TIMEOUT', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NO_INTERFACE', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAX_RETRANSMIT', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NO_CHANNEL', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TOO_LARGE', index=7, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NO_RESPONSE', index=8, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BAD_REQUEST', index=9, number=32, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NOT_AUTHORIZED', index=10, number=33, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=1207, + serialized_end=1387, +) +_sym_db.RegisterEnumDescriptor(_ROUTING_ERROR) + +_MESHPACKET_PRIORITY = _descriptor.EnumDescriptor( + name='Priority', + full_name='MeshPacket.Priority', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNSET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MIN', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BACKGROUND', index=2, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=3, number=64, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELIABLE', index=4, number=70, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ACK', index=5, number=120, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAX', index=6, number=127, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=1769, + serialized_end=1860, +) +_sym_db.RegisterEnumDescriptor(_MESHPACKET_PRIORITY) + +_LOGRECORD_LEVEL = _descriptor.EnumDescriptor( + name='Level', + full_name='LogRecord.Level', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNSET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CRITICAL', index=1, number=50, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR', index=2, number=40, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WARNING', index=3, number=30, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INFO', index=4, number=20, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEBUG', index=5, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TRACE', index=6, number=5, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2416, + serialized_end=2504, +) +_sym_db.RegisterEnumDescriptor(_LOGRECORD_LEVEL) + + +_POSITION = _descriptor.Descriptor( + name='Position', + full_name='Position', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='latitude_i', full_name='Position.latitude_i', index=0, + number=1, type=15, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='longitude_i', full_name='Position.longitude_i', index=1, + number=2, type=15, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='altitude', full_name='Position.altitude', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='battery_level', full_name='Position.battery_level', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='time', full_name='Position.time', index=4, + number=9, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='location_source', full_name='Position.location_source', index=5, + number=10, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='altitude_source', full_name='Position.altitude_source', index=6, + number=11, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='pos_timestamp', full_name='Position.pos_timestamp', index=7, + number=12, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='pos_time_millis', full_name='Position.pos_time_millis', index=8, + number=13, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='altitude_hae', full_name='Position.altitude_hae', index=9, + number=14, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='alt_geoid_sep', full_name='Position.alt_geoid_sep', index=10, + number=15, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='PDOP', full_name='Position.PDOP', index=11, + number=16, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='HDOP', full_name='Position.HDOP', index=12, + number=17, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='VDOP', full_name='Position.VDOP', index=13, + number=18, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_accuracy', full_name='Position.gps_accuracy', index=14, + number=19, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ground_speed', full_name='Position.ground_speed', index=15, + number=20, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ground_track', full_name='Position.ground_track', index=16, + number=21, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='fix_quality', full_name='Position.fix_quality', index=17, + number=22, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='fix_type', full_name='Position.fix_type', index=18, + number=23, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='sats_in_view', full_name='Position.sats_in_view', index=19, + number=24, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='sensor_id', full_name='Position.sensor_id', index=20, + number=25, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='pos_next_update', full_name='Position.pos_next_update', index=21, + number=40, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='pos_seq_number', full_name='Position.pos_seq_number', index=22, + number=41, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _POSITION_LOCSOURCE, + _POSITION_ALTSOURCE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=31, + serialized_end=819, +) + + +_USER = _descriptor.Descriptor( + name='User', + full_name='User', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='User.id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='long_name', full_name='User.long_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='short_name', full_name='User.short_name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='macaddr', full_name='User.macaddr', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hw_model', full_name='User.hw_model', index=4, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_licensed', full_name='User.is_licensed', index=5, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='team', full_name='User.team', index=6, + number=8, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tx_power_dbm', full_name='User.tx_power_dbm', index=7, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ant_gain_dbi', full_name='User.ant_gain_dbi', index=8, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ant_azimuth', full_name='User.ant_azimuth', index=9, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=822, + serialized_end=1037, +) + + +_ROUTEDISCOVERY = _descriptor.Descriptor( + name='RouteDiscovery', + full_name='RouteDiscovery', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='route', full_name='RouteDiscovery.route', index=0, + number=2, type=7, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1039, + serialized_end=1070, +) + + +_ROUTING = _descriptor.Descriptor( + name='Routing', + full_name='Routing', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='route_request', full_name='Routing.route_request', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='route_reply', full_name='Routing.route_reply', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='error_reason', full_name='Routing.error_reason', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _ROUTING_ERROR, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='variant', full_name='Routing.variant', + index=0, containing_type=None, fields=[]), + ], + serialized_start=1073, + serialized_end=1398, +) + + +_DATA = _descriptor.Descriptor( + name='Data', + full_name='Data', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='portnum', full_name='Data.portnum', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='payload', full_name='Data.payload', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='want_response', full_name='Data.want_response', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='dest', full_name='Data.dest', index=3, + number=4, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='source', full_name='Data.source', index=4, + number=5, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='request_id', full_name='Data.request_id', index=5, + number=6, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1400, + serialized_end=1523, +) + + +_MESHPACKET = _descriptor.Descriptor( + name='MeshPacket', + full_name='MeshPacket', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='from', full_name='MeshPacket.from', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='to', full_name='MeshPacket.to', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='channel', full_name='MeshPacket.channel', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='decoded', full_name='MeshPacket.decoded', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='encrypted', full_name='MeshPacket.encrypted', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='MeshPacket.id', index=5, + number=6, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rx_time', full_name='MeshPacket.rx_time', index=6, + number=7, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rx_snr', full_name='MeshPacket.rx_snr', index=7, + number=8, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hop_limit', full_name='MeshPacket.hop_limit', index=8, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='want_ack', full_name='MeshPacket.want_ack', index=9, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='priority', full_name='MeshPacket.priority', index=10, + number=12, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rx_rssi', full_name='MeshPacket.rx_rssi', index=11, + number=13, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _MESHPACKET_PRIORITY, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='payloadVariant', full_name='MeshPacket.payloadVariant', + index=0, containing_type=None, fields=[]), + ], + serialized_start=1526, + serialized_end=1878, +) + + +_NODEINFO = _descriptor.Descriptor( + name='NodeInfo', + full_name='NodeInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num', full_name='NodeInfo.num', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='user', full_name='NodeInfo.user', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='position', full_name='NodeInfo.position', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='snr', full_name='NodeInfo.snr', index=3, + number=7, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='last_heard', full_name='NodeInfo.last_heard', index=4, + number=4, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1880, + serialized_end=1986, +) + + +_MYNODEINFO = _descriptor.Descriptor( + name='MyNodeInfo', + full_name='MyNodeInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='my_node_num', full_name='MyNodeInfo.my_node_num', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_gps', full_name='MyNodeInfo.has_gps', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='num_bands', full_name='MyNodeInfo.num_bands', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='max_channels', full_name='MyNodeInfo.max_channels', index=3, + number=15, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='region', full_name='MyNodeInfo.region', index=4, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\030\001', file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hw_model_deprecated', full_name='MyNodeInfo.hw_model_deprecated', index=5, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\030\001', file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='firmware_version', full_name='MyNodeInfo.firmware_version', index=6, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='error_code', full_name='MyNodeInfo.error_code', index=7, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='error_address', full_name='MyNodeInfo.error_address', index=8, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='error_count', full_name='MyNodeInfo.error_count', index=9, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='reboot_count', full_name='MyNodeInfo.reboot_count', index=10, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=11, + number=13, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='min_app_version', full_name='MyNodeInfo.min_app_version', index=12, + number=14, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1989, + serialized_end=2320, +) + + +_LOGRECORD = _descriptor.Descriptor( + name='LogRecord', + full_name='LogRecord', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='LogRecord.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='time', full_name='LogRecord.time', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='source', full_name='LogRecord.source', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='level', full_name='LogRecord.level', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LOGRECORD_LEVEL, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2323, + serialized_end=2504, +) + + +_FROMRADIO = _descriptor.Descriptor( + name='FromRadio', + full_name='FromRadio', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num', full_name='FromRadio.num', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='packet', full_name='FromRadio.packet', index=1, + number=11, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='my_info', full_name='FromRadio.my_info', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_info', full_name='FromRadio.node_info', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='log_record', full_name='FromRadio.log_record', index=4, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='config_complete_id', full_name='FromRadio.config_complete_id', index=5, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rebooted', full_name='FromRadio.rebooted', index=6, + number=9, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='payloadVariant', full_name='FromRadio.payloadVariant', + index=0, containing_type=None, fields=[]), + ], + serialized_start=2507, + serialized_end=2740, +) + + +_TORADIO_PEERINFO = _descriptor.Descriptor( + name='PeerInfo', + full_name='ToRadio.PeerInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='app_version', full_name='ToRadio.PeerInfo.app_version', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mqtt_gateway', full_name='ToRadio.PeerInfo.mqtt_gateway', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2873, + serialized_end=2926, +) + +_TORADIO = _descriptor.Descriptor( + name='ToRadio', + full_name='ToRadio', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='packet', full_name='ToRadio.packet', index=0, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='peer_info', full_name='ToRadio.peer_info', index=1, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='want_config_id', full_name='ToRadio.want_config_id', index=2, + number=100, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='disconnect', full_name='ToRadio.disconnect', index=3, + number=104, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_TORADIO_PEERINFO, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='payloadVariant', full_name='ToRadio.payloadVariant', + index=0, containing_type=None, fields=[]), + ], + serialized_start=2743, + serialized_end=2968, +) + +_POSITION.fields_by_name['location_source'].enum_type = _POSITION_LOCSOURCE +_POSITION.fields_by_name['altitude_source'].enum_type = _POSITION_ALTSOURCE +_POSITION_LOCSOURCE.containing_type = _POSITION +_POSITION_ALTSOURCE.containing_type = _POSITION +_USER.fields_by_name['hw_model'].enum_type = _HARDWAREMODEL +_USER.fields_by_name['team'].enum_type = _TEAM +_ROUTING.fields_by_name['route_request'].message_type = _ROUTEDISCOVERY +_ROUTING.fields_by_name['route_reply'].message_type = _ROUTEDISCOVERY +_ROUTING.fields_by_name['error_reason'].enum_type = _ROUTING_ERROR +_ROUTING_ERROR.containing_type = _ROUTING +_ROUTING.oneofs_by_name['variant'].fields.append( + _ROUTING.fields_by_name['route_request']) +_ROUTING.fields_by_name['route_request'].containing_oneof = _ROUTING.oneofs_by_name['variant'] +_ROUTING.oneofs_by_name['variant'].fields.append( + _ROUTING.fields_by_name['route_reply']) +_ROUTING.fields_by_name['route_reply'].containing_oneof = _ROUTING.oneofs_by_name['variant'] +_ROUTING.oneofs_by_name['variant'].fields.append( + _ROUTING.fields_by_name['error_reason']) +_ROUTING.fields_by_name['error_reason'].containing_oneof = _ROUTING.oneofs_by_name['variant'] +_DATA.fields_by_name['portnum'].enum_type = portnums__pb2._PORTNUM +_MESHPACKET.fields_by_name['decoded'].message_type = _DATA +_MESHPACKET.fields_by_name['priority'].enum_type = _MESHPACKET_PRIORITY +_MESHPACKET_PRIORITY.containing_type = _MESHPACKET +_MESHPACKET.oneofs_by_name['payloadVariant'].fields.append( + _MESHPACKET.fields_by_name['decoded']) +_MESHPACKET.fields_by_name['decoded'].containing_oneof = _MESHPACKET.oneofs_by_name['payloadVariant'] +_MESHPACKET.oneofs_by_name['payloadVariant'].fields.append( + _MESHPACKET.fields_by_name['encrypted']) +_MESHPACKET.fields_by_name['encrypted'].containing_oneof = _MESHPACKET.oneofs_by_name['payloadVariant'] +_NODEINFO.fields_by_name['user'].message_type = _USER +_NODEINFO.fields_by_name['position'].message_type = _POSITION +_MYNODEINFO.fields_by_name['error_code'].enum_type = _CRITICALERRORCODE +_LOGRECORD.fields_by_name['level'].enum_type = _LOGRECORD_LEVEL +_LOGRECORD_LEVEL.containing_type = _LOGRECORD +_FROMRADIO.fields_by_name['packet'].message_type = _MESHPACKET +_FROMRADIO.fields_by_name['my_info'].message_type = _MYNODEINFO +_FROMRADIO.fields_by_name['node_info'].message_type = _NODEINFO +_FROMRADIO.fields_by_name['log_record'].message_type = _LOGRECORD +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['packet']) +_FROMRADIO.fields_by_name['packet'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['my_info']) +_FROMRADIO.fields_by_name['my_info'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['node_info']) +_FROMRADIO.fields_by_name['node_info'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['log_record']) +_FROMRADIO.fields_by_name['log_record'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['config_complete_id']) +_FROMRADIO.fields_by_name['config_complete_id'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['rebooted']) +_FROMRADIO.fields_by_name['rebooted'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_TORADIO_PEERINFO.containing_type = _TORADIO +_TORADIO.fields_by_name['packet'].message_type = _MESHPACKET +_TORADIO.fields_by_name['peer_info'].message_type = _TORADIO_PEERINFO +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( + _TORADIO.fields_by_name['packet']) +_TORADIO.fields_by_name['packet'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( + _TORADIO.fields_by_name['peer_info']) +_TORADIO.fields_by_name['peer_info'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( + _TORADIO.fields_by_name['want_config_id']) +_TORADIO.fields_by_name['want_config_id'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( + _TORADIO.fields_by_name['disconnect']) +_TORADIO.fields_by_name['disconnect'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] +DESCRIPTOR.message_types_by_name['Position'] = _POSITION +DESCRIPTOR.message_types_by_name['User'] = _USER +DESCRIPTOR.message_types_by_name['RouteDiscovery'] = _ROUTEDISCOVERY +DESCRIPTOR.message_types_by_name['Routing'] = _ROUTING +DESCRIPTOR.message_types_by_name['Data'] = _DATA +DESCRIPTOR.message_types_by_name['MeshPacket'] = _MESHPACKET +DESCRIPTOR.message_types_by_name['NodeInfo'] = _NODEINFO +DESCRIPTOR.message_types_by_name['MyNodeInfo'] = _MYNODEINFO +DESCRIPTOR.message_types_by_name['LogRecord'] = _LOGRECORD +DESCRIPTOR.message_types_by_name['FromRadio'] = _FROMRADIO +DESCRIPTOR.message_types_by_name['ToRadio'] = _TORADIO +DESCRIPTOR.enum_types_by_name['HardwareModel'] = _HARDWAREMODEL +DESCRIPTOR.enum_types_by_name['Team'] = _TEAM +DESCRIPTOR.enum_types_by_name['Constants'] = _CONSTANTS +DESCRIPTOR.enum_types_by_name['CriticalErrorCode'] = _CRITICALERRORCODE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Position = _reflection.GeneratedProtocolMessageType('Position', (_message.Message,), { + 'DESCRIPTOR' : _POSITION, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:Position) + }) +_sym_db.RegisterMessage(Position) + +User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), { + 'DESCRIPTOR' : _USER, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:User) + }) +_sym_db.RegisterMessage(User) + +RouteDiscovery = _reflection.GeneratedProtocolMessageType('RouteDiscovery', (_message.Message,), { + 'DESCRIPTOR' : _ROUTEDISCOVERY, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:RouteDiscovery) + }) +_sym_db.RegisterMessage(RouteDiscovery) + +Routing = _reflection.GeneratedProtocolMessageType('Routing', (_message.Message,), { + 'DESCRIPTOR' : _ROUTING, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:Routing) + }) +_sym_db.RegisterMessage(Routing) + +Data = _reflection.GeneratedProtocolMessageType('Data', (_message.Message,), { + 'DESCRIPTOR' : _DATA, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:Data) + }) +_sym_db.RegisterMessage(Data) + +MeshPacket = _reflection.GeneratedProtocolMessageType('MeshPacket', (_message.Message,), { + 'DESCRIPTOR' : _MESHPACKET, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:MeshPacket) + }) +_sym_db.RegisterMessage(MeshPacket) + +NodeInfo = _reflection.GeneratedProtocolMessageType('NodeInfo', (_message.Message,), { + 'DESCRIPTOR' : _NODEINFO, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:NodeInfo) + }) +_sym_db.RegisterMessage(NodeInfo) + +MyNodeInfo = _reflection.GeneratedProtocolMessageType('MyNodeInfo', (_message.Message,), { + 'DESCRIPTOR' : _MYNODEINFO, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:MyNodeInfo) + }) +_sym_db.RegisterMessage(MyNodeInfo) + +LogRecord = _reflection.GeneratedProtocolMessageType('LogRecord', (_message.Message,), { + 'DESCRIPTOR' : _LOGRECORD, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:LogRecord) + }) +_sym_db.RegisterMessage(LogRecord) + +FromRadio = _reflection.GeneratedProtocolMessageType('FromRadio', (_message.Message,), { + 'DESCRIPTOR' : _FROMRADIO, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:FromRadio) + }) +_sym_db.RegisterMessage(FromRadio) + +ToRadio = _reflection.GeneratedProtocolMessageType('ToRadio', (_message.Message,), { + + 'PeerInfo' : _reflection.GeneratedProtocolMessageType('PeerInfo', (_message.Message,), { + 'DESCRIPTOR' : _TORADIO_PEERINFO, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:ToRadio.PeerInfo) + }) + , + 'DESCRIPTOR' : _TORADIO, + '__module__' : 'mesh_pb2' + # @@protoc_insertion_point(class_scope:ToRadio) + }) +_sym_db.RegisterMessage(ToRadio) +_sym_db.RegisterMessage(ToRadio.PeerInfo) + + +DESCRIPTOR._options = None +_MYNODEINFO.fields_by_name['region']._options = None +_MYNODEINFO.fields_by_name['hw_model_deprecated']._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/mqtt_pb2.py b/meshtastic/mqtt_pb2.py index dccd89a..d770169 100644 --- a/meshtastic/mqtt_pb2.py +++ b/meshtastic/mqtt_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: mqtt.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -19,7 +19,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\nMQTTProtosH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\nmqtt.proto\x1a\nmesh.proto\"V\n\x0fServiceEnvelope\x12\x1b\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\tBF\n\x13\x63om.geeksville.meshB\nMQTTProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' , dependencies=[mesh__pb2.DESCRIPTOR,]) @@ -33,7 +32,6 @@ _SERVICEENVELOPE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='packet', full_name='ServiceEnvelope.packet', index=0, @@ -41,21 +39,21 @@ _SERVICEENVELOPE = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='channel_id', full_name='ServiceEnvelope.channel_id', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='gateway_id', full_name='ServiceEnvelope.gateway_id', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], diff --git a/meshtastic/mqtt_pb2.py-E b/meshtastic/mqtt_pb2.py-E new file mode 100644 index 0000000..f2df05a --- /dev/null +++ b/meshtastic/mqtt_pb2.py-E @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: mqtt.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import mesh_pb2 as mesh__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='mqtt.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\nMQTTProtosH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\nmqtt.proto\x1a\nmesh.proto\"V\n\x0fServiceEnvelope\x12\x1b\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\tBF\n\x13\x63om.geeksville.meshB\nMQTTProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + , + dependencies=[mesh__pb2.DESCRIPTOR,]) + + + + +_SERVICEENVELOPE = _descriptor.Descriptor( + name='ServiceEnvelope', + full_name='ServiceEnvelope', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='packet', full_name='ServiceEnvelope.packet', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='channel_id', full_name='ServiceEnvelope.channel_id', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gateway_id', full_name='ServiceEnvelope.gateway_id', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=26, + serialized_end=112, +) + +_SERVICEENVELOPE.fields_by_name['packet'].message_type = mesh__pb2._MESHPACKET +DESCRIPTOR.message_types_by_name['ServiceEnvelope'] = _SERVICEENVELOPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ServiceEnvelope = _reflection.GeneratedProtocolMessageType('ServiceEnvelope', (_message.Message,), { + 'DESCRIPTOR' : _SERVICEENVELOPE, + '__module__' : 'mqtt_pb2' + # @@protoc_insertion_point(class_scope:ServiceEnvelope) + }) +_sym_db.RegisterMessage(ServiceEnvelope) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/node.py-E b/meshtastic/node.py-E new file mode 100644 index 0000000..eab6974 --- /dev/null +++ b/meshtastic/node.py-E @@ -0,0 +1,404 @@ +""" +# an API for Meshtastic devices + +Primary class: SerialInterface +Install with pip: "[pip3 install meshtastic](https://pypi.org/project/meshtastic/)" +Source code on [github](https://github.com/meshtastic/Meshtastic-python) + +properties of SerialInterface: + +- radioConfig - Current radio configuration and device settings, if you write to this the new settings will be applied to +the device. +- nodes - The database of received nodes. Includes always up-to-date location and username information for each +node in the mesh. This is a read-only datastructure. +- nodesByNum - like "nodes" but keyed by nodeNum instead of nodeId +- myInfo - Contains read-only information about the local radio device (software version, hardware version, etc) + +# Published PubSub topics + +We use a [publish-subscribe](https://pypubsub.readthedocs.io/en/v4.0.3/) model to communicate asynchronous events. Available +topics: + +- meshtastic.connection.established - published once we've successfully connected to the radio and downloaded the node DB +- meshtastic.connection.lost - published once we've lost our link to the radio +- meshtastic.receive.text(packet) - delivers a received packet as a dictionary, if you only care about a particular +type of packet, you should subscribe to the full topic name. If you want to see all packets, simply subscribe to "meshtastic.receive". +- meshtastic.receive.position(packet) +- meshtastic.receive.user(packet) +- meshtastic.receive.data.portnum(packet) (where portnum is an integer or well known PortNum enum) +- meshtastic.node.updated(node = NodeInfo) - published when a node in the DB changes (appears, location changed, username changed, etc...) + +We receive position, user, or data packets from the mesh. You probably only care about meshtastic.receive.data. The first argument for +that publish will be the packet. Text or binary data packets (from sendData or sendText) will both arrive this way. If you print packet +you'll see the fields in the dictionary. decoded.data.payload will contain the raw bytes that were sent. If the packet was sent with +sendText, decoded.data.text will **also** be populated with the decoded string. For ASCII these two strings will be the same, but for +unicode scripts they can be different. + +# Example Usage +``` +import meshtastic +from pubsub import pub + +def onReceive(packet, interface): # called when a packet arrives + print(f"Received: {packet}") + +def onConnection(interface, topic=pub.AUTO_TOPIC): # called when we (re)connect to the radio + # defaults to broadcast, specify a destination ID if you wish + interface.sendText("hello mesh") + +pub.subscribe(onReceive, "meshtastic.receive") +pub.subscribe(onConnection, "meshtastic.connection.established") +# By default will try to find a meshtastic device, otherwise provide a device path like /dev/ttyUSB0 +interface = meshtastic.SerialInterface() + +``` + +""" + +import pygatt +import google.protobuf.json_format +import serial +import threading +import logging +import sys +import random +import traceback +import time +import base64 +import platform +import socket +from . import mesh_pb2, portnums_pb2, apponly_pb2, admin_pb2, environmental_measurement_pb2, remote_hardware_pb2, channel_pb2, radioconfig_pb2, util +from .util import fixme, catchAndIgnore, stripnl, DeferredExecution, Timeout +from pubsub import pub +from dotmap import DotMap +from typing import * +from google.protobuf.json_format import MessageToJson + + + +def pskToString(psk: bytes): + """Given an array of PSK bytes, decode them into a human readable (but privacy protecting) string""" + if len(psk) == 0: + return "unencrypted" + elif len(psk) == 1: + b = psk[0] + if b == 0: + return "unencrypted" + elif b == 1: + return "default" + else: + return f"simple{b - 1}" + else: + return "secret" + + +class Node: + """A model of a (local or remote) node in the mesh + + Includes methods for radioConfig and channels + """ + + def __init__(self, iface, nodeNum): + """Constructor""" + self.iface = iface + self.nodeNum = nodeNum + self.radioConfig = None + self.channels = None + self._timeout = Timeout(maxSecs=60) + + def showChannels(self): + """Show human readable description of our channels""" + print("Channels:") + for c in self.channels: + if c.role != channel_pb2.Channel.Role.DISABLED: + cStr = stripnl(MessageToJson(c.settings)) + print( + f" {channel_pb2.Channel.Role.Name(c.role)} psk={pskToString(c.settings.psk)} {cStr}") + publicURL = self.getURL(includeAll=False) + adminURL = self.getURL(includeAll=True) + print(f"\nPrimary channel URL: {publicURL}") + if adminURL != publicURL: + print(f"Complete URL (includes all channels): {adminURL}") + + def showInfo(self): + """Show human readable description of our node""" + print( + f"Preferences: {stripnl(MessageToJson(self.radioConfig.preferences))}\n") + self.showChannels() + + def requestConfig(self): + """ + Send regular MeshPackets to ask for settings and channels + """ + self.radioConfig = None + self.channels = None + self.partialChannels = [] # We keep our channels in a temp array until finished + + self._requestSettings() + + def waitForConfig(self): + """Block until radio config is received. Returns True if config has been received.""" + return self._timeout.waitForSet(self, attrs=('radioConfig', 'channels')) + + def writeConfig(self): + """Write the current (edited) radioConfig to the device""" + if self.radioConfig == None: + raise Exception("No RadioConfig has been read") + + p = admin_pb2.AdminMessage() + p.set_radio.CopyFrom(self.radioConfig) + + self._sendAdmin(p) + logging.debug("Wrote config") + + def writeChannel(self, channelIndex, adminIndex=0): + """Write the current (edited) channel to the device""" + + p = admin_pb2.AdminMessage() + p.set_channel.CopyFrom(self.channels[channelIndex]) + + self._sendAdmin(p, adminIndex=adminIndex) + logging.debug(f"Wrote channel {channelIndex}") + + def deleteChannel(self, channelIndex): + """Delete the specifed channelIndex and shift other channels up""" + ch = self.channels[channelIndex] + if ch.role != channel_pb2.Channel.Role.SECONDARY: + raise Exception("Only SECONDARY channels can be deleted") + + # we are careful here because if we move the "admin" channel the channelIndex we need to use + # for sending admin channels will also change + adminIndex = self.iface.localNode._getAdminChannelIndex() + + self.channels.pop(channelIndex) + self._fixupChannels() # expand back to 8 channels + + index = channelIndex + while index < self.iface.myInfo.max_channels: + self.writeChannel(index, adminIndex=adminIndex) + index += 1 + + # if we are updating the local node, we might end up *moving* the admin channel index as we are writing + if (self.iface.localNode == self) and index >= adminIndex: + # We've now passed the old location for admin index (and writen it), so we can start finding it by name again + adminIndex = 0 + + def getChannelByName(self, name): + """Try to find the named channel or return None""" + for c in (self.channels or []): + if c.settings and c.settings.name == name: + return c + return None + + def getDisabledChannel(self): + """Return the first channel that is disabled (i.e. available for some new use)""" + for c in self.channels: + if c.role == channel_pb2.Channel.Role.DISABLED: + return c + return None + + def _getAdminChannelIndex(self): + """Return the channel number of the admin channel, or 0 if no reserved channel""" + c = self.getChannelByName("admin") + if c: + return c.index + else: + return 0 + + def setOwner(self, long_name, short_name=None, is_licensed=False): + """Set device owner name""" + nChars = 3 + minChars = 2 + if long_name is not None: + long_name = long_name.strip() + if short_name is None: + words = long_name.split() + if len(long_name) <= nChars: + short_name = long_name + elif len(words) >= minChars: + short_name = ''.join(map(lambda word: word[0], words)) + else: + trans = str.maketrans(dict.fromkeys('aeiouAEIOU')) + short_name = long_name[0] + long_name[1:].translate(trans) + if len(short_name) < nChars: + short_name = long_name[:nChars] + + p = admin_pb2.AdminMessage() + + if long_name is not None: + p.set_owner.long_name = long_name + if short_name is not None: + short_name = short_name.strip() + if len(short_name) > nChars: + short_name = short_name[:nChars] + p.set_owner.short_name = short_name + p.set_owner.is_licensed = is_licensed + + return self._sendAdmin(p) + + def getURL(self, includeAll: bool = True): + """The sharable URL that describes the current channel + """ + # Only keep the primary/secondary channels, assume primary is first + channelSet = apponly_pb2.ChannelSet() + for c in self.channels: + if c.role == channel_pb2.Channel.Role.PRIMARY or (includeAll and c.role == channel_pb2.Channel.Role.SECONDARY): + channelSet.settings.append(c.settings) + bytes = channelSet.SerializeToString() + s = base64.urlsafe_b64encode(bytes).decode('ascii') + return f"https://www.meshtastic.org/d/#{s}".replace("=", "") + + def setURL(self, url): + """Set mesh network URL""" + if self.radioConfig == None: + raise Exception("No RadioConfig has been read") + + # URLs are of the form https://www.meshtastic.org/d/#{base64_channel_set} + # Split on '/#' to find the base64 encoded channel settings + splitURL = url.split("/#") + b64 = splitURL[-1] + + # We normally strip padding to make for a shorter URL, but the python parser doesn't like + # that. So add back any missing padding + # per https://stackoverflow.com/a/9807138 + missing_padding = len(b64) % 4 + if missing_padding: + b64 += '=' * (4 - missing_padding) + + decodedURL = base64.urlsafe_b64decode(b64) + channelSet = apponly_pb2.ChannelSet() + channelSet.ParseFromString(decodedURL) + + i = 0 + for chs in channelSet.settings: + ch = channel_pb2.Channel() + ch.role = channel_pb2.Channel.Role.PRIMARY if i == 0 else channel_pb2.Channel.Role.SECONDARY + ch.index = i + ch.settings.CopyFrom(chs) + self.channels[ch.index] = ch + self.writeChannel(ch.index) + i = i + 1 + + def _requestSettings(self): + """ + Done with initial config messages, now send regular MeshPackets to ask for settings + """ + p = admin_pb2.AdminMessage() + p.get_radio_request = True + + def onResponse(p): + """A closure to handle the response packet""" + self.radioConfig = p["decoded"]["admin"]["raw"].get_radio_response + logging.debug("Received radio config, now fetching channels...") + self._timeout.reset() # We made foreward progress + self._requestChannel(0) # now start fetching channels + + # Show progress message for super slow operations + if self != self.iface.localNode: + logging.info( + "Requesting preferences from remote node (this could take a while)") + + return self._sendAdmin(p, + wantResponse=True, + onResponse=onResponse) + + def exitSimulator(self): + """ + Tell a simulator node to exit (this message is ignored for other nodes) + """ + p = admin_pb2.AdminMessage() + p.exit_simulator = True + + return self._sendAdmin(p) + + def reboot(self, secs: int = 10): + """ + Tell the node to reboot + """ + p = admin_pb2.AdminMessage() + p.reboot_seconds = secs + logging.info(f"Telling node to reboot in {secs} seconds") + + return self._sendAdmin(p) + + def _fixupChannels(self): + """Fixup indexes and add disabled channels as needed""" + + # Add extra disabled channels as needed + for index, ch in enumerate(self.channels): + ch.index = index # fixup indexes + + self._fillChannels() + + def _fillChannels(self): + """Mark unused channels as disabled""" + + # Add extra disabled channels as needed + index = len(self.channels) + while index < self.iface.myInfo.max_channels: + ch = channel_pb2.Channel() + ch.role = channel_pb2.Channel.Role.DISABLED + ch.index = index + self.channels.append(ch) + index += 1 + + def _requestChannel(self, channelNum: int): + """ + Done with initial config messages, now send regular MeshPackets to ask for settings + """ + p = admin_pb2.AdminMessage() + p.get_channel_request = channelNum + 1 + + # Show progress message for super slow operations + if self != self.iface.localNode: + logging.info( + f"Requesting channel {channelNum} info from remote node (this could take a while)") + else: + logging.debug(f"Requesting channel {channelNum}") + + def onResponse(p): + """A closure to handle the response packet""" + c = p["decoded"]["admin"]["raw"].get_channel_response + self.partialChannels.append(c) + self._timeout.reset() # We made foreward progress + logging.debug(f"Received channel {stripnl(c)}") + index = c.index + + # for stress testing, we can always download all channels + fastChannelDownload = True + + # Once we see a response that has NO settings, assume we are at the end of channels and stop fetching + quitEarly = ( + c.role == channel_pb2.Channel.Role.DISABLED) and fastChannelDownload + + if quitEarly or index >= self.iface.myInfo.max_channels - 1: + logging.debug("Finished downloading channels") + + self.channels = self.partialChannels + self._fixupChannels() + + # FIXME, the following should only be called after we have settings and channels + self.iface._connected() # Tell everone else we are ready to go + else: + self._requestChannel(index + 1) + + return self._sendAdmin(p, + wantResponse=True, + onResponse=onResponse) + + def _sendAdmin(self, p: admin_pb2.AdminMessage, wantResponse=False, + onResponse=None, + adminIndex=0): + """Send an admin message to the specified node (or the local node if destNodeNum is zero)""" + + if adminIndex == 0: # unless a special channel index was used, we want to use the admin index + adminIndex = self.iface.localNode._getAdminChannelIndex() + + return self.iface.sendData(p, self.nodeNum, + portNum=portnums_pb2.PortNum.ADMIN_APP, + wantAck=True, + wantResponse=wantResponse, + onResponse=onResponse, + channelIndex=adminIndex) + + diff --git a/meshtastic/portnums_pb2.py b/meshtastic/portnums_pb2.py index 0d5a644..7c33c8b 100644 --- a/meshtastic/portnums_pb2.py +++ b/meshtastic/portnums_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: portnums.proto -"""Generated protocol buffer code.""" + from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message @@ -19,8 +19,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\010PortnumsH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eportnums.proto*\xbe\x02\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12!\n\x1d\x45NVIRONMENTAL_MEASUREMENT_APP\x10\x43\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42\x44\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + serialized_pb=b'\n\x0eportnums.proto*\xcb\x02\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12!\n\x1d\x45NVIRONMENTAL_MEASUREMENT_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42\x44\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' ) _PORTNUM = _descriptor.EnumDescriptor( @@ -28,93 +27,80 @@ _PORTNUM = _descriptor.EnumDescriptor( full_name='PortNum', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='UNKNOWN_APP', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TEXT_MESSAGE_APP', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='REMOTE_HARDWARE_APP', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POSITION_APP', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='NODEINFO_APP', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ROUTING_APP', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ADMIN_APP', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='REPLY_APP', index=7, number=32, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='IP_TUNNEL_APP', index=8, number=33, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='SERIAL_APP', index=9, number=64, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='STORE_FORWARD_APP', index=10, number=65, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='RANGE_TEST_APP', index=11, number=66, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ENVIRONMENTAL_MEASUREMENT_APP', index=12, number=67, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( - name='PRIVATE_APP', index=13, number=256, + name='ZPS_APP', index=13, number=68, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( - name='ATAK_FORWARDER', index=14, number=257, + name='PRIVATE_APP', index=14, number=256, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( - name='MAX', index=15, number=511, + name='ATAK_FORWARDER', index=15, number=257, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), + _descriptor.EnumValueDescriptor( + name='MAX', index=16, number=511, + serialized_options=None, + type=None), ], containing_type=None, serialized_options=None, serialized_start=19, - serialized_end=337, + serialized_end=350, ) _sym_db.RegisterEnumDescriptor(_PORTNUM) @@ -132,6 +118,7 @@ SERIAL_APP = 64 STORE_FORWARD_APP = 65 RANGE_TEST_APP = 66 ENVIRONMENTAL_MEASUREMENT_APP = 67 +ZPS_APP = 68 PRIVATE_APP = 256 ATAK_FORWARDER = 257 MAX = 511 diff --git a/meshtastic/portnums_pb2.py-E b/meshtastic/portnums_pb2.py-E new file mode 100644 index 0000000..7c33c8b --- /dev/null +++ b/meshtastic/portnums_pb2.py-E @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: portnums.proto + +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='portnums.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\010PortnumsH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x0eportnums.proto*\xcb\x02\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12!\n\x1d\x45NVIRONMENTAL_MEASUREMENT_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42\x44\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + +_PORTNUM = _descriptor.EnumDescriptor( + name='PortNum', + full_name='PortNum', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN_APP', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TEXT_MESSAGE_APP', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_HARDWARE_APP', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POSITION_APP', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODEINFO_APP', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTING_APP', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ADMIN_APP', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REPLY_APP', index=7, number=32, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='IP_TUNNEL_APP', index=8, number=33, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERIAL_APP', index=9, number=64, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STORE_FORWARD_APP', index=10, number=65, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RANGE_TEST_APP', index=11, number=66, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ENVIRONMENTAL_MEASUREMENT_APP', index=12, number=67, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ZPS_APP', index=13, number=68, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PRIVATE_APP', index=14, number=256, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ATAK_FORWARDER', index=15, number=257, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAX', index=16, number=511, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=19, + serialized_end=350, +) +_sym_db.RegisterEnumDescriptor(_PORTNUM) + +PortNum = enum_type_wrapper.EnumTypeWrapper(_PORTNUM) +UNKNOWN_APP = 0 +TEXT_MESSAGE_APP = 1 +REMOTE_HARDWARE_APP = 2 +POSITION_APP = 3 +NODEINFO_APP = 4 +ROUTING_APP = 5 +ADMIN_APP = 6 +REPLY_APP = 32 +IP_TUNNEL_APP = 33 +SERIAL_APP = 64 +STORE_FORWARD_APP = 65 +RANGE_TEST_APP = 66 +ENVIRONMENTAL_MEASUREMENT_APP = 67 +ZPS_APP = 68 +PRIVATE_APP = 256 +ATAK_FORWARDER = 257 +MAX = 511 + + +DESCRIPTOR.enum_types_by_name['PortNum'] = _PORTNUM +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/radioconfig_pb2.py b/meshtastic/radioconfig_pb2.py index 6788f8b..1e755fb 100644 --- a/meshtastic/radioconfig_pb2.py +++ b/meshtastic/radioconfig_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: radioconfig.proto -"""Generated protocol buffer code.""" + from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message @@ -19,8 +19,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\021RadioConfigProtosH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x11radioconfig.proto\"\x88\x11\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x1a\xc5\x10\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x11\n\twifi_ssid\x18\x0c \x01(\t\x12\x15\n\rwifi_password\x18\r \x01(\t\x12\x14\n\x0cwifi_ap_mode\x18\x0e \x01(\x08\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\x12&\n\x0e\x63harge_current\x18\x10 \x01(\x0e\x32\x0e.ChargeCurrent\x12\x11\n\tis_router\x18% \x01(\x08\x12\x14\n\x0cis_low_power\x18& \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\' \x01(\x08\x12\x17\n\x0fserial_disabled\x18( \x01(\x08\x12(\n\x0elocation_share\x18 \x01(\x0e\x32\x10.LocationSharing\x12$\n\rgps_operation\x18! \x01(\x0e\x32\r.GpsOperation\x12\x1b\n\x13gps_update_interval\x18\" \x01(\r\x12\x18\n\x10gps_attempt_time\x18$ \x01(\r\x12\x15\n\rgps_accept_2d\x18- \x01(\x08\x12\x13\n\x0bgps_max_dop\x18. \x01(\r\x12\x18\n\x10\x66requency_offset\x18) \x01(\x02\x12\x13\n\x0bmqtt_server\x18* \x01(\t\x12\x15\n\rmqtt_disabled\x18+ \x01(\x08\x12(\n\ngps_format\x18, \x01(\x0e\x32\x14.GpsCoordinateFormat\x12\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x1c\n\x14serialplugin_enabled\x18x \x01(\x08\x12\x19\n\x11serialplugin_echo\x18y \x01(\x08\x12\x18\n\x10serialplugin_rxd\x18z \x01(\r\x12\x18\n\x10serialplugin_txd\x18{ \x01(\r\x12\x1c\n\x14serialplugin_timeout\x18| \x01(\r\x12\x19\n\x11serialplugin_mode\x18} \x01(\r\x12\'\n\x1f\x65xt_notification_plugin_enabled\x18~ \x01(\x08\x12)\n!ext_notification_plugin_output_ms\x18\x7f \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_output\x18\x80\x01 \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_active\x18\x81\x01 \x01(\x08\x12.\n%ext_notification_plugin_alert_message\x18\x82\x01 \x01(\x08\x12+\n\"ext_notification_plugin_alert_bell\x18\x83\x01 \x01(\x08\x12\"\n\x19range_test_plugin_enabled\x18\x84\x01 \x01(\x08\x12!\n\x18range_test_plugin_sender\x18\x85\x01 \x01(\r\x12\x1f\n\x16range_test_plugin_save\x18\x86\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_enabled\x18\x94\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\x12=\n4environmental_measurement_plugin_measurement_enabled\x18\x8c\x01 \x01(\x08\x12\x38\n/environmental_measurement_plugin_screen_enabled\x18\x8d\x01 \x01(\x08\x12\x44\n;environmental_measurement_plugin_read_error_count_threshold\x18\x8e\x01 \x01(\r\x12\x39\n0environmental_measurement_plugin_update_interval\x18\x8f\x01 \x01(\r\x12;\n2environmental_measurement_plugin_recovery_interval\x18\x90\x01 \x01(\r\x12;\n2environmental_measurement_plugin_display_farenheit\x18\x91\x01 \x01(\x08\x12v\n,environmental_measurement_plugin_sensor_type\x18\x92\x01 \x01(\x0e\x32?.RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType\x12\x34\n+environmental_measurement_plugin_sensor_pin\x18\x93\x01 \x01(\r\x12\x17\n\x0eposition_flags\x18\x96\x01 \x01(\r\"<\n\"EnvironmentalMeasurementSensorType\x12\t\n\x05\x44HT11\x10\x00\x12\x0b\n\x07\x44S18B20\x10\x01J\x06\x08\x88\x01\x10\x89\x01*f\n\nRegionCode\x12\t\n\x05Unset\x10\x00\x12\x06\n\x02US\x10\x01\x12\t\n\x05\x45U433\x10\x02\x12\t\n\x05\x45U865\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t*\xd1\x01\n\rChargeCurrent\x12\x0b\n\x07MAUnset\x10\x00\x12\t\n\x05MA100\x10\x01\x12\t\n\x05MA190\x10\x02\x12\t\n\x05MA280\x10\x03\x12\t\n\x05MA360\x10\x04\x12\t\n\x05MA450\x10\x05\x12\t\n\x05MA550\x10\x06\x12\t\n\x05MA630\x10\x07\x12\t\n\x05MA700\x10\x08\x12\t\n\x05MA780\x10\t\x12\t\n\x05MA880\x10\n\x12\t\n\x05MA960\x10\x0b\x12\n\n\x06MA1000\x10\x0c\x12\n\n\x06MA1080\x10\r\x12\n\n\x06MA1160\x10\x0e\x12\n\n\x06MA1240\x10\x0f\x12\n\n\x06MA1320\x10\x10*j\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\x12\x13\n\x0fGpsOpStationary\x10\x01\x12\x0f\n\x0bGpsOpMobile\x10\x02\x12\x11\n\rGpsOpTimeOnly\x10\x03\x12\x11\n\rGpsOpDisabled\x10\x04*\x83\x01\n\x13GpsCoordinateFormat\x12\x10\n\x0cGpsFormatDec\x10\x00\x12\x10\n\x0cGpsFormatDMS\x10\x01\x12\x10\n\x0cGpsFormatUTM\x10\x02\x12\x11\n\rGpsFormatMGRS\x10\x03\x12\x10\n\x0cGpsFormatOLC\x10\x04\x12\x11\n\rGpsFormatOSGR\x10\x05*@\n\x0fLocationSharing\x12\x0c\n\x08LocUnset\x10\x00\x12\x0e\n\nLocEnabled\x10\x01\x12\x0f\n\x0bLocDisabled\x10\x02*\xbc\x01\n\rPositionFlags\x12\x11\n\rPOS_UNDEFINED\x10\x00\x12\x10\n\x0cPOS_ALTITUDE\x10\x01\x12\x0f\n\x0bPOS_ALT_MSL\x10\x02\x12\x0f\n\x0bPOS_GEO_SEP\x10\x04\x12\x0b\n\x07POS_DOP\x10\x08\x12\r\n\tPOS_HVDOP\x10\x10\x12\x0f\n\x0bPOS_BATTERY\x10 \x12\x11\n\rPOS_SATINVIEW\x10@\x12\x10\n\x0bPOS_SEQ_NOS\x10\x80\x01\x12\x12\n\rPOS_TIMESTAMP\x10\x80\x02\x42M\n\x13\x63om.geeksville.meshB\x11RadioConfigProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' + serialized_pb=b'\n\x11radioconfig.proto\"\xfa\x12\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x1a\xb7\x12\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12 \n\x18position_broadcast_smart\x18\x11 \x01(\x08\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x11\n\twifi_ssid\x18\x0c \x01(\t\x12\x15\n\rwifi_password\x18\r \x01(\t\x12\x14\n\x0cwifi_ap_mode\x18\x0e \x01(\x08\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\x12&\n\x0e\x63harge_current\x18\x10 \x01(\x0e\x32\x0e.ChargeCurrent\x12\x11\n\tis_router\x18% \x01(\x08\x12\x14\n\x0cis_low_power\x18& \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\' \x01(\x08\x12\x17\n\x0fserial_disabled\x18( \x01(\x08\x12(\n\x0elocation_share\x18 \x01(\x0e\x32\x10.LocationSharing\x12$\n\rgps_operation\x18! \x01(\x0e\x32\r.GpsOperation\x12\x1b\n\x13gps_update_interval\x18\" \x01(\r\x12\x18\n\x10gps_attempt_time\x18$ \x01(\r\x12\x15\n\rgps_accept_2d\x18- \x01(\x08\x12\x13\n\x0bgps_max_dop\x18. \x01(\r\x12\x18\n\x10\x66requency_offset\x18) \x01(\x02\x12\x13\n\x0bmqtt_server\x18* \x01(\t\x12\x15\n\rmqtt_disabled\x18+ \x01(\x08\x12(\n\ngps_format\x18, \x01(\x0e\x32\x14.GpsCoordinateFormat\x12\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x1c\n\x14serialplugin_enabled\x18x \x01(\x08\x12\x19\n\x11serialplugin_echo\x18y \x01(\x08\x12\x18\n\x10serialplugin_rxd\x18z \x01(\r\x12\x18\n\x10serialplugin_txd\x18{ \x01(\r\x12\x1c\n\x14serialplugin_timeout\x18| \x01(\r\x12\x19\n\x11serialplugin_mode\x18} \x01(\r\x12\'\n\x1f\x65xt_notification_plugin_enabled\x18~ \x01(\x08\x12)\n!ext_notification_plugin_output_ms\x18\x7f \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_output\x18\x80\x01 \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_active\x18\x81\x01 \x01(\x08\x12.\n%ext_notification_plugin_alert_message\x18\x82\x01 \x01(\x08\x12+\n\"ext_notification_plugin_alert_bell\x18\x83\x01 \x01(\x08\x12\"\n\x19range_test_plugin_enabled\x18\x84\x01 \x01(\x08\x12!\n\x18range_test_plugin_sender\x18\x85\x01 \x01(\r\x12\x1f\n\x16range_test_plugin_save\x18\x86\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_enabled\x18\x94\x01 \x01(\x08\x12\'\n\x1estore_forward_plugin_heartbeat\x18\x95\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\x12\x30\n\'store_forward_plugin_history_return_max\x18\x8a\x01 \x01(\r\x12\x33\n*store_forward_plugin_history_return_window\x18\x8b\x01 \x01(\r\x12=\n4environmental_measurement_plugin_measurement_enabled\x18\x8c\x01 \x01(\x08\x12\x38\n/environmental_measurement_plugin_screen_enabled\x18\x8d\x01 \x01(\x08\x12\x44\n;environmental_measurement_plugin_read_error_count_threshold\x18\x8e\x01 \x01(\r\x12\x39\n0environmental_measurement_plugin_update_interval\x18\x8f\x01 \x01(\r\x12;\n2environmental_measurement_plugin_recovery_interval\x18\x90\x01 \x01(\r\x12;\n2environmental_measurement_plugin_display_farenheit\x18\x91\x01 \x01(\x08\x12v\n,environmental_measurement_plugin_sensor_type\x18\x92\x01 \x01(\x0e\x32?.RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType\x12\x34\n+environmental_measurement_plugin_sensor_pin\x18\x93\x01 \x01(\r\x12\x17\n\x0eposition_flags\x18\x96\x01 \x01(\r\x12\x1a\n\x11is_always_powered\x18\x97\x01 \x01(\x08\x12\"\n\x19\x61uto_screen_carousel_secs\x18\x98\x01 \x01(\r\"<\n\"EnvironmentalMeasurementSensorType\x12\t\n\x05\x44HT11\x10\x00\x12\x0b\n\x07\x44S18B20\x10\x01J\x06\x08\x88\x01\x10\x89\x01*f\n\nRegionCode\x12\t\n\x05Unset\x10\x00\x12\x06\n\x02US\x10\x01\x12\t\n\x05\x45U433\x10\x02\x12\t\n\x05\x45U865\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t*\xd1\x01\n\rChargeCurrent\x12\x0b\n\x07MAUnset\x10\x00\x12\t\n\x05MA100\x10\x01\x12\t\n\x05MA190\x10\x02\x12\t\n\x05MA280\x10\x03\x12\t\n\x05MA360\x10\x04\x12\t\n\x05MA450\x10\x05\x12\t\n\x05MA550\x10\x06\x12\t\n\x05MA630\x10\x07\x12\t\n\x05MA700\x10\x08\x12\t\n\x05MA780\x10\t\x12\t\n\x05MA880\x10\n\x12\t\n\x05MA960\x10\x0b\x12\n\n\x06MA1000\x10\x0c\x12\n\n\x06MA1080\x10\r\x12\n\n\x06MA1160\x10\x0e\x12\n\n\x06MA1240\x10\x0f\x12\n\n\x06MA1320\x10\x10*j\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\x12\x13\n\x0fGpsOpStationary\x10\x01\x12\x0f\n\x0bGpsOpMobile\x10\x02\x12\x11\n\rGpsOpTimeOnly\x10\x03\x12\x11\n\rGpsOpDisabled\x10\x04*\x83\x01\n\x13GpsCoordinateFormat\x12\x10\n\x0cGpsFormatDec\x10\x00\x12\x10\n\x0cGpsFormatDMS\x10\x01\x12\x10\n\x0cGpsFormatUTM\x10\x02\x12\x11\n\rGpsFormatMGRS\x10\x03\x12\x10\n\x0cGpsFormatOLC\x10\x04\x12\x11\n\rGpsFormatOSGR\x10\x05*@\n\x0fLocationSharing\x12\x0c\n\x08LocUnset\x10\x00\x12\x0e\n\nLocEnabled\x10\x01\x12\x0f\n\x0bLocDisabled\x10\x02*\xbc\x01\n\rPositionFlags\x12\x11\n\rPOS_UNDEFINED\x10\x00\x12\x10\n\x0cPOS_ALTITUDE\x10\x01\x12\x0f\n\x0bPOS_ALT_MSL\x10\x02\x12\x0f\n\x0bPOS_GEO_SEP\x10\x04\x12\x0b\n\x07POS_DOP\x10\x08\x12\r\n\tPOS_HVDOP\x10\x10\x12\x0f\n\x0bPOS_BATTERY\x10 \x12\x11\n\rPOS_SATINVIEW\x10@\x12\x10\n\x0bPOS_SEQ_NOS\x10\x80\x01\x12\x12\n\rPOS_TIMESTAMP\x10\x80\x02\x42M\n\x13\x63om.geeksville.meshB\x11RadioConfigProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' ) _REGIONCODE = _descriptor.EnumDescriptor( @@ -28,63 +27,52 @@ _REGIONCODE = _descriptor.EnumDescriptor( full_name='RegionCode', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='Unset', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='US', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='EU433', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='EU865', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='CN', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='JP', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='ANZ', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='KR', index=7, number=7, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='TW', index=8, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='RU', index=9, number=9, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2208, - serialized_end=2310, + serialized_start=2450, + serialized_end=2552, ) _sym_db.RegisterEnumDescriptor(_REGIONCODE) @@ -94,98 +82,80 @@ _CHARGECURRENT = _descriptor.EnumDescriptor( full_name='ChargeCurrent', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='MAUnset', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA100', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA190', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA280', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA360', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA450', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA550', index=6, number=6, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA630', index=7, number=7, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA700', index=8, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA780', index=9, number=9, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA880', index=10, number=10, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA960', index=11, number=11, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA1000', index=12, number=12, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA1080', index=13, number=13, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA1160', index=14, number=14, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA1240', index=15, number=15, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='MA1320', index=16, number=16, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2313, - serialized_end=2522, + serialized_start=2555, + serialized_end=2764, ) _sym_db.RegisterEnumDescriptor(_CHARGECURRENT) @@ -195,38 +165,32 @@ _GPSOPERATION = _descriptor.EnumDescriptor( full_name='GpsOperation', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='GpsOpUnset', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsOpStationary', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsOpMobile', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsOpTimeOnly', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsOpDisabled', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2524, - serialized_end=2630, + serialized_start=2766, + serialized_end=2872, ) _sym_db.RegisterEnumDescriptor(_GPSOPERATION) @@ -236,43 +200,36 @@ _GPSCOORDINATEFORMAT = _descriptor.EnumDescriptor( full_name='GpsCoordinateFormat', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='GpsFormatDec', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsFormatDMS', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsFormatUTM', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsFormatMGRS', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsFormatOLC', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GpsFormatOSGR', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2633, - serialized_end=2764, + serialized_start=2875, + serialized_end=3006, ) _sym_db.RegisterEnumDescriptor(_GPSCOORDINATEFORMAT) @@ -282,28 +239,24 @@ _LOCATIONSHARING = _descriptor.EnumDescriptor( full_name='LocationSharing', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='LocUnset', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='LocEnabled', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='LocDisabled', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2766, - serialized_end=2830, + serialized_start=3008, + serialized_end=3072, ) _sym_db.RegisterEnumDescriptor(_LOCATIONSHARING) @@ -313,63 +266,52 @@ _POSITIONFLAGS = _descriptor.EnumDescriptor( full_name='PositionFlags', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='POS_UNDEFINED', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_ALTITUDE', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_ALT_MSL', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_GEO_SEP', index=3, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_DOP', index=4, number=8, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_HVDOP', index=5, number=16, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_BATTERY', index=6, number=32, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_SATINVIEW', index=7, number=64, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_SEQ_NOS', index=8, number=128, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='POS_TIMESTAMP', index=9, number=256, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2833, - serialized_end=3021, + serialized_start=3075, + serialized_end=3263, ) _sym_db.RegisterEnumDescriptor(_POSITIONFLAGS) @@ -432,23 +374,20 @@ _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE = _descriptor.En full_name='RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='DHT11', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='DS18B20', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=2138, - serialized_end=2198, + serialized_start=2380, + serialized_end=2440, ) _sym_db.RegisterEnumDescriptor(_RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE) @@ -459,7 +398,6 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='position_broadcast_secs', full_name='RadioConfig.UserPreferences.position_broadcast_secs', index=0, @@ -467,406 +405,448 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='send_owner_interval', full_name='RadioConfig.UserPreferences.send_owner_interval', index=1, + name='position_broadcast_smart', full_name='RadioConfig.UserPreferences.position_broadcast_smart', index=1, + number=17, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='send_owner_interval', full_name='RadioConfig.UserPreferences.send_owner_interval', index=2, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='wait_bluetooth_secs', full_name='RadioConfig.UserPreferences.wait_bluetooth_secs', index=2, + name='wait_bluetooth_secs', full_name='RadioConfig.UserPreferences.wait_bluetooth_secs', index=3, number=4, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='screen_on_secs', full_name='RadioConfig.UserPreferences.screen_on_secs', index=3, + name='screen_on_secs', full_name='RadioConfig.UserPreferences.screen_on_secs', index=4, number=5, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='phone_timeout_secs', full_name='RadioConfig.UserPreferences.phone_timeout_secs', index=4, + name='phone_timeout_secs', full_name='RadioConfig.UserPreferences.phone_timeout_secs', index=5, number=6, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='phone_sds_timeout_sec', full_name='RadioConfig.UserPreferences.phone_sds_timeout_sec', index=5, + name='phone_sds_timeout_sec', full_name='RadioConfig.UserPreferences.phone_sds_timeout_sec', index=6, number=7, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='mesh_sds_timeout_secs', full_name='RadioConfig.UserPreferences.mesh_sds_timeout_secs', index=6, + name='mesh_sds_timeout_secs', full_name='RadioConfig.UserPreferences.mesh_sds_timeout_secs', index=7, number=8, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='sds_secs', full_name='RadioConfig.UserPreferences.sds_secs', index=7, + name='sds_secs', full_name='RadioConfig.UserPreferences.sds_secs', index=8, number=9, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ls_secs', full_name='RadioConfig.UserPreferences.ls_secs', index=8, + name='ls_secs', full_name='RadioConfig.UserPreferences.ls_secs', index=9, number=10, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='min_wake_secs', full_name='RadioConfig.UserPreferences.min_wake_secs', index=9, + name='min_wake_secs', full_name='RadioConfig.UserPreferences.min_wake_secs', index=10, number=11, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='wifi_ssid', full_name='RadioConfig.UserPreferences.wifi_ssid', index=10, + name='wifi_ssid', full_name='RadioConfig.UserPreferences.wifi_ssid', index=11, number=12, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='wifi_password', full_name='RadioConfig.UserPreferences.wifi_password', index=11, + name='wifi_password', full_name='RadioConfig.UserPreferences.wifi_password', index=12, number=13, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='wifi_ap_mode', full_name='RadioConfig.UserPreferences.wifi_ap_mode', index=12, + name='wifi_ap_mode', full_name='RadioConfig.UserPreferences.wifi_ap_mode', index=13, number=14, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='region', full_name='RadioConfig.UserPreferences.region', index=13, + name='region', full_name='RadioConfig.UserPreferences.region', index=14, number=15, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=14, + name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=15, number=16, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='is_router', full_name='RadioConfig.UserPreferences.is_router', index=15, + name='is_router', full_name='RadioConfig.UserPreferences.is_router', index=16, number=37, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=16, + name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=17, number=38, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=17, + name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=18, number=39, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serial_disabled', full_name='RadioConfig.UserPreferences.serial_disabled', index=18, + name='serial_disabled', full_name='RadioConfig.UserPreferences.serial_disabled', index=19, number=40, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='location_share', full_name='RadioConfig.UserPreferences.location_share', index=19, + name='location_share', full_name='RadioConfig.UserPreferences.location_share', index=20, number=32, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='gps_operation', full_name='RadioConfig.UserPreferences.gps_operation', index=20, + name='gps_operation', full_name='RadioConfig.UserPreferences.gps_operation', index=21, number=33, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='gps_update_interval', full_name='RadioConfig.UserPreferences.gps_update_interval', index=21, + name='gps_update_interval', full_name='RadioConfig.UserPreferences.gps_update_interval', index=22, number=34, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='gps_attempt_time', full_name='RadioConfig.UserPreferences.gps_attempt_time', index=22, + name='gps_attempt_time', full_name='RadioConfig.UserPreferences.gps_attempt_time', index=23, number=36, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='gps_accept_2d', full_name='RadioConfig.UserPreferences.gps_accept_2d', index=23, + name='gps_accept_2d', full_name='RadioConfig.UserPreferences.gps_accept_2d', index=24, number=45, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='gps_max_dop', full_name='RadioConfig.UserPreferences.gps_max_dop', index=24, + name='gps_max_dop', full_name='RadioConfig.UserPreferences.gps_max_dop', index=25, number=46, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='frequency_offset', full_name='RadioConfig.UserPreferences.frequency_offset', index=25, + name='frequency_offset', full_name='RadioConfig.UserPreferences.frequency_offset', index=26, number=41, type=2, cpp_type=6, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='mqtt_server', full_name='RadioConfig.UserPreferences.mqtt_server', index=26, + name='mqtt_server', full_name='RadioConfig.UserPreferences.mqtt_server', index=27, number=42, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='mqtt_disabled', full_name='RadioConfig.UserPreferences.mqtt_disabled', index=27, + name='mqtt_disabled', full_name='RadioConfig.UserPreferences.mqtt_disabled', index=28, number=43, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='gps_format', full_name='RadioConfig.UserPreferences.gps_format', index=28, + name='gps_format', full_name='RadioConfig.UserPreferences.gps_format', index=29, number=44, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=29, + name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=30, number=100, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=30, + name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=31, number=101, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=31, + name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=32, number=103, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serialplugin_enabled', full_name='RadioConfig.UserPreferences.serialplugin_enabled', index=32, + name='serialplugin_enabled', full_name='RadioConfig.UserPreferences.serialplugin_enabled', index=33, number=120, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serialplugin_echo', full_name='RadioConfig.UserPreferences.serialplugin_echo', index=33, + name='serialplugin_echo', full_name='RadioConfig.UserPreferences.serialplugin_echo', index=34, number=121, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serialplugin_rxd', full_name='RadioConfig.UserPreferences.serialplugin_rxd', index=34, + name='serialplugin_rxd', full_name='RadioConfig.UserPreferences.serialplugin_rxd', index=35, number=122, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serialplugin_txd', full_name='RadioConfig.UserPreferences.serialplugin_txd', index=35, + name='serialplugin_txd', full_name='RadioConfig.UserPreferences.serialplugin_txd', index=36, number=123, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serialplugin_timeout', full_name='RadioConfig.UserPreferences.serialplugin_timeout', index=36, + name='serialplugin_timeout', full_name='RadioConfig.UserPreferences.serialplugin_timeout', index=37, number=124, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='serialplugin_mode', full_name='RadioConfig.UserPreferences.serialplugin_mode', index=37, + name='serialplugin_mode', full_name='RadioConfig.UserPreferences.serialplugin_mode', index=38, number=125, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ext_notification_plugin_enabled', full_name='RadioConfig.UserPreferences.ext_notification_plugin_enabled', index=38, + name='ext_notification_plugin_enabled', full_name='RadioConfig.UserPreferences.ext_notification_plugin_enabled', index=39, number=126, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ext_notification_plugin_output_ms', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output_ms', index=39, + name='ext_notification_plugin_output_ms', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output_ms', index=40, number=127, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ext_notification_plugin_output', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output', index=40, + name='ext_notification_plugin_output', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output', index=41, number=128, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ext_notification_plugin_active', full_name='RadioConfig.UserPreferences.ext_notification_plugin_active', index=41, + name='ext_notification_plugin_active', full_name='RadioConfig.UserPreferences.ext_notification_plugin_active', index=42, number=129, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ext_notification_plugin_alert_message', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_message', index=42, + name='ext_notification_plugin_alert_message', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_message', index=43, number=130, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ext_notification_plugin_alert_bell', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_bell', index=43, + name='ext_notification_plugin_alert_bell', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_bell', index=44, number=131, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='range_test_plugin_enabled', full_name='RadioConfig.UserPreferences.range_test_plugin_enabled', index=44, + name='range_test_plugin_enabled', full_name='RadioConfig.UserPreferences.range_test_plugin_enabled', index=45, number=132, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='range_test_plugin_sender', full_name='RadioConfig.UserPreferences.range_test_plugin_sender', index=45, + name='range_test_plugin_sender', full_name='RadioConfig.UserPreferences.range_test_plugin_sender', index=46, number=133, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='range_test_plugin_save', full_name='RadioConfig.UserPreferences.range_test_plugin_save', index=46, + name='range_test_plugin_save', full_name='RadioConfig.UserPreferences.range_test_plugin_save', index=47, number=134, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='store_forward_plugin_enabled', full_name='RadioConfig.UserPreferences.store_forward_plugin_enabled', index=47, + name='store_forward_plugin_enabled', full_name='RadioConfig.UserPreferences.store_forward_plugin_enabled', index=48, number=148, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='store_forward_plugin_records', full_name='RadioConfig.UserPreferences.store_forward_plugin_records', index=48, + name='store_forward_plugin_heartbeat', full_name='RadioConfig.UserPreferences.store_forward_plugin_heartbeat', index=49, + number=149, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_records', full_name='RadioConfig.UserPreferences.store_forward_plugin_records', index=50, number=137, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_measurement_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_measurement_enabled', index=49, + name='store_forward_plugin_history_return_max', full_name='RadioConfig.UserPreferences.store_forward_plugin_history_return_max', index=51, + number=138, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_history_return_window', full_name='RadioConfig.UserPreferences.store_forward_plugin_history_return_window', index=52, + number=139, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_measurement_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_measurement_enabled', index=53, number=140, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_screen_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_screen_enabled', index=50, + name='environmental_measurement_plugin_screen_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_screen_enabled', index=54, number=141, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_read_error_count_threshold', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_read_error_count_threshold', index=51, + name='environmental_measurement_plugin_read_error_count_threshold', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_read_error_count_threshold', index=55, number=142, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_update_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_update_interval', index=52, + name='environmental_measurement_plugin_update_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_update_interval', index=56, number=143, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_recovery_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_recovery_interval', index=53, + name='environmental_measurement_plugin_recovery_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_recovery_interval', index=57, number=144, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_display_farenheit', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_display_farenheit', index=54, + name='environmental_measurement_plugin_display_farenheit', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_display_farenheit', index=58, number=145, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_sensor_type', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_type', index=55, + name='environmental_measurement_plugin_sensor_type', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_type', index=59, number=146, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='environmental_measurement_plugin_sensor_pin', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_pin', index=56, + name='environmental_measurement_plugin_sensor_pin', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_pin', index=60, number=147, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='position_flags', full_name='RadioConfig.UserPreferences.position_flags', index=57, + name='position_flags', full_name='RadioConfig.UserPreferences.position_flags', index=61, number=150, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_always_powered', full_name='RadioConfig.UserPreferences.is_always_powered', index=62, + number=151, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='auto_screen_carousel_secs', full_name='RadioConfig.UserPreferences.auto_screen_carousel_secs', index=63, + number=152, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -881,7 +861,7 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( oneofs=[ ], serialized_start=89, - serialized_end=2206, + serialized_end=2448, ) _RADIOCONFIG = _descriptor.Descriptor( @@ -890,7 +870,6 @@ _RADIOCONFIG = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='preferences', full_name='RadioConfig.preferences', index=0, @@ -898,7 +877,7 @@ _RADIOCONFIG = _descriptor.Descriptor( has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -912,7 +891,7 @@ _RADIOCONFIG = _descriptor.Descriptor( oneofs=[ ], serialized_start=22, - serialized_end=2206, + serialized_end=2448, ) _RADIOCONFIG_USERPREFERENCES.fields_by_name['region'].enum_type = _REGIONCODE diff --git a/meshtastic/radioconfig_pb2.py-E b/meshtastic/radioconfig_pb2.py-E new file mode 100644 index 0000000..1e755fb --- /dev/null +++ b/meshtastic/radioconfig_pb2.py-E @@ -0,0 +1,932 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: radioconfig.proto + +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='radioconfig.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\021RadioConfigProtosH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x11radioconfig.proto\"\xfa\x12\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x1a\xb7\x12\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12 \n\x18position_broadcast_smart\x18\x11 \x01(\x08\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x11\n\twifi_ssid\x18\x0c \x01(\t\x12\x15\n\rwifi_password\x18\r \x01(\t\x12\x14\n\x0cwifi_ap_mode\x18\x0e \x01(\x08\x12\x1b\n\x06region\x18\x0f \x01(\x0e\x32\x0b.RegionCode\x12&\n\x0e\x63harge_current\x18\x10 \x01(\x0e\x32\x0e.ChargeCurrent\x12\x11\n\tis_router\x18% \x01(\x08\x12\x14\n\x0cis_low_power\x18& \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\' \x01(\x08\x12\x17\n\x0fserial_disabled\x18( \x01(\x08\x12(\n\x0elocation_share\x18 \x01(\x0e\x32\x10.LocationSharing\x12$\n\rgps_operation\x18! \x01(\x0e\x32\r.GpsOperation\x12\x1b\n\x13gps_update_interval\x18\" \x01(\r\x12\x18\n\x10gps_attempt_time\x18$ \x01(\r\x12\x15\n\rgps_accept_2d\x18- \x01(\x08\x12\x13\n\x0bgps_max_dop\x18. \x01(\r\x12\x18\n\x10\x66requency_offset\x18) \x01(\x02\x12\x13\n\x0bmqtt_server\x18* \x01(\t\x12\x15\n\rmqtt_disabled\x18+ \x01(\x08\x12(\n\ngps_format\x18, \x01(\x0e\x32\x14.GpsCoordinateFormat\x12\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x1c\n\x14serialplugin_enabled\x18x \x01(\x08\x12\x19\n\x11serialplugin_echo\x18y \x01(\x08\x12\x18\n\x10serialplugin_rxd\x18z \x01(\r\x12\x18\n\x10serialplugin_txd\x18{ \x01(\r\x12\x1c\n\x14serialplugin_timeout\x18| \x01(\r\x12\x19\n\x11serialplugin_mode\x18} \x01(\r\x12\'\n\x1f\x65xt_notification_plugin_enabled\x18~ \x01(\x08\x12)\n!ext_notification_plugin_output_ms\x18\x7f \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_output\x18\x80\x01 \x01(\r\x12\'\n\x1e\x65xt_notification_plugin_active\x18\x81\x01 \x01(\x08\x12.\n%ext_notification_plugin_alert_message\x18\x82\x01 \x01(\x08\x12+\n\"ext_notification_plugin_alert_bell\x18\x83\x01 \x01(\x08\x12\"\n\x19range_test_plugin_enabled\x18\x84\x01 \x01(\x08\x12!\n\x18range_test_plugin_sender\x18\x85\x01 \x01(\r\x12\x1f\n\x16range_test_plugin_save\x18\x86\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_enabled\x18\x94\x01 \x01(\x08\x12\'\n\x1estore_forward_plugin_heartbeat\x18\x95\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\x12\x30\n\'store_forward_plugin_history_return_max\x18\x8a\x01 \x01(\r\x12\x33\n*store_forward_plugin_history_return_window\x18\x8b\x01 \x01(\r\x12=\n4environmental_measurement_plugin_measurement_enabled\x18\x8c\x01 \x01(\x08\x12\x38\n/environmental_measurement_plugin_screen_enabled\x18\x8d\x01 \x01(\x08\x12\x44\n;environmental_measurement_plugin_read_error_count_threshold\x18\x8e\x01 \x01(\r\x12\x39\n0environmental_measurement_plugin_update_interval\x18\x8f\x01 \x01(\r\x12;\n2environmental_measurement_plugin_recovery_interval\x18\x90\x01 \x01(\r\x12;\n2environmental_measurement_plugin_display_farenheit\x18\x91\x01 \x01(\x08\x12v\n,environmental_measurement_plugin_sensor_type\x18\x92\x01 \x01(\x0e\x32?.RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType\x12\x34\n+environmental_measurement_plugin_sensor_pin\x18\x93\x01 \x01(\r\x12\x17\n\x0eposition_flags\x18\x96\x01 \x01(\r\x12\x1a\n\x11is_always_powered\x18\x97\x01 \x01(\x08\x12\"\n\x19\x61uto_screen_carousel_secs\x18\x98\x01 \x01(\r\"<\n\"EnvironmentalMeasurementSensorType\x12\t\n\x05\x44HT11\x10\x00\x12\x0b\n\x07\x44S18B20\x10\x01J\x06\x08\x88\x01\x10\x89\x01*f\n\nRegionCode\x12\t\n\x05Unset\x10\x00\x12\x06\n\x02US\x10\x01\x12\t\n\x05\x45U433\x10\x02\x12\t\n\x05\x45U865\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t*\xd1\x01\n\rChargeCurrent\x12\x0b\n\x07MAUnset\x10\x00\x12\t\n\x05MA100\x10\x01\x12\t\n\x05MA190\x10\x02\x12\t\n\x05MA280\x10\x03\x12\t\n\x05MA360\x10\x04\x12\t\n\x05MA450\x10\x05\x12\t\n\x05MA550\x10\x06\x12\t\n\x05MA630\x10\x07\x12\t\n\x05MA700\x10\x08\x12\t\n\x05MA780\x10\t\x12\t\n\x05MA880\x10\n\x12\t\n\x05MA960\x10\x0b\x12\n\n\x06MA1000\x10\x0c\x12\n\n\x06MA1080\x10\r\x12\n\n\x06MA1160\x10\x0e\x12\n\n\x06MA1240\x10\x0f\x12\n\n\x06MA1320\x10\x10*j\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\x12\x13\n\x0fGpsOpStationary\x10\x01\x12\x0f\n\x0bGpsOpMobile\x10\x02\x12\x11\n\rGpsOpTimeOnly\x10\x03\x12\x11\n\rGpsOpDisabled\x10\x04*\x83\x01\n\x13GpsCoordinateFormat\x12\x10\n\x0cGpsFormatDec\x10\x00\x12\x10\n\x0cGpsFormatDMS\x10\x01\x12\x10\n\x0cGpsFormatUTM\x10\x02\x12\x11\n\rGpsFormatMGRS\x10\x03\x12\x10\n\x0cGpsFormatOLC\x10\x04\x12\x11\n\rGpsFormatOSGR\x10\x05*@\n\x0fLocationSharing\x12\x0c\n\x08LocUnset\x10\x00\x12\x0e\n\nLocEnabled\x10\x01\x12\x0f\n\x0bLocDisabled\x10\x02*\xbc\x01\n\rPositionFlags\x12\x11\n\rPOS_UNDEFINED\x10\x00\x12\x10\n\x0cPOS_ALTITUDE\x10\x01\x12\x0f\n\x0bPOS_ALT_MSL\x10\x02\x12\x0f\n\x0bPOS_GEO_SEP\x10\x04\x12\x0b\n\x07POS_DOP\x10\x08\x12\r\n\tPOS_HVDOP\x10\x10\x12\x0f\n\x0bPOS_BATTERY\x10 \x12\x11\n\rPOS_SATINVIEW\x10@\x12\x10\n\x0bPOS_SEQ_NOS\x10\x80\x01\x12\x12\n\rPOS_TIMESTAMP\x10\x80\x02\x42M\n\x13\x63om.geeksville.meshB\x11RadioConfigProtosH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + +_REGIONCODE = _descriptor.EnumDescriptor( + name='RegionCode', + full_name='RegionCode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='Unset', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='US', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EU433', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EU865', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CN', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='JP', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ANZ', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KR', index=7, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TW', index=8, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RU', index=9, number=9, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2450, + serialized_end=2552, +) +_sym_db.RegisterEnumDescriptor(_REGIONCODE) + +RegionCode = enum_type_wrapper.EnumTypeWrapper(_REGIONCODE) +_CHARGECURRENT = _descriptor.EnumDescriptor( + name='ChargeCurrent', + full_name='ChargeCurrent', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MAUnset', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA100', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA190', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA280', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA360', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA450', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA550', index=6, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA630', index=7, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA700', index=8, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA780', index=9, number=9, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA880', index=10, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA960', index=11, number=11, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA1000', index=12, number=12, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA1080', index=13, number=13, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA1160', index=14, number=14, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA1240', index=15, number=15, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MA1320', index=16, number=16, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2555, + serialized_end=2764, +) +_sym_db.RegisterEnumDescriptor(_CHARGECURRENT) + +ChargeCurrent = enum_type_wrapper.EnumTypeWrapper(_CHARGECURRENT) +_GPSOPERATION = _descriptor.EnumDescriptor( + name='GpsOperation', + full_name='GpsOperation', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='GpsOpUnset', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsOpStationary', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsOpMobile', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsOpTimeOnly', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsOpDisabled', index=4, number=4, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2766, + serialized_end=2872, +) +_sym_db.RegisterEnumDescriptor(_GPSOPERATION) + +GpsOperation = enum_type_wrapper.EnumTypeWrapper(_GPSOPERATION) +_GPSCOORDINATEFORMAT = _descriptor.EnumDescriptor( + name='GpsCoordinateFormat', + full_name='GpsCoordinateFormat', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='GpsFormatDec', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsFormatDMS', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsFormatUTM', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsFormatMGRS', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsFormatOLC', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GpsFormatOSGR', index=5, number=5, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2875, + serialized_end=3006, +) +_sym_db.RegisterEnumDescriptor(_GPSCOORDINATEFORMAT) + +GpsCoordinateFormat = enum_type_wrapper.EnumTypeWrapper(_GPSCOORDINATEFORMAT) +_LOCATIONSHARING = _descriptor.EnumDescriptor( + name='LocationSharing', + full_name='LocationSharing', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LocUnset', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LocEnabled', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LocDisabled', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3008, + serialized_end=3072, +) +_sym_db.RegisterEnumDescriptor(_LOCATIONSHARING) + +LocationSharing = enum_type_wrapper.EnumTypeWrapper(_LOCATIONSHARING) +_POSITIONFLAGS = _descriptor.EnumDescriptor( + name='PositionFlags', + full_name='PositionFlags', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='POS_UNDEFINED', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_ALTITUDE', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_ALT_MSL', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_GEO_SEP', index=3, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_DOP', index=4, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_HVDOP', index=5, number=16, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_BATTERY', index=6, number=32, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_SATINVIEW', index=7, number=64, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_SEQ_NOS', index=8, number=128, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POS_TIMESTAMP', index=9, number=256, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3075, + serialized_end=3263, +) +_sym_db.RegisterEnumDescriptor(_POSITIONFLAGS) + +PositionFlags = enum_type_wrapper.EnumTypeWrapper(_POSITIONFLAGS) +Unset = 0 +US = 1 +EU433 = 2 +EU865 = 3 +CN = 4 +JP = 5 +ANZ = 6 +KR = 7 +TW = 8 +RU = 9 +MAUnset = 0 +MA100 = 1 +MA190 = 2 +MA280 = 3 +MA360 = 4 +MA450 = 5 +MA550 = 6 +MA630 = 7 +MA700 = 8 +MA780 = 9 +MA880 = 10 +MA960 = 11 +MA1000 = 12 +MA1080 = 13 +MA1160 = 14 +MA1240 = 15 +MA1320 = 16 +GpsOpUnset = 0 +GpsOpStationary = 1 +GpsOpMobile = 2 +GpsOpTimeOnly = 3 +GpsOpDisabled = 4 +GpsFormatDec = 0 +GpsFormatDMS = 1 +GpsFormatUTM = 2 +GpsFormatMGRS = 3 +GpsFormatOLC = 4 +GpsFormatOSGR = 5 +LocUnset = 0 +LocEnabled = 1 +LocDisabled = 2 +POS_UNDEFINED = 0 +POS_ALTITUDE = 1 +POS_ALT_MSL = 2 +POS_GEO_SEP = 4 +POS_DOP = 8 +POS_HVDOP = 16 +POS_BATTERY = 32 +POS_SATINVIEW = 64 +POS_SEQ_NOS = 128 +POS_TIMESTAMP = 256 + + +_RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE = _descriptor.EnumDescriptor( + name='EnvironmentalMeasurementSensorType', + full_name='RadioConfig.UserPreferences.EnvironmentalMeasurementSensorType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DHT11', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DS18B20', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2380, + serialized_end=2440, +) +_sym_db.RegisterEnumDescriptor(_RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE) + + +_RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( + name='UserPreferences', + full_name='RadioConfig.UserPreferences', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='position_broadcast_secs', full_name='RadioConfig.UserPreferences.position_broadcast_secs', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='position_broadcast_smart', full_name='RadioConfig.UserPreferences.position_broadcast_smart', index=1, + number=17, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='send_owner_interval', full_name='RadioConfig.UserPreferences.send_owner_interval', index=2, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='wait_bluetooth_secs', full_name='RadioConfig.UserPreferences.wait_bluetooth_secs', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='screen_on_secs', full_name='RadioConfig.UserPreferences.screen_on_secs', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='phone_timeout_secs', full_name='RadioConfig.UserPreferences.phone_timeout_secs', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='phone_sds_timeout_sec', full_name='RadioConfig.UserPreferences.phone_sds_timeout_sec', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mesh_sds_timeout_secs', full_name='RadioConfig.UserPreferences.mesh_sds_timeout_secs', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='sds_secs', full_name='RadioConfig.UserPreferences.sds_secs', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ls_secs', full_name='RadioConfig.UserPreferences.ls_secs', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='min_wake_secs', full_name='RadioConfig.UserPreferences.min_wake_secs', index=10, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='wifi_ssid', full_name='RadioConfig.UserPreferences.wifi_ssid', index=11, + number=12, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='wifi_password', full_name='RadioConfig.UserPreferences.wifi_password', index=12, + number=13, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='wifi_ap_mode', full_name='RadioConfig.UserPreferences.wifi_ap_mode', index=13, + number=14, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='region', full_name='RadioConfig.UserPreferences.region', index=14, + number=15, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=15, + number=16, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_router', full_name='RadioConfig.UserPreferences.is_router', index=16, + number=37, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=17, + number=38, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=18, + number=39, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serial_disabled', full_name='RadioConfig.UserPreferences.serial_disabled', index=19, + number=40, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='location_share', full_name='RadioConfig.UserPreferences.location_share', index=20, + number=32, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_operation', full_name='RadioConfig.UserPreferences.gps_operation', index=21, + number=33, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_update_interval', full_name='RadioConfig.UserPreferences.gps_update_interval', index=22, + number=34, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_attempt_time', full_name='RadioConfig.UserPreferences.gps_attempt_time', index=23, + number=36, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_accept_2d', full_name='RadioConfig.UserPreferences.gps_accept_2d', index=24, + number=45, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_max_dop', full_name='RadioConfig.UserPreferences.gps_max_dop', index=25, + number=46, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='frequency_offset', full_name='RadioConfig.UserPreferences.frequency_offset', index=26, + number=41, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mqtt_server', full_name='RadioConfig.UserPreferences.mqtt_server', index=27, + number=42, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mqtt_disabled', full_name='RadioConfig.UserPreferences.mqtt_disabled', index=28, + number=43, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gps_format', full_name='RadioConfig.UserPreferences.gps_format', index=29, + number=44, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=30, + number=100, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=31, + number=101, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=32, + number=103, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serialplugin_enabled', full_name='RadioConfig.UserPreferences.serialplugin_enabled', index=33, + number=120, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serialplugin_echo', full_name='RadioConfig.UserPreferences.serialplugin_echo', index=34, + number=121, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serialplugin_rxd', full_name='RadioConfig.UserPreferences.serialplugin_rxd', index=35, + number=122, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serialplugin_txd', full_name='RadioConfig.UserPreferences.serialplugin_txd', index=36, + number=123, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serialplugin_timeout', full_name='RadioConfig.UserPreferences.serialplugin_timeout', index=37, + number=124, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='serialplugin_mode', full_name='RadioConfig.UserPreferences.serialplugin_mode', index=38, + number=125, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ext_notification_plugin_enabled', full_name='RadioConfig.UserPreferences.ext_notification_plugin_enabled', index=39, + number=126, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ext_notification_plugin_output_ms', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output_ms', index=40, + number=127, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ext_notification_plugin_output', full_name='RadioConfig.UserPreferences.ext_notification_plugin_output', index=41, + number=128, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ext_notification_plugin_active', full_name='RadioConfig.UserPreferences.ext_notification_plugin_active', index=42, + number=129, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ext_notification_plugin_alert_message', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_message', index=43, + number=130, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ext_notification_plugin_alert_bell', full_name='RadioConfig.UserPreferences.ext_notification_plugin_alert_bell', index=44, + number=131, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='range_test_plugin_enabled', full_name='RadioConfig.UserPreferences.range_test_plugin_enabled', index=45, + number=132, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='range_test_plugin_sender', full_name='RadioConfig.UserPreferences.range_test_plugin_sender', index=46, + number=133, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='range_test_plugin_save', full_name='RadioConfig.UserPreferences.range_test_plugin_save', index=47, + number=134, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_enabled', full_name='RadioConfig.UserPreferences.store_forward_plugin_enabled', index=48, + number=148, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_heartbeat', full_name='RadioConfig.UserPreferences.store_forward_plugin_heartbeat', index=49, + number=149, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_records', full_name='RadioConfig.UserPreferences.store_forward_plugin_records', index=50, + number=137, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_history_return_max', full_name='RadioConfig.UserPreferences.store_forward_plugin_history_return_max', index=51, + number=138, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='store_forward_plugin_history_return_window', full_name='RadioConfig.UserPreferences.store_forward_plugin_history_return_window', index=52, + number=139, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_measurement_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_measurement_enabled', index=53, + number=140, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_screen_enabled', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_screen_enabled', index=54, + number=141, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_read_error_count_threshold', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_read_error_count_threshold', index=55, + number=142, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_update_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_update_interval', index=56, + number=143, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_recovery_interval', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_recovery_interval', index=57, + number=144, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_display_farenheit', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_display_farenheit', index=58, + number=145, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_sensor_type', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_type', index=59, + number=146, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='environmental_measurement_plugin_sensor_pin', full_name='RadioConfig.UserPreferences.environmental_measurement_plugin_sensor_pin', index=60, + number=147, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='position_flags', full_name='RadioConfig.UserPreferences.position_flags', index=61, + number=150, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_always_powered', full_name='RadioConfig.UserPreferences.is_always_powered', index=62, + number=151, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='auto_screen_carousel_secs', full_name='RadioConfig.UserPreferences.auto_screen_carousel_secs', index=63, + number=152, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=89, + serialized_end=2448, +) + +_RADIOCONFIG = _descriptor.Descriptor( + name='RadioConfig', + full_name='RadioConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='preferences', full_name='RadioConfig.preferences', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_RADIOCONFIG_USERPREFERENCES, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=22, + serialized_end=2448, +) + +_RADIOCONFIG_USERPREFERENCES.fields_by_name['region'].enum_type = _REGIONCODE +_RADIOCONFIG_USERPREFERENCES.fields_by_name['charge_current'].enum_type = _CHARGECURRENT +_RADIOCONFIG_USERPREFERENCES.fields_by_name['location_share'].enum_type = _LOCATIONSHARING +_RADIOCONFIG_USERPREFERENCES.fields_by_name['gps_operation'].enum_type = _GPSOPERATION +_RADIOCONFIG_USERPREFERENCES.fields_by_name['gps_format'].enum_type = _GPSCOORDINATEFORMAT +_RADIOCONFIG_USERPREFERENCES.fields_by_name['environmental_measurement_plugin_sensor_type'].enum_type = _RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE +_RADIOCONFIG_USERPREFERENCES.containing_type = _RADIOCONFIG +_RADIOCONFIG_USERPREFERENCES_ENVIRONMENTALMEASUREMENTSENSORTYPE.containing_type = _RADIOCONFIG_USERPREFERENCES +_RADIOCONFIG.fields_by_name['preferences'].message_type = _RADIOCONFIG_USERPREFERENCES +DESCRIPTOR.message_types_by_name['RadioConfig'] = _RADIOCONFIG +DESCRIPTOR.enum_types_by_name['RegionCode'] = _REGIONCODE +DESCRIPTOR.enum_types_by_name['ChargeCurrent'] = _CHARGECURRENT +DESCRIPTOR.enum_types_by_name['GpsOperation'] = _GPSOPERATION +DESCRIPTOR.enum_types_by_name['GpsCoordinateFormat'] = _GPSCOORDINATEFORMAT +DESCRIPTOR.enum_types_by_name['LocationSharing'] = _LOCATIONSHARING +DESCRIPTOR.enum_types_by_name['PositionFlags'] = _POSITIONFLAGS +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +RadioConfig = _reflection.GeneratedProtocolMessageType('RadioConfig', (_message.Message,), { + + 'UserPreferences' : _reflection.GeneratedProtocolMessageType('UserPreferences', (_message.Message,), { + 'DESCRIPTOR' : _RADIOCONFIG_USERPREFERENCES, + '__module__' : 'radioconfig_pb2' + # @@protoc_insertion_point(class_scope:RadioConfig.UserPreferences) + }) + , + 'DESCRIPTOR' : _RADIOCONFIG, + '__module__' : 'radioconfig_pb2' + # @@protoc_insertion_point(class_scope:RadioConfig) + }) +_sym_db.RegisterMessage(RadioConfig) +_sym_db.RegisterMessage(RadioConfig.UserPreferences) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/remote_hardware.py-E b/meshtastic/remote_hardware.py-E new file mode 100644 index 0000000..ae98938 --- /dev/null +++ b/meshtastic/remote_hardware.py-E @@ -0,0 +1,67 @@ + +from . import portnums_pb2, remote_hardware_pb2 +from pubsub import pub + + +def onGPIOreceive(packet, interface): + """Callback for received GPIO responses + + FIXME figure out how to do closures with methods in python""" + hw = packet["decoded"]["remotehw"] + print(f'Received RemoteHardware typ={hw["typ"]}, gpio_value={hw["gpioValue"]}') + + +class RemoteHardwareClient: + """ + This is the client code to control/monitor simple hardware built into the + meshtastic devices. It is intended to be both a useful API/service and example + code for how you can connect to your own custom meshtastic services + """ + + def __init__(self, iface): + """ + Constructor + + iface is the already open MeshInterface instance + """ + self.iface = iface + ch = iface.localNode.getChannelByName("gpio") + if not ch: + raise Exception( + "No gpio channel found, please create on the sending and receive nodes to use this (secured) service (--ch-add gpio --info then --seturl)") + self.channelIndex = ch.index + + pub.subscribe( + onGPIOreceive, "meshtastic.receive.remotehw") + + def _sendHardware(self, nodeid, r, wantResponse=False, onResponse=None): + if not nodeid: + raise Exception( + "You must set a destination node ID for this operation (use --dest \!xxxxxxxxx)") + return self.iface.sendData(r, nodeid, portnums_pb2.REMOTE_HARDWARE_APP, + wantAck=True, channelIndex=self.channelIndex, wantResponse=wantResponse, onResponse=onResponse) + + def writeGPIOs(self, nodeid, mask, vals): + """ + Write the specified vals bits to the device GPIOs. Only bits in mask that + are 1 will be changed + """ + r = remote_hardware_pb2.HardwareMessage() + r.typ = remote_hardware_pb2.HardwareMessage.Type.WRITE_GPIOS + r.gpio_mask = mask + r.gpio_value = vals + return self._sendHardware(nodeid, r) + + def readGPIOs(self, nodeid, mask, onResponse = None): + """Read the specified bits from GPIO inputs on the device""" + r = remote_hardware_pb2.HardwareMessage() + r.typ = remote_hardware_pb2.HardwareMessage.Type.READ_GPIOS + r.gpio_mask = mask + return self._sendHardware(nodeid, r, wantResponse=True, onResponse=onResponse) + + def watchGPIOs(self, nodeid, mask): + """Watch the specified bits from GPIO inputs on the device for changes""" + r = remote_hardware_pb2.HardwareMessage() + r.typ = remote_hardware_pb2.HardwareMessage.Type.WATCH_GPIOS + r.gpio_mask = mask + return self._sendHardware(nodeid, r) diff --git a/meshtastic/remote_hardware_pb2.py b/meshtastic/remote_hardware_pb2.py index 44ae274..17c41b4 100644 --- a/meshtastic/remote_hardware_pb2.py +++ b/meshtastic/remote_hardware_pb2.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: remote_hardware.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -18,7 +18,6 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\016RemoteHardwareH\003Z!github.com/meshtastic/gomeshproto', - create_key=_descriptor._internal_create_key, serialized_pb=b'\n\x15remote_hardware.proto\"\xca\x01\n\x0fHardwareMessage\x12\"\n\x03typ\x18\x01 \x01(\x0e\x32\x15.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42J\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' ) @@ -29,38 +28,31 @@ _HARDWAREMESSAGE_TYPE = _descriptor.EnumDescriptor( full_name='HardwareMessage.Type', filename=None, file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='UNSET', index=0, number=0, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='WRITE_GPIOS', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='WATCH_GPIOS', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='GPIOS_CHANGED', index=3, number=3, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='READ_GPIOS', index=4, number=4, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='READ_GPIOS_REPLY', index=5, number=5, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, @@ -76,7 +68,6 @@ _HARDWAREMESSAGE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='typ', full_name='HardwareMessage.typ', index=0, @@ -84,21 +75,21 @@ _HARDWAREMESSAGE = _descriptor.Descriptor( has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='gpio_mask', full_name='HardwareMessage.gpio_mask', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='gpio_value', full_name='HardwareMessage.gpio_value', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], diff --git a/meshtastic/remote_hardware_pb2.py-E b/meshtastic/remote_hardware_pb2.py-E new file mode 100644 index 0000000..17c41b4 --- /dev/null +++ b/meshtastic/remote_hardware_pb2.py-E @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: remote_hardware.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='remote_hardware.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\016RemoteHardwareH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x15remote_hardware.proto\"\xca\x01\n\x0fHardwareMessage\x12\"\n\x03typ\x18\x01 \x01(\x0e\x32\x15.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42J\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + + + +_HARDWAREMESSAGE_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='HardwareMessage.Type', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNSET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WRITE_GPIOS', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WATCH_GPIOS', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GPIOS_CHANGED', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='READ_GPIOS', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='READ_GPIOS_REPLY', index=5, number=5, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=120, + serialized_end=228, +) +_sym_db.RegisterEnumDescriptor(_HARDWAREMESSAGE_TYPE) + + +_HARDWAREMESSAGE = _descriptor.Descriptor( + name='HardwareMessage', + full_name='HardwareMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='typ', full_name='HardwareMessage.typ', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gpio_mask', full_name='HardwareMessage.gpio_mask', index=1, + number=2, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gpio_value', full_name='HardwareMessage.gpio_value', index=2, + number=3, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _HARDWAREMESSAGE_TYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=26, + serialized_end=228, +) + +_HARDWAREMESSAGE.fields_by_name['typ'].enum_type = _HARDWAREMESSAGE_TYPE +_HARDWAREMESSAGE_TYPE.containing_type = _HARDWAREMESSAGE +DESCRIPTOR.message_types_by_name['HardwareMessage'] = _HARDWAREMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HardwareMessage = _reflection.GeneratedProtocolMessageType('HardwareMessage', (_message.Message,), { + 'DESCRIPTOR' : _HARDWAREMESSAGE, + '__module__' : 'remote_hardware_pb2' + # @@protoc_insertion_point(class_scope:HardwareMessage) + }) +_sym_db.RegisterMessage(HardwareMessage) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/storeforward_pb2.py b/meshtastic/storeforward_pb2.py new file mode 100644 index 0000000..b27cb8e --- /dev/null +++ b/meshtastic/storeforward_pb2.py @@ -0,0 +1,291 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: storeforward.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='storeforward.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\017StoreAndForwardH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x12storeforward.proto\"\x8d\x05\n\x16StoreAndForwardMessage\x12\x33\n\x02rr\x18\x01 \x01(\x0e\x32\'.StoreAndForwardMessage.RequestResponse\x12\x31\n\x05stats\x18\x02 \x01(\x0b\x32\".StoreAndForwardMessage.Statistics\x12\x30\n\x07history\x18\x03 \x01(\x0b\x32\x1f.StoreAndForwardMessage.History\x1a\xc6\x01\n\nStatistics\x12\x15\n\rMessagesTotal\x18\x01 \x01(\r\x12\x15\n\rMessagesSaved\x18\x02 \x01(\r\x12\x13\n\x0bMessagesMax\x18\x03 \x01(\r\x12\x0e\n\x06UpTime\x18\x04 \x01(\r\x12\x10\n\x08Requests\x18\x05 \x01(\r\x12\x17\n\x0fRequestsHistory\x18\x06 \x01(\r\x12\x11\n\tHeartbeat\x18\x07 \x01(\x08\x12\x11\n\tReturnMax\x18\x08 \x01(\r\x12\x14\n\x0cReturnWindow\x18\t \x01(\r\x1a\x32\n\x07History\x12\x17\n\x0fHistoryMessages\x18\x01 \x01(\r\x12\x0e\n\x06Window\x18\x02 \x01(\r\"\xdb\x01\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x10\n\x0c\x43LIENT_ERROR\x10\x65\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x66\x12\x10\n\x0c\x43LIENT_STATS\x10g\x12\x0f\n\x0b\x43LIENT_PING\x10h\x12\x0f\n\x0b\x43LIENT_PONG\x10i\x12\x08\n\x03MAX\x10\xff\x01\x42K\n\x13\x63om.geeksville.meshB\x0fStoreAndForwardH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + + + +_STOREANDFORWARDMESSAGE_REQUESTRESPONSE = _descriptor.EnumDescriptor( + name='RequestResponse', + full_name='StoreAndForwardMessage.RequestResponse', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNSET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_ERROR', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_HEARTBEAT', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_PING', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_PONG', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_BUSY', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_ERROR', index=6, number=101, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_HISTORY', index=7, number=102, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_STATS', index=8, number=103, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_PING', index=9, number=104, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_PONG', index=10, number=105, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAX', index=11, number=255, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=457, + serialized_end=676, +) +_sym_db.RegisterEnumDescriptor(_STOREANDFORWARDMESSAGE_REQUESTRESPONSE) + + +_STOREANDFORWARDMESSAGE_STATISTICS = _descriptor.Descriptor( + name='Statistics', + full_name='StoreAndForwardMessage.Statistics', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MessagesTotal', full_name='StoreAndForwardMessage.Statistics.MessagesTotal', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='MessagesSaved', full_name='StoreAndForwardMessage.Statistics.MessagesSaved', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='MessagesMax', full_name='StoreAndForwardMessage.Statistics.MessagesMax', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='UpTime', full_name='StoreAndForwardMessage.Statistics.UpTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Requests', full_name='StoreAndForwardMessage.Statistics.Requests', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='RequestsHistory', full_name='StoreAndForwardMessage.Statistics.RequestsHistory', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Heartbeat', full_name='StoreAndForwardMessage.Statistics.Heartbeat', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ReturnMax', full_name='StoreAndForwardMessage.Statistics.ReturnMax', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ReturnWindow', full_name='StoreAndForwardMessage.Statistics.ReturnWindow', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=204, + serialized_end=402, +) + +_STOREANDFORWARDMESSAGE_HISTORY = _descriptor.Descriptor( + name='History', + full_name='StoreAndForwardMessage.History', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='HistoryMessages', full_name='StoreAndForwardMessage.History.HistoryMessages', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Window', full_name='StoreAndForwardMessage.History.Window', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=404, + serialized_end=454, +) + +_STOREANDFORWARDMESSAGE = _descriptor.Descriptor( + name='StoreAndForwardMessage', + full_name='StoreAndForwardMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rr', full_name='StoreAndForwardMessage.rr', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='stats', full_name='StoreAndForwardMessage.stats', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='history', full_name='StoreAndForwardMessage.history', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_STOREANDFORWARDMESSAGE_STATISTICS, _STOREANDFORWARDMESSAGE_HISTORY, ], + enum_types=[ + _STOREANDFORWARDMESSAGE_REQUESTRESPONSE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=23, + serialized_end=676, +) + +_STOREANDFORWARDMESSAGE_STATISTICS.containing_type = _STOREANDFORWARDMESSAGE +_STOREANDFORWARDMESSAGE_HISTORY.containing_type = _STOREANDFORWARDMESSAGE +_STOREANDFORWARDMESSAGE.fields_by_name['rr'].enum_type = _STOREANDFORWARDMESSAGE_REQUESTRESPONSE +_STOREANDFORWARDMESSAGE.fields_by_name['stats'].message_type = _STOREANDFORWARDMESSAGE_STATISTICS +_STOREANDFORWARDMESSAGE.fields_by_name['history'].message_type = _STOREANDFORWARDMESSAGE_HISTORY +_STOREANDFORWARDMESSAGE_REQUESTRESPONSE.containing_type = _STOREANDFORWARDMESSAGE +DESCRIPTOR.message_types_by_name['StoreAndForwardMessage'] = _STOREANDFORWARDMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +StoreAndForwardMessage = _reflection.GeneratedProtocolMessageType('StoreAndForwardMessage', (_message.Message,), { + + 'Statistics' : _reflection.GeneratedProtocolMessageType('Statistics', (_message.Message,), { + 'DESCRIPTOR' : _STOREANDFORWARDMESSAGE_STATISTICS, + '__module__' : 'storeforward_pb2' + # @@protoc_insertion_point(class_scope:StoreAndForwardMessage.Statistics) + }) + , + + 'History' : _reflection.GeneratedProtocolMessageType('History', (_message.Message,), { + 'DESCRIPTOR' : _STOREANDFORWARDMESSAGE_HISTORY, + '__module__' : 'storeforward_pb2' + # @@protoc_insertion_point(class_scope:StoreAndForwardMessage.History) + }) + , + 'DESCRIPTOR' : _STOREANDFORWARDMESSAGE, + '__module__' : 'storeforward_pb2' + # @@protoc_insertion_point(class_scope:StoreAndForwardMessage) + }) +_sym_db.RegisterMessage(StoreAndForwardMessage) +_sym_db.RegisterMessage(StoreAndForwardMessage.Statistics) +_sym_db.RegisterMessage(StoreAndForwardMessage.History) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/storeforward_pb2.py-E b/meshtastic/storeforward_pb2.py-E new file mode 100644 index 0000000..b27cb8e --- /dev/null +++ b/meshtastic/storeforward_pb2.py-E @@ -0,0 +1,291 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: storeforward.proto + +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='storeforward.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\017StoreAndForwardH\003Z!github.com/meshtastic/gomeshproto', + serialized_pb=b'\n\x12storeforward.proto\"\x8d\x05\n\x16StoreAndForwardMessage\x12\x33\n\x02rr\x18\x01 \x01(\x0e\x32\'.StoreAndForwardMessage.RequestResponse\x12\x31\n\x05stats\x18\x02 \x01(\x0b\x32\".StoreAndForwardMessage.Statistics\x12\x30\n\x07history\x18\x03 \x01(\x0b\x32\x1f.StoreAndForwardMessage.History\x1a\xc6\x01\n\nStatistics\x12\x15\n\rMessagesTotal\x18\x01 \x01(\r\x12\x15\n\rMessagesSaved\x18\x02 \x01(\r\x12\x13\n\x0bMessagesMax\x18\x03 \x01(\r\x12\x0e\n\x06UpTime\x18\x04 \x01(\r\x12\x10\n\x08Requests\x18\x05 \x01(\r\x12\x17\n\x0fRequestsHistory\x18\x06 \x01(\r\x12\x11\n\tHeartbeat\x18\x07 \x01(\x08\x12\x11\n\tReturnMax\x18\x08 \x01(\r\x12\x14\n\x0cReturnWindow\x18\t \x01(\r\x1a\x32\n\x07History\x12\x17\n\x0fHistoryMessages\x18\x01 \x01(\r\x12\x0e\n\x06Window\x18\x02 \x01(\r\"\xdb\x01\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x10\n\x0c\x43LIENT_ERROR\x10\x65\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x66\x12\x10\n\x0c\x43LIENT_STATS\x10g\x12\x0f\n\x0b\x43LIENT_PING\x10h\x12\x0f\n\x0b\x43LIENT_PONG\x10i\x12\x08\n\x03MAX\x10\xff\x01\x42K\n\x13\x63om.geeksville.meshB\x0fStoreAndForwardH\x03Z!github.com/meshtastic/gomeshprotob\x06proto3' +) + + + +_STOREANDFORWARDMESSAGE_REQUESTRESPONSE = _descriptor.EnumDescriptor( + name='RequestResponse', + full_name='StoreAndForwardMessage.RequestResponse', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNSET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_ERROR', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_HEARTBEAT', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_PING', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_PONG', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ROUTER_BUSY', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_ERROR', index=6, number=101, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_HISTORY', index=7, number=102, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_STATS', index=8, number=103, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_PING', index=9, number=104, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLIENT_PONG', index=10, number=105, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAX', index=11, number=255, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=457, + serialized_end=676, +) +_sym_db.RegisterEnumDescriptor(_STOREANDFORWARDMESSAGE_REQUESTRESPONSE) + + +_STOREANDFORWARDMESSAGE_STATISTICS = _descriptor.Descriptor( + name='Statistics', + full_name='StoreAndForwardMessage.Statistics', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MessagesTotal', full_name='StoreAndForwardMessage.Statistics.MessagesTotal', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='MessagesSaved', full_name='StoreAndForwardMessage.Statistics.MessagesSaved', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='MessagesMax', full_name='StoreAndForwardMessage.Statistics.MessagesMax', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='UpTime', full_name='StoreAndForwardMessage.Statistics.UpTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Requests', full_name='StoreAndForwardMessage.Statistics.Requests', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='RequestsHistory', full_name='StoreAndForwardMessage.Statistics.RequestsHistory', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Heartbeat', full_name='StoreAndForwardMessage.Statistics.Heartbeat', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ReturnMax', full_name='StoreAndForwardMessage.Statistics.ReturnMax', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ReturnWindow', full_name='StoreAndForwardMessage.Statistics.ReturnWindow', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=204, + serialized_end=402, +) + +_STOREANDFORWARDMESSAGE_HISTORY = _descriptor.Descriptor( + name='History', + full_name='StoreAndForwardMessage.History', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='HistoryMessages', full_name='StoreAndForwardMessage.History.HistoryMessages', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Window', full_name='StoreAndForwardMessage.History.Window', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=404, + serialized_end=454, +) + +_STOREANDFORWARDMESSAGE = _descriptor.Descriptor( + name='StoreAndForwardMessage', + full_name='StoreAndForwardMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rr', full_name='StoreAndForwardMessage.rr', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='stats', full_name='StoreAndForwardMessage.stats', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='history', full_name='StoreAndForwardMessage.history', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_STOREANDFORWARDMESSAGE_STATISTICS, _STOREANDFORWARDMESSAGE_HISTORY, ], + enum_types=[ + _STOREANDFORWARDMESSAGE_REQUESTRESPONSE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=23, + serialized_end=676, +) + +_STOREANDFORWARDMESSAGE_STATISTICS.containing_type = _STOREANDFORWARDMESSAGE +_STOREANDFORWARDMESSAGE_HISTORY.containing_type = _STOREANDFORWARDMESSAGE +_STOREANDFORWARDMESSAGE.fields_by_name['rr'].enum_type = _STOREANDFORWARDMESSAGE_REQUESTRESPONSE +_STOREANDFORWARDMESSAGE.fields_by_name['stats'].message_type = _STOREANDFORWARDMESSAGE_STATISTICS +_STOREANDFORWARDMESSAGE.fields_by_name['history'].message_type = _STOREANDFORWARDMESSAGE_HISTORY +_STOREANDFORWARDMESSAGE_REQUESTRESPONSE.containing_type = _STOREANDFORWARDMESSAGE +DESCRIPTOR.message_types_by_name['StoreAndForwardMessage'] = _STOREANDFORWARDMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +StoreAndForwardMessage = _reflection.GeneratedProtocolMessageType('StoreAndForwardMessage', (_message.Message,), { + + 'Statistics' : _reflection.GeneratedProtocolMessageType('Statistics', (_message.Message,), { + 'DESCRIPTOR' : _STOREANDFORWARDMESSAGE_STATISTICS, + '__module__' : 'storeforward_pb2' + # @@protoc_insertion_point(class_scope:StoreAndForwardMessage.Statistics) + }) + , + + 'History' : _reflection.GeneratedProtocolMessageType('History', (_message.Message,), { + 'DESCRIPTOR' : _STOREANDFORWARDMESSAGE_HISTORY, + '__module__' : 'storeforward_pb2' + # @@protoc_insertion_point(class_scope:StoreAndForwardMessage.History) + }) + , + 'DESCRIPTOR' : _STOREANDFORWARDMESSAGE, + '__module__' : 'storeforward_pb2' + # @@protoc_insertion_point(class_scope:StoreAndForwardMessage) + }) +_sym_db.RegisterMessage(StoreAndForwardMessage) +_sym_db.RegisterMessage(StoreAndForwardMessage.Statistics) +_sym_db.RegisterMessage(StoreAndForwardMessage.History) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/test.py-E b/meshtastic/test.py-E new file mode 100644 index 0000000..c377427 --- /dev/null +++ b/meshtastic/test.py-E @@ -0,0 +1,182 @@ +import logging +from . import util +from . import SerialInterface, TCPInterface, BROADCAST_NUM +from pubsub import pub +import time +import sys +import threading, traceback +from dotmap import DotMap + +"""The interfaces we are using for our tests""" +interfaces = None + +"""A list of all packets we received while the current test was running""" +receivedPackets = None + +testsRunning = False + +testNumber = 0 + +sendingInterface = None + + +def onReceive(packet, interface): + """Callback invoked when a packet arrives""" + if sendingInterface == interface: + pass + # print("Ignoring sending interface") + else: + # print(f"From {interface.stream.port}: {packet}") + p = DotMap(packet) + + if p.decoded.portnum == "TEXT_MESSAGE_APP": + # We only care a about clear text packets + if receivedPackets != None: + receivedPackets.append(p) + + +def onNode(node): + """Callback invoked when the node DB changes""" + print(f"Node changed: {node}") + + +def subscribe(): + """Subscribe to the topics the user probably wants to see, prints output to stdout""" + + pub.subscribe(onNode, "meshtastic.node") + + +def testSend(fromInterface, toInterface, isBroadcast=False, asBinary=False, wantAck=False): + """ + Sends one test packet between two nodes and then returns success or failure + + Arguments: + fromInterface {[type]} -- [description] + toInterface {[type]} -- [description] + + Returns: + boolean -- True for success + """ + global receivedPackets + receivedPackets = [] + fromNode = fromInterface.myInfo.my_node_num + + if isBroadcast: + toNode = BROADCAST_NUM + else: + toNode = toInterface.myInfo.my_node_num + + logging.debug( + f"Sending test wantAck={wantAck} packet from {fromNode} to {toNode}") + global sendingInterface + sendingInterface = fromInterface + if not asBinary: + fromInterface.sendText(f"Test {testNumber}", toNode, wantAck=wantAck) + else: + fromInterface.sendData((f"Binary {testNumber}").encode( + "utf-8"), toNode, wantAck=wantAck) + for sec in range(60): # max of 60 secs before we timeout + time.sleep(1) + if (len(receivedPackets) >= 1): + return True + return False # Failed to send + + +def runTests(numTests=50, wantAck=False, maxFailures=0): + logging.info(f"Running {numTests} tests with wantAck={wantAck}") + numFail = 0 + numSuccess = 0 + for i in range(numTests): + global testNumber + testNumber = testNumber + 1 + isBroadcast = True + # asBinary=(i % 2 == 0) + success = testSend( + interfaces[0], interfaces[1], isBroadcast, asBinary=False, wantAck=wantAck) + if not success: + numFail = numFail + 1 + logging.error( + f"Test {testNumber} failed, expected packet not received ({numFail} failures so far)") + else: + numSuccess = numSuccess + 1 + logging.info( + f"Test {testNumber} succeeded {numSuccess} successes {numFail} failures so far") + + # if numFail >= 3: + # for i in interfaces: + # i.close() + # return + + time.sleep(1) + + if numFail > maxFailures: + logging.error("Too many failures! Test failed!") + + return numFail + + +def testThread(numTests=50): + logging.info("Found devices, starting tests...") + runTests(numTests, wantAck=True) + # Allow a few dropped packets + runTests(numTests, wantAck=False, maxFailures=5) + + +def onConnection(topic=pub.AUTO_TOPIC): + """Callback invoked when we connect/disconnect from a radio""" + print(f"Connection changed: {topic.getName()}") + + +def openDebugLog(portName): + debugname = "log" + portName.replace("/", "_") + logging.info(f"Writing serial debugging to {debugname}") + return open(debugname, 'w+', buffering=1) + + +def testAll(): + """ + Run a series of tests using devices we can find. + + Raises: + Exception: If not enough devices are found + """ + ports = util.findPorts() + if (len(ports) < 2): + raise Exception("Must have at least two devices connected to USB") + + pub.subscribe(onConnection, "meshtastic.connection") + pub.subscribe(onReceive, "meshtastic.receive") + global interfaces + interfaces = list(map(lambda port: SerialInterface( + port, debugOut=openDebugLog(port), connectNow=True), ports)) + + logging.info("Ports opened, starting test") + testThread() + + for i in interfaces: + i.close() + + +def testSimulator(): + """ + Assume that someone has launched meshtastic-native as a simulated node. + Talk to that node over TCP, do some operations and if they are successful + exit the process with a success code, else exit with a non zero exit code. + + Run with + python3 -c 'from meshtastic.test import testSimulator; testSimulator()' + """ + logging.basicConfig(level=logging.DEBUG if False else logging.INFO) + logging.info("Connecting to simulator on localhost!") + try: + iface = TCPInterface("localhost") + iface.showInfo() + iface.localNode.showInfo() + iface.localNode.exitSimulator() + iface.close() + logging.info("Integration test successful!") + except: + print("Error while testing simulator:", sys.exc_info()[0]) + traceback.print_exc() + sys.exit(1) + sys.exit(0) diff --git a/meshtastic/tunnel.py-E b/meshtastic/tunnel.py-E new file mode 100644 index 0000000..0aa9dc0 --- /dev/null +++ b/meshtastic/tunnel.py-E @@ -0,0 +1,207 @@ +# code for IP tunnel over a mesh +# Note python-pytuntap was too buggy +# using pip3 install pytap2 +# make sure to "sudo setcap cap_net_admin+eip /usr/bin/python3.8" so python can access tun device without being root +# sudo ip tuntap del mode tun tun0 +# sudo bin/run.sh --port /dev/ttyUSB0 --setch-shortfast +# sudo bin/run.sh --port /dev/ttyUSB0 --tunnel --debug +# ssh -Y root@192.168.10.151 (or dietpi), default password p +# ncat -e /bin/cat -k -u -l 1235 +# ncat -u 10.115.64.152 1235 +# ping -c 1 -W 20 10.115.64.152 +# ping -i 30 -W 30 10.115.64.152 + +# FIXME: use a more optimal MTU + +from . import portnums_pb2 +from pubsub import pub +import logging +import threading + +# A new non standard log level that is lower level than DEBUG +LOG_TRACE = 5 + +# fixme - find a way to move onTunnelReceive inside of the class +tunnelInstance = None + +"""A list of chatty UDP services we should never accidentally +forward to our slow network""" +udpBlacklist = { + 1900, # SSDP + 5353, # multicast DNS +} + +"""A list of TCP services to block""" +tcpBlacklist = {} + +"""A list of protocols we ignore""" +protocolBlacklist = { + 0x02, # IGMP + 0x80, # Service-Specific Connection-Oriented Protocol in a Multilink and Connectionless Environment +} + + +def hexstr(barray): + """Print a string of hex digits""" + return ":".join('{:02x}'.format(x) for x in barray) + + +def ipstr(barray): + """Print a string of ip digits""" + return ".".join('{}'.format(x) for x in barray) + + +def readnet_u16(p, offset): + """Read big endian u16 (network byte order)""" + return p[offset] * 256 + p[offset + 1] + + +def onTunnelReceive(packet, interface): + """Callback for received tunneled messages from mesh + + FIXME figure out how to do closures with methods in python""" + tunnelInstance.onReceive(packet) + + +class Tunnel: + """A TUN based IP tunnel over meshtastic""" + + def __init__(self, iface, subnet=None, netmask="255.255.0.0"): + """ + Constructor + + iface is the already open MeshInterface instance + subnet is used to construct our network number (normally 10.115.x.x) + """ + + if subnet is None: + subnet = "10.115" + + self.iface = iface + self.subnetPrefix = subnet + + global tunnelInstance + tunnelInstance = self + + logging.info( + "Starting IP to mesh tunnel (you must be root for this *pre-alpha* feature to work). Mesh members:") + + pub.subscribe(onTunnelReceive, "meshtastic.receive.data.IP_TUNNEL_APP") + myAddr = self._nodeNumToIp(self.iface.myInfo.my_node_num) + + for node in self.iface.nodes.values(): + nodeId = node["user"]["id"] + ip = self._nodeNumToIp(node["num"]) + logging.info(f"Node { nodeId } has IP address { ip }") + + logging.debug("creating TUN device with MTU=200") + # FIXME - figure out real max MTU, it should be 240 - the overhead bytes for SubPacket and Data + from pytap2 import TapDevice + self.tun = TapDevice(name="mesh") + self.tun.up() + self.tun.ifconfig(address=myAddr, netmask=netmask, mtu=200) + logging.debug(f"starting TUN reader, our IP address is {myAddr}") + self._rxThread = threading.Thread( + target=self.__tunReader, args=(), daemon=True) + self._rxThread.start() + + def onReceive(self, packet): + p = packet["decoded"]["payload"] + if packet["from"] == self.iface.myInfo.my_node_num: + logging.debug("Ignoring message we sent") + else: + logging.debug( + f"Received mesh tunnel message type={type(p)} len={len(p)}") + # we don't really need to check for filtering here (sender should have checked), but this provides + # useful debug printing on types of packets received + if not self._shouldFilterPacket(p): + self.tun.write(p) + + def _shouldFilterPacket(self, p): + """Given a packet, decode it and return true if it should be ignored""" + protocol = p[8 + 1] + srcaddr = p[12:16] + destAddr = p[16:20] + subheader = 20 + ignore = False # Assume we will be forwarding the packet + if protocol in protocolBlacklist: + ignore = True + logging.log( + LOG_TRACE, f"Ignoring blacklisted protocol 0x{protocol:02x}") + elif protocol == 0x01: # ICMP + icmpType = p[20] + icmpCode = p[21] + checksum = p[22:24] + logging.debug( + f"forwarding ICMP message src={ipstr(srcaddr)}, dest={ipstr(destAddr)}, type={icmpType}, code={icmpCode}, checksum={checksum}") + # reply to pings (swap src and dest but keep rest of packet unchanged) + #pingback = p[:12]+p[16:20]+p[12:16]+p[20:] + # tap.write(pingback) + elif protocol == 0x11: # UDP + srcport = readnet_u16(p, subheader) + destport = readnet_u16(p, subheader + 2) + if destport in udpBlacklist: + ignore = True + logging.log( + LOG_TRACE, f"ignoring blacklisted UDP port {destport}") + else: + logging.debug( + f"forwarding udp srcport={srcport}, destport={destport}") + elif protocol == 0x06: # TCP + srcport = readnet_u16(p, subheader) + destport = readnet_u16(p, subheader + 2) + if destport in tcpBlacklist: + ignore = True + logging.log( + LOG_TRACE, f"ignoring blacklisted TCP port {destport}") + else: + logging.debug( + f"forwarding tcp srcport={srcport}, destport={destport}") + else: + logging.warning( + f"forwarding unexpected protocol 0x{protocol:02x}, src={ipstr(srcaddr)}, dest={ipstr(destAddr)}") + + return ignore + + def __tunReader(self): + tap = self.tun + logging.debug("TUN reader running") + while True: + p = tap.read() + #logging.debug(f"IP packet received on TUN interface, type={type(p)}") + destAddr = p[16:20] + + if not self._shouldFilterPacket(p): + self.sendPacket(destAddr, p) + + def _ipToNodeId(self, ipAddr): + # We only consider the last 16 bits of the nodenum for IP address matching + ipBits = ipAddr[2] * 256 + ipAddr[3] + + if ipBits == 0xffff: + return "^all" + + for node in self.iface.nodes.values(): + nodeNum = node["num"] & 0xffff + # logging.debug(f"Considering nodenum 0x{nodeNum:x} for ipBits 0x{ipBits:x}") + if (nodeNum) == ipBits: + return node["user"]["id"] + return None + + def _nodeNumToIp(self, nodeNum): + return f"{self.subnetPrefix}.{(nodeNum >> 8) & 0xff}.{nodeNum & 0xff}" + + def sendPacket(self, destAddr, p): + """Forward the provided IP packet into the mesh""" + nodeId = self._ipToNodeId(destAddr) + if nodeId is not None: + logging.debug( + f"Forwarding packet bytelen={len(p)} dest={ipstr(destAddr)}, destNode={nodeId}") + self.iface.sendData( + p, nodeId, portnums_pb2.IP_TUNNEL_APP, wantAck=False) + else: + logging.warning( + f"Dropping packet because no node found for destIP={ipstr(destAddr)}") + + def close(self): + self.tun.close() diff --git a/meshtastic/util.py-E b/meshtastic/util.py-E new file mode 100644 index 0000000..4f27d30 --- /dev/null +++ b/meshtastic/util.py-E @@ -0,0 +1,90 @@ + +from collections import defaultdict +import serial, traceback +import serial.tools.list_ports +from queue import Queue +import threading, sys, time, logging + +"""Some devices such as a seger jlink we never want to accidentally open""" +blacklistVids = dict.fromkeys([0x1366]) + + +def stripnl(s): + """remove newlines from a string (and remove extra whitespace)""" + s = str(s).replace("\n", " ") + return ' '.join(s.split()) + + +def fixme(message): + raise Exception(f"FIXME: {message}") + + +def catchAndIgnore(reason, closure): + """Call a closure but if it throws an excpetion print it and continue""" + try: + closure() + except BaseException as ex: + logging.error(f"Exception thrown in {reason}: {ex}") + + +def findPorts(): + """Find all ports that might have meshtastic devices + + Returns: + list -- a list of device paths + """ + l = list(map(lambda port: port.device, + filter(lambda port: port.vid != None and port.vid not in blacklistVids, + serial.tools.list_ports.comports()))) + l.sort() + return l + + +class dotdict(dict): + """dot.notation access to dictionary attributes""" + __getattr__ = dict.get + __setattr__ = dict.__setitem__ + __delattr__ = dict.__delitem__ + + +class Timeout: + def __init__(self, maxSecs=20): + self.expireTime = 0 + self.sleepInterval = 0.1 + self.expireTimeout = maxSecs + + def reset(self): + """Restart the waitForSet timer""" + self.expireTime = time.time() + self.expireTimeout + + def waitForSet(self, target, attrs=()): + """Block until the specified attributes are set. Returns True if config has been received.""" + self.reset() + while time.time() < self.expireTime: + if all(map(lambda a: getattr(target, a, None), attrs)): + return True + time.sleep(self.sleepInterval) + return False + + +class DeferredExecution(): + """A thread that accepts closures to run, and runs them as they are received""" + + def __init__(self, name=None): + self.queue = Queue() + self.thread = threading.Thread(target=self._run, args=(), name=name) + self.thread.daemon = True + self.thread.start() + + def queueWork(self, runnable): + self.queue.put(runnable) + + def _run(self): + while True: + try: + o = self.queue.get() + o() + except: + logging.error( + f"Unexpected error in deferred execution {sys.exc_info()[0]}") + print(traceback.format_exc()) diff --git a/setup.py b/setup.py index 89ecea4..531906f 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ with open("README.md", "r") as fh: # This call to setup() does all the work setup( name="meshtastic", - version="1.2.41", + version="1.2.43", description="Python API & client shell for talking to Meshtastic devices", long_description=long_description, long_description_content_type="text/markdown",