diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 69b9c8f..b541af1 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -19,5 +19,7 @@ def main(): client = StreamInterface("/dev/ttyUSB0") +# self.sendText("hello world") + if __name__ == "__main__": main() diff --git a/meshtastic/interface.py b/meshtastic/interface.py index 4b6803a..306bbd1 100644 --- a/meshtastic/interface.py +++ b/meshtastic/interface.py @@ -3,6 +3,7 @@ import serial import threading import logging import sys +import traceback from . import mesh_pb2 START1 = 0x94 @@ -10,10 +11,11 @@ START2 = 0xc3 HEADER_LEN = 4 MAX_TO_FROM_RADIO_SIZE = 512 +BROADCAST_ADDR = "all" # A special ID that means broadcast """ -TODO: +TODO: * use port enumeration to find ports https://pyserial.readthedocs.io/en/latest/shortintro.html @@ -21,21 +23,15 @@ Contains a reader thread that is always trying to read on the serial port. methods: -- constructor(serialPort) -- sendData(destinationId, bytes, variant) -- sendPacket(destinationId, meshPacket) - throws errors if we have errors talking to the device -- close() - shuts down the interface -- init() - starts the enumeration process to download NodeDB etc... - we will not publish to topics until this enumeration completes - radioConfig - getter/setter syntax: https://www.python-course.eu/python3_properties.php - nodes - the database of received nodes - myNodeInfo - myNodeId -## PubSub topics +# PubSub topics Use a pubsub model to communicate events [https://pypubsub.readthedocs.io/en/v4.0.3/ ] -- meshtastic.send(MeshPacket) - Not implemented, instead call send(packet) on MeshInterface - meshtastic.connection.established - published once we've successfully connected to the radio and downloaded the node DB - meshtastic.connection.lost - published once we've lost our link to the radio - meshtastic.receive.position(MeshPacket) @@ -43,18 +39,43 @@ Use a pubsub model to communicate events [https://pypubsub.readthedocs.io/en/v4. - meshtastic.receive.data(MeshPacket) - meshtastic.node.updated(NodeInfo) - published when a node in the DB changes (appears, location changed, username changed, etc...) - meshtastic.debug(string) +- meshtastic.send(MeshPacket) - Not yet implemented, instead call sendPacket(...) on MeshInterface """ +MY_CONFIG_ID = 42 + class MeshInterface: """Interface class for meshtastic devices""" def __init__(self): + """Constructor""" self.debugOut = sys.stdout self.nodes = None # FIXME self._startConfig() + def sendText(self, text, destinationId=BROADCAST_ADDR): + """Send a utf8 string to some other node, if the node has a display it will also be shown on the device.""" + self.sendData(text.encode("utf-8"), destinationId, + dataType=mesh_pb2.Data.CLEAR_TEXT) + + def sendData(self, byteData, destinationId=BROADCAST_ADDR, dataType=mesh_pb2.Data.OPAQUE): + """Send a data packet to some other node""" + meshPacket = mesh_pb2.MeshPacket() + meshPacket.payload.data.payload = byteData + meshPacket.payload.data.typ = dataType + self.sendPacket(meshPacket, destinationId) + + def sendPacket(self, meshPacket, destinationId=BROADCAST_ADDR): + """Send a MeshPacket to the specified node (or if unspecified, broadcast). + You probably don't want this - use sendData instead.""" + toRadio = mesh_pb2.ToRadio() + # FIXME add support for non broadcast addresses + meshPacket.to = 255 + toRadio.packet.CopyFrom(meshPacket) + self._sendToRadio(toRadio) + def _startConfig(self): """Start device packets flowing""" self.myInfo = None @@ -63,7 +84,7 @@ class MeshInterface: self.radioConfig = None startConfig = mesh_pb2.ToRadio() - startConfig.want_config_id = 42 # we don't use this value + startConfig.want_config_id = MY_CONFIG_ID # we don't use this value self._sendToRadio(startConfig) def _sendToRadio(self, toRadio): @@ -72,7 +93,7 @@ class MeshInterface: def _handleFromRadio(self, fromRadioBytes): """ - Handle a packet that arrived from the radio (update model and publish events) + Handle a packet that arrived from the radio(update model and publish events) Called by subclasses.""" fromRadio = mesh_pb2.FromRadio() @@ -86,35 +107,15 @@ class MeshInterface: node = fromRadio.node_info self._nodesByNum[node.num] = node self.nodes[node.user.id] = node - elif fromRadio.HasField("config_complete_id"): + elif fromRadio.config_complete_id == MY_CONFIG_ID: # we ignore the config_complete_id, it is unneeded for our stream API fromRadio.config_complete_id pass - - -""" - // / Tells the phone what our node number is, can be - 1 if we've not yet - // / joined a mesh. - // REV2: In the rev 1 API this is in the BLE mynodeinfo characteristic - MyNodeInfo my_info = 3 - - // / One packet is sent for each node in the on radio DB - // REV2: In the rev1 API this is available in the nodeinfo characteristic - // starts over with the first node in our DB - NodeInfo node_info = 4 - - // / REV2: In rev1 this was the radio BLE characteristic - RadioConfig radio = 6 - - // / REV2: sent as true once the device has finished sending all of the - // / responses to want_config - // / recipient should check if this ID matches our original request nonce, if - // / not, it means your config responses haven't started yet - uint32 config_complete_id = 8 -""" + else: + logging.warn("Unexpected FromRadio payload") class StreamInterface(MeshInterface): - """Interface class for meshtastic devices over a stream link (serial, TCP, etc)""" + """Interface class for meshtastic devices over a stream link(serial, TCP, etc)""" def __init__(self, devPath): """Constructor, opens a connection to a specified serial port""" @@ -150,7 +151,7 @@ class StreamInterface(MeshInterface): while not self._wantExit: b = self.stream.read(1) if len(b) > 0: - #logging.debug(f"read returned {b}") + # logging.debug(f"read returned {b}") c = b[0] ptr = len(self._rxBuf) @@ -179,9 +180,10 @@ class StreamInterface(MeshInterface): if len(self._rxBuf) != 0 and ptr + 1 == packetlen + HEADER_LEN: try: self._handleFromRadio(self._rxBuf[HEADER_LEN:]) - except: + except Exception as ex: logging.warn( - f"Error handling FromRadio, possibly corrupted?") + f"Error handling FromRadio, possibly corrupted? {ex}") + traceback.print_exc() self._rxBuf = empty logging.debug("reader is exiting") self.stream.close() diff --git a/meshtastic/mesh_pb2.py b/meshtastic/mesh_pb2.py index 748ed21..86e50d8 100644 --- a/meshtastic/mesh_pb2.py +++ b/meshtastic/mesh_pb2.py @@ -20,7 +20,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=_b('\n\023com.geeksville.meshB\nMeshProtos'), - serialized_pb=_b('\n\nmesh.proto\"f\n\x08Position\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\x06 \x01(\r\"n\n\x04\x44\x61ta\x12\x17\n\x03typ\x18\x01 \x01(\x0e\x32\n.Data.Type\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"<\n\x04Type\x12\x11\n\rSIGNAL_OPAQUE\x10\x00\x12\x0e\n\nCLEAR_TEXT\x10\x01\x12\x11\n\rCLEAR_READACK\x10\x02\"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\"i\n\tSubPacket\x12\x1b\n\x08position\x18\x01 \x01(\x0b\x32\t.Position\x12\x13\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.Data\x12\x13\n\x04user\x18\x04 \x01(\x0b\x32\x05.User\x12\x15\n\rwant_response\x18\x05 \x01(\x08\"p\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x05\x12\n\n\x02to\x18\x02 \x01(\x05\x12\x1b\n\x07payload\x18\x03 \x01(\x0b\x32\n.SubPacket\x12\x0f\n\x07rx_time\x18\x04 \x01(\r\x12\x0e\n\x06rx_snr\x18\x05 \x01(\x11\x12\n\n\x02id\x18\x06 \x01(\r\"\xd4\x01\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\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\"\xd7\x03\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\xe8\x02\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1a\n\x12num_missed_to_fail\x18\x03 \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\x18\n\x10keep_all_packets\x18\x64 \x01(\x08\x12\x18\n\x10promiscuous_mode\x18\x65 \x01(\x08\"o\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\x05\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\x05 \x01(\x05\x12\x17\n\x0f\x66requency_error\x18\x06 \x01(\x05\"\xc4\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\x05\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\"\xd5\x01\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\"\x1e\n\x0b\x44\x65\x62ugString\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xe5\x01\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\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*\x17\n\tConstants\x12\n\n\x06Unused\x10\x00\x42!\n\x13\x63om.geeksville.meshB\nMeshProtosb\x06proto3') + serialized_pb=_b('\n\nmesh.proto\"f\n\x08Position\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\x06 \x01(\r\"g\n\x04\x44\x61ta\x12\x17\n\x03typ\x18\x01 \x01(\x0e\x32\n.Data.Type\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"5\n\x04Type\x12\n\n\x06OPAQUE\x10\x00\x12\x0e\n\nCLEAR_TEXT\x10\x01\x12\x11\n\rCLEAR_READACK\x10\x02\"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\"i\n\tSubPacket\x12\x1b\n\x08position\x18\x01 \x01(\x0b\x32\t.Position\x12\x13\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.Data\x12\x13\n\x04user\x18\x04 \x01(\x0b\x32\x05.User\x12\x15\n\rwant_response\x18\x05 \x01(\x08\"p\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x05\x12\n\n\x02to\x18\x02 \x01(\x05\x12\x1b\n\x07payload\x18\x03 \x01(\x0b\x32\n.SubPacket\x12\x0f\n\x07rx_time\x18\x04 \x01(\r\x12\x0e\n\x06rx_snr\x18\x05 \x01(\x11\x12\n\n\x02id\x18\x06 \x01(\r\"\xd4\x01\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\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\"\xd7\x03\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\xe8\x02\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1a\n\x12num_missed_to_fail\x18\x03 \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\x18\n\x10keep_all_packets\x18\x64 \x01(\x08\x12\x18\n\x10promiscuous_mode\x18\x65 \x01(\x08\"o\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\x05\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\x05 \x01(\x05\x12\x17\n\x0f\x66requency_error\x18\x06 \x01(\x05\"\xc4\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\x05\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\"\xd5\x01\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\"\x1e\n\x0b\x44\x65\x62ugString\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xe5\x01\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\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*\x17\n\tConstants\x12\n\n\x06Unused\x10\x00\x42!\n\x13\x63om.geeksville.meshB\nMeshProtosb\x06proto3') ) _CONSTANTS = _descriptor.EnumDescriptor( @@ -36,8 +36,8 @@ _CONSTANTS = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=2184, - serialized_end=2207, + serialized_start=2177, + serialized_end=2200, ) _sym_db.RegisterEnumDescriptor(_CONSTANTS) @@ -52,7 +52,7 @@ _DATA_TYPE = _descriptor.EnumDescriptor( file=DESCRIPTOR, values=[ _descriptor.EnumValueDescriptor( - name='SIGNAL_OPAQUE', index=0, number=0, + name='OPAQUE', index=0, number=0, serialized_options=None, type=None), _descriptor.EnumValueDescriptor( @@ -67,7 +67,7 @@ _DATA_TYPE = _descriptor.EnumDescriptor( containing_type=None, serialized_options=None, serialized_start=168, - serialized_end=228, + serialized_end=221, ) _sym_db.RegisterEnumDescriptor(_DATA_TYPE) @@ -96,8 +96,8 @@ _CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=677, - serialized_end=773, + serialized_start=670, + serialized_end=766, ) _sym_db.RegisterEnumDescriptor(_CHANNELSETTINGS_MODEMCONFIG) @@ -196,7 +196,7 @@ _DATA = _descriptor.Descriptor( oneofs=[ ], serialized_start=118, - serialized_end=228, + serialized_end=221, ) @@ -247,8 +247,8 @@ _USER = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=230, - serialized_end=304, + serialized_start=223, + serialized_end=297, ) @@ -278,8 +278,8 @@ _ROUTEDISCOVERY = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=306, - serialized_end=337, + serialized_start=299, + serialized_end=330, ) @@ -330,8 +330,8 @@ _SUBPACKET = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=339, - serialized_end=444, + serialized_start=332, + serialized_end=437, ) @@ -396,8 +396,8 @@ _MESHPACKET = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=446, - serialized_end=558, + serialized_start=439, + serialized_end=551, ) @@ -449,8 +449,8 @@ _CHANNELSETTINGS = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=561, - serialized_end=773, + serialized_start=554, + serialized_end=766, ) @@ -564,8 +564,8 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=887, - serialized_end=1247, + serialized_start=880, + serialized_end=1240, ) _RADIOCONFIG = _descriptor.Descriptor( @@ -601,8 +601,8 @@ _RADIOCONFIG = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=776, - serialized_end=1247, + serialized_start=769, + serialized_end=1240, ) @@ -660,8 +660,8 @@ _NODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1249, - serialized_end=1360, + serialized_start=1242, + serialized_end=1353, ) @@ -747,8 +747,8 @@ _MYNODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1363, - serialized_end=1559, + serialized_start=1356, + serialized_end=1552, ) @@ -820,8 +820,8 @@ _DEVICESTATE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1562, - serialized_end=1775, + serialized_start=1555, + serialized_end=1768, ) @@ -851,8 +851,8 @@ _DEBUGSTRING = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1777, - serialized_end=1807, + serialized_start=1770, + serialized_end=1800, ) @@ -927,8 +927,8 @@ _FROMRADIO = _descriptor.Descriptor( name='variant', full_name='FromRadio.variant', index=0, containing_type=None, fields=[]), ], - serialized_start=1810, - serialized_end=2039, + serialized_start=1803, + serialized_end=2032, ) @@ -982,8 +982,8 @@ _TORADIO = _descriptor.Descriptor( name='variant', full_name='ToRadio.variant', index=0, containing_type=None, fields=[]), ], - serialized_start=2042, - serialized_end=2182, + serialized_start=2035, + serialized_end=2175, ) _DATA.fields_by_name['typ'].enum_type = _DATA_TYPE diff --git a/proto b/proto index 79b2cf7..8427b23 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 79b2cf728c08007284542b32d9d075d01e8153d8 +Subproject commit 8427b23016dc96fc78885f05de5172e9eec5fe6d