diff --git a/meshtastic/atak.options b/meshtastic/atak.options index 6baa7ea..cec1ca3 100644 --- a/meshtastic/atak.options +++ b/meshtastic/atak.options @@ -5,3 +5,4 @@ *GeoChat.message max_size:200 *GeoChat.to max_size:120 *GeoChat.to_callsign max_size:120 +*TAKPacket.detail max_size:220 \ No newline at end of file diff --git a/meshtastic/atak.proto b/meshtastic/atak.proto index ccde335..5dc08c9 100644 --- a/meshtastic/atak.proto +++ b/meshtastic/atak.proto @@ -40,6 +40,12 @@ message TAKPacket { * ATAK GeoChat message */ GeoChat chat = 6; + + /* + * Generic CoT detail XML + * May be compressed / truncated by the sender (EUD) + */ + bytes detail = 7; } } diff --git a/meshtastic/clientonly.options b/meshtastic/clientonly.options index bc98b39..c47944a 100644 --- a/meshtastic/clientonly.options +++ b/meshtastic/clientonly.options @@ -1,2 +1,4 @@ *DeviceProfile.long_name max_size:40 -*DeviceProfile.short_name max_size:5 \ No newline at end of file +*DeviceProfile.short_name max_size:5 +*DeviceProfile.ringtone max_size:231 +*DeviceProfile.canned_messages max_size:201 \ No newline at end of file diff --git a/meshtastic/clientonly.proto b/meshtastic/clientonly.proto index b1a27b1..2b919ef 100644 --- a/meshtastic/clientonly.proto +++ b/meshtastic/clientonly.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package meshtastic; import "meshtastic/localonly.proto"; +import "meshtastic/mesh.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; @@ -39,4 +40,19 @@ message DeviceProfile { * The ModuleConfig of the node */ optional LocalModuleConfig module_config = 5; + + /* + * Fixed position data + */ + optional Position fixed_position = 6; + + /* + * Ringtone for ExternalNotification + */ + optional string ringtone = 7; + + /* + * Predefined messages for CannedMessage + */ + optional string canned_messages = 8; } diff --git a/meshtastic/config.options b/meshtastic/config.options index ecd4679..9310cf0 100644 --- a/meshtastic/config.options +++ b/meshtastic/config.options @@ -19,4 +19,4 @@ *SecurityConfig.public_key max_size:32 *SecurityConfig.private_key max_size:32 *SecurityConfig.admin_key max_size:32 -*SecurityConfig.admin_key max_count:1 +*SecurityConfig.admin_key max_count:3 diff --git a/meshtastic/config.proto b/meshtastic/config.proto index 66d149f..54f1be7 100644 --- a/meshtastic/config.proto +++ b/meshtastic/config.proto @@ -802,6 +802,21 @@ message Config { * Singapore 923mhz */ SG_923 = 18; + + /* + * Philippines 433mhz + */ + PH_433 = 19; + + /* + * Philippines 868mhz + */ + PH_868 = 20; + + /* + * Philippines 915mhz + */ + PH_915 = 21; } /* @@ -973,6 +988,11 @@ message Config { * If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it. */ bool ignore_mqtt = 104; + + /* + * Sets the ok_to_mqtt bit on outgoing packets + */ + bool config_ok_to_mqtt = 105; } message BluetoothConfig { @@ -1070,4 +1090,4 @@ message Config { SecurityConfig security = 8; SessionkeyConfig sessionkey = 9; } -} \ No newline at end of file +} diff --git a/meshtastic/deviceonly.proto b/meshtastic/deviceonly.proto index b3fb440..91367bf 100644 --- a/meshtastic/deviceonly.proto +++ b/meshtastic/deviceonly.proto @@ -141,7 +141,7 @@ message NodeInfoLite { /* * Number of hops away from us this node is (0 if adjacent) */ - uint32 hops_away = 9; + optional uint32 hops_away = 9; /* * True if node is in our favorites list diff --git a/meshtastic/mesh.options b/meshtastic/mesh.options index 541e4c9..cb85daa 100644 --- a/meshtastic/mesh.options +++ b/meshtastic/mesh.options @@ -18,6 +18,7 @@ # 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 *Data.payload max_size:237 +*Data.bitfield int_size:8 *NodeInfo.channel int_size:8 *NodeInfo.hops_away int_size:8 @@ -72,4 +73,4 @@ *ChunkedPayload.chunk_count int_size:16 *ChunkedPayload.chunk_index int_size:16 -*ChunkedPayload.payload_chunk max_size:228 \ No newline at end of file +*ChunkedPayload.payload_chunk max_size:228 diff --git a/meshtastic/mesh.proto b/meshtastic/mesh.proto index 23d2b9c..6b9be53 100644 --- a/meshtastic/mesh.proto +++ b/meshtastic/mesh.proto @@ -338,6 +338,11 @@ enum HardwareModel { * Heltec HRU-3601: https://heltec.org/project/hru-3601/ */ HELTEC_HRU_3601 = 23; + + /* + * Heltec Wireless Bridge + */ + HELTEC_WIRELESS_BRIDGE = 24; /* * B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station @@ -427,7 +432,7 @@ enum HardwareModel { DR_DEV = 41; /* - * M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, Paper) https://m5stack.com/ + * M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ */ M5STACK = 42; @@ -619,10 +624,31 @@ enum HardwareModel { * ^^^ short A0 to switch to I2C address 0x3C * */ -RP2040_FEATHER_RFM95 = 76; - /* M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, Paper) https://m5stack.com/ */ - M5STACK_COREBASIC=77; - M5STACK_CORE2=78; + RP2040_FEATHER_RFM95 = 76; + + /* M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ */ + M5STACK_COREBASIC = 77; + M5STACK_CORE2 = 78; + + /* Pico2 with Waveshare Hat, same as Pico */ + RPI_PICO2 = 79; + + /* M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, CoreS3, Paper) https://m5stack.com/ */ + M5STACK_CORES3 = 80; + + /* Seeed XIAO S3 DK*/ + SEEED_XIAO_S3 = 81; + + /* + * Nordic nRF52840+Semtech SX1262 LoRa BLE Combo Module. nRF52840+SX1262 MS24SF1 + */ + MS24SF1 = 82; + + /* + * Lilygo TLora-C6 with the new ESP32-C6 MCU + */ + TLORA_C6 = 83; + /* * ------------------------------------------------------------------------------------------------------------------------------------------ * Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. @@ -811,7 +837,17 @@ message Routing { /* * The receiving node does not have a Public Key to decode with */ - PKI_UNKNOWN_PUBKEY = 35; + PKI_UNKNOWN_PUBKEY = 35; + + /* + * Admin packet otherwise checks out, but uses a bogus or expired session key + */ + ADMIN_BAD_SESSION_KEY = 36; + + /* + * Admin packet sent using PKC, but not from a public key on the admin key list + */ + ADMIN_PUBLIC_KEY_UNAUTHORIZED = 37; } oneof variant { @@ -888,6 +924,11 @@ message Data { * a message a heart or poop emoji. */ fixed32 emoji = 8; + + /* + * Bitfield for extra flags. First use is to indicate that user approves the packet being uploaded to MQTT. + */ + optional uint32 bitfield = 9; } /* @@ -1301,7 +1342,7 @@ message NodeInfo { /* * Number of hops away from us this node is (0 if adjacent) */ - uint32 hops_away = 9; + optional uint32 hops_away = 9; /* * True if node is in our favorites list @@ -1813,6 +1854,11 @@ message DeviceMetadata { * Has Remote Hardware enabled */ bool hasRemoteHardware = 10; + + /* + * Has PKC capabilities + */ + bool hasPKC = 11; } /* @@ -1889,4 +1935,4 @@ message ChunkedPayloadResponse { */ resend_chunks resend_chunks = 4; } -} \ No newline at end of file +} diff --git a/meshtastic/module_config.options b/meshtastic/module_config.options index 68aba7c..fdde1b3 100644 --- a/meshtastic/module_config.options +++ b/meshtastic/module_config.options @@ -26,3 +26,4 @@ *DetectionSensorConfig.monitor_pin int_size:8 *DetectionSensorConfig.name max_size:20 +*DetectionSensorConfig.detection_trigger_type max_size:8 diff --git a/meshtastic/module_config.proto b/meshtastic/module_config.proto index 9945e1b..933d142 100644 --- a/meshtastic/module_config.proto +++ b/meshtastic/module_config.proto @@ -137,20 +137,39 @@ message ModuleConfig { * Detection Sensor Module Config */ message DetectionSensorConfig { + + enum TriggerType { + // Event is triggered if pin is low + LOGIC_LOW = 0; + // Event is triggered if pin is high + LOGIC_HIGH = 1; + // Event is triggered when pin goes high to low + FALLING_EDGE = 2; + // Event is triggered when pin goes low to high + RISING_EDGE = 3; + // Event is triggered on every pin state change, low is considered to be + // "active" + EITHER_EDGE_ACTIVE_LOW = 4; + // Event is triggered on every pin state change, high is considered to be + // "active" + EITHER_EDGE_ACTIVE_HIGH = 5; + } /* * Whether the Module is enabled */ bool enabled = 1; /* - * Interval in seconds of how often we can send a message to the mesh when a state change is detected + * Interval in seconds of how often we can send a message to the mesh when a + * trigger event is detected */ uint32 minimum_broadcast_secs = 2; /* - * Interval in seconds of how often we should send a message to the mesh with the current state regardless of changes - * When set to 0, only state changes will be broadcasted - * Works as a sort of status heartbeat for peace of mind + * Interval in seconds of how often we should send a message to the mesh + * with the current state regardless of trigger events When set to 0, only + * trigger events will be broadcasted Works as a sort of status heartbeat + * for peace of mind */ uint32 state_broadcast_secs = 3; @@ -173,10 +192,9 @@ message ModuleConfig { uint32 monitor_pin = 6; /* - * Whether or not the GPIO pin state detection is triggered on HIGH (1) - * Otherwise LOW (0) + * The type of trigger event to be used */ - bool detection_triggered_high = 7; + TriggerType detection_trigger_type = 7; /* * Whether or not use INPUT_PULLUP mode for GPIO pin @@ -545,22 +563,37 @@ message ModuleConfig { uint32 air_quality_interval = 7; /* - * Interval in seconds of how often we should try to send our - * air quality metrics to the mesh + * Enable/disable Power metrics */ bool power_measurement_enabled = 8; /* * Interval in seconds of how often we should try to send our - * air quality metrics to the mesh + * power metrics to the mesh */ uint32 power_update_interval = 9; /* - * Interval in seconds of how often we should try to send our - * air quality metrics to the mesh + * Enable/Disable the power measurement module on-device display */ bool power_screen_enabled = 10; + + /* + * Preferences for the (Health) Telemetry Module + * Enable/Disable the telemetry measurement module measurement collection + */ + bool health_measurement_enabled = 11; + + /* + * Interval in seconds of how often we should try to send our + * health metrics to the mesh + */ + uint32 health_update_interval = 12; + + /* + * Enable/Disable the health telemetry module on-device display + */ + bool health_screen_enabled = 13; } /* diff --git a/meshtastic/telemetry.options b/meshtastic/telemetry.options index 073412a..79b1f12 100644 --- a/meshtastic/telemetry.options +++ b/meshtastic/telemetry.options @@ -6,3 +6,6 @@ *LocalStats.num_online_nodes int_size:16 *LocalStats.num_total_nodes int_size:16 + +*HealthMetrics.heart_bpm int_size:8 +*HealthMetrics.spO2 int_size:8 diff --git a/meshtastic/telemetry.proto b/meshtastic/telemetry.proto index 72bb418..c3b896b 100644 --- a/meshtastic/telemetry.proto +++ b/meshtastic/telemetry.proto @@ -128,11 +128,6 @@ message EnvironmentMetrics { * Wind lull in m/s */ optional float wind_lull = 17; - - /* - * CO2 measurement in ppm - */ - optional uint32 co2 = 18; } /* @@ -258,7 +253,7 @@ message LocalStats { uint32 num_packets_tx = 4; /* - * Number of packets received good + * Number of packets received (both good and bad) */ uint32 num_packets_rx = 5; @@ -276,6 +271,43 @@ message LocalStats { * Number of nodes total */ uint32 num_total_nodes = 8; + + /* + * Number of received packets that were duplicates (due to multiple nodes relaying). + * If this number is high, there are nodes in the mesh relaying packets when it's unnecessary, for example due to the ROUTER/REPEATER role. + */ + uint32 num_rx_dupe = 9; + + /* + * Number of packets we transmitted that were a relay for others (not originating from ourselves). + */ + uint32 num_tx_relay = 10; + + /* + * Number of times we canceled a packet to be relayed, because someone else did it before us. + * This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you. + */ + uint32 num_tx_relay_canceled = 11; +} + +/* + * Health telemetry metrics + */ + message HealthMetrics { + /* + * Heart rate (beats per minute) + */ + optional uint32 heart_bpm = 1; + + /* + * SpO2 (blood oxygen saturation) level + */ + optional uint32 spO2 = 2; + + /* + * Body temperature in degrees Celsius + */ + optional float temperature = 3; } /* @@ -312,6 +344,11 @@ message Telemetry { * Local device mesh statistics */ LocalStats local_stats = 6; + + /* + * Health telemetry metrics + */ + HealthMetrics health_metrics = 7; } } @@ -468,11 +505,16 @@ enum TelemetrySensorType { * Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor */ CUSTOM_SENSOR = 29; + + /* + * MAX30102 Pulse Oximeter and Heart-Rate Sensor + */ + MAX30102 = 30; /* - * SCD40/SCD41 CO2, humidity, temperature sensor + * MLX90614 non-contact IR temperature sensor. */ - SCD4X = 30; + MLX90614 = 31; } /*