diff --git a/.gitignore b/.gitignore index fd7c7e8..49922bb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ README build dist *.egg-info -log_* \ No newline at end of file +log_* +.eggs diff --git a/README.md b/README.md index be927f2..cec5399 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,10 @@ This indicates an OS permission problem for access by your user to the USB seria sudo usermod -a -G dialout ``` -## Required device software version +## A note to developers of this lib -This API and tool both require that the device is running Meshtastic 0.6.0 or later. +If you need to build a new release you'll need: +``` +apt install pandoc +sudo pip3 install markdown pandoc webencodings pyparsing +``` \ No newline at end of file diff --git a/docs/meshtastic/apponly_pb2.html b/docs/meshtastic/apponly_pb2.html new file mode 100644 index 0000000..5fd09c6 --- /dev/null +++ b/docs/meshtastic/apponly_pb2.html @@ -0,0 +1,194 @@ + + + + + + +meshtastic.apponly_pb2 API documentation + + + + + + + + + + + +
+
+
+

Module meshtastic.apponly_pb2

+
+
+
+ +Expand source code + +
# -*- 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()
+
+
+from . import mesh_pb2 as mesh__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='apponly.proto',
+  package='',
+  syntax='proto3',
+  serialized_options=b'\n\023com.geeksville.meshB\007AppOnlyH\003',
+  serialized_pb=b'\n\rapponly.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(\tB \n\x13\x63om.geeksville.meshB\x07\x41ppOnlyH\x03\x62\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=29,
+  serialized_end=115,
+)
+
+_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__' : 'apponly_pb2'
+  # @@protoc_insertion_point(class_scope:ServiceEnvelope)
+  })
+_sym_db.RegisterMessage(ServiceEnvelope)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class ServiceEnvelope +(*args, **kwargs) +
+
+

A ProtocolMessage

+

Ancestors

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

Class variables

+
+
var DESCRIPTOR
+
+
+
+
+

Instance variables

+
+
var channel_id
+
+

Field ServiceEnvelope.channel_id

+
+
var gateway_id
+
+

Field ServiceEnvelope.gateway_id

+
+
var packet
+
+

Field ServiceEnvelope.packet

+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/meshtastic/deviceonly_pb2.html b/docs/meshtastic/deviceonly_pb2.html new file mode 100644 index 0000000..c2118be --- /dev/null +++ b/docs/meshtastic/deviceonly_pb2.html @@ -0,0 +1,284 @@ + + + + + + +meshtastic.deviceonly_pb2 API documentation + + + + + + + + + + + +
+
+
+

Module meshtastic.deviceonly_pb2

+
+
+
+ +Expand source code + +
# -*- 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()
+
+
+from . import mesh_pb2 as mesh__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='deviceonly.proto',
+  package='',
+  syntax='proto3',
+  serialized_options=b'\n\023com.geeksville.meshB\nDeviceOnlyH\003',
+  serialized_pb=b'\n\x10\x64\x65viceonly.proto\x1a\nmesh.proto\"\xab\x02\n\x0b\x44\x65viceState\x12\x1b\n\x05radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfig\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(\x08\x12,\n\x12secondary_channels\x18\x0c \x03(\x0b\x32\x10.ChannelSettingsB#\n\x13\x63om.geeksville.meshB\nDeviceOnlyH\x03\x62\x06proto3'
+  ,
+  dependencies=[mesh__pb2.DESCRIPTOR,])
+
+
+
+
+_DEVICESTATE = _descriptor.Descriptor(
+  name='DeviceState',
+  full_name='DeviceState',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='radio', full_name='DeviceState.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='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),
+    _descriptor.FieldDescriptor(
+      name='secondary_channels', full_name='DeviceState.secondary_channels', index=9,
+      number=12, 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=33,
+  serialized_end=332,
+)
+
+_DEVICESTATE.fields_by_name['radio'].message_type = mesh__pb2._RADIOCONFIG
+_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
+_DEVICESTATE.fields_by_name['secondary_channels'].message_type = mesh__pb2._CHANNELSETTINGS
+DESCRIPTOR.message_types_by_name['DeviceState'] = _DEVICESTATE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+DeviceState = _reflection.GeneratedProtocolMessageType('DeviceState', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICESTATE,
+  '__module__' : 'deviceonly_pb2'
+  # @@protoc_insertion_point(class_scope:DeviceState)
+  })
+_sym_db.RegisterMessage(DeviceState)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class DeviceState +(*args, **kwargs) +
+
+

A ProtocolMessage

+

Ancestors

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

Class variables

+
+
var DESCRIPTOR
+
+
+
+
+

Instance variables

+
+
var did_gps_reset
+
+

Field DeviceState.did_gps_reset

+
+
var my_node
+
+

Field DeviceState.my_node

+
+
var no_save
+
+

Field DeviceState.no_save

+
+
var node_db
+
+

Field DeviceState.node_db

+
+
var owner
+
+

Field DeviceState.owner

+
+
var radio
+
+

Field DeviceState.radio

+
+
var receive_queue
+
+

Field DeviceState.receive_queue

+
+
var rx_text_message
+
+

Field DeviceState.rx_text_message

+
+
var secondary_channels
+
+

Field DeviceState.secondary_channels

+
+
var version
+
+

Field DeviceState.version

+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/meshtastic/index.html b/docs/meshtastic/index.html index c4c79cf..8a8e58d 100644 --- a/docs/meshtastic/index.html +++ b/docs/meshtastic/index.html @@ -145,15 +145,7 @@ interface = meshtastic.SerialInterface() import socket import pygatt import google.protobuf.json_format -import serial -import threading -import logging -import time -import sys -import traceback -import time -import base64 -import platform +import serial, threading, logging, sys, random, traceback, time, base64, platform from . import mesh_pb2, portnums_pb2, util from pubsub import pub from dotmap import DotMap @@ -196,6 +188,8 @@ class MeshInterface: self.nodes = None # FIXME self.isConnected = threading.Event() self.noProto = noProto + random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it + self.currentPacketId = random.randint(0, 0xffffffff) self._startConfig() def __enter__(self): @@ -426,7 +420,6 @@ class MeshInterface: self.nodes = {} # nodes keyed by ID self.nodesByNum = {} # nodes keyed by nodenum self.radioConfig = None - self.currentPacketId = None startConfig = mesh_pb2.ToRadio() startConfig.want_config_id = MY_CONFIG_ID # we don't use this value @@ -458,8 +451,6 @@ class MeshInterface: raise Exception( "This device needs a newer python client, please \"pip install --upgrade meshtastic\"") # start assigning our packet IDs from the opposite side of where our local device is assigning them - self.currentPacketId = ( - self.myInfo.current_packet_id + 0x80000000) & 0xffffffff elif fromRadio.HasField("radio"): self.radioConfig = fromRadio.radio elif fromRadio.HasField("node_info"): @@ -881,17 +872,25 @@ class TCPInterface(StreamInterface):

Sub-modules

+
meshtastic.apponly_pb2
+
+
+
meshtastic.ble
+
meshtastic.deviceonly_pb2
+
+
+
meshtastic.mesh_pb2
-

Generated protocol buffer code.

+
meshtastic.portnums_pb2
-

Generated protocol buffer code.

+
meshtastic.remote_hardware
@@ -899,7 +898,7 @@ class TCPInterface(StreamInterface):
meshtastic.remote_hardware_pb2
-

Generated protocol buffer code.

+
meshtastic.test
@@ -1054,6 +1053,8 @@ noProto – If True, don't try to run our protocol on the link - just be a d self.nodes = None # FIXME self.isConnected = threading.Event() self.noProto = noProto + random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it + self.currentPacketId = random.randint(0, 0xffffffff) self._startConfig() def __enter__(self): @@ -1284,7 +1285,6 @@ noProto – If True, don't try to run our protocol on the link - just be a d self.nodes = {} # nodes keyed by ID self.nodesByNum = {} # nodes keyed by nodenum self.radioConfig = None - self.currentPacketId = None startConfig = mesh_pb2.ToRadio() startConfig.want_config_id = MY_CONFIG_ID # we don't use this value @@ -1316,8 +1316,6 @@ noProto – If True, don't try to run our protocol on the link - just be a d raise Exception( "This device needs a newer python client, please \"pip install --upgrade meshtastic\"") # start assigning our packet IDs from the opposite side of where our local device is assigning them - self.currentPacketId = ( - self.myInfo.current_packet_id + 0x80000000) & 0xffffffff elif fromRadio.HasField("radio"): self.radioConfig = fromRadio.radio elif fromRadio.HasField("node_info"): @@ -2221,7 +2219,9 @@ hostname {string} – Hostname/IP address of the device to connect to

  • Sub-modules

      +
    • meshtastic.apponly_pb2
    • meshtastic.ble
    • +
    • meshtastic.deviceonly_pb2
    • meshtastic.mesh_pb2
    • meshtastic.portnums_pb2
    • meshtastic.remote_hardware
    • diff --git a/docs/meshtastic/mesh_pb2.html b/docs/meshtastic/mesh_pb2.html index 7445e26..e38cda5 100644 --- a/docs/meshtastic/mesh_pb2.html +++ b/docs/meshtastic/mesh_pb2.html @@ -5,7 +5,7 @@ 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,69 +48,68 @@ DESCRIPTOR = _descriptor.FileDescriptor(
         package='',
         syntax='proto3',
         serialized_options=b'\n\023com.geeksville.meshB\nMeshProtosH\003',
      -  create_key=_descriptor._internal_create_key,
      -  serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"j\n\x08Position\x12\x12\n\nlatitude_i\x18\x07 \x01(\x11\x12\x13\n\x0blongitude_i\x18\x08 \x01(\x11\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\"2\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\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\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x05\"\xdb\x02\n\tSubPacket\x12!\n\x08position\x18\x01 \x01(\x0b\x32\t.PositionB\x02\x18\x01H\x00\x12\x15\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.DataH\x00\x12\x19\n\x04user\x18\x04 \x01(\x0b\x32\x05.UserB\x02\x18\x01H\x00\x12(\n\rroute_request\x18\x06 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x07 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12\"\n\x0broute_error\x18\r \x01(\x0e\x32\x0b.RouteErrorH\x00\x12\x15\n\rwant_response\x18\x05 \x01(\x08\x12\x14\n\nsuccess_id\x18\n \x01(\rH\x01\x12\x11\n\x07\x66\x61il_id\x18\x0b \x01(\rH\x01\x12\x0c\n\x04\x64\x65st\x18\t \x01(\r\x12\x0e\n\x06source\x18\x0c \x01(\r\x12\x13\n\x0boriginal_id\x18\x02 \x01(\rB\t\n\x07payloadB\x05\n\x03\x61\x63k\"\xce\x01\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\r\x12\n\n\x02to\x18\x02 \x01(\r\x12\x15\n\rchannel_index\x18\x04 \x01(\r\x12\x1d\n\x07\x64\x65\x63oded\x18\x03 \x01(\x0b\x32\n.SubPacketH\x00\x12\x13\n\tencrypted\x18\x08 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\r\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x12\x0e\n\x06rx_snr\x18\x07 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x42\t\n\x07payload\"\xa8\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\"`\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\"\xf7\x05\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x12*\n\x10\x63hannel_settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x1a\x88\x05\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\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\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \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\x17\n\x0fignore_incoming\x18g \x03(\r\"h\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\x10\n\x08next_hop\x18\x05 \x01(\r\"\xc5\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x14\n\x0cnum_channels\x18\x03 \x01(\x05\x12\x0e\n\x06region\x18\x04 \x01(\t\x12\x10\n\x08hw_model\x18\x05 \x01(\t\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12\x12\n\nerror_code\x18\x07 \x01(\r\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x16\n\x0epacket_id_bits\x18\n \x01(\r\x12\x19\n\x11\x63urrent_packet_id\x18\x0b \x01(\r\x12\x15\n\rnode_num_bits\x18\x0c \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xab\x02\n\x0b\x44\x65viceState\x12\x1b\n\x05radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfig\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(\x08\x12,\n\x12secondary_channels\x18\x0c \x03(\x0b\x32\x10.ChannelSettings\"\x1e\n\x0b\x44\x65\x62ugString\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xa8\x02\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \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\x1d\n\x05radio\x18\x06 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12$\n\x0c\x64\x65\x62ug_string\x18\x07 \x01(\x0b\x32\x0c.DebugStringH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x12-\n\x11secondary_channel\x18\n \x01(\x0b\x32\x10.ChannelSettingsH\x00\x42\t\n\x07variant\"\x8c\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12!\n\tset_radio\x18\x65 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x66 \x01(\x0b\x32\x05.UserH\x00\x42\t\n\x07variant*>\n\nRouteError\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*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xf0\x01*^\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*U\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\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\x42#\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03\x62\x06proto3'
      +  serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"j\n\x08Position\x12\x12\n\nlatitude_i\x18\x07 \x01(\x11\x12\x13\n\x0blongitude_i\x18\x08 \x01(\x11\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\"2\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\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\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x05\"\xeb\x02\n\tSubPacket\x12\x15\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.DataH\x00\x12(\n\rroute_request\x18\x06 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x07 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12$\n\x0c\x65rror_reason\x18\r \x01(\x0e\x32\x0c.ErrorReasonH\x00\x12!\n\x08position\x18\x01 \x01(\x0b\x32\t.PositionB\x02\x18\x01H\x00\x12\x19\n\x04user\x18\x04 \x01(\x0b\x32\x05.UserB\x02\x18\x01H\x00\x12\x15\n\rwant_response\x18\x05 \x01(\x08\x12\x14\n\nsuccess_id\x18\n \x01(\rH\x01\x12\x11\n\x07\x66\x61il_id\x18\x0b \x01(\rH\x01\x12\x0c\n\x04\x64\x65st\x18\t \x01(\r\x12\x0e\n\x06source\x18\x0c \x01(\r\x12\x13\n\x0boriginal_id\x18\x02 \x01(\rB\x10\n\x0epayloadVariantB\x0c\n\nackVariant\"\xd5\x01\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\r\x12\n\n\x02to\x18\x02 \x01(\r\x12\x15\n\rchannel_index\x18\x04 \x01(\r\x12\x1d\n\x07\x64\x65\x63oded\x18\x03 \x01(\x0b\x32\n.SubPacketH\x00\x12\x13\n\tencrypted\x18\x08 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\r\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x12\x0e\n\x06rx_snr\x18\x07 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x42\x10\n\x0epayloadVariant\"\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\"\x82\x0b\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x12.\n\x10\x63hannel_settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettingsB\x02\x18\x01\x1a\x8f\n\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\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \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\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\x88\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\"h\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\x10\n\x08next_hop\x18\x05 \x01(\r\"\xd9\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x14\n\x0cnum_channels\x18\x03 \x01(\x05\x12\x0e\n\x06region\x18\x04 \x01(\t\x12\x10\n\x08hw_model\x18\x05 \x01(\t\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\x16\n\x0epacket_id_bits\x18\n \x01(\r\x12\x19\n\x11\x63urrent_packet_id\x18\x0b \x01(\r\x12\x15\n\rnode_num_bits\x18\x0c \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\"\xa1\x02\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \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\x1d\n\x05radio\x18\x06 \x01(\x0b\x32\x0c.RadioConfigH\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\x12#\n\x07\x63hannel\x18\n \x01(\x0b\x32\x10.ChannelSettingsH\x00\x42\x10\n\x0epayloadVariant\"\xbc\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12!\n\tset_radio\x18\x65 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x66 \x01(\x0b\x32\x05.UserH\x00\x12\'\n\x0bset_channel\x18g \x01(\x0b\x32\x10.ChannelSettingsH\x00\x42\x10\n\x0epayloadVariant*e\n\x0b\x45rrorReason\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*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xf0\x01*^\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*\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*\xaf\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\x42#\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03\x62\x06proto3'
         ,
         dependencies=[portnums__pb2.DESCRIPTOR,])
       
      -_ROUTEERROR = _descriptor.EnumDescriptor(
      -  name='RouteError',
      -  full_name='RouteError',
      +_ERRORREASON = _descriptor.EnumDescriptor(
      +  name='ErrorReason',
      +  full_name='ErrorReason',
         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),
      +    _descriptor.EnumValueDescriptor(
      +      name='MAX_RETRANSMIT', index=5, number=5,
      +      serialized_options=None,
      +      type=None),
         ],
         containing_type=None,
         serialized_options=None,
      -  serialized_start=3129,
      -  serialized_end=3191,
      +  serialized_start=3776,
      +  serialized_end=3877,
       )
      -_sym_db.RegisterEnumDescriptor(_ROUTEERROR)
      +_sym_db.RegisterEnumDescriptor(_ERRORREASON)
       
      -RouteError = enum_type_wrapper.EnumTypeWrapper(_ROUTEERROR)
      +ErrorReason = enum_type_wrapper.EnumTypeWrapper(_ERRORREASON)
       _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=240,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
         ],
         containing_type=None,
         serialized_options=None,
      -  serialized_start=3193,
      -  serialized_end=3239,
      +  serialized_start=3879,
      +  serialized_end=3925,
       )
       _sym_db.RegisterEnumDescriptor(_CONSTANTS)
       
      @@ -121,94 +119,166 @@ _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),
         ],
         containing_type=None,
         serialized_options=None,
      -  serialized_start=3241,
      -  serialized_end=3335,
      +  serialized_start=3927,
      +  serialized_end=4021,
       )
       _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=4024,
      +  serialized_end=4233,
      +)
      +_sym_db.RegisterEnumDescriptor(_CHARGECURRENT)
      +
      +ChargeCurrent = enum_type_wrapper.EnumTypeWrapper(_CHARGECURRENT)
       _GPSOPERATION = _descriptor.EnumDescriptor(
         name='GpsOperation',
         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='GpsOpMobile', index=1, number=2,
      +      name='GpsOpStationary', index=1, number=1,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
      -      name='GpsOpTimeOnly', index=2, number=3,
      +      name='GpsOpMobile', index=2, number=2,
             serialized_options=None,
      -      type=None,
      -      create_key=_descriptor._internal_create_key),
      +      type=None),
           _descriptor.EnumValueDescriptor(
      -      name='GpsOpDisabled', index=3, number=4,
      +      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),
         ],
         containing_type=None,
         serialized_options=None,
      -  serialized_start=3337,
      -  serialized_end=3422,
      +  serialized_start=4235,
      +  serialized_end=4341,
       )
       _sym_db.RegisterEnumDescriptor(_GPSOPERATION)
       
      @@ -218,36 +288,85 @@ _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=3424,
      -  serialized_end=3488,
      +  serialized_start=4343,
      +  serialized_end=4407,
       )
       _sym_db.RegisterEnumDescriptor(_LOCATIONSHARING)
       
       LocationSharing = enum_type_wrapper.EnumTypeWrapper(_LOCATIONSHARING)
      +_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),
      +  ],
      +  containing_type=None,
      +  serialized_options=None,
      +  serialized_start=4410,
      +  serialized_end=4585,
      +)
      +_sym_db.RegisterEnumDescriptor(_CRITICALERRORCODE)
      +
      +CriticalErrorCode = enum_type_wrapper.EnumTypeWrapper(_CRITICALERRORCODE)
       NONE = 0
       NO_ROUTE = 1
       GOT_NAK = 2
       TIMEOUT = 3
      +NO_INTERFACE = 4
      +MAX_RETRANSMIT = 5
       Unused = 0
       DATA_PAYLOAD_LEN = 240
       Unset = 0
      @@ -259,13 +378,40 @@ JP = 5
       ANZ = 6
       KR = 7
       TW = 8
      +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
       LocUnset = 0
       LocEnabled = 1
       LocDisabled = 2
      +globals()['None'] = 0
      +TxWatchdog = 1
      +SleepEnterWait = 2
      +NoRadio = 3
      +Unspecified = 4
      +UBloxInitFailed = 5
      +NoAXP192 = 6
      +InvalidRadioSetting = 7
      +TransmitFailed = 8
       
       
       _CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor(
      @@ -273,36 +419,73 @@ _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,
      -  serialized_start=1059,
      -  serialized_end=1155,
      +  serialized_start=1144,
      +  serialized_end=1240,
       )
       _sym_db.RegisterEnumDescriptor(_CHANNELSETTINGS_MODEMCONFIG)
       
      +_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=3203,
      +  serialized_end=3291,
      +)
      +_sym_db.RegisterEnumDescriptor(_LOGRECORD_LEVEL)
      +
       
       _POSITION = _descriptor.Descriptor(
         name='Position',
      @@ -310,7 +493,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,
      @@ -318,35 +500,35 @@ _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=8, 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='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),
         ],
         extensions=[
         ],
      @@ -370,7 +552,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,
      @@ -378,14 +559,14 @@ _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),
         ],
         extensions=[
         ],
      @@ -409,7 +590,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,
      @@ -417,28 +597,28 @@ _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),
         ],
         extensions=[
         ],
      @@ -462,7 +642,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,
      @@ -470,7 +649,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=[
         ],
      @@ -494,92 +673,91 @@ _SUBPACKET = _descriptor.Descriptor(
         filename=None,
         file=DESCRIPTOR,
         containing_type=None,
      -  create_key=_descriptor._internal_create_key,
         fields=[
           _descriptor.FieldDescriptor(
      -      name='position', full_name='SubPacket.position', 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=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      -    _descriptor.FieldDescriptor(
      -      name='data', full_name='SubPacket.data', index=1,
      +      name='data', full_name='SubPacket.data', index=0,
             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='user', full_name='SubPacket.user', index=2,
      -      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=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      -    _descriptor.FieldDescriptor(
      -      name='route_request', full_name='SubPacket.route_request', index=3,
      +      name='route_request', full_name='SubPacket.route_request', index=1,
             number=6, 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='route_reply', full_name='SubPacket.route_reply', index=4,
      +      name='route_reply', full_name='SubPacket.route_reply', index=2,
             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='route_error', full_name='SubPacket.route_error', index=5,
      +      name='error_reason', full_name='SubPacket.error_reason', index=3,
             number=13, 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='position', full_name='SubPacket.position', index=4,
      +      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=b'\030\001', file=DESCRIPTOR),
      +    _descriptor.FieldDescriptor(
      +      name='user', full_name='SubPacket.user', index=5,
      +      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=b'\030\001', file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='want_response', full_name='SubPacket.want_response', index=6,
             number=5, 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='success_id', full_name='SubPacket.success_id', 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,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='fail_id', full_name='SubPacket.fail_id', 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,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='dest', full_name='SubPacket.dest', 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='source', full_name='SubPacket.source', index=10,
             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,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
           _descriptor.FieldDescriptor(
             name='original_id', full_name='SubPacket.original_id', index=11,
             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),
         ],
         extensions=[
         ],
      @@ -592,18 +770,14 @@ _SUBPACKET = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
           _descriptor.OneofDescriptor(
      -      name='payload', full_name='SubPacket.payload',
      -      index=0, containing_type=None,
      -      create_key=_descriptor._internal_create_key,
      -    fields=[]),
      +      name='payloadVariant', full_name='SubPacket.payloadVariant',
      +      index=0, containing_type=None, fields=[]),
           _descriptor.OneofDescriptor(
      -      name='ack', full_name='SubPacket.ack',
      -      index=1, containing_type=None,
      -      create_key=_descriptor._internal_create_key,
      -    fields=[]),
      +      name='ackVariant', full_name='SubPacket.ackVariant',
      +      index=1, containing_type=None, fields=[]),
         ],
         serialized_start=300,
      -  serialized_end=647,
      +  serialized_end=663,
       )
       
       
      @@ -613,7 +787,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,
      @@ -621,70 +794,70 @@ _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=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_index', full_name='MeshPacket.channel_index', index=2,
             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='decoded', full_name='MeshPacket.decoded', index=3,
             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='encrypted', full_name='MeshPacket.encrypted', index=4,
             number=8, 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=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_time', full_name='MeshPacket.rx_time', index=6,
             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='rx_snr', full_name='MeshPacket.rx_snr', index=7,
             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='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),
         ],
         extensions=[
         ],
      @@ -697,13 +870,11 @@ _MESHPACKET = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
           _descriptor.OneofDescriptor(
      -      name='payload', full_name='MeshPacket.payload',
      -      index=0, containing_type=None,
      -      create_key=_descriptor._internal_create_key,
      -    fields=[]),
      +      name='payloadVariant', full_name='MeshPacket.payloadVariant',
      +      index=0, containing_type=None, fields=[]),
         ],
      -  serialized_start=650,
      -  serialized_end=856,
      +  serialized_start=666,
      +  serialized_end=879,
       )
       
       
      @@ -713,7 +884,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,
      @@ -721,56 +891,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),
      +    _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=[
         ],
      @@ -784,8 +975,8 @@ _CHANNELSETTINGS = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
         ],
      -  serialized_start=859,
      -  serialized_end=1155,
      +  serialized_start=882,
      +  serialized_end=1240,
       )
       
       
      @@ -795,7 +986,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,
      @@ -803,168 +993,294 @@ _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,
             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,
             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,
             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,
             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,
             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,
             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,
             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,
             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,
             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,
             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,
             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,
             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,
             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='is_router', full_name='RadioConfig.UserPreferences.is_router', index=14,
      +      name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=14,
      +      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=15,
             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=15,
      +      name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=16,
             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=16,
      +      name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=17,
             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='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=17,
      +      name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=18,
             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=18,
      +      name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=19,
             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='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='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=23,
      +      name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=24,
             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=25,
      +      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=26,
      +      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=27,
      +      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=28,
      +      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=29,
      +      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=30,
      +      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=31,
      +      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=32,
      +      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=33,
      +      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=34,
      +      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=35,
      +      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=36,
      +      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=37,
      +      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=38,
      +      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=39,
      +      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=40,
      +      number=136, 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=41,
      +      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),
         ],
         extensions=[
         ],
      @@ -977,8 +1293,8 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
         ],
      -  serialized_start=1269,
      -  serialized_end=1917,
      +  serialized_start=1358,
      +  serialized_end=2653,
       )
       
       _RADIOCONFIG = _descriptor.Descriptor(
      @@ -987,7 +1303,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,
      @@ -995,14 +1310,14 @@ _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),
           _descriptor.FieldDescriptor(
             name='channel_settings', full_name='RadioConfig.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=b'\030\001', file=DESCRIPTOR),
         ],
         extensions=[
         ],
      @@ -1015,8 +1330,8 @@ _RADIOCONFIG = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
         ],
      -  serialized_start=1158,
      -  serialized_end=1917,
      +  serialized_start=1243,
      +  serialized_end=2653,
       )
       
       
      @@ -1026,7 +1341,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,
      @@ -1034,285 +1348,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='next_hop', full_name='NodeInfo.next_hop', 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),
      -  ],
      -  extensions=[
      -  ],
      -  nested_types=[],
      -  enum_types=[
      -  ],
      -  serialized_options=None,
      -  is_extendable=False,
      -  syntax='proto3',
      -  extension_ranges=[],
      -  oneofs=[
      -  ],
      -  serialized_start=1919,
      -  serialized_end=2023,
      -)
      -
      -
      -_MYNODEINFO = _descriptor.Descriptor(
      -  name='MyNodeInfo',
      -  full_name='MyNodeInfo',
      -  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,
      -      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,  create_key=_descriptor._internal_create_key),
      -    _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),
      -    _descriptor.FieldDescriptor(
      -      name='num_channels', full_name='MyNodeInfo.num_channels', 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),
      -    _descriptor.FieldDescriptor(
      -      name='region', full_name='MyNodeInfo.region', index=3,
      -      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=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
      -    _descriptor.FieldDescriptor(
      -      name='hw_model', full_name='MyNodeInfo.hw_model', index=4,
      -      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),
      -    _descriptor.FieldDescriptor(
      -      name='firmware_version', full_name='MyNodeInfo.firmware_version', index=5,
      -      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),
      -    _descriptor.FieldDescriptor(
      -      name='error_code', full_name='MyNodeInfo.error_code', 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),
      -    _descriptor.FieldDescriptor(
      -      name='error_address', full_name='MyNodeInfo.error_address', 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),
      -    _descriptor.FieldDescriptor(
      -      name='error_count', full_name='MyNodeInfo.error_count', 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),
      -    _descriptor.FieldDescriptor(
      -      name='packet_id_bits', full_name='MyNodeInfo.packet_id_bits', 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),
      -    _descriptor.FieldDescriptor(
      -      name='current_packet_id', full_name='MyNodeInfo.current_packet_id', 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),
      -    _descriptor.FieldDescriptor(
      -      name='node_num_bits', full_name='MyNodeInfo.node_num_bits', index=11,
      -      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,  create_key=_descriptor._internal_create_key),
      -    _descriptor.FieldDescriptor(
      -      name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=12,
      -      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),
      -    _descriptor.FieldDescriptor(
      -      name='min_app_version', full_name='MyNodeInfo.min_app_version', index=13,
      -      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),
      -  ],
      -  extensions=[
      -  ],
      -  nested_types=[],
      -  enum_types=[
      -  ],
      -  serialized_options=None,
      -  is_extendable=False,
      -  syntax='proto3',
      -  extension_ranges=[],
      -  oneofs=[
      -  ],
      -  serialized_start=2026,
      -  serialized_end=2351,
      -)
      -
      -
      -_DEVICESTATE = _descriptor.Descriptor(
      -  name='DeviceState',
      -  full_name='DeviceState',
      -  filename=None,
      -  file=DESCRIPTOR,
      -  containing_type=None,
      -  create_key=_descriptor._internal_create_key,
      -  fields=[
      -    _descriptor.FieldDescriptor(
      -      name='radio', full_name='DeviceState.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,  create_key=_descriptor._internal_create_key),
      -    _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),
      -    _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),
      -    _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),
      -    _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),
      -    _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),
      -    _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),
      -    _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),
      -    _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),
      -    _descriptor.FieldDescriptor(
      -      name='secondary_channels', full_name='DeviceState.secondary_channels', index=9,
      -      number=12, 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),
      -  ],
      -  extensions=[
      -  ],
      -  nested_types=[],
      -  enum_types=[
      -  ],
      -  serialized_options=None,
      -  is_extendable=False,
      -  syntax='proto3',
      -  extension_ranges=[],
      -  oneofs=[
      -  ],
      -  serialized_start=2354,
      -  serialized_end=2653,
      -)
      -
      -
      -_DEBUGSTRING = _descriptor.Descriptor(
      -  name='DebugString',
      -  full_name='DebugString',
      -  filename=None,
      -  file=DESCRIPTOR,
      -  containing_type=None,
      -  create_key=_descriptor._internal_create_key,
      -  fields=[
      -    _descriptor.FieldDescriptor(
      -      name='message', full_name='DebugString.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,  create_key=_descriptor._internal_create_key),
      +      serialized_options=None, file=DESCRIPTOR),
         ],
         extensions=[
         ],
      @@ -1326,7 +1390,182 @@ _DEBUGSTRING = _descriptor.Descriptor(
         oneofs=[
         ],
         serialized_start=2655,
      -  serialized_end=2685,
      +  serialized_end=2759,
      +)
      +
      +
      +_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_channels', full_name='MyNodeInfo.num_channels', 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='region', full_name='MyNodeInfo.region', index=3,
      +      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=None, file=DESCRIPTOR),
      +    _descriptor.FieldDescriptor(
      +      name='hw_model', full_name='MyNodeInfo.hw_model', index=4,
      +      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='firmware_version', full_name='MyNodeInfo.firmware_version', index=5,
      +      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=6,
      +      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=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='error_count', full_name='MyNodeInfo.error_count', 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='packet_id_bits', full_name='MyNodeInfo.packet_id_bits', 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='current_packet_id', full_name='MyNodeInfo.current_packet_id', 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='node_num_bits', full_name='MyNodeInfo.node_num_bits', index=11,
      +      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),
      +    _descriptor.FieldDescriptor(
      +      name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=12,
      +      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=13,
      +      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=2762,
      +  serialized_end=3107,
      +)
      +
      +
      +_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=3110,
      +  serialized_end=3291,
       )
       
       
      @@ -1336,7 +1575,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,
      @@ -1344,63 +1582,63 @@ _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=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='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='radio', full_name='FromRadio.radio', index=4,
             number=6, 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='debug_string', full_name='FromRadio.debug_string', index=5,
      +      name='log_record', full_name='FromRadio.log_record', index=5,
             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=6,
             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=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='secondary_channel', full_name='FromRadio.secondary_channel', index=8,
      +      name='channel', full_name='FromRadio.channel', index=8,
             number=10, 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),
         ],
         extensions=[
         ],
      @@ -1413,13 +1651,11 @@ _FROMRADIO = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
           _descriptor.OneofDescriptor(
      -      name='variant', full_name='FromRadio.variant',
      -      index=0, containing_type=None,
      -      create_key=_descriptor._internal_create_key,
      -    fields=[]),
      +      name='payloadVariant', full_name='FromRadio.payloadVariant',
      +      index=0, containing_type=None, fields=[]),
         ],
      -  serialized_start=2688,
      -  serialized_end=2984,
      +  serialized_start=3294,
      +  serialized_end=3583,
       )
       
       
      @@ -1429,7 +1665,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,
      @@ -1437,28 +1672,35 @@ _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='want_config_id', full_name='ToRadio.want_config_id', index=1,
             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='set_radio', full_name='ToRadio.set_radio', index=2,
             number=101, 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_owner', full_name='ToRadio.set_owner', index=3,
             number=102, 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='ToRadio.set_channel', index=4,
      +      number=103, 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=[
         ],
      @@ -1471,56 +1713,55 @@ _TORADIO = _descriptor.Descriptor(
         extension_ranges=[],
         oneofs=[
           _descriptor.OneofDescriptor(
      -      name='variant', full_name='ToRadio.variant',
      -      index=0, containing_type=None,
      -      create_key=_descriptor._internal_create_key,
      -    fields=[]),
      +      name='payloadVariant', full_name='ToRadio.payloadVariant',
      +      index=0, containing_type=None, fields=[]),
         ],
      -  serialized_start=2987,
      -  serialized_end=3127,
      +  serialized_start=3586,
      +  serialized_end=3774,
       )
       
       _DATA.fields_by_name['portnum'].enum_type = portnums__pb2._PORTNUM
      -_SUBPACKET.fields_by_name['position'].message_type = _POSITION
       _SUBPACKET.fields_by_name['data'].message_type = _DATA
      -_SUBPACKET.fields_by_name['user'].message_type = _USER
       _SUBPACKET.fields_by_name['route_request'].message_type = _ROUTEDISCOVERY
       _SUBPACKET.fields_by_name['route_reply'].message_type = _ROUTEDISCOVERY
      -_SUBPACKET.fields_by_name['route_error'].enum_type = _ROUTEERROR
      -_SUBPACKET.oneofs_by_name['payload'].fields.append(
      -  _SUBPACKET.fields_by_name['position'])
      -_SUBPACKET.fields_by_name['position'].containing_oneof = _SUBPACKET.oneofs_by_name['payload']
      -_SUBPACKET.oneofs_by_name['payload'].fields.append(
      +_SUBPACKET.fields_by_name['error_reason'].enum_type = _ERRORREASON
      +_SUBPACKET.fields_by_name['position'].message_type = _POSITION
      +_SUBPACKET.fields_by_name['user'].message_type = _USER
      +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append(
         _SUBPACKET.fields_by_name['data'])
      -_SUBPACKET.fields_by_name['data'].containing_oneof = _SUBPACKET.oneofs_by_name['payload']
      -_SUBPACKET.oneofs_by_name['payload'].fields.append(
      -  _SUBPACKET.fields_by_name['user'])
      -_SUBPACKET.fields_by_name['user'].containing_oneof = _SUBPACKET.oneofs_by_name['payload']
      -_SUBPACKET.oneofs_by_name['payload'].fields.append(
      +_SUBPACKET.fields_by_name['data'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant']
      +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append(
         _SUBPACKET.fields_by_name['route_request'])
      -_SUBPACKET.fields_by_name['route_request'].containing_oneof = _SUBPACKET.oneofs_by_name['payload']
      -_SUBPACKET.oneofs_by_name['payload'].fields.append(
      +_SUBPACKET.fields_by_name['route_request'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant']
      +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append(
         _SUBPACKET.fields_by_name['route_reply'])
      -_SUBPACKET.fields_by_name['route_reply'].containing_oneof = _SUBPACKET.oneofs_by_name['payload']
      -_SUBPACKET.oneofs_by_name['payload'].fields.append(
      -  _SUBPACKET.fields_by_name['route_error'])
      -_SUBPACKET.fields_by_name['route_error'].containing_oneof = _SUBPACKET.oneofs_by_name['payload']
      -_SUBPACKET.oneofs_by_name['ack'].fields.append(
      +_SUBPACKET.fields_by_name['route_reply'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant']
      +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append(
      +  _SUBPACKET.fields_by_name['error_reason'])
      +_SUBPACKET.fields_by_name['error_reason'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant']
      +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append(
      +  _SUBPACKET.fields_by_name['position'])
      +_SUBPACKET.fields_by_name['position'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant']
      +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append(
      +  _SUBPACKET.fields_by_name['user'])
      +_SUBPACKET.fields_by_name['user'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant']
      +_SUBPACKET.oneofs_by_name['ackVariant'].fields.append(
         _SUBPACKET.fields_by_name['success_id'])
      -_SUBPACKET.fields_by_name['success_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ack']
      -_SUBPACKET.oneofs_by_name['ack'].fields.append(
      +_SUBPACKET.fields_by_name['success_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ackVariant']
      +_SUBPACKET.oneofs_by_name['ackVariant'].fields.append(
         _SUBPACKET.fields_by_name['fail_id'])
      -_SUBPACKET.fields_by_name['fail_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ack']
      +_SUBPACKET.fields_by_name['fail_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ackVariant']
       _MESHPACKET.fields_by_name['decoded'].message_type = _SUBPACKET
      -_MESHPACKET.oneofs_by_name['payload'].fields.append(
      +_MESHPACKET.oneofs_by_name['payloadVariant'].fields.append(
         _MESHPACKET.fields_by_name['decoded'])
      -_MESHPACKET.fields_by_name['decoded'].containing_oneof = _MESHPACKET.oneofs_by_name['payload']
      -_MESHPACKET.oneofs_by_name['payload'].fields.append(
      +_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['payload']
      +_MESHPACKET.fields_by_name['encrypted'].containing_oneof = _MESHPACKET.oneofs_by_name['payloadVariant']
       _CHANNELSETTINGS.fields_by_name['modem_config'].enum_type = _CHANNELSETTINGS_MODEMCONFIG
       _CHANNELSETTINGS_MODEMCONFIG.containing_type = _CHANNELSETTINGS
       _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.containing_type = _RADIOCONFIG
      @@ -1528,58 +1769,58 @@ _RADIOCONFIG.fields_by_name['preferences'].message_type = _RADIOCONFIG_U
       _RADIOCONFIG.fields_by_name['channel_settings'].message_type = _CHANNELSETTINGS
       _NODEINFO.fields_by_name['user'].message_type = _USER
       _NODEINFO.fields_by_name['position'].message_type = _POSITION
      -_DEVICESTATE.fields_by_name['radio'].message_type = _RADIOCONFIG
      -_DEVICESTATE.fields_by_name['my_node'].message_type = _MYNODEINFO
      -_DEVICESTATE.fields_by_name['owner'].message_type = _USER
      -_DEVICESTATE.fields_by_name['node_db'].message_type = _NODEINFO
      -_DEVICESTATE.fields_by_name['receive_queue'].message_type = _MESHPACKET
      -_DEVICESTATE.fields_by_name['rx_text_message'].message_type = _MESHPACKET
      -_DEVICESTATE.fields_by_name['secondary_channels'].message_type = _CHANNELSETTINGS
      +_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['radio'].message_type = _RADIOCONFIG
      -_FROMRADIO.fields_by_name['debug_string'].message_type = _DEBUGSTRING
      -_FROMRADIO.fields_by_name['secondary_channel'].message_type = _CHANNELSETTINGS
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      +_FROMRADIO.fields_by_name['log_record'].message_type = _LOGRECORD
      +_FROMRADIO.fields_by_name['channel'].message_type = _CHANNELSETTINGS
      +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append(
         _FROMRADIO.fields_by_name['packet'])
      -_FROMRADIO.fields_by_name['packet'].containing_oneof = _FROMRADIO.oneofs_by_name['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      +_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['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      +_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['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      +_FROMRADIO.fields_by_name['node_info'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant']
      +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append(
         _FROMRADIO.fields_by_name['radio'])
      -_FROMRADIO.fields_by_name['radio'].containing_oneof = _FROMRADIO.oneofs_by_name['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      -  _FROMRADIO.fields_by_name['debug_string'])
      -_FROMRADIO.fields_by_name['debug_string'].containing_oneof = _FROMRADIO.oneofs_by_name['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      +_FROMRADIO.fields_by_name['radio'].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['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      +_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['variant']
      -_FROMRADIO.oneofs_by_name['variant'].fields.append(
      -  _FROMRADIO.fields_by_name['secondary_channel'])
      -_FROMRADIO.fields_by_name['secondary_channel'].containing_oneof = _FROMRADIO.oneofs_by_name['variant']
      +_FROMRADIO.fields_by_name['rebooted'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant']
      +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append(
      +  _FROMRADIO.fields_by_name['channel'])
      +_FROMRADIO.fields_by_name['channel'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant']
       _TORADIO.fields_by_name['packet'].message_type = _MESHPACKET
       _TORADIO.fields_by_name['set_radio'].message_type = _RADIOCONFIG
       _TORADIO.fields_by_name['set_owner'].message_type = _USER
      -_TORADIO.oneofs_by_name['variant'].fields.append(
      +_TORADIO.fields_by_name['set_channel'].message_type = _CHANNELSETTINGS
      +_TORADIO.oneofs_by_name['payloadVariant'].fields.append(
         _TORADIO.fields_by_name['packet'])
      -_TORADIO.fields_by_name['packet'].containing_oneof = _TORADIO.oneofs_by_name['variant']
      -_TORADIO.oneofs_by_name['variant'].fields.append(
      +_TORADIO.fields_by_name['packet'].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['variant']
      -_TORADIO.oneofs_by_name['variant'].fields.append(
      +_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['set_radio'])
      -_TORADIO.fields_by_name['set_radio'].containing_oneof = _TORADIO.oneofs_by_name['variant']
      -_TORADIO.oneofs_by_name['variant'].fields.append(
      +_TORADIO.fields_by_name['set_radio'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant']
      +_TORADIO.oneofs_by_name['payloadVariant'].fields.append(
         _TORADIO.fields_by_name['set_owner'])
      -_TORADIO.fields_by_name['set_owner'].containing_oneof = _TORADIO.oneofs_by_name['variant']
      +_TORADIO.fields_by_name['set_owner'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant']
      +_TORADIO.oneofs_by_name['payloadVariant'].fields.append(
      +  _TORADIO.fields_by_name['set_channel'])
      +_TORADIO.fields_by_name['set_channel'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant']
       DESCRIPTOR.message_types_by_name['Position'] = _POSITION
       DESCRIPTOR.message_types_by_name['Data'] = _DATA
       DESCRIPTOR.message_types_by_name['User'] = _USER
      @@ -1590,15 +1831,16 @@ DESCRIPTOR.message_types_by_name['ChannelSettings'] = _CHANNELSETTINGS
       DESCRIPTOR.message_types_by_name['RadioConfig'] = _RADIOCONFIG
       DESCRIPTOR.message_types_by_name['NodeInfo'] = _NODEINFO
       DESCRIPTOR.message_types_by_name['MyNodeInfo'] = _MYNODEINFO
      -DESCRIPTOR.message_types_by_name['DeviceState'] = _DEVICESTATE
      -DESCRIPTOR.message_types_by_name['DebugString'] = _DEBUGSTRING
      +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['RouteError'] = _ROUTEERROR
      +DESCRIPTOR.enum_types_by_name['ErrorReason'] = _ERRORREASON
       DESCRIPTOR.enum_types_by_name['Constants'] = _CONSTANTS
       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['LocationSharing'] = _LOCATIONSHARING
      +DESCRIPTOR.enum_types_by_name['CriticalErrorCode'] = _CRITICALERRORCODE
       _sym_db.RegisterFileDescriptor(DESCRIPTOR)
       
       Position = _reflection.GeneratedProtocolMessageType('Position', (_message.Message,), {
      @@ -1679,19 +1921,12 @@ MyNodeInfo = _reflection.GeneratedProtocolMessageType('MyNodeInfo', (_me
         })
       _sym_db.RegisterMessage(MyNodeInfo)
       
      -DeviceState = _reflection.GeneratedProtocolMessageType('DeviceState', (_message.Message,), {
      -  'DESCRIPTOR' : _DEVICESTATE,
      +LogRecord = _reflection.GeneratedProtocolMessageType('LogRecord', (_message.Message,), {
      +  'DESCRIPTOR' : _LOGRECORD,
         '__module__' : 'mesh_pb2'
      -  # @@protoc_insertion_point(class_scope:DeviceState)
      +  # @@protoc_insertion_point(class_scope:LogRecord)
         })
      -_sym_db.RegisterMessage(DeviceState)
      -
      -DebugString = _reflection.GeneratedProtocolMessageType('DebugString', (_message.Message,), {
      -  'DESCRIPTOR' : _DEBUGSTRING,
      -  '__module__' : 'mesh_pb2'
      -  # @@protoc_insertion_point(class_scope:DebugString)
      -  })
      -_sym_db.RegisterMessage(DebugString)
      +_sym_db.RegisterMessage(LogRecord)
       
       FromRadio = _reflection.GeneratedProtocolMessageType('FromRadio', (_message.Message,), {
         'DESCRIPTOR' : _FROMRADIO,
      @@ -1711,6 +1946,7 @@ _sym_db.RegisterMessage(ToRadio)
       DESCRIPTOR._options = None
       _SUBPACKET.fields_by_name['position']._options = None
       _SUBPACKET.fields_by_name['user']._options = None
      +_RADIOCONFIG.fields_by_name['channel_settings']._options = None
       # @@protoc_insertion_point(module_scope)
      @@ -1725,24 +1961,17 @@ _SUBPACKET.fields_by_name['user']._options = None
      class ChannelSettings -(**kwargs) +(*args, **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.

      +

      A ProtocolMessage

      Ancestors

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

      Class variables

      -
      var BANDWIDTH_FIELD_NUMBER
      -
      -
      -
      var Bw125Cr45Sf128
      @@ -1759,661 +1988,72 @@ shown below.

      -
      var CHANNEL_NUM_FIELD_NUMBER
      -
      -
      -
      -
      var CODING_RATE_FIELD_NUMBER
      -
      -
      -
      var DESCRIPTOR
      -
      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
      -

      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)
      -
      +

      Field ChannelSettings.bandwidth

      var 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)
      -
      +

      Field ChannelSettings.channel_num

      var 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.coding_rate

      +
      + +
      +

      Field ChannelSettings.downlink_enabled

      +
      +
      var id
      +
      +

      Field ChannelSettings.id

      var 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)
      -
      +

      Field ChannelSettings.modem_config

      var 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)
      -
      +

      Field ChannelSettings.name

      var 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)
      -
      +

      Field ChannelSettings.psk

      var 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)
      -
      +

      Field ChannelSettings.spread_factor

      var 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.tx_power

      -
      -

      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.' % (cls.__name__, msg.__class__.__name__))
      -
      -  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):
      -  if isinstance(serialized, memoryview) and six.PY2:
      -    raise TypeError(
      -        'memoryview not supported in Python 2 with the pure Python proto '
      -        'implementation: this is to maintain compatibility with the C++ '
      -        'implementation')
      -
      -  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
      -
      +

      Field ChannelSettings.uplink_enabled

      class Data -(**kwargs) +(*args, **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.

      +

      A ProtocolMessage

      Ancestors

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

      Class variables

      @@ -2422,4058 +2062,296 @@ shown below.

      -
      var PAYLOAD_FIELD_NUMBER
      -
      -
      -
      -
      var PORTNUM_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 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)
      -
      +

      Field Data.payload

      var 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)
      -
      -
      -
      -

      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.' % (cls.__name__, msg.__class__.__name__))
      -
      -  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):
      -  if isinstance(serialized, memoryview) and six.PY2:
      -    raise TypeError(
      -        'memoryview not supported in Python 2 with the pure Python proto '
      -        'implementation: this is to maintain compatibility with the C++ '
      -        'implementation')
      -
      -  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 DebugString -(**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 DESCRIPTOR
    -
    -
    -
    -
    var MESSAGE_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 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)
    -
    -
    -
    -

    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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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 -(**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 DESCRIPTOR
    -
    -
    -
    -
    var DID_GPS_RESET_FIELD_NUMBER
    -
    -
    -
    -
    var MY_NODE_FIELD_NUMBER
    -
    -
    -
    -
    var NODE_DB_FIELD_NUMBER
    -
    -
    -
    -
    var NO_SAVE_FIELD_NUMBER
    -
    -
    -
    -
    var OWNER_FIELD_NUMBER
    -
    -
    -
    -
    var RADIO_FIELD_NUMBER
    -
    -
    -
    -
    var RECEIVE_QUEUE_FIELD_NUMBER
    -
    -
    -
    -
    var RX_TEXT_MESSAGE_FIELD_NUMBER
    -
    -
    -
    -
    var SECONDARY_CHANNELS_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
    -
    -

    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 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
    -
    -

    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
    -
    -

    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
    -
    -

    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 radio
    -
    -

    Getter for 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
    -
    -
    -
    var 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
    -
    -

    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 secondary_channels
    -
    -

    Getter for secondary_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
    -
    -
    -
    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field Data.portnum

    class FromRadio -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    -
    var CONFIG_COMPLETE_ID_FIELD_NUMBER
    -
    -
    -
    -
    var DEBUG_STRING_FIELD_NUMBER
    -
    -
    -
    var DESCRIPTOR
    -
    var MY_INFO_FIELD_NUMBER
    +
    +

    Instance variables

    +
    +
    var channel
    -
    +

    Field FromRadio.channel

    -
    var NODE_INFO_FIELD_NUMBER
    +
    var config_complete_id
    -
    +

    Field FromRadio.config_complete_id

    -
    var NUM_FIELD_NUMBER
    +
    var log_record
    -
    +

    Field FromRadio.log_record

    -
    var PACKET_FIELD_NUMBER
    +
    var my_info
    -
    +

    Field FromRadio.my_info

    -
    var RADIO_FIELD_NUMBER
    +
    var node_info
    -
    +

    Field FromRadio.node_info

    -
    var REBOOTED_FIELD_NUMBER
    +
    var num
    -
    +

    Field FromRadio.num

    -
    var SECONDARY_CHANNEL_FIELD_NUMBER
    +
    var packet
    -
    +

    Field FromRadio.packet

    +
    +
    var radio
    +
    +

    Field FromRadio.radio

    +
    +
    var rebooted
    +
    +

    Field FromRadio.rebooted

    -

    Static methods

    -
    -
    -def FromString(s) -
    -
    -
    -
    - -Expand source code - -
    def FromString(s):
    -  message = cls()
    -  message.MergeFromString(s)
    -  return message
    -
    -
    -def RegisterExtension(extension_handle) +
    +class LogRecord +(*args, **kwargs)
    +

    A ProtocolMessage

    +

    Ancestors

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

    Class variables

    +
    +
    var CRITICAL
    +
    +
    +
    +
    var DEBUG
    +
    +
    +
    +
    var DESCRIPTOR
    +
    +
    +
    +
    var ERROR
    +
    +
    +
    +
    var INFO
    +
    +
    +
    +
    var Level
    +
    +
    +
    +
    var TRACE
    +
    +
    +
    +
    var UNSET
    +
    +
    +
    +
    var WARNING
    +
    -
    - -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
    +
    var level
    -

    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)
    -
    +

    Field LogRecord.level

    -
    var debug_string
    +
    var message
    -

    Getter for debug_string.

    -
    - -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
    -
    +

    Field LogRecord.message

    -
    var my_info
    +
    var source
    -

    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
    -
    +

    Field LogRecord.source

    -
    var node_info
    +
    var time
    -

    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
    -
    -

    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
    -
    -

    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 radio
    -
    -

    Getter for 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
    -
    -
    -
    var 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)
    -
    -
    -
    var secondary_channel
    -
    -

    Getter for secondary_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
    -
    -
    -
    -

    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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field LogRecord.time

    class MeshPacket -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    -
    var CHANNEL_INDEX_FIELD_NUMBER
    -
    -
    -
    -
    var DECODED_FIELD_NUMBER
    -
    -
    -
    var DESCRIPTOR
    -
    var ENCRYPTED_FIELD_NUMBER
    -
    -
    -
    -
    var FROM_FIELD_NUMBER
    -
    -
    -
    -
    var HOP_LIMIT_FIELD_NUMBER
    -
    -
    -
    -
    var ID_FIELD_NUMBER
    -
    -
    -
    -
    var RX_SNR_FIELD_NUMBER
    -
    -
    -
    -
    var RX_TIME_FIELD_NUMBER
    -
    -
    -
    -
    var TO_FIELD_NUMBER
    -
    -
    -
    -
    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_index
    -

    Getter for channel_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)
    -
    +

    Field MeshPacket.channel_index

    var 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
    -
    +

    Field MeshPacket.decoded

    var 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)
    -
    +

    Field MeshPacket.encrypted

    var 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)
    -
    +

    Field MeshPacket.from

    var 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)
    -
    +

    Field MeshPacket.hop_limit

    var 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)
    -
    +

    Field MeshPacket.id

    var 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)
    -
    +

    Field MeshPacket.rx_snr

    var 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)
    -
    +

    Field MeshPacket.rx_time

    var 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)
    -
    +

    Field MeshPacket.to

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field MeshPacket.want_ack

    class MyNodeInfo -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    -
    var CURRENT_PACKET_ID_FIELD_NUMBER
    -
    -
    -
    var DESCRIPTOR
    -
    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_FIELD_NUMBER
    -
    -
    -
    -
    var MESSAGE_TIMEOUT_MSEC_FIELD_NUMBER
    -
    -
    -
    -
    var MIN_APP_VERSION_FIELD_NUMBER
    -
    -
    -
    -
    var MY_NODE_NUM_FIELD_NUMBER
    -
    -
    -
    -
    var NODE_NUM_BITS_FIELD_NUMBER
    -
    -
    -
    -
    var NUM_CHANNELS_FIELD_NUMBER
    -
    -
    -
    -
    var PACKET_ID_BITS_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 current_packet_id
    -

    Getter for current_packet_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)
    -
    +

    Field MyNodeInfo.current_packet_id

    var 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)
    -
    +

    Field MyNodeInfo.error_address

    var 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)
    -
    +

    Field MyNodeInfo.error_code

    var 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)
    -
    +

    Field MyNodeInfo.error_count

    var 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)
    -
    +

    Field MyNodeInfo.firmware_version

    var 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)
    -
    +

    Field MyNodeInfo.has_gps

    var 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)
    -
    +

    Field MyNodeInfo.hw_model

    var 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)
    -
    +

    Field MyNodeInfo.message_timeout_msec

    var 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)
    -
    +

    Field MyNodeInfo.min_app_version

    var 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)
    -
    +

    Field MyNodeInfo.my_node_num

    var node_num_bits
    -

    Getter for node_num_bits.

    -
    - -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 MyNodeInfo.node_num_bits

    var num_channels
    -

    Getter for num_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)
    -
    +

    Field MyNodeInfo.num_channels

    var packet_id_bits
    -

    Getter for packet_id_bits.

    -
    - -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 MyNodeInfo.packet_id_bits

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field MyNodeInfo.region

    class NodeInfo -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    @@ -6482,1819 +2360,116 @@ shown below.

    -
    var NEXT_HOP_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 next_hop
    -

    Getter for next_hop.

    -
    - -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 NodeInfo.next_hop

    var 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)
    -
    +

    Field NodeInfo.num

    var 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
    -
    +

    Field NodeInfo.position

    var 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)
    -
    +

    Field NodeInfo.snr

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field NodeInfo.user

    class Position -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    -
    var ALTITUDE_FIELD_NUMBER
    -
    -
    -
    -
    var BATTERY_LEVEL_FIELD_NUMBER
    -
    -
    -
    var DESCRIPTOR
    -
    var LATITUDE_I_FIELD_NUMBER
    -
    -
    -
    -
    var LONGITUDE_I_FIELD_NUMBER
    -
    -
    -
    -
    var TIME_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 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)
    -
    +

    Field Position.altitude

    var 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)
    -
    +

    Field Position.battery_level

    var 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)
    -
    +

    Field Position.latitude_i

    var 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)
    -
    +

    Field Position.longitude_i

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field Position.time

    class RadioConfig -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    -
    var CHANNEL_SETTINGS_FIELD_NUMBER
    -
    -
    -
    var DESCRIPTOR
    -
    var PREFERENCES_FIELD_NUMBER
    -
    -
    -
    var UserPreferences
    -

    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)
    -
    +

    A ProtocolMessage

    Instance variables

    var channel_settings
    -

    Getter for channel_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
    -
    +

    Field RadioConfig.channel_settings

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field RadioConfig.preferences

    class RouteDiscovery -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    @@ -8303,1325 +2478,94 @@ shown below.

    -
    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
    -

    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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field RouteDiscovery.route

    class SubPacket -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    -
    var DATA_FIELD_NUMBER
    -
    -
    -
    var DESCRIPTOR
    -
    var DEST_FIELD_NUMBER
    -
    -
    -
    -
    var FAIL_ID_FIELD_NUMBER
    -
    -
    -
    -
    var ORIGINAL_ID_FIELD_NUMBER
    -
    -
    -
    -
    var POSITION_FIELD_NUMBER
    -
    -
    -
    -
    var ROUTE_ERROR_FIELD_NUMBER
    -
    -
    -
    -
    var ROUTE_REPLY_FIELD_NUMBER
    -
    -
    -
    -
    var ROUTE_REQUEST_FIELD_NUMBER
    -
    -
    -
    -
    var SOURCE_FIELD_NUMBER
    -
    -
    -
    -
    var SUCCESS_ID_FIELD_NUMBER
    -
    -
    -
    -
    var USER_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 data
    -

    Getter for data.

    -
    - -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
    -
    +

    Field SubPacket.data

    var 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)
    -
    +

    Field SubPacket.dest

    +
    +
    var error_reason
    +
    +

    Field SubPacket.error_reason

    var fail_id
    -

    Getter for fail_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)
    -
    +

    Field SubPacket.fail_id

    var original_id
    -

    Getter for original_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)
    -
    +

    Field SubPacket.original_id

    var 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 route_error
    -
    -

    Getter for route_error.

    -
    - -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 SubPacket.position

    var 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
    -
    +

    Field SubPacket.route_reply

    var 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
    -
    +

    Field SubPacket.route_request

    var 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)
    -
    +

    Field SubPacket.source

    var success_id
    -

    Getter for success_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)
    -
    +

    Field SubPacket.success_id

    var 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
    -
    +

    Field SubPacket.user

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field SubPacket.want_response

    class ToRadio -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    @@ -9630,619 +2574,40 @@ shown below.

    -
    var PACKET_FIELD_NUMBER
    -
    -
    -
    -
    var SET_OWNER_FIELD_NUMBER
    -
    -
    -
    -
    var SET_RADIO_FIELD_NUMBER
    -
    -
    -
    -
    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 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
    -
    +

    Field ToRadio.packet

    +
    +
    var set_channel
    +
    +

    Field ToRadio.set_channel

    var 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
    -
    +

    Field ToRadio.set_owner

    var 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
    -
    +

    Field ToRadio.set_radio

    var 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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field ToRadio.want_config_id

    class User -(**kwargs) +(*args, **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.

    +

    A ProtocolMessage

    Ancestors

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

    Class variables

    @@ -10251,574 +2616,24 @@ shown below.

    -
    var ID_FIELD_NUMBER
    -
    -
    -
    -
    var LONG_NAME_FIELD_NUMBER
    -
    -
    -
    -
    var MACADDR_FIELD_NUMBER
    -
    -
    -
    -
    var SHORT_NAME_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 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)
    -
    +

    Field User.id

    var 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)
    -
    +

    Field User.long_name

    var 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)
    -
    +

    Field User.macaddr

    var 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)
    -
    -
    -
    -

    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.' % (cls.__name__, msg.__class__.__name__))
    -
    -  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):
    -  if isinstance(serialized, memoryview) and six.PY2:
    -    raise TypeError(
    -        'memoryview not supported in Python 2 with the pure Python proto '
    -        'implementation: this is to maintain compatibility with the C++ '
    -        'implementation')
    -
    -  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
    -
    +

    Field User.short_name

    @@ -10840,215 +2655,71 @@ and propagates this to our listener iff this was a state change.

    • ChannelSettings

      -
        -
      • BANDWIDTH_FIELD_NUMBER
      • +
      • Data

      • -

        DebugString

        - -
      • -
      • -

        DeviceState

        - -
      • -
      • FromRadio

        -
          -
        • ByteSize
        • -
        • CONFIG_COMPLETE_ID_FIELD_NUMBER
        • -
        • Clear
        • -
        • ClearField
        • -
        • DEBUG_STRING_FIELD_NUMBER
        • + + +
        • +

          LogRecord

          +
        • MeshPacket

          -
            -
          • ByteSize
          • -
          • CHANNEL_INDEX_FIELD_NUMBER
          • -
          • Clear
          • -
          • ClearField
          • -
          • DECODED_FIELD_NUMBER
          • +
            • DESCRIPTOR
            • -
            • DiscardUnknownFields
            • -
            • ENCRYPTED_FIELD_NUMBER
            • -
            • FROM_FIELD_NUMBER
            • -
            • FindInitializationErrors
            • -
            • FromString
            • -
            • HOP_LIMIT_FIELD_NUMBER
            • -
            • HasField
            • -
            • ID_FIELD_NUMBER
            • -
            • IsInitialized
            • -
            • ListFields
            • -
            • MergeFrom
            • -
            • MergeFromString
            • -
            • RX_SNR_FIELD_NUMBER
            • -
            • RX_TIME_FIELD_NUMBER
            • -
            • RegisterExtension
            • -
            • SerializePartialToString
            • -
            • SerializeToString
            • -
            • SetInParent
            • -
            • TO_FIELD_NUMBER
            • -
            • UnknownFields
            • -
            • WANT_ACK_FIELD_NUMBER
            • -
            • WhichOneof
            • channel_index
            • decoded
            • encrypted
            • @@ -11064,38 +2735,7 @@ and propagates this to our listener iff this was a state change.

            • MyNodeInfo

                -
              • ByteSize
              • -
              • CURRENT_PACKET_ID_FIELD_NUMBER
              • -
              • 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_FIELD_NUMBER
              • -
              • HasField
              • -
              • IsInitialized
              • -
              • ListFields
              • -
              • MESSAGE_TIMEOUT_MSEC_FIELD_NUMBER
              • -
              • MIN_APP_VERSION_FIELD_NUMBER
              • -
              • MY_NODE_NUM_FIELD_NUMBER
              • -
              • MergeFrom
              • -
              • MergeFromString
              • -
              • NODE_NUM_BITS_FIELD_NUMBER
              • -
              • NUM_CHANNELS_FIELD_NUMBER
              • -
              • PACKET_ID_BITS_FIELD_NUMBER
              • -
              • REGION_FIELD_NUMBER
              • -
              • RegisterExtension
              • -
              • SerializePartialToString
              • -
              • SerializeToString
              • -
              • SetInParent
              • -
              • UnknownFields
              • -
              • WhichOneof
              • current_packet_id
              • error_address
              • error_code
              • @@ -11114,30 +2754,8 @@ and propagates this to our listener iff this was a state change.

              • NodeInfo

                -
                  -
                • ByteSize
                • -
                • Clear
                • -
                • ClearField
                • +
                  • DESCRIPTOR
                  • -
                  • DiscardUnknownFields
                  • -
                  • FindInitializationErrors
                  • -
                  • FromString
                  • -
                  • HasField
                  • -
                  • IsInitialized
                  • -
                  • ListFields
                  • -
                  • MergeFrom
                  • -
                  • MergeFromString
                  • -
                  • NEXT_HOP_FIELD_NUMBER
                  • -
                  • NUM_FIELD_NUMBER
                  • -
                  • POSITION_FIELD_NUMBER
                  • -
                  • RegisterExtension
                  • -
                  • SNR_FIELD_NUMBER
                  • -
                  • SerializePartialToString
                  • -
                  • SerializeToString
                  • -
                  • SetInParent
                  • -
                  • USER_FIELD_NUMBER
                  • -
                  • UnknownFields
                  • -
                  • WhichOneof
                  • next_hop
                  • num
                  • position
                  • @@ -11147,30 +2765,8 @@ and propagates this to our listener iff this was a state change.

                  • Position

                    -
                      -
                    • ALTITUDE_FIELD_NUMBER
                    • -
                    • BATTERY_LEVEL_FIELD_NUMBER
                    • -
                    • ByteSize
                    • -
                    • Clear
                    • -
                    • ClearField
                    • +
                      • DESCRIPTOR
                      • -
                      • DiscardUnknownFields
                      • -
                      • FindInitializationErrors
                      • -
                      • FromString
                      • -
                      • HasField
                      • -
                      • IsInitialized
                      • -
                      • LATITUDE_I_FIELD_NUMBER
                      • -
                      • LONGITUDE_I_FIELD_NUMBER
                      • -
                      • ListFields
                      • -
                      • MergeFrom
                      • -
                      • MergeFromString
                      • -
                      • RegisterExtension
                      • -
                      • SerializePartialToString
                      • -
                      • SerializeToString
                      • -
                      • SetInParent
                      • -
                      • TIME_FIELD_NUMBER
                      • -
                      • UnknownFields
                      • -
                      • WhichOneof
                      • altitude
                      • battery_level
                      • latitude_i
                      • @@ -11181,27 +2777,8 @@ and propagates this to our listener iff this was a state change.

                      • RadioConfig

                        @@ -11209,67 +2786,20 @@ and propagates this to our listener iff this was a state change.

                      • RouteDiscovery

                      • SubPacket

                        -
                          -
                        • ByteSize
                        • -
                        • Clear
                        • -
                        • ClearField
                        • -
                        • DATA_FIELD_NUMBER
                        • +
                          • DESCRIPTOR
                          • -
                          • DEST_FIELD_NUMBER
                          • -
                          • DiscardUnknownFields
                          • -
                          • FAIL_ID_FIELD_NUMBER
                          • -
                          • FindInitializationErrors
                          • -
                          • FromString
                          • -
                          • HasField
                          • -
                          • IsInitialized
                          • -
                          • ListFields
                          • -
                          • MergeFrom
                          • -
                          • MergeFromString
                          • -
                          • ORIGINAL_ID_FIELD_NUMBER
                          • -
                          • POSITION_FIELD_NUMBER
                          • -
                          • ROUTE_ERROR_FIELD_NUMBER
                          • -
                          • ROUTE_REPLY_FIELD_NUMBER
                          • -
                          • ROUTE_REQUEST_FIELD_NUMBER
                          • -
                          • RegisterExtension
                          • -
                          • SOURCE_FIELD_NUMBER
                          • -
                          • SUCCESS_ID_FIELD_NUMBER
                          • -
                          • SerializePartialToString
                          • -
                          • SerializeToString
                          • -
                          • SetInParent
                          • -
                          • USER_FIELD_NUMBER
                          • -
                          • UnknownFields
                          • -
                          • WANT_RESPONSE_FIELD_NUMBER
                          • -
                          • WhichOneof
                          • data
                          • dest
                          • +
                          • error_reason
                          • fail_id
                          • original_id
                          • position
                          • -
                          • route_error
                          • route_reply
                          • route_request
                          • source
                          • @@ -11280,30 +2810,10 @@ and propagates this to our listener iff this was a state change.

                          • ToRadio

                            -
                              -
                            • ByteSize
                            • -
                            • Clear
                            • -
                            • ClearField
                            • +
                              • DESCRIPTOR
                              • -
                              • DiscardUnknownFields
                              • -
                              • FindInitializationErrors
                              • -
                              • FromString
                              • -
                              • HasField
                              • -
                              • IsInitialized
                              • -
                              • ListFields
                              • -
                              • MergeFrom
                              • -
                              • MergeFromString
                              • -
                              • PACKET_FIELD_NUMBER
                              • -
                              • RegisterExtension
                              • -
                              • SET_OWNER_FIELD_NUMBER
                              • -
                              • SET_RADIO_FIELD_NUMBER
                              • -
                              • SerializePartialToString
                              • -
                              • SerializeToString
                              • -
                              • SetInParent
                              • -
                              • UnknownFields
                              • -
                              • WANT_CONFIG_ID_FIELD_NUMBER
                              • -
                              • WhichOneof
                              • packet
                              • +
                              • set_channel
                              • set_owner
                              • set_radio
                              • want_config_id
                              • @@ -11312,28 +2822,7 @@ and propagates this to our listener iff this was a state change.

                              • User

                                  -
                                • ByteSize
                                • -
                                • Clear
                                • -
                                • ClearField
                                • DESCRIPTOR
                                • -
                                • DiscardUnknownFields
                                • -
                                • FindInitializationErrors
                                • -
                                • FromString
                                • -
                                • HasField
                                • -
                                • ID_FIELD_NUMBER
                                • -
                                • IsInitialized
                                • -
                                • LONG_NAME_FIELD_NUMBER
                                • -
                                • ListFields
                                • -
                                • MACADDR_FIELD_NUMBER
                                • -
                                • MergeFrom
                                • -
                                • MergeFromString
                                • -
                                • RegisterExtension
                                • -
                                • SHORT_NAME_FIELD_NUMBER
                                • -
                                • SerializePartialToString
                                • -
                                • SerializeToString
                                • -
                                • SetInParent
                                • -
                                • UnknownFields
                                • -
                                • WhichOneof
                                • id
                                • long_name
                                • macaddr
                                • diff --git a/docs/meshtastic/portnums_pb2.html b/docs/meshtastic/portnums_pb2.html index 5e1377f..ee809ab 100644 --- a/docs/meshtastic/portnums_pb2.html +++ b/docs/meshtastic/portnums_pb2.html @@ -5,7 +5,7 @@ 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\003',
                                  -  create_key=_descriptor._internal_create_key,
                                  -  serialized_pb=b'\n\x0eportnums.proto*\xa1\x01\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\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x42!\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03\x62\x06proto3'
                                  +  serialized_pb=b'\n\x0eportnums.proto*\xdd\x01\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\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\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x42!\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03\x62\x06proto3'
                                   )
                                   
                                   _PORTNUM = _descriptor.EnumDescriptor(
                                  @@ -57,53 +55,56 @@ _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='REPLY_APP', index=5, number=32,
                                         serialized_options=None,
                                  -      type=None,
                                  -      create_key=_descriptor._internal_create_key),
                                  +      type=None),
                                       _descriptor.EnumValueDescriptor(
                                         name='IP_TUNNEL_APP', index=6, number=33,
                                         serialized_options=None,
                                  -      type=None,
                                  -      create_key=_descriptor._internal_create_key),
                                  +      type=None),
                                       _descriptor.EnumValueDescriptor(
                                  -      name='PRIVATE_APP', index=7, number=256,
                                  +      name='SERIAL_APP', index=7, number=64,
                                         serialized_options=None,
                                  -      type=None,
                                  -      create_key=_descriptor._internal_create_key),
                                  +      type=None),
                                  +    _descriptor.EnumValueDescriptor(
                                  +      name='STORE_FORWARD_APP', index=8, number=65,
                                  +      serialized_options=None,
                                  +      type=None),
                                  +    _descriptor.EnumValueDescriptor(
                                  +      name='PRIVATE_APP', index=9, number=256,
                                  +      serialized_options=None,
                                  +      type=None),
                                  +    _descriptor.EnumValueDescriptor(
                                  +      name='ATAK_FORWARDER', index=10, number=257,
                                  +      serialized_options=None,
                                  +      type=None),
                                     ],
                                     containing_type=None,
                                     serialized_options=None,
                                     serialized_start=19,
                                  -  serialized_end=180,
                                  +  serialized_end=240,
                                   )
                                   _sym_db.RegisterEnumDescriptor(_PORTNUM)
                                   
                                  @@ -115,7 +116,10 @@ POSITION_APP = 3
                                   NODEINFO_APP = 4
                                   REPLY_APP = 32
                                   IP_TUNNEL_APP = 33
                                  +SERIAL_APP = 64
                                  +STORE_FORWARD_APP = 65
                                   PRIVATE_APP = 256
                                  +ATAK_FORWARDER = 257
                                   
                                   
                                   DESCRIPTOR.enum_types_by_name['PortNum'] = _PORTNUM
                                  diff --git a/docs/meshtastic/remote_hardware_pb2.html b/docs/meshtastic/remote_hardware_pb2.html
                                  index ad616d5..ccf79da 100644
                                  --- a/docs/meshtastic/remote_hardware_pb2.html
                                  +++ b/docs/meshtastic/remote_hardware_pb2.html
                                  @@ -5,7 +5,7 @@
                                   
                                   
                                   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\003',
                                  -  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\x42\'\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareH\x03\x62\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,16 +163,13 @@ DESCRIPTOR._options = None
                                   
                                  class HardwareMessage -(**kwargs) +(*args, **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.

                                  +

                                  A ProtocolMessage

                                  Ancestors

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

                                  Class variables

                                  @@ -195,14 +182,6 @@ shown below.

                                  -
                                  var GPIO_MASK_FIELD_NUMBER
                                  -
                                  -
                                  -
                                  -
                                  var GPIO_VALUE_FIELD_NUMBER
                                  -
                                  -
                                  -
                                  var READ_GPIOS
                                  @@ -211,10 +190,6 @@ shown below.

                                  -
                                  var TYP_FIELD_NUMBER
                                  -
                                  -
                                  -
                                  var Type
                                  @@ -232,544 +207,19 @@ 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 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)
                                  -
                                  +

                                  Field HardwareMessage.gpio_mask

                                  var 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)
                                  -
                                  +

                                  Field HardwareMessage.gpio_value

                                  var 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.' % (cls.__name__, msg.__class__.__name__))
                                  -
                                  -  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):
                                  -  if isinstance(serialized, memoryview) and six.PY2:
                                  -    raise TypeError(
                                  -        'memoryview not supported in Python 2 with the pure Python proto '
                                  -        'implementation: this is to maintain compatibility with the C++ '
                                  -        'implementation')
                                  -
                                  -  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
                                  -
                                  +

                                  Field HardwareMessage.typ

                                  @@ -791,35 +241,15 @@ and propagates this to our listener iff this was a state change.

                                  • 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
                                      • diff --git a/meshtastic/__init__.py b/meshtastic/__init__.py index af69a0f..bf3aa27 100644 --- a/meshtastic/__init__.py +++ b/meshtastic/__init__.py @@ -58,15 +58,7 @@ interface = meshtastic.SerialInterface() import socket import pygatt import google.protobuf.json_format -import serial -import threading -import logging -import time -import sys -import traceback -import time -import base64 -import platform +import serial, threading, logging, sys, random, traceback, time, base64, platform from . import mesh_pb2, portnums_pb2, util from pubsub import pub from dotmap import DotMap @@ -109,6 +101,8 @@ class MeshInterface: self.nodes = None # FIXME self.isConnected = threading.Event() self.noProto = noProto + random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it + self.currentPacketId = random.randint(0, 0xffffffff) self._startConfig() def __enter__(self): @@ -339,7 +333,6 @@ class MeshInterface: self.nodes = {} # nodes keyed by ID self.nodesByNum = {} # nodes keyed by nodenum self.radioConfig = None - self.currentPacketId = None startConfig = mesh_pb2.ToRadio() startConfig.want_config_id = MY_CONFIG_ID # we don't use this value @@ -371,8 +364,6 @@ class MeshInterface: raise Exception( "This device needs a newer python client, please \"pip install --upgrade meshtastic\"") # start assigning our packet IDs from the opposite side of where our local device is assigning them - self.currentPacketId = ( - self.myInfo.current_packet_id + 0x80000000) & 0xffffffff elif fromRadio.HasField("radio"): self.radioConfig = fromRadio.radio elif fromRadio.HasField("node_info"): diff --git a/meshtastic/apponly_pb2.py b/meshtastic/apponly_pb2.py new file mode 100644 index 0000000..b61e850 --- /dev/null +++ b/meshtastic/apponly_pb2.py @@ -0,0 +1,86 @@ +# -*- 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() + + +from . import mesh_pb2 as mesh__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='apponly.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\007AppOnlyH\003', + serialized_pb=b'\n\rapponly.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(\tB \n\x13\x63om.geeksville.meshB\x07\x41ppOnlyH\x03\x62\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=29, + serialized_end=115, +) + +_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__' : 'apponly_pb2' + # @@protoc_insertion_point(class_scope:ServiceEnvelope) + }) +_sym_db.RegisterMessage(ServiceEnvelope) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/deviceonly_pb2.py b/meshtastic/deviceonly_pb2.py new file mode 100644 index 0000000..e1f110a --- /dev/null +++ b/meshtastic/deviceonly_pb2.py @@ -0,0 +1,141 @@ +# -*- 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() + + +from . import mesh_pb2 as mesh__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='deviceonly.proto', + package='', + syntax='proto3', + serialized_options=b'\n\023com.geeksville.meshB\nDeviceOnlyH\003', + serialized_pb=b'\n\x10\x64\x65viceonly.proto\x1a\nmesh.proto\"\xab\x02\n\x0b\x44\x65viceState\x12\x1b\n\x05radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfig\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(\x08\x12,\n\x12secondary_channels\x18\x0c \x03(\x0b\x32\x10.ChannelSettingsB#\n\x13\x63om.geeksville.meshB\nDeviceOnlyH\x03\x62\x06proto3' + , + dependencies=[mesh__pb2.DESCRIPTOR,]) + + + + +_DEVICESTATE = _descriptor.Descriptor( + name='DeviceState', + full_name='DeviceState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='radio', full_name='DeviceState.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='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), + _descriptor.FieldDescriptor( + name='secondary_channels', full_name='DeviceState.secondary_channels', index=9, + number=12, 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=33, + serialized_end=332, +) + +_DEVICESTATE.fields_by_name['radio'].message_type = mesh__pb2._RADIOCONFIG +_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 +_DEVICESTATE.fields_by_name['secondary_channels'].message_type = mesh__pb2._CHANNELSETTINGS +DESCRIPTOR.message_types_by_name['DeviceState'] = _DEVICESTATE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +DeviceState = _reflection.GeneratedProtocolMessageType('DeviceState', (_message.Message,), { + 'DESCRIPTOR' : _DEVICESTATE, + '__module__' : 'deviceonly_pb2' + # @@protoc_insertion_point(class_scope:DeviceState) + }) +_sym_db.RegisterMessage(DeviceState) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/mesh_pb2.py b/meshtastic/mesh_pb2.py index f3edf0d..8a9b0c2 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,69 +20,68 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=b'\n\023com.geeksville.meshB\nMeshProtosH\003', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"j\n\x08Position\x12\x12\n\nlatitude_i\x18\x07 \x01(\x11\x12\x13\n\x0blongitude_i\x18\x08 \x01(\x11\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\"2\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\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\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x05\"\xdb\x02\n\tSubPacket\x12!\n\x08position\x18\x01 \x01(\x0b\x32\t.PositionB\x02\x18\x01H\x00\x12\x15\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.DataH\x00\x12\x19\n\x04user\x18\x04 \x01(\x0b\x32\x05.UserB\x02\x18\x01H\x00\x12(\n\rroute_request\x18\x06 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x07 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12\"\n\x0broute_error\x18\r \x01(\x0e\x32\x0b.RouteErrorH\x00\x12\x15\n\rwant_response\x18\x05 \x01(\x08\x12\x14\n\nsuccess_id\x18\n \x01(\rH\x01\x12\x11\n\x07\x66\x61il_id\x18\x0b \x01(\rH\x01\x12\x0c\n\x04\x64\x65st\x18\t \x01(\r\x12\x0e\n\x06source\x18\x0c \x01(\r\x12\x13\n\x0boriginal_id\x18\x02 \x01(\rB\t\n\x07payloadB\x05\n\x03\x61\x63k\"\xce\x01\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\r\x12\n\n\x02to\x18\x02 \x01(\r\x12\x15\n\rchannel_index\x18\x04 \x01(\r\x12\x1d\n\x07\x64\x65\x63oded\x18\x03 \x01(\x0b\x32\n.SubPacketH\x00\x12\x13\n\tencrypted\x18\x08 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\r\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x12\x0e\n\x06rx_snr\x18\x07 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x42\t\n\x07payload\"\xa8\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\"`\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\"\xf7\x05\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x12*\n\x10\x63hannel_settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x1a\x88\x05\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\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\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \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\x17\n\x0fignore_incoming\x18g \x03(\r\"h\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\x10\n\x08next_hop\x18\x05 \x01(\r\"\xc5\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x14\n\x0cnum_channels\x18\x03 \x01(\x05\x12\x0e\n\x06region\x18\x04 \x01(\t\x12\x10\n\x08hw_model\x18\x05 \x01(\t\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12\x12\n\nerror_code\x18\x07 \x01(\r\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\x12\x16\n\x0epacket_id_bits\x18\n \x01(\r\x12\x19\n\x11\x63urrent_packet_id\x18\x0b \x01(\r\x12\x15\n\rnode_num_bits\x18\x0c \x01(\r\x12\x1c\n\x14message_timeout_msec\x18\r \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0e \x01(\r\"\xab\x02\n\x0b\x44\x65viceState\x12\x1b\n\x05radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfig\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(\x08\x12,\n\x12secondary_channels\x18\x0c \x03(\x0b\x32\x10.ChannelSettings\"\x1e\n\x0b\x44\x65\x62ugString\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xa8\x02\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \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\x1d\n\x05radio\x18\x06 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12$\n\x0c\x64\x65\x62ug_string\x18\x07 \x01(\x0b\x32\x0c.DebugStringH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x12-\n\x11secondary_channel\x18\n \x01(\x0b\x32\x10.ChannelSettingsH\x00\x42\t\n\x07variant\"\x8c\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12!\n\tset_radio\x18\x65 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x66 \x01(\x0b\x32\x05.UserH\x00\x42\t\n\x07variant*>\n\nRouteError\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*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xf0\x01*^\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*U\n\x0cGpsOperation\x12\x0e\n\nGpsOpUnset\x10\x00\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\x42#\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03\x62\x06proto3' + serialized_pb=b'\n\nmesh.proto\x1a\x0eportnums.proto\"j\n\x08Position\x12\x12\n\nlatitude_i\x18\x07 \x01(\x11\x12\x13\n\x0blongitude_i\x18\x08 \x01(\x11\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\"2\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"J\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\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x05\"\xeb\x02\n\tSubPacket\x12\x15\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.DataH\x00\x12(\n\rroute_request\x18\x06 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x07 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12$\n\x0c\x65rror_reason\x18\r \x01(\x0e\x32\x0c.ErrorReasonH\x00\x12!\n\x08position\x18\x01 \x01(\x0b\x32\t.PositionB\x02\x18\x01H\x00\x12\x19\n\x04user\x18\x04 \x01(\x0b\x32\x05.UserB\x02\x18\x01H\x00\x12\x15\n\rwant_response\x18\x05 \x01(\x08\x12\x14\n\nsuccess_id\x18\n \x01(\rH\x01\x12\x11\n\x07\x66\x61il_id\x18\x0b \x01(\rH\x01\x12\x0c\n\x04\x64\x65st\x18\t \x01(\r\x12\x0e\n\x06source\x18\x0c \x01(\r\x12\x13\n\x0boriginal_id\x18\x02 \x01(\rB\x10\n\x0epayloadVariantB\x0c\n\nackVariant\"\xd5\x01\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\r\x12\n\n\x02to\x18\x02 \x01(\r\x12\x15\n\rchannel_index\x18\x04 \x01(\r\x12\x1d\n\x07\x64\x65\x63oded\x18\x03 \x01(\x0b\x32\n.SubPacketH\x00\x12\x13\n\tencrypted\x18\x08 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\r\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x12\x0e\n\x06rx_snr\x18\x07 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\r\x12\x10\n\x08want_ack\x18\x0b \x01(\x08\x42\x10\n\x0epayloadVariant\"\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\"\x82\x0b\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x12.\n\x10\x63hannel_settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettingsB\x02\x18\x01\x1a\x8f\n\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\x15\n\rfactory_reset\x18\x64 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x65 \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\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\x88\x01 \x01(\x08\x12%\n\x1cstore_forward_plugin_records\x18\x89\x01 \x01(\r\"h\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\x10\n\x08next_hop\x18\x05 \x01(\r\"\xd9\x02\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x14\n\x0cnum_channels\x18\x03 \x01(\x05\x12\x0e\n\x06region\x18\x04 \x01(\t\x12\x10\n\x08hw_model\x18\x05 \x01(\t\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\x16\n\x0epacket_id_bits\x18\n \x01(\r\x12\x19\n\x11\x63urrent_packet_id\x18\x0b \x01(\r\x12\x15\n\rnode_num_bits\x18\x0c \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\"\xa1\x02\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \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\x1d\n\x05radio\x18\x06 \x01(\x0b\x32\x0c.RadioConfigH\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\x12#\n\x07\x63hannel\x18\n \x01(\x0b\x32\x10.ChannelSettingsH\x00\x42\x10\n\x0epayloadVariant\"\xbc\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12!\n\tset_radio\x18\x65 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x66 \x01(\x0b\x32\x05.UserH\x00\x12\'\n\x0bset_channel\x18g \x01(\x0b\x32\x10.ChannelSettingsH\x00\x42\x10\n\x0epayloadVariant*e\n\x0b\x45rrorReason\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*.\n\tConstants\x12\n\n\x06Unused\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xf0\x01*^\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*\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*\xaf\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\x42#\n\x13\x63om.geeksville.meshB\nMeshProtosH\x03\x62\x06proto3' , dependencies=[portnums__pb2.DESCRIPTOR,]) -_ROUTEERROR = _descriptor.EnumDescriptor( - name='RouteError', - full_name='RouteError', +_ERRORREASON = _descriptor.EnumDescriptor( + name='ErrorReason', + full_name='ErrorReason', 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), + _descriptor.EnumValueDescriptor( + name='MAX_RETRANSMIT', index=5, number=5, + serialized_options=None, + type=None), ], containing_type=None, serialized_options=None, - serialized_start=3129, - serialized_end=3191, + serialized_start=3776, + serialized_end=3877, ) -_sym_db.RegisterEnumDescriptor(_ROUTEERROR) +_sym_db.RegisterEnumDescriptor(_ERRORREASON) -RouteError = enum_type_wrapper.EnumTypeWrapper(_ROUTEERROR) +ErrorReason = enum_type_wrapper.EnumTypeWrapper(_ERRORREASON) _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=240, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), ], containing_type=None, serialized_options=None, - serialized_start=3193, - serialized_end=3239, + serialized_start=3879, + serialized_end=3925, ) _sym_db.RegisterEnumDescriptor(_CONSTANTS) @@ -92,94 +91,166 @@ _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), ], containing_type=None, serialized_options=None, - serialized_start=3241, - serialized_end=3335, + serialized_start=3927, + serialized_end=4021, ) _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=4024, + serialized_end=4233, +) +_sym_db.RegisterEnumDescriptor(_CHARGECURRENT) + +ChargeCurrent = enum_type_wrapper.EnumTypeWrapper(_CHARGECURRENT) _GPSOPERATION = _descriptor.EnumDescriptor( name='GpsOperation', 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='GpsOpMobile', index=1, number=2, + name='GpsOpStationary', index=1, number=1, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( - name='GpsOpTimeOnly', index=2, number=3, + name='GpsOpMobile', index=2, number=2, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( - name='GpsOpDisabled', index=3, number=4, + 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), ], containing_type=None, serialized_options=None, - serialized_start=3337, - serialized_end=3422, + serialized_start=4235, + serialized_end=4341, ) _sym_db.RegisterEnumDescriptor(_GPSOPERATION) @@ -189,36 +260,85 @@ _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=3424, - serialized_end=3488, + serialized_start=4343, + serialized_end=4407, ) _sym_db.RegisterEnumDescriptor(_LOCATIONSHARING) LocationSharing = enum_type_wrapper.EnumTypeWrapper(_LOCATIONSHARING) +_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), + ], + containing_type=None, + serialized_options=None, + serialized_start=4410, + serialized_end=4585, +) +_sym_db.RegisterEnumDescriptor(_CRITICALERRORCODE) + +CriticalErrorCode = enum_type_wrapper.EnumTypeWrapper(_CRITICALERRORCODE) NONE = 0 NO_ROUTE = 1 GOT_NAK = 2 TIMEOUT = 3 +NO_INTERFACE = 4 +MAX_RETRANSMIT = 5 Unused = 0 DATA_PAYLOAD_LEN = 240 Unset = 0 @@ -230,13 +350,40 @@ JP = 5 ANZ = 6 KR = 7 TW = 8 +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 LocUnset = 0 LocEnabled = 1 LocDisabled = 2 +globals()['None'] = 0 +TxWatchdog = 1 +SleepEnterWait = 2 +NoRadio = 3 +Unspecified = 4 +UBloxInitFailed = 5 +NoAXP192 = 6 +InvalidRadioSetting = 7 +TransmitFailed = 8 _CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor( @@ -244,36 +391,73 @@ _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, - serialized_start=1059, - serialized_end=1155, + serialized_start=1144, + serialized_end=1240, ) _sym_db.RegisterEnumDescriptor(_CHANNELSETTINGS_MODEMCONFIG) +_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=3203, + serialized_end=3291, +) +_sym_db.RegisterEnumDescriptor(_LOGRECORD_LEVEL) + _POSITION = _descriptor.Descriptor( name='Position', @@ -281,7 +465,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, @@ -289,35 +472,35 @@ _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=8, 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='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), ], extensions=[ ], @@ -341,7 +524,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, @@ -349,14 +531,14 @@ _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), ], extensions=[ ], @@ -380,7 +562,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, @@ -388,28 +569,28 @@ _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), ], extensions=[ ], @@ -433,7 +614,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, @@ -441,7 +621,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=[ ], @@ -465,92 +645,91 @@ _SUBPACKET = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, - create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='position', full_name='SubPacket.position', 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=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='data', full_name='SubPacket.data', index=1, + name='data', full_name='SubPacket.data', index=0, 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='user', full_name='SubPacket.user', index=2, - 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=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='route_request', full_name='SubPacket.route_request', index=3, + name='route_request', full_name='SubPacket.route_request', index=1, number=6, 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='route_reply', full_name='SubPacket.route_reply', index=4, + name='route_reply', full_name='SubPacket.route_reply', index=2, 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='route_error', full_name='SubPacket.route_error', index=5, + name='error_reason', full_name='SubPacket.error_reason', index=3, number=13, 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='position', full_name='SubPacket.position', index=4, + 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=b'\030\001', file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='user', full_name='SubPacket.user', index=5, + 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=b'\030\001', file=DESCRIPTOR), _descriptor.FieldDescriptor( name='want_response', full_name='SubPacket.want_response', index=6, number=5, 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='success_id', full_name='SubPacket.success_id', 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, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='fail_id', full_name='SubPacket.fail_id', 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, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='dest', full_name='SubPacket.dest', 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='source', full_name='SubPacket.source', index=10, 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, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='original_id', full_name='SubPacket.original_id', index=11, 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), ], extensions=[ ], @@ -563,18 +742,14 @@ _SUBPACKET = _descriptor.Descriptor( extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='payload', full_name='SubPacket.payload', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + name='payloadVariant', full_name='SubPacket.payloadVariant', + index=0, containing_type=None, fields=[]), _descriptor.OneofDescriptor( - name='ack', full_name='SubPacket.ack', - index=1, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + name='ackVariant', full_name='SubPacket.ackVariant', + index=1, containing_type=None, fields=[]), ], serialized_start=300, - serialized_end=647, + serialized_end=663, ) @@ -584,7 +759,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, @@ -592,70 +766,70 @@ _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=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_index', full_name='MeshPacket.channel_index', index=2, 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='decoded', full_name='MeshPacket.decoded', index=3, 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='encrypted', full_name='MeshPacket.encrypted', index=4, number=8, 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=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_time', full_name='MeshPacket.rx_time', index=6, 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='rx_snr', full_name='MeshPacket.rx_snr', index=7, 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='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), ], extensions=[ ], @@ -668,13 +842,11 @@ _MESHPACKET = _descriptor.Descriptor( extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='payload', full_name='MeshPacket.payload', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + name='payloadVariant', full_name='MeshPacket.payloadVariant', + index=0, containing_type=None, fields=[]), ], - serialized_start=650, - serialized_end=856, + serialized_start=666, + serialized_end=879, ) @@ -684,7 +856,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, @@ -692,56 +863,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), + _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=[ ], @@ -755,8 +947,8 @@ _CHANNELSETTINGS = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=859, - serialized_end=1155, + serialized_start=882, + serialized_end=1240, ) @@ -766,7 +958,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, @@ -774,168 +965,294 @@ _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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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='is_router', full_name='RadioConfig.UserPreferences.is_router', index=14, + name='charge_current', full_name='RadioConfig.UserPreferences.charge_current', index=14, + 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=15, 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=15, + name='is_low_power', full_name='RadioConfig.UserPreferences.is_low_power', index=16, 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=16, + name='fixed_position', full_name='RadioConfig.UserPreferences.fixed_position', index=17, 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='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=17, + name='factory_reset', full_name='RadioConfig.UserPreferences.factory_reset', index=18, 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=18, + name='debug_log_enabled', full_name='RadioConfig.UserPreferences.debug_log_enabled', index=19, 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='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='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=23, + name='ignore_incoming', full_name='RadioConfig.UserPreferences.ignore_incoming', index=24, 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=25, + 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=26, + 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=27, + 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=28, + 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=29, + 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=30, + 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=31, + 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=32, + 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=33, + 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=34, + 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=35, + 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=36, + 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=37, + 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=38, + 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=39, + 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=40, + number=136, 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=41, + 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), ], extensions=[ ], @@ -948,8 +1265,8 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1269, - serialized_end=1917, + serialized_start=1358, + serialized_end=2653, ) _RADIOCONFIG = _descriptor.Descriptor( @@ -958,7 +1275,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, @@ -966,14 +1282,14 @@ _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), _descriptor.FieldDescriptor( name='channel_settings', full_name='RadioConfig.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=b'\030\001', file=DESCRIPTOR), ], extensions=[ ], @@ -986,8 +1302,8 @@ _RADIOCONFIG = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1158, - serialized_end=1917, + serialized_start=1243, + serialized_end=2653, ) @@ -997,7 +1313,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, @@ -1005,285 +1320,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='next_hop', full_name='NodeInfo.next_hop', 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), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1919, - serialized_end=2023, -) - - -_MYNODEINFO = _descriptor.Descriptor( - name='MyNodeInfo', - full_name='MyNodeInfo', - 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, - 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, create_key=_descriptor._internal_create_key), - _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), - _descriptor.FieldDescriptor( - name='num_channels', full_name='MyNodeInfo.num_channels', 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), - _descriptor.FieldDescriptor( - name='region', full_name='MyNodeInfo.region', index=3, - 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=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='hw_model', full_name='MyNodeInfo.hw_model', index=4, - 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), - _descriptor.FieldDescriptor( - name='firmware_version', full_name='MyNodeInfo.firmware_version', index=5, - 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), - _descriptor.FieldDescriptor( - name='error_code', full_name='MyNodeInfo.error_code', 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), - _descriptor.FieldDescriptor( - name='error_address', full_name='MyNodeInfo.error_address', 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), - _descriptor.FieldDescriptor( - name='error_count', full_name='MyNodeInfo.error_count', 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), - _descriptor.FieldDescriptor( - name='packet_id_bits', full_name='MyNodeInfo.packet_id_bits', 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), - _descriptor.FieldDescriptor( - name='current_packet_id', full_name='MyNodeInfo.current_packet_id', 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), - _descriptor.FieldDescriptor( - name='node_num_bits', full_name='MyNodeInfo.node_num_bits', index=11, - 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, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=12, - 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), - _descriptor.FieldDescriptor( - name='min_app_version', full_name='MyNodeInfo.min_app_version', index=13, - 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), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2026, - serialized_end=2351, -) - - -_DEVICESTATE = _descriptor.Descriptor( - name='DeviceState', - full_name='DeviceState', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='radio', full_name='DeviceState.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, create_key=_descriptor._internal_create_key), - _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), - _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), - _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), - _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), - _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), - _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), - _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), - _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), - _descriptor.FieldDescriptor( - name='secondary_channels', full_name='DeviceState.secondary_channels', index=9, - number=12, 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), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2354, - serialized_end=2653, -) - - -_DEBUGSTRING = _descriptor.Descriptor( - name='DebugString', - full_name='DebugString', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='message', full_name='DebugString.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, create_key=_descriptor._internal_create_key), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -1297,7 +1362,182 @@ _DEBUGSTRING = _descriptor.Descriptor( oneofs=[ ], serialized_start=2655, - serialized_end=2685, + serialized_end=2759, +) + + +_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_channels', full_name='MyNodeInfo.num_channels', 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='region', full_name='MyNodeInfo.region', index=3, + 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=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hw_model', full_name='MyNodeInfo.hw_model', index=4, + 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='firmware_version', full_name='MyNodeInfo.firmware_version', index=5, + 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=6, + 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=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='error_count', full_name='MyNodeInfo.error_count', 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='packet_id_bits', full_name='MyNodeInfo.packet_id_bits', 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='current_packet_id', full_name='MyNodeInfo.current_packet_id', 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='node_num_bits', full_name='MyNodeInfo.node_num_bits', index=11, + 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), + _descriptor.FieldDescriptor( + name='message_timeout_msec', full_name='MyNodeInfo.message_timeout_msec', index=12, + 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=13, + 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=2762, + serialized_end=3107, +) + + +_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=3110, + serialized_end=3291, ) @@ -1307,7 +1547,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, @@ -1315,63 +1554,63 @@ _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=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='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='radio', full_name='FromRadio.radio', index=4, number=6, 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='debug_string', full_name='FromRadio.debug_string', index=5, + name='log_record', full_name='FromRadio.log_record', index=5, 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=6, 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=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='secondary_channel', full_name='FromRadio.secondary_channel', index=8, + name='channel', full_name='FromRadio.channel', index=8, number=10, 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), ], extensions=[ ], @@ -1384,13 +1623,11 @@ _FROMRADIO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='variant', full_name='FromRadio.variant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + name='payloadVariant', full_name='FromRadio.payloadVariant', + index=0, containing_type=None, fields=[]), ], - serialized_start=2688, - serialized_end=2984, + serialized_start=3294, + serialized_end=3583, ) @@ -1400,7 +1637,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, @@ -1408,28 +1644,35 @@ _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='want_config_id', full_name='ToRadio.want_config_id', index=1, 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='set_radio', full_name='ToRadio.set_radio', index=2, number=101, 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_owner', full_name='ToRadio.set_owner', index=3, number=102, 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='ToRadio.set_channel', index=4, + number=103, 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=[ ], @@ -1442,56 +1685,55 @@ _TORADIO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='variant', full_name='ToRadio.variant', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), + name='payloadVariant', full_name='ToRadio.payloadVariant', + index=0, containing_type=None, fields=[]), ], - serialized_start=2987, - serialized_end=3127, + serialized_start=3586, + serialized_end=3774, ) _DATA.fields_by_name['portnum'].enum_type = portnums__pb2._PORTNUM -_SUBPACKET.fields_by_name['position'].message_type = _POSITION _SUBPACKET.fields_by_name['data'].message_type = _DATA -_SUBPACKET.fields_by_name['user'].message_type = _USER _SUBPACKET.fields_by_name['route_request'].message_type = _ROUTEDISCOVERY _SUBPACKET.fields_by_name['route_reply'].message_type = _ROUTEDISCOVERY -_SUBPACKET.fields_by_name['route_error'].enum_type = _ROUTEERROR -_SUBPACKET.oneofs_by_name['payload'].fields.append( - _SUBPACKET.fields_by_name['position']) -_SUBPACKET.fields_by_name['position'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] -_SUBPACKET.oneofs_by_name['payload'].fields.append( +_SUBPACKET.fields_by_name['error_reason'].enum_type = _ERRORREASON +_SUBPACKET.fields_by_name['position'].message_type = _POSITION +_SUBPACKET.fields_by_name['user'].message_type = _USER +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append( _SUBPACKET.fields_by_name['data']) -_SUBPACKET.fields_by_name['data'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] -_SUBPACKET.oneofs_by_name['payload'].fields.append( - _SUBPACKET.fields_by_name['user']) -_SUBPACKET.fields_by_name['user'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] -_SUBPACKET.oneofs_by_name['payload'].fields.append( +_SUBPACKET.fields_by_name['data'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant'] +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append( _SUBPACKET.fields_by_name['route_request']) -_SUBPACKET.fields_by_name['route_request'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] -_SUBPACKET.oneofs_by_name['payload'].fields.append( +_SUBPACKET.fields_by_name['route_request'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant'] +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append( _SUBPACKET.fields_by_name['route_reply']) -_SUBPACKET.fields_by_name['route_reply'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] -_SUBPACKET.oneofs_by_name['payload'].fields.append( - _SUBPACKET.fields_by_name['route_error']) -_SUBPACKET.fields_by_name['route_error'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] -_SUBPACKET.oneofs_by_name['ack'].fields.append( +_SUBPACKET.fields_by_name['route_reply'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant'] +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append( + _SUBPACKET.fields_by_name['error_reason']) +_SUBPACKET.fields_by_name['error_reason'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant'] +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append( + _SUBPACKET.fields_by_name['position']) +_SUBPACKET.fields_by_name['position'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant'] +_SUBPACKET.oneofs_by_name['payloadVariant'].fields.append( + _SUBPACKET.fields_by_name['user']) +_SUBPACKET.fields_by_name['user'].containing_oneof = _SUBPACKET.oneofs_by_name['payloadVariant'] +_SUBPACKET.oneofs_by_name['ackVariant'].fields.append( _SUBPACKET.fields_by_name['success_id']) -_SUBPACKET.fields_by_name['success_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ack'] -_SUBPACKET.oneofs_by_name['ack'].fields.append( +_SUBPACKET.fields_by_name['success_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ackVariant'] +_SUBPACKET.oneofs_by_name['ackVariant'].fields.append( _SUBPACKET.fields_by_name['fail_id']) -_SUBPACKET.fields_by_name['fail_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ack'] +_SUBPACKET.fields_by_name['fail_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ackVariant'] _MESHPACKET.fields_by_name['decoded'].message_type = _SUBPACKET -_MESHPACKET.oneofs_by_name['payload'].fields.append( +_MESHPACKET.oneofs_by_name['payloadVariant'].fields.append( _MESHPACKET.fields_by_name['decoded']) -_MESHPACKET.fields_by_name['decoded'].containing_oneof = _MESHPACKET.oneofs_by_name['payload'] -_MESHPACKET.oneofs_by_name['payload'].fields.append( +_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['payload'] +_MESHPACKET.fields_by_name['encrypted'].containing_oneof = _MESHPACKET.oneofs_by_name['payloadVariant'] _CHANNELSETTINGS.fields_by_name['modem_config'].enum_type = _CHANNELSETTINGS_MODEMCONFIG _CHANNELSETTINGS_MODEMCONFIG.containing_type = _CHANNELSETTINGS _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.containing_type = _RADIOCONFIG @@ -1499,58 +1741,58 @@ _RADIOCONFIG.fields_by_name['preferences'].message_type = _RADIOCONFIG_USERPREFE _RADIOCONFIG.fields_by_name['channel_settings'].message_type = _CHANNELSETTINGS _NODEINFO.fields_by_name['user'].message_type = _USER _NODEINFO.fields_by_name['position'].message_type = _POSITION -_DEVICESTATE.fields_by_name['radio'].message_type = _RADIOCONFIG -_DEVICESTATE.fields_by_name['my_node'].message_type = _MYNODEINFO -_DEVICESTATE.fields_by_name['owner'].message_type = _USER -_DEVICESTATE.fields_by_name['node_db'].message_type = _NODEINFO -_DEVICESTATE.fields_by_name['receive_queue'].message_type = _MESHPACKET -_DEVICESTATE.fields_by_name['rx_text_message'].message_type = _MESHPACKET -_DEVICESTATE.fields_by_name['secondary_channels'].message_type = _CHANNELSETTINGS +_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['radio'].message_type = _RADIOCONFIG -_FROMRADIO.fields_by_name['debug_string'].message_type = _DEBUGSTRING -_FROMRADIO.fields_by_name['secondary_channel'].message_type = _CHANNELSETTINGS -_FROMRADIO.oneofs_by_name['variant'].fields.append( +_FROMRADIO.fields_by_name['log_record'].message_type = _LOGRECORD +_FROMRADIO.fields_by_name['channel'].message_type = _CHANNELSETTINGS +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( _FROMRADIO.fields_by_name['packet']) -_FROMRADIO.fields_by_name['packet'].containing_oneof = _FROMRADIO.oneofs_by_name['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( +_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['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( +_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['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( +_FROMRADIO.fields_by_name['node_info'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( _FROMRADIO.fields_by_name['radio']) -_FROMRADIO.fields_by_name['radio'].containing_oneof = _FROMRADIO.oneofs_by_name['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( - _FROMRADIO.fields_by_name['debug_string']) -_FROMRADIO.fields_by_name['debug_string'].containing_oneof = _FROMRADIO.oneofs_by_name['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( +_FROMRADIO.fields_by_name['radio'].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['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( +_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['variant'] -_FROMRADIO.oneofs_by_name['variant'].fields.append( - _FROMRADIO.fields_by_name['secondary_channel']) -_FROMRADIO.fields_by_name['secondary_channel'].containing_oneof = _FROMRADIO.oneofs_by_name['variant'] +_FROMRADIO.fields_by_name['rebooted'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] +_FROMRADIO.oneofs_by_name['payloadVariant'].fields.append( + _FROMRADIO.fields_by_name['channel']) +_FROMRADIO.fields_by_name['channel'].containing_oneof = _FROMRADIO.oneofs_by_name['payloadVariant'] _TORADIO.fields_by_name['packet'].message_type = _MESHPACKET _TORADIO.fields_by_name['set_radio'].message_type = _RADIOCONFIG _TORADIO.fields_by_name['set_owner'].message_type = _USER -_TORADIO.oneofs_by_name['variant'].fields.append( +_TORADIO.fields_by_name['set_channel'].message_type = _CHANNELSETTINGS +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( _TORADIO.fields_by_name['packet']) -_TORADIO.fields_by_name['packet'].containing_oneof = _TORADIO.oneofs_by_name['variant'] -_TORADIO.oneofs_by_name['variant'].fields.append( +_TORADIO.fields_by_name['packet'].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['variant'] -_TORADIO.oneofs_by_name['variant'].fields.append( +_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['set_radio']) -_TORADIO.fields_by_name['set_radio'].containing_oneof = _TORADIO.oneofs_by_name['variant'] -_TORADIO.oneofs_by_name['variant'].fields.append( +_TORADIO.fields_by_name['set_radio'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( _TORADIO.fields_by_name['set_owner']) -_TORADIO.fields_by_name['set_owner'].containing_oneof = _TORADIO.oneofs_by_name['variant'] +_TORADIO.fields_by_name['set_owner'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] +_TORADIO.oneofs_by_name['payloadVariant'].fields.append( + _TORADIO.fields_by_name['set_channel']) +_TORADIO.fields_by_name['set_channel'].containing_oneof = _TORADIO.oneofs_by_name['payloadVariant'] DESCRIPTOR.message_types_by_name['Position'] = _POSITION DESCRIPTOR.message_types_by_name['Data'] = _DATA DESCRIPTOR.message_types_by_name['User'] = _USER @@ -1561,15 +1803,16 @@ DESCRIPTOR.message_types_by_name['ChannelSettings'] = _CHANNELSETTINGS DESCRIPTOR.message_types_by_name['RadioConfig'] = _RADIOCONFIG DESCRIPTOR.message_types_by_name['NodeInfo'] = _NODEINFO DESCRIPTOR.message_types_by_name['MyNodeInfo'] = _MYNODEINFO -DESCRIPTOR.message_types_by_name['DeviceState'] = _DEVICESTATE -DESCRIPTOR.message_types_by_name['DebugString'] = _DEBUGSTRING +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['RouteError'] = _ROUTEERROR +DESCRIPTOR.enum_types_by_name['ErrorReason'] = _ERRORREASON DESCRIPTOR.enum_types_by_name['Constants'] = _CONSTANTS 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['LocationSharing'] = _LOCATIONSHARING +DESCRIPTOR.enum_types_by_name['CriticalErrorCode'] = _CRITICALERRORCODE _sym_db.RegisterFileDescriptor(DESCRIPTOR) Position = _reflection.GeneratedProtocolMessageType('Position', (_message.Message,), { @@ -1650,19 +1893,12 @@ MyNodeInfo = _reflection.GeneratedProtocolMessageType('MyNodeInfo', (_message.Me }) _sym_db.RegisterMessage(MyNodeInfo) -DeviceState = _reflection.GeneratedProtocolMessageType('DeviceState', (_message.Message,), { - 'DESCRIPTOR' : _DEVICESTATE, +LogRecord = _reflection.GeneratedProtocolMessageType('LogRecord', (_message.Message,), { + 'DESCRIPTOR' : _LOGRECORD, '__module__' : 'mesh_pb2' - # @@protoc_insertion_point(class_scope:DeviceState) + # @@protoc_insertion_point(class_scope:LogRecord) }) -_sym_db.RegisterMessage(DeviceState) - -DebugString = _reflection.GeneratedProtocolMessageType('DebugString', (_message.Message,), { - 'DESCRIPTOR' : _DEBUGSTRING, - '__module__' : 'mesh_pb2' - # @@protoc_insertion_point(class_scope:DebugString) - }) -_sym_db.RegisterMessage(DebugString) +_sym_db.RegisterMessage(LogRecord) FromRadio = _reflection.GeneratedProtocolMessageType('FromRadio', (_message.Message,), { 'DESCRIPTOR' : _FROMRADIO, @@ -1682,4 +1918,5 @@ _sym_db.RegisterMessage(ToRadio) DESCRIPTOR._options = None _SUBPACKET.fields_by_name['position']._options = None _SUBPACKET.fields_by_name['user']._options = None +_RADIOCONFIG.fields_by_name['channel_settings']._options = None # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/portnums_pb2.py b/meshtastic/portnums_pb2.py index 389ab87..171a206 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\003', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eportnums.proto*\xa1\x01\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\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x42!\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03\x62\x06proto3' + serialized_pb=b'\n\x0eportnums.proto*\xdd\x01\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\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\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x42!\n\x13\x63om.geeksville.meshB\x08PortnumsH\x03\x62\x06proto3' ) _PORTNUM = _descriptor.EnumDescriptor( @@ -28,53 +27,56 @@ _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='REPLY_APP', index=5, number=32, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( name='IP_TUNNEL_APP', index=6, number=33, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), _descriptor.EnumValueDescriptor( - name='PRIVATE_APP', index=7, number=256, + name='SERIAL_APP', index=7, number=64, serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), + type=None), + _descriptor.EnumValueDescriptor( + name='STORE_FORWARD_APP', index=8, number=65, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PRIVATE_APP', index=9, number=256, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ATAK_FORWARDER', index=10, number=257, + serialized_options=None, + type=None), ], containing_type=None, serialized_options=None, serialized_start=19, - serialized_end=180, + serialized_end=240, ) _sym_db.RegisterEnumDescriptor(_PORTNUM) @@ -86,7 +88,10 @@ POSITION_APP = 3 NODEINFO_APP = 4 REPLY_APP = 32 IP_TUNNEL_APP = 33 +SERIAL_APP = 64 +STORE_FORWARD_APP = 65 PRIVATE_APP = 256 +ATAK_FORWARDER = 257 DESCRIPTOR.enum_types_by_name['PortNum'] = _PORTNUM diff --git a/meshtastic/remote_hardware_pb2.py b/meshtastic/remote_hardware_pb2.py index ee6a78e..31052e0 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\003', - 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\x42\'\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareH\x03\x62\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/proto b/proto index 3473446..8492e40 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 3473446418a4e83ff0ff4c7588101c2e1b29e604 +Subproject commit 8492e4030ad928ee5fc97f8ead95325dba7f9492 diff --git a/setup.py b/setup.py index e452a3c..54cf04d 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.1.33", + version="1.1.44", description="Python API & client shell for talking to Meshtastic devices", long_description=long_description, long_description_content_type="text/markdown",