diff --git a/README.md b/README.md index 74be814..a291992 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Meshtastic-protobufs [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/meshtastic/Meshtastic-protobufs) +[![CI](https://github.com/meshtastic/Meshtastic-protobufs/actions/workflows/ci.yml/badge.svg)](https://github.com/meshtastic/Meshtastic-protobufs/actions/workflows/ci.yml) The protobuf definitions for the Meshtastic project (used by apps and the device code) diff --git a/admin.options b/admin.options index 7f0f5d7..8f8a1c2 100644 --- a/admin.options +++ b/admin.options @@ -1 +1,7 @@ -*AdminMessage.variant anonymous_oneof:true \ No newline at end of file +*AdminMessage.variant anonymous_oneof:true + +*AdminMessage.set_canned_message_plugin_part1 max_size:200 +*AdminMessage.set_canned_message_plugin_part2 max_size:200 +*AdminMessage.set_canned_message_plugin_part3 max_size:200 +*AdminMessage.set_canned_message_plugin_part4 max_size:200 +*AdminMessage.set_canned_message_plugin_part5 max_size:200 diff --git a/admin.proto b/admin.proto index 0b85324..2ba4e2a 100644 --- a/admin.proto +++ b/admin.proto @@ -4,6 +4,7 @@ option java_package = "com.geeksville.mesh"; option optimize_for = LITE_RUNTIME; option go_package = "github.com/meshtastic/gomeshproto"; +import "cannedmessages.proto"; import "channel.proto"; import "mesh.proto"; import "radioconfig.proto"; @@ -76,5 +77,65 @@ message AdminMessage { * Tell the node to reboot in this many seconds (or <0 to cancel reboot) */ int32 reboot_seconds = 35; + + /* + * Get the Canned Message Plugin message part1 in the response to this message. + */ + bool get_canned_message_plugin_part1_request = 36; + CannedMessagePluginMessagePart1 get_canned_message_plugin_part1_response = 37; + + /* + * Get the Canned Message Plugin message part2 in the response to this message. + */ + bool get_canned_message_plugin_part2_request = 38; + CannedMessagePluginMessagePart2 get_canned_message_plugin_part2_response = 39; + + /* + * Get the Canned Message Plugin message part3 in the response to this message. + */ + bool get_canned_message_plugin_part3_request = 40; + CannedMessagePluginMessagePart3 get_canned_message_plugin_part3_response = 41; + + /* + * Get the Canned Message Plugin message part4 in the response to this message. + */ + bool get_canned_message_plugin_part4_request = 42; + CannedMessagePluginMessagePart4 get_canned_message_plugin_part4_response = 43; + + /* + * Get the Canned Message Plugin message part5 in the response to this message. + */ + bool get_canned_message_plugin_part5_request = 44; + CannedMessagePluginMessagePart5 get_canned_message_plugin_part5_response = 45; + + /* + * Set the canned message plugin part 1 text. + */ + CannedMessagePluginMessagePart1 set_canned_message_plugin_part1 = 46; + + /* + * Set the canned message plugin part 2 text. + */ + CannedMessagePluginMessagePart2 set_canned_message_plugin_part2 = 47; + + /* + * Set the canned message plugin part 3 text. + */ + CannedMessagePluginMessagePart3 set_canned_message_plugin_part3 = 48; + + /* + * Set the canned message plugin part 4 text. + */ + CannedMessagePluginMessagePart4 set_canned_message_plugin_part4 = 49; + + /* + * Set the canned message plugin part 5 text. + */ + CannedMessagePluginMessagePart5 set_canned_message_plugin_part5 = 50; + + /* + * Tell the node to shutdown in this many seconds (or <0 to cancel shutdown) + */ + int32 shutdown_seconds = 51; } -} +} // AdminMessage diff --git a/cannedmessages.options b/cannedmessages.options new file mode 100644 index 0000000..d06a327 --- /dev/null +++ b/cannedmessages.options @@ -0,0 +1,5 @@ +*CannedMessagePluginMessagePart1.text max_size:200 +*CannedMessagePluginMessagePart2.text max_size:200 +*CannedMessagePluginMessagePart3.text max_size:200 +*CannedMessagePluginMessagePart4.text max_size:200 +*CannedMessagePluginMessagePart5.text max_size:200 diff --git a/cannedmessages.proto b/cannedmessages.proto new file mode 100644 index 0000000..8a249da --- /dev/null +++ b/cannedmessages.proto @@ -0,0 +1,81 @@ +syntax = "proto3"; +/* + * Meshtastic protobufs + * + * For more information on protobufs (and tools to use them with the language of your choice) see + * https://developers.google.com/protocol-buffers/docs/proto3 + * + * We are not placing any of these defs inside a package, because if you do the + * resulting nanopb version is super verbose package mesh. + * + * Protobuf build instructions: + * + * To build java classes for reading writing: + * protoc -I=. --java_out /tmp mesh.proto + * + * To generate Nanopb c code: + * /home/kevinh/packages/nanopb-0.4.0-linux-x86/generator-bin/protoc --nanopb_out=/tmp -I=app/src/main/proto mesh.proto + * + * Nanopb binaries available here: https://jpa.kapsi.fi/nanopb/download/ use nanopb 0.4.0 + */ + +option java_package = "com.geeksville.mesh"; +option java_outer_classname = "CannedMessageConfigProtos"; +option optimize_for = LITE_RUNTIME; +option go_package = "github.com/meshtastic/gomeshproto"; + +/* + * Canned message plugin part 1 + */ +message CannedMessagePluginMessagePart1 { + /* + * Predefined messages for canned message plugin separated by '|' characters. + * This is part 1. + */ + string text = 1; +} + +/* + * Canned message plugin part 2 + */ +message CannedMessagePluginMessagePart2 { + /* + * Predefined messages for canned message plugin separated by '|' characters. + * This is part 2. + */ + string text = 1; +} + +/* + * Canned message plugin part 3 + */ +message CannedMessagePluginMessagePart3 { + /* + * Predefined messages for canned message plugin separated by '|' characters. + * This is part 3. + */ + string text = 1; +} + +/* + * Canned message plugin part 4 + */ +message CannedMessagePluginMessagePart4 { + /* + * Predefined messages for canned message plugin separated by '|' characters. + * This is part 4. + */ + string text = 1; +} + +/* + * Canned message plugin part 5 + */ +message CannedMessagePluginMessagePart5 { + /* + * Predefined messages for canned message plugin separated by '|' characters. + * This is part 5. + */ + string text = 1; +} + diff --git a/deviceonly.options b/deviceonly.options index 9e04083..321174a 100644 --- a/deviceonly.options +++ b/deviceonly.options @@ -7,5 +7,11 @@ # FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in RAM *DeviceState.receive_queue max_count:1 +*DeviceState.canned_message_plugin_message_part1 max_size:200 +*DeviceState.canned_message_plugin_message_part2 max_size:200 +*DeviceState.canned_message_plugin_message_part3 max_size:200 +*DeviceState.canned_message_plugin_message_part4 max_size:200 +*DeviceState.canned_message_plugin_message_part5 max_size:200 + *ChannelFile.channels max_count:8 diff --git a/deviceonly.proto b/deviceonly.proto index 0d3110a..7a68534 100644 --- a/deviceonly.proto +++ b/deviceonly.proto @@ -87,6 +87,32 @@ message DeviceState { * Some GPSes seem to have bogus settings from the factory, so we always do one factory reset. */ bool did_gps_reset = 11; + + /* + * Canned Message Plugin message part1. + */ + string canned_message_plugin_message_part1 = 13; + + /* + * Canned Message Plugin message part2. + */ + string canned_message_plugin_message_part2 = 14; + + /* + * Canned Message Plugin message part3. + */ + string canned_message_plugin_message_part3 = 15; + + /* + * Canned Message Plugin message part4. + */ + string canned_message_plugin_message_part4 = 16; + + /* + * Canned Message Plugin message part5. + */ + string canned_message_plugin_message_part5 = 17; + } /* diff --git a/radioconfig.options b/radioconfig.options index 1a95b78..c56c4d3 100644 --- a/radioconfig.options +++ b/radioconfig.options @@ -9,3 +9,5 @@ *UserPreferences.mqtt_username max_size:32 *UserPreferences.mqtt_password max_size:32 +*UserPreferences.canned_message_plugin_allow_input_source max_size:16 +*UserPreferences.canned_message_plugin_messages max_size:200 diff --git a/radioconfig.proto b/radioconfig.proto index 4f1b448..e551cf9 100644 --- a/radioconfig.proto +++ b/radioconfig.proto @@ -217,6 +217,18 @@ enum PositionFlags { POS_TIMESTAMP = 0x0100; } +enum InputEventChar { + KEY_NONE = 0; + KEY_UP = 17; + KEY_DOWN = 18; + KEY_LEFT = 19; + KEY_RIGHT = 20; + /* '\n' */ + KEY_SELECT = 10; + KEY_BACK = 27; + KEY_CANCEL = 24; +} + /* * The entire set of user settable/readable settings for our radio device. * Includes both the current channel settings and any preferences the user has @@ -539,6 +551,11 @@ message RadioConfig { enum EnvironmentalMeasurementSensorType { DHT11 = 0; DS18B20 = 1; + DHT12 = 2; + DHT21 = 3; + DHT22 = 4; + BME280 = 5; + BME680 = 6; }; /* @@ -571,13 +588,13 @@ message RadioConfig { /* * If non-zero, the device will fully power off this many seconds after external power is removed. - * + * */ uint32 on_battery_shutdown_after_secs = 153; /* * Overrides HOPS_RELIABLE and sets the maximum number of hops. This can't be greater than 7. - * + * */ uint32 hop_limit = 154; @@ -587,7 +604,7 @@ message RadioConfig { * If using the default server, this will only be honoured if set, otherwise the device will use the default username */ string mqtt_username = 155; - + /* * MQTT password to use (most useful for a custom MQTT server). * If using a custom server, this will be honoured even if empty. @@ -606,7 +623,67 @@ message RadioConfig { */ bool is_power_saving = 158; - } + /* + * Enable the rotary encoder #1 + */ + bool rotary1_enabled = 160; + /* + * GPIO pin for rotary encoder A port. + */ + uint32 rotary1_pin_a = 161; + + /* + * GPIO pin for rotary encoder B port. + */ + uint32 rotary1_pin_b = 162; + + /* + * GPIO pin for rotary encoder Press port. + */ + uint32 rotary1_pin_press = 163; + + /* + * Generate input event on CW of this kind. + */ + InputEventChar rotary1_event_cw = 164; + + /* + * Generate input event on CCW of this kind. + */ + InputEventChar rotary1_event_ccw = 165; + + /* + * Generate input event on Press of this kind. + */ + InputEventChar rotary1_event_press = 166; + + /* + * Enable/disable CannedMessagePlugin. + */ + bool canned_message_plugin_enabled = 170; + + /* + * Input event origin accepted by the canned message plugin. + * Can be e.g. "rotEnc1" or keyword "_any" + */ + string canned_message_plugin_allow_input_source = 171; + + /* + * Predefined messages for CannedMessagePlugin separated by '|' characters. + * Note: Split out the messages out to their own messages because we want to store 1,000 characters. + * and the entire message must fit within 256 bytes. + * Not sure if we should deprecate this or just remove it since we're in dev phase. + */ + string canned_message_plugin_messages = 172 [deprecated = true]; + + /* + * CannedMessagePlugin also sends a bell character with the messages. + * ExternalNotificationPlugin can benefit from this feature. + */ + bool canned_message_plugin_send_bell = 173; + } UserPreferences preferences = 1; -} + +} // RadioConfig +