Merge pull request #2052 from meshtastic/create-pull-request/patch

Changes by create-pull-request action
This commit is contained in:
Thomas Göttgens 2022-12-21 13:56:37 +01:00 committed by GitHub
commit 8074955841
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 1178 additions and 762 deletions

@ -1 +1 @@
Subproject commit 8f3972e579b09c7f4682f49c609a88e9d0ee2097
Subproject commit 0f2a3304eebd89b5950ccfab98082778de3353a0

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "admin.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_ADMIN_PB_H_INCLUDED
#define PB_ADMIN_PB_H_INCLUDED
@ -15,24 +15,41 @@
#endif
/* Enum definitions */
/* TODO: REPLACE */
typedef enum _AdminMessage_ConfigType {
/* TODO: REPLACE */
AdminMessage_ConfigType_DEVICE_CONFIG = 0,
/* TODO: REPLACE */
AdminMessage_ConfigType_POSITION_CONFIG = 1,
/* TODO: REPLACE */
AdminMessage_ConfigType_POWER_CONFIG = 2,
/* TODO: REPLACE */
AdminMessage_ConfigType_NETWORK_CONFIG = 3,
/* TODO: REPLACE */
AdminMessage_ConfigType_DISPLAY_CONFIG = 4,
/* TODO: REPLACE */
AdminMessage_ConfigType_LORA_CONFIG = 5,
/* TODO: REPLACE */
AdminMessage_ConfigType_BLUETOOTH_CONFIG = 6
} AdminMessage_ConfigType;
/* TODO: REPLACE */
typedef enum _AdminMessage_ModuleConfigType {
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_MQTT_CONFIG = 0,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_SERIAL_CONFIG = 1,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_EXTNOTIF_CONFIG = 2,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_STOREFORWARD_CONFIG = 3,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_RANGETEST_CONFIG = 4,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_TELEMETRY_CONFIG = 5,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_CANNEDMSG_CONFIG = 6,
/* TODO: REPLACE */
AdminMessage_ModuleConfigType_AUDIO_CONFIG = 7
} AdminMessage_ModuleConfigType;
@ -112,6 +129,10 @@ typedef struct _AdminMessage {
} AdminMessage;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _AdminMessage_ConfigType_MIN AdminMessage_ConfigType_DEVICE_CONFIG
#define _AdminMessage_ConfigType_MAX AdminMessage_ConfigType_BLUETOOTH_CONFIG
@ -121,10 +142,9 @@ typedef struct _AdminMessage {
#define _AdminMessage_ModuleConfigType_MAX AdminMessage_ModuleConfigType_AUDIO_CONFIG
#define _AdminMessage_ModuleConfigType_ARRAYSIZE ((AdminMessage_ModuleConfigType)(AdminMessage_ModuleConfigType_AUDIO_CONFIG+1))
#define AdminMessage_payload_variant_get_config_request_ENUMTYPE AdminMessage_ConfigType
#define AdminMessage_payload_variant_get_module_config_request_ENUMTYPE AdminMessage_ModuleConfigType
#ifdef __cplusplus
extern "C" {
#endif
/* Initializer values for message structs */
#define AdminMessage_init_default {0, {0}}

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "apponly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_APPONLY_PB_H_INCLUDED
#define PB_APPONLY_PB_H_INCLUDED

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "cannedmessages.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_CANNEDMESSAGES_PB_H_INCLUDED
#define PB_CANNEDMESSAGES_PB_H_INCLUDED

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "channel.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_CHANNEL_PB_H_INCLUDED
#define PB_CHANNEL_PB_H_INCLUDED
@ -10,9 +10,22 @@
#endif
/* Enum definitions */
/* How this channel is being used (or not).
Note: this field is an enum to give us options for the future.
In particular, someday we might make a 'SCANNING' option.
SCANNING channels could have different frequencies and the radio would
occasionally check that freq to see if anything is being transmitted.
For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow
cross band routing as needed.
If a device has only a single radio (the common case) only one channel can be PRIMARY at a time
(but any number of SECONDARY channels can't be sent received on that common frequency) */
typedef enum _Channel_Role {
/* This channel is not in use right now */
Channel_Role_DISABLED = 0,
/* This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY */
Channel_Role_PRIMARY = 1,
/* Secondary channels are only used for encryption/decryption/authentication purposes.
Their radio settings (freq etc) are ignored, only psk is used. */
Channel_Role_SECONDARY = 2
} Channel_Role;
@ -92,15 +105,18 @@ typedef struct _Channel {
} Channel;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _Channel_Role_MIN Channel_Role_DISABLED
#define _Channel_Role_MAX Channel_Role_SECONDARY
#define _Channel_Role_ARRAYSIZE ((Channel_Role)(Channel_Role_SECONDARY+1))
#ifdef __cplusplus
extern "C" {
#endif
#define Channel_role_ENUMTYPE Channel_Role
/* Initializer values for message structs */
#define ChannelSettings_init_default {0, {0, {0}}, "", 0, 0, 0}

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_CONFIG_PB_H_INCLUDED
#define PB_CONFIG_PB_H_INCLUDED
@ -10,167 +10,369 @@
#endif
/* Enum definitions */
/* Defines the device's role on the Mesh network */
typedef enum _Config_DeviceConfig_Role {
/* Client device role */
Config_DeviceConfig_Role_CLIENT = 0,
/* Client Mute device role
Same as a client except packets will not hop over this node, does not contribute to routing packets for mesh. */
Config_DeviceConfig_Role_CLIENT_MUTE = 1,
/* Router device role.
Mesh packets will prefer to be routed over this node. This node will not be used by client apps.
The wifi/ble radios and the oled screen will be put to sleep. */
Config_DeviceConfig_Role_ROUTER = 2,
/* Router Client device role
Mesh packets will prefer to be routed over this node. The Router Client can be used as both a Router and an app connected Client. */
Config_DeviceConfig_Role_ROUTER_CLIENT = 3
} Config_DeviceConfig_Role;
/* Bit field of boolean configuration options, indicating which optional
fields to include when assembling POSITION messages
Longitude and latitude are always included (also time if GPS-synced)
NOTE: the more fields are included, the larger the message will be -
leading to longer airtime and a higher risk of packet loss */
typedef enum _Config_PositionConfig_PositionFlags {
/* Required for compilation */
Config_PositionConfig_PositionFlags_UNSET = 0,
/* Include an altitude value (if available) */
Config_PositionConfig_PositionFlags_ALTITUDE = 1,
/* Altitude value is MSL */
Config_PositionConfig_PositionFlags_ALTITUDE_MSL = 2,
/* Include geoidal separation */
Config_PositionConfig_PositionFlags_GEOIDAL_SEPARATION = 4,
/* Include the DOP value ; PDOP used by default, see below */
Config_PositionConfig_PositionFlags_DOP = 8,
/* If POS_DOP set, send separate HDOP / VDOP values instead of PDOP */
Config_PositionConfig_PositionFlags_HVDOP = 16,
/* Include number of "satellites in view" */
Config_PositionConfig_PositionFlags_SATINVIEW = 32,
/* Include a sequence number incremented per packet */
Config_PositionConfig_PositionFlags_SEQ_NO = 64,
/* Include positional timestamp (from GPS solution) */
Config_PositionConfig_PositionFlags_TIMESTAMP = 128,
/* Include positional heading
Intended for use with vehicle not walking speeds
walking speeds are likely to be error prone like the compass */
Config_PositionConfig_PositionFlags_HEADING = 256,
/* Include positional speed
Intended for use with vehicle not walking speeds
walking speeds are likely to be error prone like the compass */
Config_PositionConfig_PositionFlags_SPEED = 512
} Config_PositionConfig_PositionFlags;
typedef enum _Config_NetworkConfig_EthMode {
/* obtain ip address via DHCP */
Config_NetworkConfig_EthMode_DHCP = 0,
/* use static ip address */
Config_NetworkConfig_EthMode_STATIC = 1
} Config_NetworkConfig_EthMode;
/* How the GPS coordinates are displayed on the OLED screen. */
typedef enum _Config_DisplayConfig_GpsCoordinateFormat {
/* GPS coordinates are displayed in the normal decimal degrees format:
DD.DDDDDD DDD.DDDDDD */
Config_DisplayConfig_GpsCoordinateFormat_DEC = 0,
/* GPS coordinates are displayed in the degrees minutes seconds format:
DD°MM'SS"C DDD°MM'SS"C, where C is the compass point representing the locations quadrant */
Config_DisplayConfig_GpsCoordinateFormat_DMS = 1,
/* Universal Transverse Mercator format:
ZZB EEEEEE NNNNNNN, where Z is zone, B is band, E is easting, N is northing */
Config_DisplayConfig_GpsCoordinateFormat_UTM = 2,
/* Military Grid Reference System format:
ZZB CD EEEEE NNNNN, where Z is zone, B is band, C is the east 100k square, D is the north 100k square,
E is easting, N is northing */
Config_DisplayConfig_GpsCoordinateFormat_MGRS = 3,
/* Open Location Code (aka Plus Codes). */
Config_DisplayConfig_GpsCoordinateFormat_OLC = 4,
/* Ordnance Survey Grid Reference (the National Grid System of the UK).
Format: AB EEEEE NNNNN, where A is the east 100k square, B is the north 100k square,
E is the easting, N is the northing */
Config_DisplayConfig_GpsCoordinateFormat_OSGR = 5
} Config_DisplayConfig_GpsCoordinateFormat;
/* Unit display preference */
typedef enum _Config_DisplayConfig_DisplayUnits {
/* Metric (Default) */
Config_DisplayConfig_DisplayUnits_METRIC = 0,
/* Imperial */
Config_DisplayConfig_DisplayUnits_IMPERIAL = 1
} Config_DisplayConfig_DisplayUnits;
/* Override OLED outo detect with this if it fails. */
typedef enum _Config_DisplayConfig_OledType {
/* Default / Auto */
Config_DisplayConfig_OledType_OLED_AUTO = 0,
/* Default / Auto */
Config_DisplayConfig_OledType_OLED_SSD1306 = 1,
/* Default / Auto */
Config_DisplayConfig_OledType_OLED_SH1106 = 2
} Config_DisplayConfig_OledType;
typedef enum _Config_LoRaConfig_RegionCode {
/* Region is not set */
Config_LoRaConfig_RegionCode_UNSET = 0,
/* United States */
Config_LoRaConfig_RegionCode_US = 1,
/* European Union 433mhz */
Config_LoRaConfig_RegionCode_EU_433 = 2,
/* European Union 433mhz */
Config_LoRaConfig_RegionCode_EU_868 = 3,
/* China */
Config_LoRaConfig_RegionCode_CN = 4,
/* Japan */
Config_LoRaConfig_RegionCode_JP = 5,
/* Australia / New Zealand */
Config_LoRaConfig_RegionCode_ANZ = 6,
/* Korea */
Config_LoRaConfig_RegionCode_KR = 7,
/* Taiwan */
Config_LoRaConfig_RegionCode_TW = 8,
/* Russia */
Config_LoRaConfig_RegionCode_RU = 9,
/* India */
Config_LoRaConfig_RegionCode_IN = 10,
/* New Zealand 865mhz */
Config_LoRaConfig_RegionCode_NZ_865 = 11,
/* Thailand */
Config_LoRaConfig_RegionCode_TH = 12,
/* WLAN Band */
Config_LoRaConfig_RegionCode_LORA_24 = 13
} Config_LoRaConfig_RegionCode;
/* Standard predefined channel settings
Note: these mappings must match ModemPreset Choice in the device code. */
typedef enum _Config_LoRaConfig_ModemPreset {
/* Long Range - Fast */
Config_LoRaConfig_ModemPreset_LONG_FAST = 0,
/* Long Range - Slow */
Config_LoRaConfig_ModemPreset_LONG_SLOW = 1,
/* Very Long Range - Slow */
Config_LoRaConfig_ModemPreset_VERY_LONG_SLOW = 2,
/* Medium Range - Slow */
Config_LoRaConfig_ModemPreset_MEDIUM_SLOW = 3,
/* Medium Range - Fast */
Config_LoRaConfig_ModemPreset_MEDIUM_FAST = 4,
/* Short Range - Slow */
Config_LoRaConfig_ModemPreset_SHORT_SLOW = 5,
/* Short Range - Fast */
Config_LoRaConfig_ModemPreset_SHORT_FAST = 6
} Config_LoRaConfig_ModemPreset;
typedef enum _Config_BluetoothConfig_PairingMode {
/* Device generates a random pin that will be shown on the screen of the device for pairing */
Config_BluetoothConfig_PairingMode_RANDOM_PIN = 0,
/* Device requires a specified fixed pin for pairing */
Config_BluetoothConfig_PairingMode_FIXED_PIN = 1,
/* Device requires no pin for pairing */
Config_BluetoothConfig_PairingMode_NO_PIN = 2
} Config_BluetoothConfig_PairingMode;
/* Struct definitions */
typedef struct _Config_BluetoothConfig {
bool enabled;
Config_BluetoothConfig_PairingMode mode;
uint32_t fixed_pin;
} Config_BluetoothConfig;
/* Configuration */
typedef struct _Config_DeviceConfig {
/* Sets the role of node */
Config_DeviceConfig_Role role;
/* Disabling this will disable the SerialConsole by not initilizing the StreamAPI */
bool serial_enabled;
/* By default we turn off logging as soon as an API client connects (to keep shared serial link quiet).
Set this to true to leave the debug log outputting even when API is active. */
bool debug_log_enabled;
/* For boards without a hard wired button, this is the pin number that will be used
Boards that have more than one button can swap the function with this one. defaults to BUTTON_PIN if defined. */
uint32_t button_gpio;
/* For boards without a PWM buzzer, this is the pin number that will be used
Defaults to PIN_BUZZER if defined. */
uint32_t buzzer_gpio;
} Config_DeviceConfig;
/* Position Config */
typedef struct _Config_PositionConfig {
/* We should send our position this often (but only if it has changed significantly)
Defaults to 15 minutes */
uint32_t position_broadcast_secs;
/* Adaptive position braoadcast, which is now the default. */
bool position_broadcast_smart_enabled;
/* If set, this node is at a fixed position.
We will generate GPS position updates at the regular interval, but use whatever the last lat/lon/alt we have for the node.
The lat/lon/alt can be set by an internal GPS or with the help of the app. */
bool fixed_position;
/* Is GPS enabled for this node? */
bool gps_enabled;
/* How often should we try to get GPS position (in seconds)
or zero for the default of once every 30 seconds
or a very large value (maxint) to update only once at boot. */
uint32_t gps_update_interval;
/* How long should we try to get our position during each gps_update_interval attempt? (in seconds)
Or if zero, use the default of 30 seconds.
If we don't get a new gps fix in that time, the gps will be put into sleep until the next gps_update_rate
window. */
uint32_t gps_attempt_time;
/* Bit field of boolean configuration options for POSITION messages
(bitwise OR of PositionFlags) */
uint32_t position_flags;
/* (Re)define GPS_RX_PIN for your board. */
uint32_t rx_gpio;
/* (Re)define GPS_TX_PIN for your board. */
uint32_t tx_gpio;
} Config_PositionConfig;
/* Power Config\
See [Power Config](/docs/settings/config/power) for additional power config details. */
typedef struct _Config_PowerConfig {
/* If set, we are powered from a low-current source (i.e. solar), so even if it looks like we have power flowing in
we should try to minimize power consumption as much as possible.
YOU DO NOT NEED TO SET THIS IF YOU'VE set is_router (it is implied in that case).
Advanced Option */
bool is_power_saving;
/* If non-zero, the device will fully power off this many seconds after external power is removed. */
uint32_t on_battery_shutdown_after_secs;
/* Ratio of voltage divider for battery pin eg. 3.20 (R1=100k, R2=220k)
Overrides the ADC_MULTIPLIER defined in variant for battery voltage calculation.
Should be set to floating point value between 2 and 4
Fixes issues on Heltec v2 */
float adc_multiplier_override;
/* Wait Bluetooth Seconds
The number of seconds for to wait before turning off BLE in No Bluetooth states
0 for default of 1 minute */
uint32_t wait_bluetooth_secs;
/* Mesh Super Deep Sleep Timeout Seconds
While in Light Sleep if this value is exceeded we will lower into super deep sleep
for sds_secs (default 1 year) or a button press
0 for default of two hours, MAXUINT for disabled */
uint32_t mesh_sds_timeout_secs;
/* Super Deep Sleep Seconds
While in Light Sleep if mesh_sds_timeout_secs is exceeded we will lower into super deep sleep
for this value (default 1 year) or a button press
0 for default of one year */
uint32_t sds_secs;
/* Light Sleep Seconds
In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on
ESP32 Only
0 for default of 300 */
uint32_t ls_secs;
/* Minimum Wake Seconds
While in light sleep when we receive packets on the LoRa radio we will wake and handle them and stay awake in no BLE mode for this value
0 for default of 10 seconds */
uint32_t min_wake_secs;
} Config_PowerConfig;
typedef struct _Config_NetworkConfig_IpV4Config {
/* Static IP address */
uint32_t ip;
/* Static gateway address */
uint32_t gateway;
/* Static subnet mask */
uint32_t subnet;
/* Static DNS server address */
uint32_t dns;
} Config_NetworkConfig_IpV4Config;
/* Network Config */
typedef struct _Config_NetworkConfig {
/* Enable WiFi (disables Bluetooth) */
bool wifi_enabled;
/* If set, this node will try to join the specified wifi network and
acquire an address via DHCP */
char wifi_ssid[33];
/* If set, will be use to authenticate to the named wifi */
char wifi_psk[64];
/* NTP server to use if WiFi is conneced, defaults to `0.pool.ntp.org` */
char ntp_server[33];
/* Enable Ethernet */
bool eth_enabled;
/* acquire an address via DHCP or assign static */
Config_NetworkConfig_EthMode eth_mode;
/* struct to keep static address */
bool has_ipv4_config;
Config_NetworkConfig_IpV4Config ipv4_config;
} Config_NetworkConfig;
/* Display Config */
typedef struct _Config_DisplayConfig {
/* Number of seconds the screen stays on after pressing the user button or receiving a message
0 for default of one minute MAXUINT for always on */
uint32_t screen_on_secs;
/* How the GPS coordinates are formatted on the OLED screen. */
Config_DisplayConfig_GpsCoordinateFormat gps_format;
/* Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds.
Potentially useful for devices without user buttons. */
uint32_t auto_screen_carousel_secs;
/* If this is set, the displayed compass will always point north. if unset, the old behaviour
(top of display is heading direction) is used. */
bool compass_north_top;
/* Flip screen vertically, for cases that mount the screen upside down */
bool flip_screen;
/* Perferred display units */
Config_DisplayConfig_DisplayUnits units;
/* Override auto-detect in screen */
Config_DisplayConfig_OledType oled;
} Config_DisplayConfig;
/* Lora Config */
typedef struct _Config_LoRaConfig {
/* When enabled, the `modem_preset` fields will be adheared to, else the `bandwidth`/`spread_factor`/`coding_rate`
will be taked from their respective manually defined fields */
bool use_preset;
/* Either modem_config or bandwidth/spreading/coding will be specified - NOT BOTH.
As a heuristic: If bandwidth is specified, do not use modem_config.
Because protobufs take ZERO space when the value is zero this works out nicely.
This value is replaced by bandwidth/spread_factor/coding_rate.
If you'd like to experiment with other options add them to MeshRadio.cpp in the device code. */
Config_LoRaConfig_ModemPreset modem_preset;
/* Bandwidth in MHz
Certain bandwidth numbers are 'special' and will be converted to the
appropriate floating point value: 31 -> 31.25MHz */
uint16_t bandwidth;
/* A number from 7 to 12.
Indicates number of chirps per symbol as 1<<spread_factor. */
uint32_t spread_factor;
/* The denominator of the coding rate.
ie for 4/5, the value is 5. 4/8 the value is 8. */
uint8_t coding_rate;
/* This parameter is for advanced users with advanced test equipment, we do not recommend most users use it.
A frequency offset that is added to to the calculated band center frequency.
Used to correct for crystal calibration errors. */
float frequency_offset;
/* The region code for the radio (US, CN, EU433, etc...) */
Config_LoRaConfig_RegionCode region;
/* Maximum number of hops. This can't be greater than 7.
Default of 3 */
uint32_t hop_limit;
/* Disable TX from the LoRa radio. Useful for hot-swapping antennas and other tests.
Defaults to false */
bool tx_enabled;
/* If zero then, use default max legal continuous power (ie. something that won't
burn out the radio hardware)
In most cases you should use zero here.
Units are in dBm. */
int8_t tx_power;
/* This is controlling the actual hardware frequency the radio is transmitting on.
Most users should never need to be exposed to this field/concept.
A channel number between 1 and NUM_CHANNELS (whatever the max is in the current region).
If ZERO then the rule is "use the old channel name hash based
algorithm to derive the channel number")
If using the hash algorithm the channel number will be: hash(channel_name) %
NUM_CHANNELS (Where num channels depends on the regulatory region). */
uint16_t channel_num;
/* If true, duty cycle limits will be exceeded and thus you're possibly not following
the local regulations if you're not a HAM.
Has no effect if the duty cycle of the used region is 100%. */
bool override_duty_cycle;
/* For testing it is useful sometimes to force a node to never listen to
particular other nodes (simulating radio out of range). All nodenums listed
in ignore_incoming will have packets they send droped on receive (by router.cpp) */
pb_size_t ignore_incoming_count;
uint32_t ignore_incoming[3];
} Config_LoRaConfig;
typedef struct _Config_NetworkConfig_IpV4Config {
uint32_t ip;
uint32_t gateway;
uint32_t subnet;
uint32_t dns;
} Config_NetworkConfig_IpV4Config;
typedef struct _Config_PositionConfig {
uint32_t position_broadcast_secs;
bool position_broadcast_smart_enabled;
bool fixed_position;
bool gps_enabled;
uint32_t gps_update_interval;
uint32_t gps_attempt_time;
uint32_t position_flags;
uint32_t rx_gpio;
uint32_t tx_gpio;
} Config_PositionConfig;
typedef struct _Config_PowerConfig {
bool is_power_saving;
uint32_t on_battery_shutdown_after_secs;
float adc_multiplier_override;
uint32_t wait_bluetooth_secs;
uint32_t mesh_sds_timeout_secs;
uint32_t sds_secs;
uint32_t ls_secs;
uint32_t min_wake_secs;
} Config_PowerConfig;
typedef struct _Config_NetworkConfig {
bool wifi_enabled;
char wifi_ssid[33];
char wifi_psk[64];
char ntp_server[33];
bool eth_enabled;
Config_NetworkConfig_EthMode eth_mode;
bool has_ipv4_config;
Config_NetworkConfig_IpV4Config ipv4_config;
} Config_NetworkConfig;
typedef struct _Config_BluetoothConfig {
/* Enable Bluetooth on the device */
bool enabled;
/* Determines the pairing strategy for the device */
Config_BluetoothConfig_PairingMode mode;
/* Specified pin for PairingMode.FixedPin */
uint32_t fixed_pin;
} Config_BluetoothConfig;
typedef struct _Config {
pb_size_t which_payload_variant;
@ -186,6 +388,10 @@ typedef struct _Config {
} Config;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _Config_DeviceConfig_Role_MIN Config_DeviceConfig_Role_CLIENT
#define _Config_DeviceConfig_Role_MAX Config_DeviceConfig_Role_ROUTER_CLIENT
@ -224,9 +430,22 @@ typedef struct _Config {
#define _Config_BluetoothConfig_PairingMode_ARRAYSIZE ((Config_BluetoothConfig_PairingMode)(Config_BluetoothConfig_PairingMode_NO_PIN+1))
#ifdef __cplusplus
extern "C" {
#endif
#define Config_DeviceConfig_role_ENUMTYPE Config_DeviceConfig_Role
#define Config_NetworkConfig_eth_mode_ENUMTYPE Config_NetworkConfig_EthMode
#define Config_DisplayConfig_gps_format_ENUMTYPE Config_DisplayConfig_GpsCoordinateFormat
#define Config_DisplayConfig_units_ENUMTYPE Config_DisplayConfig_DisplayUnits
#define Config_DisplayConfig_oled_ENUMTYPE Config_DisplayConfig_OledType
#define Config_LoRaConfig_modem_preset_ENUMTYPE Config_LoRaConfig_ModemPreset
#define Config_LoRaConfig_region_ENUMTYPE Config_LoRaConfig_RegionCode
#define Config_BluetoothConfig_mode_ENUMTYPE Config_BluetoothConfig_PairingMode
/* Initializer values for message structs */
#define Config_init_default {0, {Config_DeviceConfig_init_default}}
@ -249,14 +468,39 @@ extern "C" {
#define Config_BluetoothConfig_init_zero {0, _Config_BluetoothConfig_PairingMode_MIN, 0}
/* Field tags (for use in manual encoding/decoding) */
#define Config_BluetoothConfig_enabled_tag 1
#define Config_BluetoothConfig_mode_tag 2
#define Config_BluetoothConfig_fixed_pin_tag 3
#define Config_DeviceConfig_role_tag 1
#define Config_DeviceConfig_serial_enabled_tag 2
#define Config_DeviceConfig_debug_log_enabled_tag 3
#define Config_DeviceConfig_button_gpio_tag 4
#define Config_DeviceConfig_buzzer_gpio_tag 5
#define Config_PositionConfig_position_broadcast_secs_tag 1
#define Config_PositionConfig_position_broadcast_smart_enabled_tag 2
#define Config_PositionConfig_fixed_position_tag 3
#define Config_PositionConfig_gps_enabled_tag 4
#define Config_PositionConfig_gps_update_interval_tag 5
#define Config_PositionConfig_gps_attempt_time_tag 6
#define Config_PositionConfig_position_flags_tag 7
#define Config_PositionConfig_rx_gpio_tag 8
#define Config_PositionConfig_tx_gpio_tag 9
#define Config_PowerConfig_is_power_saving_tag 1
#define Config_PowerConfig_on_battery_shutdown_after_secs_tag 2
#define Config_PowerConfig_adc_multiplier_override_tag 3
#define Config_PowerConfig_wait_bluetooth_secs_tag 4
#define Config_PowerConfig_mesh_sds_timeout_secs_tag 5
#define Config_PowerConfig_sds_secs_tag 6
#define Config_PowerConfig_ls_secs_tag 7
#define Config_PowerConfig_min_wake_secs_tag 8
#define Config_NetworkConfig_IpV4Config_ip_tag 1
#define Config_NetworkConfig_IpV4Config_gateway_tag 2
#define Config_NetworkConfig_IpV4Config_subnet_tag 3
#define Config_NetworkConfig_IpV4Config_dns_tag 4
#define Config_NetworkConfig_wifi_enabled_tag 1
#define Config_NetworkConfig_wifi_ssid_tag 3
#define Config_NetworkConfig_wifi_psk_tag 4
#define Config_NetworkConfig_ntp_server_tag 5
#define Config_NetworkConfig_eth_enabled_tag 6
#define Config_NetworkConfig_eth_mode_tag 7
#define Config_NetworkConfig_ipv4_config_tag 8
#define Config_DisplayConfig_screen_on_secs_tag 1
#define Config_DisplayConfig_gps_format_tag 2
#define Config_DisplayConfig_auto_screen_carousel_secs_tag 3
@ -277,34 +521,9 @@ extern "C" {
#define Config_LoRaConfig_channel_num_tag 11
#define Config_LoRaConfig_override_duty_cycle_tag 12
#define Config_LoRaConfig_ignore_incoming_tag 103
#define Config_NetworkConfig_IpV4Config_ip_tag 1
#define Config_NetworkConfig_IpV4Config_gateway_tag 2
#define Config_NetworkConfig_IpV4Config_subnet_tag 3
#define Config_NetworkConfig_IpV4Config_dns_tag 4
#define Config_PositionConfig_position_broadcast_secs_tag 1
#define Config_PositionConfig_position_broadcast_smart_enabled_tag 2
#define Config_PositionConfig_fixed_position_tag 3
#define Config_PositionConfig_gps_enabled_tag 4
#define Config_PositionConfig_gps_update_interval_tag 5
#define Config_PositionConfig_gps_attempt_time_tag 6
#define Config_PositionConfig_position_flags_tag 7
#define Config_PositionConfig_rx_gpio_tag 8
#define Config_PositionConfig_tx_gpio_tag 9
#define Config_PowerConfig_is_power_saving_tag 1
#define Config_PowerConfig_on_battery_shutdown_after_secs_tag 2
#define Config_PowerConfig_adc_multiplier_override_tag 3
#define Config_PowerConfig_wait_bluetooth_secs_tag 4
#define Config_PowerConfig_mesh_sds_timeout_secs_tag 5
#define Config_PowerConfig_sds_secs_tag 6
#define Config_PowerConfig_ls_secs_tag 7
#define Config_PowerConfig_min_wake_secs_tag 8
#define Config_NetworkConfig_wifi_enabled_tag 1
#define Config_NetworkConfig_wifi_ssid_tag 3
#define Config_NetworkConfig_wifi_psk_tag 4
#define Config_NetworkConfig_ntp_server_tag 5
#define Config_NetworkConfig_eth_enabled_tag 6
#define Config_NetworkConfig_eth_mode_tag 7
#define Config_NetworkConfig_ipv4_config_tag 8
#define Config_BluetoothConfig_enabled_tag 1
#define Config_BluetoothConfig_mode_tag 2
#define Config_BluetoothConfig_fixed_pin_tag 3
#define Config_device_tag 1
#define Config_position_tag 2
#define Config_power_tag 3

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "device_metadata.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_DEVICE_METADATA_PB_H_INCLUDED
#define PB_DEVICE_METADATA_PB_H_INCLUDED

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "deviceonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_DEVICEONLY_PB_H_INCLUDED
#define PB_DEVICEONLY_PB_H_INCLUDED
@ -23,17 +23,6 @@ typedef enum _ScreenFonts {
} ScreenFonts;
/* Struct definitions */
/* The on-disk saved channels */
typedef struct _ChannelFile {
/* The channels our node knows about */
pb_size_t channels_count;
Channel channels[8];
/* A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code. */
uint32_t version;
} ChannelFile;
/* This message is never sent over the wire, but it is used for serializing DB
state to flash in the device code
FIXME, since we write this each time we enter deep sleep (and have infinite
@ -68,6 +57,17 @@ typedef struct _DeviceState {
bool did_gps_reset;
} DeviceState;
/* The on-disk saved channels */
typedef struct _ChannelFile {
/* The channels our node knows about */
pb_size_t channels_count;
Channel channels[8];
/* A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code. */
uint32_t version;
} ChannelFile;
typedef PB_BYTES_ARRAY_T(2048) OEMStore_oem_icon_bits_t;
typedef PB_BYTES_ARRAY_T(32) OEMStore_oem_aes_key_t;
/* This can be used for customizing the firmware distribution. If populated,
@ -88,15 +88,19 @@ typedef struct _OEMStore {
} OEMStore;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _ScreenFonts_MIN ScreenFonts_FONT_SMALL
#define _ScreenFonts_MAX ScreenFonts_FONT_LARGE
#define _ScreenFonts_ARRAYSIZE ((ScreenFonts)(ScreenFonts_FONT_LARGE+1))
#ifdef __cplusplus
extern "C" {
#endif
#define OEMStore_oem_font_ENUMTYPE ScreenFonts
/* Initializer values for message structs */
#define DeviceState_init_default {false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0}
@ -107,8 +111,6 @@ extern "C" {
#define OEMStore_init_zero {0, 0, {0, {0}}, _ScreenFonts_MIN, "", {0, {0}}}
/* Field tags (for use in manual encoding/decoding) */
#define ChannelFile_channels_tag 1
#define ChannelFile_version_tag 2
#define DeviceState_my_node_tag 2
#define DeviceState_owner_tag 3
#define DeviceState_node_db_tag 4
@ -117,6 +119,8 @@ extern "C" {
#define DeviceState_version_tag 8
#define DeviceState_no_save_tag 9
#define DeviceState_did_gps_reset_tag 11
#define ChannelFile_channels_tag 1
#define ChannelFile_version_tag 2
#define OEMStore_oem_icon_width_tag 1
#define OEMStore_oem_icon_height_tag 2
#define OEMStore_oem_icon_bits_tag 3

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "localonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_LOCALONLY_PB_H_INCLUDED
#define PB_LOCALONLY_PB_H_INCLUDED

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "mesh.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_MESH_PB_H_INCLUDED
#define PB_MESH_PB_H_INCLUDED
@ -131,10 +131,7 @@ typedef enum _CriticalErrorCode {
CriticalErrorCode_RADIO_SPI_BUG = 11
} CriticalErrorCode;
/* Note: these enum names must EXACTLY match the string used in the device
bin/build-all.sh script.
Because they will be used to find firmware filenames in the android app for OTA updates.
To match the old style filenames, _ is converted to -, p is converted to . */
/* How the location was acquired: manual, onboard GPS, external (EUD) GPS */
typedef enum _Position_LocSource {
/* TODO: REPLACE */
Position_LocSource_LOC_UNSET = 0,
@ -146,221 +143,119 @@ typedef enum _Position_LocSource {
Position_LocSource_LOC_EXTERNAL = 3
} Position_LocSource;
/* Shared constants between device and phone */
/* How the altitude was acquired: manual, GPS int/ext, etc
Default: same as location_source if present */
typedef enum _Position_AltSource {
/* First enum must be zero, and we are just using this enum to
pass int constants between two very different environments */
/* TODO: REPLACE */
Position_AltSource_ALT_UNSET = 0,
/* From mesh.options
note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is
outside of this envelope */
/* TODO: REPLACE */
Position_AltSource_ALT_MANUAL = 1,
/* TODO: REPLACE */
Position_AltSource_ALT_INTERNAL = 2,
/* TODO: REPLACE */
Position_AltSource_ALT_EXTERNAL = 3,
/* TODO: REPLACE */
Position_AltSource_ALT_BAROMETRIC = 4
} Position_AltSource;
/* Note: these enum names must EXACTLY match the string used in the device
bin/build-all.sh script.
Because they will be used to find firmware filenames in the android app for OTA updates.
To match the old style filenames, _ is converted to -, p is converted to . */
/* A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide
details on the type of failure). */
typedef enum _Routing_Error {
/* TODO: REPLACE */
/* This message is not a failure */
Routing_Error_NONE = 0,
/* TODO: REPLACE */
/* Our node doesn't have a route to the requested destination anymore. */
Routing_Error_NO_ROUTE = 1,
/* TODO: REPLACE */
/* We received a nak while trying to forward on your behalf */
Routing_Error_GOT_NAK = 2,
/* TODO: REPLACE */
Routing_Error_TIMEOUT = 3,
/* TODO: REPLACE */
/* No suitable interface could be found for delivering this packet */
Routing_Error_NO_INTERFACE = 4,
/* The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13
(see HELTEC_V2 for the new version). */
/* We reached the max retransmission count (typically for naive flood routing) */
Routing_Error_MAX_RETRANSMIT = 5,
/* TODO: REPLACE */
/* No suitable channel was found for sending this packet (i.e. was requested channel index disabled?) */
Routing_Error_NO_CHANNEL = 6,
/* TODO: REPLACE */
/* The packet was too big for sending (exceeds interface MTU after encoding) */
Routing_Error_TOO_LARGE = 7,
/* TODO: REPLACE */
/* The request had want_response set, the request reached the destination node, but no service on that node wants to send a response
(possibly due to bad channel permissions) */
Routing_Error_NO_RESPONSE = 8,
/* TODO: REPLACE */
/* Cannot send currently because duty cycle regulations will be violated. */
Routing_Error_DUTY_CYCLE_LIMIT = 9,
/* The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37.
Sadly they did not update anything on the silkscreen to identify this board */
/* The application layer service on the remote node received your request, but considered your request somehow invalid */
Routing_Error_BAD_REQUEST = 32,
/* Ancient heltec WiFi_Lora_32 board */
/* The application layer service on the remote node received your request, but considered your request not authorized
(i.e you did not send the request on the required bound channel) */
Routing_Error_NOT_AUTHORIZED = 33
} Routing_Error;
/* Note: these enum names must EXACTLY match the string used in the device
bin/build-all.sh script.
Because they will be used to find firmware filenames in the android app for OTA updates.
To match the old style filenames, _ is converted to -, p is converted to . */
/* The priority of this message for sending.
Higher priorities are sent first (when managing the transmit queue).
This field is never sent over the air, it is only used internally inside of a local device node.
API clients (either on the local node or connected directly to the node)
can set this parameter if necessary.
(values must be <= 127 to keep protobuf field to one byte in size.
Detailed background on this field:
I noticed a funny side effect of lora being so slow: Usually when making
a protocol there isnt much need to use message priority to change the order
of transmission (because interfaces are fairly fast).
But for lora where packets can take a few seconds each, it is very important
to make sure that critical packets are sent ASAP.
In the case of meshtastic that means we want to send protocol acks as soon as possible
(to prevent unneeded retransmissions), we want routing messages to be sent next,
then messages marked as reliable and finally background packets like periodic position updates.
So I bit the bullet and implemented a new (internal - not sent over the air)
field in MeshPacket called priority.
And the transmission queue in the router object is now a priority queue. */
typedef enum _MeshPacket_Priority {
/* TODO: REPLACE */
/* Treated as Priority.DEFAULT */
MeshPacket_Priority_UNSET = 0,
/* TODO: REPLACE */
MeshPacket_Priority_MIN = 1,
/* TODO: REPLACE */
/* Background position updates are sent with very low priority -
if the link is super congested they might not go out at all */
MeshPacket_Priority_BACKGROUND = 10,
/* TODO: REPLACE */
/* This priority is used for most messages that don't have a priority set */
MeshPacket_Priority_DEFAULT = 64,
/* TODO: REPLACE */
/* If priority is unset but the message is marked as want_ack,
assume it is important and use a slightly higher priority */
MeshPacket_Priority_RELIABLE = 70,
/* The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13
(see HELTEC_V2 for the new version). */
/* Ack/naks are sent with very high priority to ensure that retransmission
stops as soon as possible */
MeshPacket_Priority_ACK = 120,
/* TODO: REPLACE */
MeshPacket_Priority_MAX = 127
} MeshPacket_Priority;
/* Shared constants between device and phone */
/* Identify if this is a delayed packet */
typedef enum _MeshPacket_Delayed {
/* First enum must be zero, and we are just using this enum to
pass int constants between two very different environments */
/* If unset, the message is being sent in real time. */
MeshPacket_Delayed_NO_DELAY = 0,
/* From mesh.options
note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is
outside of this envelope */
/* The message is delayed and was originally a broadcast */
MeshPacket_Delayed_DELAYED_BROADCAST = 1,
/* The message is delayed and was originally a direct message */
MeshPacket_Delayed_DELAYED_DIRECT = 2
} MeshPacket_Delayed;
/* Note: these enum names must EXACTLY match the string used in the device
bin/build-all.sh script.
Because they will be used to find firmware filenames in the android app for OTA updates.
To match the old style filenames, _ is converted to -, p is converted to . */
/* Log levels, chosen to match python logging conventions. */
typedef enum _LogRecord_Level {
/* TODO: REPLACE */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_UNSET = 0,
/* TODO: REPLACE */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_CRITICAL = 50,
/* TODO: REPLACE */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_ERROR = 40,
/* TODO: REPLACE */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_WARNING = 30,
/* TODO: REPLACE */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_INFO = 20,
/* The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13
(see HELTEC_V2 for the new version). */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_DEBUG = 10,
/* TODO: REPLACE */
/* Log levels, chosen to match python logging conventions. */
LogRecord_Level_TRACE = 5
} LogRecord_Level;
/* Struct definitions */
typedef PB_BYTES_ARRAY_T(237) Compressed_data_t;
/* Compressed message payload */
typedef struct _Compressed {
/* PortNum to determine the how to handle the compressed payload. */
PortNum portnum;
/* Compressed data. */
Compressed_data_t data;
} Compressed;
typedef PB_BYTES_ARRAY_T(237) Data_payload_t;
/* (Formerly called SubPacket)
The payload portion fo a packet, this is the actual bytes that are sent
inside a radio packet (because from/to are broken out by the comms library) */
typedef struct _Data {
/* Formerly named typ and of type Type */
PortNum portnum;
/* TODO: REPLACE */
Data_payload_t payload;
/* Not normally used, but for testing a sender can request that recipient
responds in kind (i.e. if it received a position, it should unicast back it's position).
Note: that if you set this on a broadcast you will receive many replies. */
bool want_response;
/* The address of the destination node.
This field is is filled in by the mesh radio device software, application
layer software should never need it.
RouteDiscovery messages _must_ populate this.
Other message types might need to if they are doing multihop routing. */
uint32_t dest;
/* The address of the original sender for this message.
This field should _only_ be populated for reliable multihop packets (to keep
packets small). */
uint32_t source;
/* Only used in routing or response messages.
Indicates the original message ID that this message is reporting failure on. (formerly called original_id) */
uint32_t request_id;
/* If set, this message is intened to be a reply to a previously sent message with the defined id. */
uint32_t reply_id;
/* Defaults to false. If true, then what is in the payload should be treated as an emoji like giving
a message a heart or poop emoji. */
uint32_t emoji;
} Data;
/* Debug output from the device.
To minimize the size of records inside the device code, if a time/source/level is not set
on the message it is assumed to be a continuation of the previously sent message.
This allows the device code to use fixed maxlen 64 byte strings for messages,
and then extend as needed by emitting multiple records. */
typedef struct _LogRecord {
/* Log levels, chosen to match python logging conventions. */
char message[64];
/* Seconds since 1970 - or 0 for unknown/unset */
uint32_t time;
/* Usually based on thread name - if known */
char source[8];
/* Not yet set */
LogRecord_Level level;
} LogRecord;
/* Unique local debugging info for this node
Note: we don't include position or the user info, because that will come in the
Sent to the phone in response to WantNodes. */
typedef struct _MyNodeInfo {
/* Tells the phone what our node number is, default starting value is
lowbyte of macaddr, but it will be fixed if that is already in use */
uint32_t my_node_num;
/* Note: This flag merely means we detected a hardware GPS in our node.
Not the same as UserPreferences.location_sharing */
bool has_gps;
/* The maximum number of 'software' channels that can be set on this node. */
uint32_t max_channels;
/* 0.0.5 etc... */
char firmware_version[18];
/* An error message we'd like to report back to the mothership through analytics.
It indicates a serious bug occurred on the device, the device coped with it,
but we still want to tell the devs about the bug.
This field will be cleared after the phone reads MyNodeInfo
(i.e. it will only be reported once)
a numeric error code to go with error message, zero means no error */
CriticalErrorCode error_code;
/* A numeric error address (nonzero if available) */
uint32_t error_address;
/* The total number of errors this node has ever encountered
(well - since the last time we discarded preferences) */
uint32_t error_count;
/* The total number of reboots this node has ever encountered
(well - since the last time we discarded preferences) */
uint32_t reboot_count;
/* Calculated bitrate of the current channel (in Bytes Per Second) */
float bitrate;
/* How long before we consider a message abandoned and we can clear our
caches of any messages in flight Normally quite large to handle the worst case
message delivery time, 5 minutes.
Formerly called FLOOD_EXPIRE_TIME in the device code */
uint32_t message_timeout_msec;
/* The minimum app version that can talk to this device.
Phone/PC apps should compare this to their build number and if too low tell the user they must update their app */
uint32_t min_app_version;
/* 24 time windows of 1hr each with the airtime transmitted out of the device per hour. */
pb_size_t air_period_tx_count;
uint32_t air_period_tx[8];
/* 24 time windows of 1hr each with the airtime of valid packets for your mesh. */
pb_size_t air_period_rx_count;
uint32_t air_period_rx[8];
/* Is the device wifi capable? */
bool has_wifi;
/* Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). */
float channel_utilization;
/* Percent of airtime for transmission used within the last hour. */
float air_util_tx;
} MyNodeInfo;
/* a gps position */
typedef struct _Position {
/* The new preferred location encoding, multiply by 1e-7 to get degrees
@ -429,13 +324,6 @@ typedef struct _Position {
uint32_t seq_number;
} Position;
/* A message used in our Dynamic Source Routing protocol (RFC 4728 based) */
typedef struct _RouteDiscovery {
/* The list of nodenums this packet has visited so far */
pb_size_t route_count;
uint32_t route[8];
} RouteDiscovery;
/* Broadcast when a newly powered mesh node wants to find a node num it can use
Sent from the phone over bluetooth to set the user id for the owner of this node.
Also sent from nodes to each other when a new node signs on (so all clients can have this info)
@ -481,6 +369,60 @@ typedef struct _User {
bool is_licensed;
} User;
/* A message used in our Dynamic Source Routing protocol (RFC 4728 based) */
typedef struct _RouteDiscovery {
/* The list of nodenums this packet has visited so far */
pb_size_t route_count;
uint32_t route[8];
} RouteDiscovery;
/* A Routing control Data packet handled by the routing module */
typedef struct _Routing {
pb_size_t which_variant;
union {
/* A route request going from the requester */
RouteDiscovery route_request;
/* A route reply */
RouteDiscovery route_reply;
/* A failure in delivering a message (usually used for routing control messages, but might be provided
in addition to ack.fail_id to provide details on the type of failure). */
Routing_Error error_reason;
};
} Routing;
typedef PB_BYTES_ARRAY_T(237) Data_payload_t;
/* (Formerly called SubPacket)
The payload portion fo a packet, this is the actual bytes that are sent
inside a radio packet (because from/to are broken out by the comms library) */
typedef struct _Data {
/* Formerly named typ and of type Type */
PortNum portnum;
/* TODO: REPLACE */
Data_payload_t payload;
/* Not normally used, but for testing a sender can request that recipient
responds in kind (i.e. if it received a position, it should unicast back it's position).
Note: that if you set this on a broadcast you will receive many replies. */
bool want_response;
/* The address of the destination node.
This field is is filled in by the mesh radio device software, application
layer software should never need it.
RouteDiscovery messages _must_ populate this.
Other message types might need to if they are doing multihop routing. */
uint32_t dest;
/* The address of the original sender for this message.
This field should _only_ be populated for reliable multihop packets (to keep
packets small). */
uint32_t source;
/* Only used in routing or response messages.
Indicates the original message ID that this message is reporting failure on. (formerly called original_id) */
uint32_t request_id;
/* If set, this message is intened to be a reply to a previously sent message with the defined id. */
uint32_t reply_id;
/* Defaults to false. If true, then what is in the payload should be treated as an emoji like giving
a message a heart or poop emoji. */
uint32_t emoji;
} Data;
/* Waypoint message, used to share arbitrary locations across the mesh */
typedef struct _Waypoint {
/* Id of the waypoint */
@ -608,19 +550,74 @@ typedef struct _NodeInfo {
DeviceMetrics device_metrics;
} NodeInfo;
/* A Routing control Data packet handled by the routing module */
typedef struct _Routing {
pb_size_t which_variant;
union {
/* A route request going from the requester */
RouteDiscovery route_request;
/* A route reply */
RouteDiscovery route_reply;
/* A failure in delivering a message (usually used for routing control messages, but might be provided
in addition to ack.fail_id to provide details on the type of failure). */
Routing_Error error_reason;
};
} Routing;
/* Unique local debugging info for this node
Note: we don't include position or the user info, because that will come in the
Sent to the phone in response to WantNodes. */
typedef struct _MyNodeInfo {
/* Tells the phone what our node number is, default starting value is
lowbyte of macaddr, but it will be fixed if that is already in use */
uint32_t my_node_num;
/* Note: This flag merely means we detected a hardware GPS in our node.
Not the same as UserPreferences.location_sharing */
bool has_gps;
/* The maximum number of 'software' channels that can be set on this node. */
uint32_t max_channels;
/* 0.0.5 etc... */
char firmware_version[18];
/* An error message we'd like to report back to the mothership through analytics.
It indicates a serious bug occurred on the device, the device coped with it,
but we still want to tell the devs about the bug.
This field will be cleared after the phone reads MyNodeInfo
(i.e. it will only be reported once)
a numeric error code to go with error message, zero means no error */
CriticalErrorCode error_code;
/* A numeric error address (nonzero if available) */
uint32_t error_address;
/* The total number of errors this node has ever encountered
(well - since the last time we discarded preferences) */
uint32_t error_count;
/* The total number of reboots this node has ever encountered
(well - since the last time we discarded preferences) */
uint32_t reboot_count;
/* Calculated bitrate of the current channel (in Bytes Per Second) */
float bitrate;
/* How long before we consider a message abandoned and we can clear our
caches of any messages in flight Normally quite large to handle the worst case
message delivery time, 5 minutes.
Formerly called FLOOD_EXPIRE_TIME in the device code */
uint32_t message_timeout_msec;
/* The minimum app version that can talk to this device.
Phone/PC apps should compare this to their build number and if too low tell the user they must update their app */
uint32_t min_app_version;
/* 24 time windows of 1hr each with the airtime transmitted out of the device per hour. */
pb_size_t air_period_tx_count;
uint32_t air_period_tx[8];
/* 24 time windows of 1hr each with the airtime of valid packets for your mesh. */
pb_size_t air_period_rx_count;
uint32_t air_period_rx[8];
/* Is the device wifi capable? */
bool has_wifi;
/* Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). */
float channel_utilization;
/* Percent of airtime for transmission used within the last hour. */
float air_util_tx;
} MyNodeInfo;
/* Debug output from the device.
To minimize the size of records inside the device code, if a time/source/level is not set
on the message it is assumed to be a continuation of the previously sent message.
This allows the device code to use fixed maxlen 64 byte strings for messages,
and then extend as needed by emitting multiple records. */
typedef struct _LogRecord {
/* Log levels, chosen to match python logging conventions. */
char message[64];
/* Seconds since 1970 - or 0 for unknown/unset */
uint32_t time;
/* Usually based on thread name - if known */
char source[8];
/* Not yet set */
LogRecord_Level level;
} LogRecord;
/* Packets from the radio to the phone will appear on the fromRadio characteristic.
It will support READ and NOTIFY. When a new packet arrives the device will BLE notify?
@ -684,6 +681,19 @@ typedef struct _ToRadio {
};
} ToRadio;
typedef PB_BYTES_ARRAY_T(237) Compressed_data_t;
/* Compressed message payload */
typedef struct _Compressed {
/* PortNum to determine the how to handle the compressed payload. */
PortNum portnum;
/* Compressed data. */
Compressed_data_t data;
} Compressed;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _HardwareModel_MIN HardwareModel_UNSET
@ -722,10 +732,29 @@ typedef struct _ToRadio {
#define _LogRecord_Level_MAX LogRecord_Level_CRITICAL
#define _LogRecord_Level_ARRAYSIZE ((LogRecord_Level)(LogRecord_Level_CRITICAL+1))
#define Position_location_source_ENUMTYPE Position_LocSource
#define Position_altitude_source_ENUMTYPE Position_AltSource
#define User_hw_model_ENUMTYPE HardwareModel
#define Routing_variant_error_reason_ENUMTYPE Routing_Error
#define Data_portnum_ENUMTYPE PortNum
#define MeshPacket_priority_ENUMTYPE MeshPacket_Priority
#define MeshPacket_delayed_ENUMTYPE MeshPacket_Delayed
#define MyNodeInfo_error_code_ENUMTYPE CriticalErrorCode
#define LogRecord_level_ENUMTYPE LogRecord_Level
#define Compressed_portnum_ENUMTYPE PortNum
#ifdef __cplusplus
extern "C" {
#endif
/* Initializer values for message structs */
#define Position_init_default {0, 0, 0, 0, _Position_LocSource_MIN, _Position_AltSource_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
@ -756,36 +785,6 @@ extern "C" {
#define Compressed_init_zero {_PortNum_MIN, {0, {0}}}
/* Field tags (for use in manual encoding/decoding) */
#define Compressed_portnum_tag 1
#define Compressed_data_tag 2
#define Data_portnum_tag 1
#define Data_payload_tag 2
#define Data_want_response_tag 3
#define Data_dest_tag 4
#define Data_source_tag 5
#define Data_request_id_tag 6
#define Data_reply_id_tag 7
#define Data_emoji_tag 8
#define LogRecord_message_tag 1
#define LogRecord_time_tag 2
#define LogRecord_source_tag 3
#define LogRecord_level_tag 4
#define MyNodeInfo_my_node_num_tag 1
#define MyNodeInfo_has_gps_tag 2
#define MyNodeInfo_max_channels_tag 3
#define MyNodeInfo_firmware_version_tag 4
#define MyNodeInfo_error_code_tag 5
#define MyNodeInfo_error_address_tag 6
#define MyNodeInfo_error_count_tag 7
#define MyNodeInfo_reboot_count_tag 8
#define MyNodeInfo_bitrate_tag 9
#define MyNodeInfo_message_timeout_msec_tag 10
#define MyNodeInfo_min_app_version_tag 11
#define MyNodeInfo_air_period_tx_tag 12
#define MyNodeInfo_air_period_rx_tag 13
#define MyNodeInfo_has_wifi_tag 14
#define MyNodeInfo_channel_utilization_tag 15
#define MyNodeInfo_air_util_tx_tag 16
#define Position_latitude_i_tag 1
#define Position_longitude_i_tag 2
#define Position_altitude_tag 3
@ -808,13 +807,24 @@ extern "C" {
#define Position_sensor_id_tag 20
#define Position_next_update_tag 21
#define Position_seq_number_tag 22
#define RouteDiscovery_route_tag 1
#define User_id_tag 1
#define User_long_name_tag 2
#define User_short_name_tag 3
#define User_macaddr_tag 4
#define User_hw_model_tag 5
#define User_is_licensed_tag 6
#define RouteDiscovery_route_tag 1
#define Routing_route_request_tag 1
#define Routing_route_reply_tag 2
#define Routing_error_reason_tag 3
#define Data_portnum_tag 1
#define Data_payload_tag 2
#define Data_want_response_tag 3
#define Data_dest_tag 4
#define Data_source_tag 5
#define Data_request_id_tag 6
#define Data_reply_id_tag 7
#define Data_emoji_tag 8
#define Waypoint_id_tag 1
#define Waypoint_latitude_i_tag 2
#define Waypoint_longitude_i_tag 3
@ -841,9 +851,26 @@ extern "C" {
#define NodeInfo_snr_tag 4
#define NodeInfo_last_heard_tag 5
#define NodeInfo_device_metrics_tag 6
#define Routing_route_request_tag 1
#define Routing_route_reply_tag 2
#define Routing_error_reason_tag 3
#define MyNodeInfo_my_node_num_tag 1
#define MyNodeInfo_has_gps_tag 2
#define MyNodeInfo_max_channels_tag 3
#define MyNodeInfo_firmware_version_tag 4
#define MyNodeInfo_error_code_tag 5
#define MyNodeInfo_error_address_tag 6
#define MyNodeInfo_error_count_tag 7
#define MyNodeInfo_reboot_count_tag 8
#define MyNodeInfo_bitrate_tag 9
#define MyNodeInfo_message_timeout_msec_tag 10
#define MyNodeInfo_min_app_version_tag 11
#define MyNodeInfo_air_period_tx_tag 12
#define MyNodeInfo_air_period_rx_tag 13
#define MyNodeInfo_has_wifi_tag 14
#define MyNodeInfo_channel_utilization_tag 15
#define MyNodeInfo_air_util_tx_tag 16
#define LogRecord_message_tag 1
#define LogRecord_time_tag 2
#define LogRecord_source_tag 3
#define LogRecord_level_tag 4
#define FromRadio_id_tag 1
#define FromRadio_packet_tag 2
#define FromRadio_my_info_tag 3
@ -857,6 +884,8 @@ extern "C" {
#define ToRadio_packet_tag 1
#define ToRadio_want_config_id_tag 3
#define ToRadio_disconnect_tag 4
#define Compressed_portnum_tag 1
#define Compressed_data_tag 2
/* Struct field encoding specification for nanopb */
#define Position_FIELDLIST(X, a) \

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "module_config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_MODULE_CONFIG_PB_H_INCLUDED
#define PB_MODULE_CONFIG_PB_H_INCLUDED
@ -10,6 +10,7 @@
#endif
/* Enum definitions */
/* Baudrate for codec2 voice */
typedef enum _ModuleConfig_AudioConfig_Audio_Baud {
ModuleConfig_AudioConfig_Audio_Baud_CODEC2_DEFAULT = 0,
ModuleConfig_AudioConfig_Audio_Baud_CODEC2_3200 = 1,
@ -22,6 +23,7 @@ typedef enum _ModuleConfig_AudioConfig_Audio_Baud {
ModuleConfig_AudioConfig_Audio_Baud_CODEC2_700B = 8
} ModuleConfig_AudioConfig_Audio_Baud;
/* TODO: REPLACE */
typedef enum _ModuleConfig_SerialConfig_Serial_Baud {
ModuleConfig_SerialConfig_Serial_Baud_BAUD_DEFAULT = 0,
ModuleConfig_SerialConfig_Serial_Baud_BAUD_110 = 1,
@ -41,6 +43,7 @@ typedef enum _ModuleConfig_SerialConfig_Serial_Baud {
ModuleConfig_SerialConfig_Serial_Baud_BAUD_921600 = 15
} ModuleConfig_SerialConfig_Serial_Baud;
/* TODO: REPLACE */
typedef enum _ModuleConfig_SerialConfig_Serial_Mode {
ModuleConfig_SerialConfig_Serial_Mode_DEFAULT = 0,
ModuleConfig_SerialConfig_Serial_Mode_SIMPLE = 1,
@ -49,100 +52,200 @@ typedef enum _ModuleConfig_SerialConfig_Serial_Mode {
ModuleConfig_SerialConfig_Serial_Mode_NMEA = 4
} ModuleConfig_SerialConfig_Serial_Mode;
/* TODO: REPLACE */
typedef enum _ModuleConfig_CannedMessageConfig_InputEventChar {
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_NONE = 0,
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_UP = 17,
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_DOWN = 18,
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_LEFT = 19,
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT = 20,
/* '\n' */
ModuleConfig_CannedMessageConfig_InputEventChar_SELECT = 10,
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_BACK = 27,
/* TODO: REPLACE */
ModuleConfig_CannedMessageConfig_InputEventChar_CANCEL = 24
} ModuleConfig_CannedMessageConfig_InputEventChar;
/* Struct definitions */
typedef struct _ModuleConfig_AudioConfig {
bool codec2_enabled;
uint8_t ptt_pin;
ModuleConfig_AudioConfig_Audio_Baud bitrate;
uint8_t i2s_ws;
uint8_t i2s_sd;
uint8_t i2s_din;
uint8_t i2s_sck;
} ModuleConfig_AudioConfig;
typedef struct _ModuleConfig_CannedMessageConfig {
bool rotary1_enabled;
uint32_t inputbroker_pin_a;
uint32_t inputbroker_pin_b;
uint32_t inputbroker_pin_press;
ModuleConfig_CannedMessageConfig_InputEventChar inputbroker_event_cw;
ModuleConfig_CannedMessageConfig_InputEventChar inputbroker_event_ccw;
ModuleConfig_CannedMessageConfig_InputEventChar inputbroker_event_press;
bool updown1_enabled;
bool enabled;
char allow_input_source[16];
bool send_bell;
} ModuleConfig_CannedMessageConfig;
typedef struct _ModuleConfig_ExternalNotificationConfig {
bool enabled;
uint32_t output_ms;
uint32_t output;
bool active;
bool alert_message;
bool alert_bell;
bool use_pwm;
uint8_t output_vibra;
uint8_t output_buzzer;
bool alert_message_vibra;
bool alert_message_buzzer;
bool alert_bell_vibra;
bool alert_bell_buzzer;
uint16_t nag_timeout;
} ModuleConfig_ExternalNotificationConfig;
/* MQTT Client Config */
typedef struct _ModuleConfig_MQTTConfig {
/* If a meshtastic node is able to reach the internet it will normally attempt to gateway any channels that are marked as
is_uplink_enabled or is_downlink_enabled. */
bool enabled;
/* The server to use for our MQTT global message gateway feature.
If not set, the default server will be used */
char address[32];
/* MQTT username to use (most useful for a custom MQTT server).
If using a custom server, this will be honoured even if empty.
If using the default server, this will only be honoured if set, otherwise the device will use the default username */
char username[64];
/* MQTT password to use (most useful for a custom MQTT server).
If using a custom server, this will be honoured even if empty.
If using the default server, this will only be honoured if set, otherwise the device will use the default password */
char password[64];
/* Whether to send encrypted or decrypted packets to MQTT.
This parameter is only honoured if you also set server
(the default official mqtt.meshtastic.org server can handle encrypted packets)
Decrypted packets may be useful for external systems that want to consume meshtastic packets */
bool encryption_enabled;
/* Whether to send / consume json packets on MQTT */
bool json_enabled;
} ModuleConfig_MQTTConfig;
typedef struct _ModuleConfig_RangeTestConfig {
bool enabled;
uint32_t sender;
bool save;
} ModuleConfig_RangeTestConfig;
/* Audio Config for codec2 voice */
typedef struct _ModuleConfig_AudioConfig {
/* Whether Audio is enabled */
bool codec2_enabled;
/* PTT Pin */
uint8_t ptt_pin;
/* The audio sample rate to use for codec2 */
ModuleConfig_AudioConfig_Audio_Baud bitrate;
/* I2S Word Select */
uint8_t i2s_ws;
/* I2S Data IN */
uint8_t i2s_sd;
/* I2S Data OUT */
uint8_t i2s_din;
/* I2S Clock */
uint8_t i2s_sck;
} ModuleConfig_AudioConfig;
/* Serial Config */
typedef struct _ModuleConfig_SerialConfig {
/* Preferences for the SerialModule
FIXME - Move this out of UserPreferences and into a section for module configuration. */
bool enabled;
/* TODO: REPLACE */
bool echo;
/* TODO: REPLACE */
uint32_t rxd;
/* TODO: REPLACE */
uint32_t txd;
/* TODO: REPLACE */
ModuleConfig_SerialConfig_Serial_Baud baud;
/* TODO: REPLACE */
uint32_t timeout;
/* TODO: REPLACE */
ModuleConfig_SerialConfig_Serial_Mode mode;
} ModuleConfig_SerialConfig;
typedef struct _ModuleConfig_StoreForwardConfig {
/* External Notifications Config */
typedef struct _ModuleConfig_ExternalNotificationConfig {
/* Enable the ExternalNotificationModule */
bool enabled;
/* When using in On/Off mode, keep the output on for this many
milliseconds. Default 1000ms (1 second). */
uint32_t output_ms;
/* Define the output pin GPIO setting Defaults to
EXT_NOTIFY_OUT if set for the board.
In standalone devices this pin should drive the LED to match the UI. */
uint32_t output;
/* IF this is true, the 'output' Pin will be pulled active high, false
means active low. */
bool active;
/* True: Alert when a text message arrives (output) */
bool alert_message;
/* True: Alert when the bell character is received (output) */
bool alert_bell;
/* use a PWM output instead of a simple on/off output. This will ignore
the 'output', 'output_ms' and 'active' settings and use the
device.buzzer_gpio instead. */
bool use_pwm;
/* Optional: Define a secondary output pin for a vibra motor
This is used in standalone devices to match the UI. */
uint8_t output_vibra;
/* Optional: Define a tertiary output pin for an active buzzer
This is used in standalone devices to to match the UI. */
uint8_t output_buzzer;
/* True: Alert when a text message arrives (output_vibra) */
bool alert_message_vibra;
/* True: Alert when a text message arrives (output_buzzer) */
bool alert_message_buzzer;
/* True: Alert when the bell character is received (output_vibra) */
bool alert_bell_vibra;
/* True: Alert when the bell character is received (output_buzzer) */
bool alert_bell_buzzer;
/* The notification will toggle with 'output_ms' for this time of seconds.
Default is 0 which means don't repeat at all. 60 would mean blink
and/or beep for 60 seconds */
uint16_t nag_timeout;
} ModuleConfig_ExternalNotificationConfig;
/* Store and Forward Module Config */
typedef struct _ModuleConfig_StoreForwardConfig {
/* Enable the Store and Forward Module */
bool enabled;
/* TODO: REPLACE */
bool heartbeat;
/* TODO: REPLACE */
uint32_t records;
/* TODO: REPLACE */
uint32_t history_return_max;
/* TODO: REPLACE */
uint32_t history_return_window;
} ModuleConfig_StoreForwardConfig;
/* Preferences for the RangeTestModule */
typedef struct _ModuleConfig_RangeTestConfig {
/* Enable the Range Test Module */
bool enabled;
/* Send out range test messages from this node */
uint32_t sender;
/* Bool value indicating that this node should save a RangeTest.csv file.
ESP32 Only */
bool save;
} ModuleConfig_RangeTestConfig;
/* Configuration for both device and environment metrics */
typedef struct _ModuleConfig_TelemetryConfig {
/* Interval in seconds of how often we should try to send our
device metrics to the mesh */
uint32_t device_update_interval;
uint32_t environment_update_interval;
/* Preferences for the Telemetry Module (Environment)
Enable/Disable the telemetry measurement module measurement collection */
bool environment_measurement_enabled;
/* Enable/Disable the telemetry measurement module on-device display */
bool environment_screen_enabled;
/* We'll always read the sensor in Celsius, but sometimes we might want to
display the results in Fahrenheit as a "user preference". */
bool environment_display_fahrenheit;
} ModuleConfig_TelemetryConfig;
/* TODO: REPLACE */
typedef struct _ModuleConfig_CannedMessageConfig {
/* Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating. */
bool rotary1_enabled;
/* GPIO pin for rotary encoder A port. */
uint32_t inputbroker_pin_a;
/* GPIO pin for rotary encoder B port. */
uint32_t inputbroker_pin_b;
/* GPIO pin for rotary encoder Press port. */
uint32_t inputbroker_pin_press;
/* Generate input event on CW of this kind. */
ModuleConfig_CannedMessageConfig_InputEventChar inputbroker_event_cw;
/* Generate input event on CCW of this kind. */
ModuleConfig_CannedMessageConfig_InputEventChar inputbroker_event_ccw;
/* Generate input event on Press of this kind. */
ModuleConfig_CannedMessageConfig_InputEventChar inputbroker_event_press;
/* Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker. */
bool updown1_enabled;
/* Enable/disable CannedMessageModule. */
bool enabled;
/* Input event origin accepted by the canned message module.
Can be e.g. "rotEnc1", "upDownEnc1" or keyword "_any" */
char allow_input_source[16];
/* CannedMessageModule also sends a bell character with the messages.
ExternalNotificationModule can benefit from this feature. */
bool send_bell;
} ModuleConfig_CannedMessageConfig;
/* Module Config */
typedef struct _ModuleConfig {
pb_size_t which_payload_variant;
@ -167,6 +270,10 @@ typedef struct _ModuleConfig {
} ModuleConfig;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _ModuleConfig_AudioConfig_Audio_Baud_MIN ModuleConfig_AudioConfig_Audio_Baud_CODEC2_DEFAULT
#define _ModuleConfig_AudioConfig_Audio_Baud_MAX ModuleConfig_AudioConfig_Audio_Baud_CODEC2_700B
@ -185,9 +292,20 @@ typedef struct _ModuleConfig {
#define _ModuleConfig_CannedMessageConfig_InputEventChar_ARRAYSIZE ((ModuleConfig_CannedMessageConfig_InputEventChar)(ModuleConfig_CannedMessageConfig_InputEventChar_BACK+1))
#ifdef __cplusplus
extern "C" {
#endif
#define ModuleConfig_AudioConfig_bitrate_ENUMTYPE ModuleConfig_AudioConfig_Audio_Baud
#define ModuleConfig_SerialConfig_baud_ENUMTYPE ModuleConfig_SerialConfig_Serial_Baud
#define ModuleConfig_SerialConfig_mode_ENUMTYPE ModuleConfig_SerialConfig_Serial_Mode
#define ModuleConfig_CannedMessageConfig_inputbroker_event_cw_ENUMTYPE ModuleConfig_CannedMessageConfig_InputEventChar
#define ModuleConfig_CannedMessageConfig_inputbroker_event_ccw_ENUMTYPE ModuleConfig_CannedMessageConfig_InputEventChar
#define ModuleConfig_CannedMessageConfig_inputbroker_event_press_ENUMTYPE ModuleConfig_CannedMessageConfig_InputEventChar
/* Initializer values for message structs */
#define ModuleConfig_init_default {0, {ModuleConfig_MQTTConfig_init_default}}
@ -210,6 +328,12 @@ extern "C" {
#define ModuleConfig_CannedMessageConfig_init_zero {0, 0, 0, 0, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
/* Field tags (for use in manual encoding/decoding) */
#define ModuleConfig_MQTTConfig_enabled_tag 1
#define ModuleConfig_MQTTConfig_address_tag 2
#define ModuleConfig_MQTTConfig_username_tag 3
#define ModuleConfig_MQTTConfig_password_tag 4
#define ModuleConfig_MQTTConfig_encryption_enabled_tag 5
#define ModuleConfig_MQTTConfig_json_enabled_tag 6
#define ModuleConfig_AudioConfig_codec2_enabled_tag 1
#define ModuleConfig_AudioConfig_ptt_pin_tag 2
#define ModuleConfig_AudioConfig_bitrate_tag 3
@ -217,17 +341,13 @@ extern "C" {
#define ModuleConfig_AudioConfig_i2s_sd_tag 5
#define ModuleConfig_AudioConfig_i2s_din_tag 6
#define ModuleConfig_AudioConfig_i2s_sck_tag 7
#define ModuleConfig_CannedMessageConfig_rotary1_enabled_tag 1
#define ModuleConfig_CannedMessageConfig_inputbroker_pin_a_tag 2
#define ModuleConfig_CannedMessageConfig_inputbroker_pin_b_tag 3
#define ModuleConfig_CannedMessageConfig_inputbroker_pin_press_tag 4
#define ModuleConfig_CannedMessageConfig_inputbroker_event_cw_tag 5
#define ModuleConfig_CannedMessageConfig_inputbroker_event_ccw_tag 6
#define ModuleConfig_CannedMessageConfig_inputbroker_event_press_tag 7
#define ModuleConfig_CannedMessageConfig_updown1_enabled_tag 8
#define ModuleConfig_CannedMessageConfig_enabled_tag 9
#define ModuleConfig_CannedMessageConfig_allow_input_source_tag 10
#define ModuleConfig_CannedMessageConfig_send_bell_tag 11
#define ModuleConfig_SerialConfig_enabled_tag 1
#define ModuleConfig_SerialConfig_echo_tag 2
#define ModuleConfig_SerialConfig_rxd_tag 3
#define ModuleConfig_SerialConfig_txd_tag 4
#define ModuleConfig_SerialConfig_baud_tag 5
#define ModuleConfig_SerialConfig_timeout_tag 6
#define ModuleConfig_SerialConfig_mode_tag 7
#define ModuleConfig_ExternalNotificationConfig_enabled_tag 1
#define ModuleConfig_ExternalNotificationConfig_output_ms_tag 2
#define ModuleConfig_ExternalNotificationConfig_output_tag 3
@ -242,32 +362,30 @@ extern "C" {
#define ModuleConfig_ExternalNotificationConfig_alert_bell_vibra_tag 12
#define ModuleConfig_ExternalNotificationConfig_alert_bell_buzzer_tag 13
#define ModuleConfig_ExternalNotificationConfig_nag_timeout_tag 14
#define ModuleConfig_MQTTConfig_enabled_tag 1
#define ModuleConfig_MQTTConfig_address_tag 2
#define ModuleConfig_MQTTConfig_username_tag 3
#define ModuleConfig_MQTTConfig_password_tag 4
#define ModuleConfig_MQTTConfig_encryption_enabled_tag 5
#define ModuleConfig_MQTTConfig_json_enabled_tag 6
#define ModuleConfig_RangeTestConfig_enabled_tag 1
#define ModuleConfig_RangeTestConfig_sender_tag 2
#define ModuleConfig_RangeTestConfig_save_tag 3
#define ModuleConfig_SerialConfig_enabled_tag 1
#define ModuleConfig_SerialConfig_echo_tag 2
#define ModuleConfig_SerialConfig_rxd_tag 3
#define ModuleConfig_SerialConfig_txd_tag 4
#define ModuleConfig_SerialConfig_baud_tag 5
#define ModuleConfig_SerialConfig_timeout_tag 6
#define ModuleConfig_SerialConfig_mode_tag 7
#define ModuleConfig_StoreForwardConfig_enabled_tag 1
#define ModuleConfig_StoreForwardConfig_heartbeat_tag 2
#define ModuleConfig_StoreForwardConfig_records_tag 3
#define ModuleConfig_StoreForwardConfig_history_return_max_tag 4
#define ModuleConfig_StoreForwardConfig_history_return_window_tag 5
#define ModuleConfig_RangeTestConfig_enabled_tag 1
#define ModuleConfig_RangeTestConfig_sender_tag 2
#define ModuleConfig_RangeTestConfig_save_tag 3
#define ModuleConfig_TelemetryConfig_device_update_interval_tag 1
#define ModuleConfig_TelemetryConfig_environment_update_interval_tag 2
#define ModuleConfig_TelemetryConfig_environment_measurement_enabled_tag 3
#define ModuleConfig_TelemetryConfig_environment_screen_enabled_tag 4
#define ModuleConfig_TelemetryConfig_environment_display_fahrenheit_tag 5
#define ModuleConfig_CannedMessageConfig_rotary1_enabled_tag 1
#define ModuleConfig_CannedMessageConfig_inputbroker_pin_a_tag 2
#define ModuleConfig_CannedMessageConfig_inputbroker_pin_b_tag 3
#define ModuleConfig_CannedMessageConfig_inputbroker_pin_press_tag 4
#define ModuleConfig_CannedMessageConfig_inputbroker_event_cw_tag 5
#define ModuleConfig_CannedMessageConfig_inputbroker_event_ccw_tag 6
#define ModuleConfig_CannedMessageConfig_inputbroker_event_press_tag 7
#define ModuleConfig_CannedMessageConfig_updown1_enabled_tag 8
#define ModuleConfig_CannedMessageConfig_enabled_tag 9
#define ModuleConfig_CannedMessageConfig_allow_input_source_tag 10
#define ModuleConfig_CannedMessageConfig_send_bell_tag 11
#define ModuleConfig_mqtt_tag 1
#define ModuleConfig_serial_tag 2
#define ModuleConfig_external_notification_tag 3

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "mqtt.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_MQTT_PB_H_INCLUDED
#define PB_MQTT_PB_H_INCLUDED

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "portnums.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_PORTNUMS_PB_H_INCLUDED
#define PB_PORTNUMS_PB_H_INCLUDED
@ -95,16 +95,16 @@ typedef enum _PortNum {
PortNum_MAX = 511
} PortNum;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _PortNum_MIN PortNum_UNKNOWN_APP
#define _PortNum_MAX PortNum_MAX
#define _PortNum_ARRAYSIZE ((PortNum)(PortNum_MAX+1))
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "remote_hardware.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_REMOTE_HARDWARE_PB_H_INCLUDED
#define PB_REMOTE_HARDWARE_PB_H_INCLUDED
@ -10,12 +10,21 @@
#endif
/* Enum definitions */
/* TODO: REPLACE */
typedef enum _HardwareMessage_Type {
/* Unset/unused */
HardwareMessage_Type_UNSET = 0,
/* Set gpio gpios based on gpio_mask/gpio_value */
HardwareMessage_Type_WRITE_GPIOS = 1,
/* We are now interested in watching the gpio_mask gpios.
If the selected gpios change, please broadcast GPIOS_CHANGED.
Will implicitly change the gpios requested to be INPUT gpios. */
HardwareMessage_Type_WATCH_GPIOS = 2,
/* The gpios listed in gpio_mask have changed, the new values are listed in gpio_value */
HardwareMessage_Type_GPIOS_CHANGED = 3,
/* Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated */
HardwareMessage_Type_READ_GPIOS = 4,
/* A reply to READ_GPIOS. gpio_mask and gpio_value will be populated */
HardwareMessage_Type_READ_GPIOS_REPLY = 5
} HardwareMessage_Type;
@ -40,15 +49,17 @@ typedef struct _HardwareMessage {
} HardwareMessage;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _HardwareMessage_Type_MIN HardwareMessage_Type_UNSET
#define _HardwareMessage_Type_MAX HardwareMessage_Type_READ_GPIOS_REPLY
#define _HardwareMessage_Type_ARRAYSIZE ((HardwareMessage_Type)(HardwareMessage_Type_READ_GPIOS_REPLY+1))
#define HardwareMessage_type_ENUMTYPE HardwareMessage_Type
#ifdef __cplusplus
extern "C" {
#endif
/* Initializer values for message structs */
#define HardwareMessage_init_default {_HardwareMessage_Type_MIN, 0, 0}

View File

@ -10,8 +10,8 @@
#endif
/* Enum definitions */
/* 001 - 063 = From Router
064 - 127 = From Client */
/* 1 - 99 = From Router
101 - 199 = From Client */
typedef enum _StoreAndForward_RequestResponse {
/* Unset/unused */
StoreAndForward_RequestResponse_UNSET = 0,
@ -29,16 +29,16 @@ typedef enum _StoreAndForward_RequestResponse {
/* Router is responding to a request for history. */
StoreAndForward_RequestResponse_ROUTER_HISTORY = 6,
/* Client is an in error state. */
StoreAndForward_RequestResponse_CLIENT_ERROR = 64,
StoreAndForward_RequestResponse_CLIENT_ERROR = 101,
/* Client has requested a replay from the router. */
StoreAndForward_RequestResponse_CLIENT_HISTORY = 65,
StoreAndForward_RequestResponse_CLIENT_HISTORY = 102,
/* Client has requested stats from the router. */
StoreAndForward_RequestResponse_CLIENT_STATS = 66,
StoreAndForward_RequestResponse_CLIENT_STATS = 103,
/* Client has requested the router respond. This can work as a
"are you there" message. */
StoreAndForward_RequestResponse_CLIENT_PING = 67,
StoreAndForward_RequestResponse_CLIENT_PING = 104,
/* The response to a "Ping" */
StoreAndForward_RequestResponse_CLIENT_PONG = 68,
StoreAndForward_RequestResponse_CLIENT_PONG = 105,
/* Client has requested that the router abort processing the client's request */
StoreAndForward_RequestResponse_CLIENT_ABORT = 106
} StoreAndForward_RequestResponse;
@ -88,17 +88,15 @@ typedef struct _StoreAndForward_Heartbeat {
typedef struct _StoreAndForward {
/* TODO: REPLACE */
StoreAndForward_RequestResponse rr;
pb_size_t which_variant;
union {
/* TODO: REPLACE */
StoreAndForward_Statistics stats;
/* TODO: REPLACE */
StoreAndForward_History history;
/* TODO: REPLACE */
StoreAndForward_Heartbeat heartbeat;
/* Empty Payload */
bool empty;
} variant;
/* TODO: REPLACE */
bool has_stats;
StoreAndForward_Statistics stats;
/* TODO: REPLACE */
bool has_history;
StoreAndForward_History history;
/* TODO: REPLACE */
bool has_heartbeat;
StoreAndForward_Heartbeat heartbeat;
} StoreAndForward;
@ -118,11 +116,11 @@ extern "C" {
/* Initializer values for message structs */
#define StoreAndForward_init_default {_StoreAndForward_RequestResponse_MIN, 0, {StoreAndForward_Statistics_init_default}}
#define StoreAndForward_init_default {_StoreAndForward_RequestResponse_MIN, false, StoreAndForward_Statistics_init_default, false, StoreAndForward_History_init_default, false, StoreAndForward_Heartbeat_init_default}
#define StoreAndForward_Statistics_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define StoreAndForward_History_init_default {0, 0, 0}
#define StoreAndForward_Heartbeat_init_default {0, 0}
#define StoreAndForward_init_zero {_StoreAndForward_RequestResponse_MIN, 0, {StoreAndForward_Statistics_init_zero}}
#define StoreAndForward_init_zero {_StoreAndForward_RequestResponse_MIN, false, StoreAndForward_Statistics_init_zero, false, StoreAndForward_History_init_zero, false, StoreAndForward_Heartbeat_init_zero}
#define StoreAndForward_Statistics_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define StoreAndForward_History_init_zero {0, 0, 0}
#define StoreAndForward_Heartbeat_init_zero {0, 0}
@ -146,20 +144,18 @@ extern "C" {
#define StoreAndForward_stats_tag 2
#define StoreAndForward_history_tag 3
#define StoreAndForward_heartbeat_tag 4
#define StoreAndForward_empty_tag 5
/* Struct field encoding specification for nanopb */
#define StoreAndForward_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, rr, 1) \
X(a, STATIC, ONEOF, MESSAGE, (variant,stats,variant.stats), 2) \
X(a, STATIC, ONEOF, MESSAGE, (variant,history,variant.history), 3) \
X(a, STATIC, ONEOF, MESSAGE, (variant,heartbeat,variant.heartbeat), 4) \
X(a, STATIC, ONEOF, BOOL, (variant,empty,variant.empty), 5)
X(a, STATIC, OPTIONAL, MESSAGE, stats, 2) \
X(a, STATIC, OPTIONAL, MESSAGE, history, 3) \
X(a, STATIC, OPTIONAL, MESSAGE, heartbeat, 4)
#define StoreAndForward_CALLBACK NULL
#define StoreAndForward_DEFAULT NULL
#define StoreAndForward_variant_stats_MSGTYPE StoreAndForward_Statistics
#define StoreAndForward_variant_history_MSGTYPE StoreAndForward_History
#define StoreAndForward_variant_heartbeat_MSGTYPE StoreAndForward_Heartbeat
#define StoreAndForward_stats_MSGTYPE StoreAndForward_Statistics
#define StoreAndForward_history_MSGTYPE StoreAndForward_History
#define StoreAndForward_heartbeat_MSGTYPE StoreAndForward_Heartbeat
#define StoreAndForward_Statistics_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, messages_total, 1) \
@ -202,7 +198,7 @@ extern const pb_msgdesc_t StoreAndForward_Heartbeat_msg;
#define StoreAndForward_Heartbeat_size 12
#define StoreAndForward_History_size 18
#define StoreAndForward_Statistics_size 50
#define StoreAndForward_size 54
#define StoreAndForward_size 88
#ifdef __cplusplus
} /* extern "C" */

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#include "telemetry.pb.h"
#if PB_PROTO_HEADER_VERSION != 40

View File

@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.6 */
/* Generated by nanopb-0.4.7 */
#ifndef PB_TELEMETRY_PB_H_INCLUDED
#define PB_TELEMETRY_PB_H_INCLUDED
@ -85,15 +85,18 @@ typedef struct _Telemetry {
} Telemetry;
#ifdef __cplusplus
extern "C" {
#endif
/* Helper constants for enums */
#define _TelemetrySensorType_MIN TelemetrySensorType_SENSOR_UNSET
#define _TelemetrySensorType_MAX TelemetrySensorType_QMC5883L
#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_QMC5883L+1))
#ifdef __cplusplus
extern "C" {
#endif
/* Initializer values for message structs */
#define DeviceMetrics_init_default {0, 0, 0, 0}