feat(protobufs): sync to firmware-current and consume workspace package (#1097)
* feat(protobufs): sync to firmware-current and consume workspace package Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*). Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true. * build(protobufs): vendor generated bindings for workspace consumers The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen * fix(protobufs): clean script removes the actual generated output dir buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback. * refactor: move web app packages/web -> apps/web Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green. * feat: config fields, module pages, key verification, telemetry capture Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green. * chore: drop #1062 (unsaved-change-detection) to match upstream revert #1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green. * fix(nodes): clean up SNR display in node table and map popup SNR is a ratio measured in dB, not dBm (which is absolute power); the node table and map popup both mislabeled it and crammed three values together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same heuristic ((snr+10)*5) shown twice — once clamped, once not. Render SNR in dB rounded to one decimal, color-coded by a 0-100% signal-quality heuristic (green/yellow/red), with the quality percentage as a muted secondary. Drop the redundant raw value. Adds unit.db; this matches the existing SNRTooltip, which already renders dB.
This commit is contained in:
@@ -2,6 +2,7 @@ syntax = "proto3";
|
||||
|
||||
package meshtastic;
|
||||
|
||||
/* trunk-ignore(buf-lint/COMPILE) */
|
||||
import "meshtastic/channel.proto";
|
||||
import "meshtastic/config.proto";
|
||||
import "meshtastic/connection_status.proto";
|
||||
@@ -12,7 +13,7 @@ import "meshtastic/module_config.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "AdminProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -151,6 +152,21 @@ message AdminMessage {
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
PAXCOUNTER_CONFIG = 12;
|
||||
|
||||
/*
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
STATUSMESSAGE_CONFIG = 13;
|
||||
|
||||
/*
|
||||
* Traffic management module config
|
||||
*/
|
||||
TRAFFICMANAGEMENT_CONFIG = 14;
|
||||
|
||||
/*
|
||||
* TAK module config
|
||||
*/
|
||||
TAK_CONFIG = 15;
|
||||
}
|
||||
|
||||
enum BackupLocation {
|
||||
@@ -187,6 +203,23 @@ message AdminMessage {
|
||||
uint32 touch_y = 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* User is requesting an over the air update.
|
||||
* Node will reboot into the OTA loader
|
||||
*/
|
||||
message OTAEvent {
|
||||
/*
|
||||
* Tell the node to reboot into OTA mode for firmware update via BLE or WiFi (ESP32 only for now)
|
||||
*/
|
||||
OTAMode reboot_ota_mode = 1;
|
||||
|
||||
/*
|
||||
* A 32 byte hash of the OTA firmware.
|
||||
* Used to verify the integrity of the firmware before applying an update.
|
||||
*/
|
||||
bytes ota_hash = 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
@@ -414,6 +447,11 @@ message AdminMessage {
|
||||
*/
|
||||
uint32 remove_ignored_node = 48;
|
||||
|
||||
/*
|
||||
* Set specified node-num to be muted
|
||||
*/
|
||||
uint32 toggle_muted_node = 49;
|
||||
|
||||
/*
|
||||
* Begins an edit transaction for config, module config, owner, and channel settings changes
|
||||
* This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings)
|
||||
@@ -443,8 +481,9 @@ message AdminMessage {
|
||||
/*
|
||||
* Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot)
|
||||
* Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth.
|
||||
* Deprecated in favor of reboot_ota_mode in 2.7.17
|
||||
*/
|
||||
int32 reboot_ota_seconds = 95;
|
||||
int32 reboot_ota_seconds = 95 [deprecated = true];
|
||||
|
||||
/*
|
||||
* This message is only supported for the simulator Portduino build.
|
||||
@@ -469,11 +508,164 @@ message AdminMessage {
|
||||
|
||||
/*
|
||||
* Tell the node to reset the nodedb.
|
||||
* When true, favorites are preserved through reset.
|
||||
*/
|
||||
int32 nodedb_reset = 100;
|
||||
bool nodedb_reset = 100;
|
||||
|
||||
/*
|
||||
* Tell the node to reset into the OTA Loader
|
||||
*/
|
||||
OTAEvent ota_request = 102;
|
||||
|
||||
/*
|
||||
* Parameters and sensor configuration
|
||||
*/
|
||||
SensorConfig sensor_config = 103;
|
||||
|
||||
/*
|
||||
* Lockdown passphrase delivery / unlock / lock-now command for hardened
|
||||
* firmware builds (see MESHTASTIC_LOCKDOWN). Used to provision the
|
||||
* passphrase on first boot, unlock encrypted storage on subsequent
|
||||
* reboots, re-verify on already-unlocked devices to authorize a new
|
||||
* client connection, or immediately re-lock the device.
|
||||
*
|
||||
* Replaces the earlier scheme that repurposed SecurityConfig.private_key
|
||||
* to carry passphrase bytes; that hack is retired.
|
||||
*/
|
||||
LockdownAuth lockdown_auth = 104;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Lockdown passphrase delivery payload.
|
||||
*
|
||||
* One message handles three operations distinguished by content:
|
||||
* - Provision (first-time): passphrase set, lock_now=false. Firmware
|
||||
* generates DEK, wraps with passphrase-derived KEK, persists.
|
||||
* - Unlock: passphrase set, lock_now=false. Firmware verifies
|
||||
* passphrase against stored DEK, unlocks storage, authorizes the
|
||||
* connection that delivered this packet.
|
||||
* - Lock now: lock_now=true, passphrase ignored. Firmware revokes
|
||||
* all client auth and reboots into the locked state.
|
||||
*
|
||||
* Firmware decides between provision and unlock based on its own state
|
||||
* (whether a DEK file already exists). Clients do not need to track
|
||||
* which case applies.
|
||||
*/
|
||||
message LockdownAuth {
|
||||
/*
|
||||
* Passphrase bytes (1-32). Empty when lock_now is true.
|
||||
* Capped to 32 to match the proto cap on related security fields.
|
||||
*/
|
||||
bytes passphrase = 1;
|
||||
|
||||
/*
|
||||
* Optional override of the boot-count token TTL granted on success.
|
||||
* 0 = use firmware default (TOKEN_DEFAULT_BOOTS).
|
||||
* On reboot the firmware decrements this; when it reaches 0 the
|
||||
* device boots fully locked and requires a fresh passphrase.
|
||||
*/
|
||||
uint32 boots_remaining = 2;
|
||||
|
||||
/*
|
||||
* Optional wall-clock expiry for the unlock token, as absolute
|
||||
* Unix-epoch seconds. 0 = no time limit (only the boot-count TTL
|
||||
* applies). On boot, if the device RTC is set and now > this value,
|
||||
* the token is treated as expired.
|
||||
*/
|
||||
uint32 valid_until_epoch = 3;
|
||||
|
||||
/*
|
||||
* If true, ignore passphrase fields, immediately revoke all
|
||||
* connection-level admin authorization, and reboot the device into
|
||||
* the locked state. Always honoured regardless of current lock state.
|
||||
*/
|
||||
bool lock_now = 4;
|
||||
|
||||
/*
|
||||
* Optional per-boot uptime cap on the unlocked session, in seconds.
|
||||
* 0 = unlimited (token-only enforcement, suitable for unattended
|
||||
* tower / infrastructure nodes).
|
||||
*
|
||||
* When non-zero, the firmware arms an uptime timer at unlock. On
|
||||
* each expiry, while there is still boot-count budget, the firmware
|
||||
* decrements the on-flash boot count in place, revokes per-
|
||||
* connection admin auth (clients must re-authenticate to see
|
||||
* content), re-engages the screen lock, and re-arms the timer
|
||||
* without rebooting. Mesh routing keeps running across session
|
||||
* boundaries; only when the boot-count budget reaches zero does
|
||||
* the device hard-lock and reboot.
|
||||
*
|
||||
* Total exposure ceiling = ((resolved boot count) + 1) * max_session_seconds.
|
||||
* The +1 accounts for the initial passphrase-unlocked session
|
||||
* itself, since boots_remaining is the number of subsequent
|
||||
* session rolls (each consuming one boot from the rollback ledger).
|
||||
* The resolved boot count is the value the firmware writes into the
|
||||
* token at unlock time: the client-supplied boots_remaining when
|
||||
* non-zero, otherwise the firmware default (TOKEN_DEFAULT_BOOTS).
|
||||
* Note that boots_remaining == 0 in this message means "use firmware
|
||||
* default", NOT "zero boots" — a client computing the ceiling for
|
||||
* display should mirror that resolution rather than multiplying the
|
||||
* raw request value.
|
||||
*
|
||||
* The cap is persisted in the token, so it survives token-based
|
||||
* auto-unlock across reboots. Explicit operator Lock Now still
|
||||
* deletes the token and forces passphrase re-entry.
|
||||
*
|
||||
* Uses millis() (CPU uptime), not wall-clock time, so the cap is
|
||||
* immune to GPS spoofing, RTC backup-battery removal, and Faraday
|
||||
* cage isolation — none of those move the uptime counter. The only
|
||||
* way to reset the session clock is a reboot, which costs a boot
|
||||
* from the on-flash, HMAC-bound counter.
|
||||
*/
|
||||
uint32 max_session_seconds = 5;
|
||||
|
||||
/*
|
||||
* Disable lockdown mode. Requires a valid passphrase in the same
|
||||
* message (the device must prove the operator owns it before
|
||||
* reverting at-rest encryption). On success the firmware decrypts
|
||||
* every stored config / channel / nodedb file back to plaintext,
|
||||
* removes the wrapped DEK, unlock token, monotonic-counter, and
|
||||
* backoff files, and reboots out of lockdown.
|
||||
*
|
||||
* This is the inverse of the provision/unlock path: it is how the
|
||||
* client app's "lockdown mode" toggle returns a device to normal
|
||||
* operation.
|
||||
*
|
||||
* NOT reversed by this operation: APPROTECT. Once the debug port
|
||||
* lockout has been burned (on silicon where it is effective) it is
|
||||
* permanent — disabling lockdown decrypts your data and removes the
|
||||
* access gates, but the SWD/JTAG port stays locked for the life of
|
||||
* the device (recoverable only via a full chip erase over a debug
|
||||
* probe, which destroys all data). Clients should make this
|
||||
* irreversibility clear at the moment lockdown is first enabled.
|
||||
*
|
||||
* When true the passphrase field is still required; boots_remaining,
|
||||
* valid_until_epoch, max_session_seconds, and lock_now are ignored.
|
||||
*/
|
||||
bool disable = 6;
|
||||
}
|
||||
|
||||
/*
|
||||
* Firmware update mode for OTA updates
|
||||
*/
|
||||
enum OTAMode {
|
||||
/*
|
||||
* Do not reboot into OTA mode
|
||||
*/
|
||||
NO_REBOOT_OTA = 0;
|
||||
|
||||
/*
|
||||
* Reboot into OTA mode for BLE firmware update
|
||||
*/
|
||||
OTA_BLE = 1;
|
||||
|
||||
/*
|
||||
* Reboot into OTA mode for WiFi firmware update
|
||||
*/
|
||||
OTA_WIFI = 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parameters for setting up Meshtastic for ameteur radio usage
|
||||
*/
|
||||
@@ -499,6 +691,12 @@ message HamParameters {
|
||||
* Optional short name of user
|
||||
*/
|
||||
string short_name = 4;
|
||||
|
||||
/*
|
||||
* Optional long name of user
|
||||
* Appended to callsign
|
||||
*/
|
||||
string long_name = 5;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -580,3 +778,113 @@ message KeyVerificationAdmin {
|
||||
*/
|
||||
optional uint32 security_number = 4;
|
||||
}
|
||||
|
||||
message SensorConfig {
|
||||
/*
|
||||
* SCD4X CO2 Sensor configuration
|
||||
*/
|
||||
SCD4X_config scd4x_config = 1;
|
||||
|
||||
/*
|
||||
* SEN5X PM Sensor configuration
|
||||
*/
|
||||
SEN5X_config sen5x_config = 2;
|
||||
|
||||
/*
|
||||
* SCD30 CO2 Sensor configuration
|
||||
*/
|
||||
SCD30_config scd30_config = 3;
|
||||
|
||||
/*
|
||||
* SHTXX temperature and relative humidity sensor configuration
|
||||
*/
|
||||
SHTXX_config shtxx_config = 4;
|
||||
}
|
||||
|
||||
message SCD4X_config {
|
||||
/*
|
||||
* Set Automatic self-calibration enabled
|
||||
*/
|
||||
optional bool set_asc = 1;
|
||||
|
||||
/*
|
||||
* Recalibration target CO2 concentration in ppm (FRC or ASC)
|
||||
*/
|
||||
optional uint32 set_target_co2_conc = 2;
|
||||
|
||||
/*
|
||||
* Reference temperature in degC
|
||||
*/
|
||||
optional float set_temperature = 3;
|
||||
|
||||
/*
|
||||
* Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure)
|
||||
*/
|
||||
optional uint32 set_altitude = 4;
|
||||
|
||||
/*
|
||||
* Sensor ambient pressure in Pa. 70000 - 120000 Pa (overrides altitude)
|
||||
*/
|
||||
optional uint32 set_ambient_pressure = 5;
|
||||
|
||||
/*
|
||||
* Perform a factory reset of the sensor
|
||||
*/
|
||||
optional bool factory_reset = 6;
|
||||
|
||||
/*
|
||||
* Power mode for sensor (true for low power, false for normal)
|
||||
*/
|
||||
optional bool set_power_mode = 7;
|
||||
}
|
||||
|
||||
message SEN5X_config {
|
||||
/*
|
||||
* Reference temperature in degC
|
||||
*/
|
||||
optional float set_temperature = 1;
|
||||
|
||||
/*
|
||||
* One-shot mode (true for low power - one-shot mode, false for normal - continuous mode)
|
||||
*/
|
||||
optional bool set_one_shot_mode = 2;
|
||||
}
|
||||
|
||||
message SCD30_config {
|
||||
/*
|
||||
* Set Automatic self-calibration enabled
|
||||
*/
|
||||
optional bool set_asc = 1;
|
||||
|
||||
/*
|
||||
* Recalibration target CO2 concentration in ppm (FRC or ASC)
|
||||
*/
|
||||
optional uint32 set_target_co2_conc = 2;
|
||||
|
||||
/*
|
||||
* Reference temperature in degC
|
||||
*/
|
||||
optional float set_temperature = 3;
|
||||
|
||||
/*
|
||||
* Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure)
|
||||
*/
|
||||
optional uint32 set_altitude = 4;
|
||||
|
||||
/*
|
||||
* Power mode for sensor (true for low power, false for normal)
|
||||
*/
|
||||
optional uint32 set_measurement_interval = 5;
|
||||
|
||||
/*
|
||||
* Perform a factory reset of the sensor
|
||||
*/
|
||||
optional bool soft_reset = 6;
|
||||
}
|
||||
|
||||
message SHTXX_config {
|
||||
/*
|
||||
* Accuracy mode (0 = low, 1 = medium, 2 = high)
|
||||
*/
|
||||
optional uint32 set_accuracy = 1;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import "meshtastic/config.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "AppOnlyProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "CannedMessageConfigProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
syntax = "proto3";
|
||||
|
||||
/* trunk-ignore(buf-lint/PACKAGE_DIRECTORY_MATCH) */
|
||||
package meshtastic;
|
||||
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "ChannelProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -86,11 +87,6 @@ message ChannelSettings {
|
||||
* Per-channel module settings.
|
||||
*/
|
||||
ModuleSettings module_settings = 7;
|
||||
|
||||
/*
|
||||
* Whether or not we should receive notifactions / alerts through this channel
|
||||
*/
|
||||
bool mute = 8;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -103,10 +99,10 @@ message ModuleSettings {
|
||||
uint32 position_precision = 1;
|
||||
|
||||
/*
|
||||
* Controls whether or not the phone / clients should mute the current channel
|
||||
* Controls whether or not the client / device should mute the current channel
|
||||
* Useful for noisy public channels you don't necessarily want to disable
|
||||
*/
|
||||
bool is_client_muted = 2;
|
||||
bool is_muted = 2;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -8,7 +8,7 @@ import "meshtastic/mesh.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "ClientOnlyProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -7,7 +7,7 @@ import "meshtastic/device_ui.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "ConfigProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
message Config {
|
||||
@@ -111,7 +111,7 @@ message Config {
|
||||
ROUTER_LATE = 11;
|
||||
|
||||
/*
|
||||
* Description: Treats packets from or to favorited nodes as ROUTER, and all other packets as CLIENT.
|
||||
* Description: Treats packets from or to favorited nodes as ROUTER_LATE, and all other packets as CLIENT.
|
||||
* Technical Details: Used for stronger attic/roof nodes to distribute messages more widely
|
||||
* from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes
|
||||
* where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node.
|
||||
@@ -648,6 +648,11 @@ message Config {
|
||||
* Can not be auto detected but set by proto. Used for 128x128 screens
|
||||
*/
|
||||
OLED_SH1107_128_128 = 4;
|
||||
|
||||
/*
|
||||
* Can not be auto detected but set by proto. Used for 64x128 rotated screens
|
||||
*/
|
||||
OLED_SH1107_ROTATED = 5;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -783,6 +788,11 @@ message Config {
|
||||
* If true, node names will show in long format
|
||||
*/
|
||||
bool use_long_node_name = 13;
|
||||
|
||||
/*
|
||||
* If true, the device will display message bubbles on screen.
|
||||
*/
|
||||
bool enable_message_bubbles = 14;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -924,6 +934,62 @@ message Config {
|
||||
* Brazil 902MHz
|
||||
*/
|
||||
BR_902 = 26;
|
||||
|
||||
/*
|
||||
* ITU Region 1 Amateur Radio 2m band (144-146 MHz)
|
||||
*/
|
||||
ITU1_2M = 27;
|
||||
|
||||
/*
|
||||
* ITU Region 2 Amateur Radio 2m band (144-148 MHz)
|
||||
*/
|
||||
ITU2_2M = 28;
|
||||
|
||||
/*
|
||||
* EU 866MHz band (Band no. 47b of 2006/771/EC and subsequent amendments) for Non-specific short-range devices (SRD)
|
||||
*/
|
||||
EU_866 = 29;
|
||||
|
||||
/*
|
||||
* EU 874MHz and 917MHz bands (Band no. 1 and 4 of 2022/172/EC and subsequent amendments) for Non-specific short-range devices (SRD)
|
||||
*/
|
||||
EU_874 = 30;
|
||||
EU_917 = 31;
|
||||
|
||||
/*
|
||||
* EU 868MHz band, with narrow presets
|
||||
*/
|
||||
EU_N_868 = 32;
|
||||
|
||||
/*
|
||||
* ITU Region 3 Amateur Radio 2m band (144-148 MHz)
|
||||
*/
|
||||
ITU3_2M = 33;
|
||||
|
||||
/*
|
||||
* ITU Region 1 Amateur Radio 70cm band (430-440 MHz)
|
||||
*/
|
||||
ITU1_70CM = 34;
|
||||
|
||||
/*
|
||||
* ITU Region 2 Amateur Radio 70cm band (420-450 MHz)
|
||||
* Note: Some countries do not allocate 420-430 MHz or 440-450 MHz.
|
||||
* Check local law!
|
||||
*/
|
||||
ITU2_70CM = 35;
|
||||
|
||||
/*
|
||||
* ITU Region 3 Amateur Radio 70cm band (430-450 MHz)
|
||||
* Note: Some countries do not allocate 440-450 MHz. Check local law!
|
||||
*/
|
||||
ITU3_70CM = 36;
|
||||
|
||||
/*
|
||||
* ITU Region 2 Amateur Radio 1.25m '125cm' band (220-225 MHz)
|
||||
* Note: Some countries do not allocate 220-222 MHz (Ex: USA/Canada).
|
||||
* Check local law!
|
||||
*/
|
||||
ITU2_125CM = 37;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -938,8 +1004,9 @@ message Config {
|
||||
|
||||
/*
|
||||
* Long Range - Slow
|
||||
* Deprecated in 2.7: Unpopular slow preset.
|
||||
*/
|
||||
LONG_SLOW = 1;
|
||||
LONG_SLOW = 1 [deprecated = true];
|
||||
|
||||
/*
|
||||
* Very Long Range - Slow
|
||||
@@ -978,6 +1045,78 @@ message Config {
|
||||
* It is not legal to use in all regions due to this wider bandwidth.
|
||||
*/
|
||||
SHORT_TURBO = 8;
|
||||
|
||||
/*
|
||||
* Long Range - Turbo
|
||||
* This preset performs similarly to LongFast, but with 500Khz bandwidth.
|
||||
*/
|
||||
LONG_TURBO = 9;
|
||||
|
||||
/*
|
||||
* Lite Fast
|
||||
* Medium range preset optimized for EU 866MHz SRD band with 125kHz bandwidth.
|
||||
* Comparable link budget to MEDIUM_FAST but compliant with Band no. 47b of 2006/771/EC.
|
||||
*/
|
||||
LITE_FAST = 10;
|
||||
|
||||
/*
|
||||
* Lite Slow
|
||||
* Medium-to-moderate range preset optimized for EU 866MHz SRD band with 125kHz bandwidth.
|
||||
* Comparable link budget to LONG_FAST but compliant with Band no. 47b of 2006/771/EC.
|
||||
*/
|
||||
LITE_SLOW = 11;
|
||||
|
||||
/*
|
||||
* Narrow Fast
|
||||
* Medium-to-moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth.
|
||||
* Comparable link budget to SHORT_SLOW, but with half the data rate.
|
||||
* Intended to avoid interference with other devices.
|
||||
*/
|
||||
NARROW_FAST = 12;
|
||||
|
||||
/*
|
||||
* Narrow Slow
|
||||
* Moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth.
|
||||
* Comparable link budget and data rate to LONG_FAST.
|
||||
*/
|
||||
NARROW_SLOW = 13;
|
||||
|
||||
/*
|
||||
* Tiny Fast
|
||||
* Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth.
|
||||
* Many regions limit data transmission bandwidth in lower amateur bands (2 Meter).
|
||||
* Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths.
|
||||
* Only compatible with SX127x and SX126x chipsets.
|
||||
* Comparable link budget and data rate to LONG_FAST.
|
||||
*/
|
||||
TINY_FAST = 14;
|
||||
|
||||
/*
|
||||
* Tiny Slow
|
||||
* Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth.
|
||||
* Many regions limit data transmission bandwidth in lower amateur bands (2 Meter).
|
||||
* Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths.
|
||||
* Only compatible with SX127x and SX126x chipsets.
|
||||
* Comparable link budget and data rate to LONG_MODERATE.
|
||||
*/
|
||||
TINY_SLOW = 15;
|
||||
}
|
||||
|
||||
enum FEM_LNA_Mode {
|
||||
/*
|
||||
* FEM_LNA is present but disabled
|
||||
*/
|
||||
DISABLED = 0;
|
||||
|
||||
/*
|
||||
* FEM_LNA is present and enabled
|
||||
*/
|
||||
ENABLED = 1;
|
||||
|
||||
/*
|
||||
* FEM_LNA is not present on the device
|
||||
*/
|
||||
NOT_PRESENT = 2;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1100,6 +1239,16 @@ message Config {
|
||||
* Sets the ok_to_mqtt bit on outgoing packets
|
||||
*/
|
||||
bool config_ok_to_mqtt = 105;
|
||||
|
||||
/*
|
||||
* Set where LORA FEM is enabled, disabled, or not present
|
||||
*/
|
||||
FEM_LNA_Mode fem_lna_mode = 106;
|
||||
|
||||
/*
|
||||
* Don't use radiolib to initialize the radio, instead listen for a serialHal connection
|
||||
*/
|
||||
bool serial_hal_only = 107;
|
||||
}
|
||||
|
||||
message BluetoothConfig {
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "ConnStatusProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
message DeviceConnectionStatus {
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "DeviceUIProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -2,6 +2,7 @@ syntax = "proto3";
|
||||
|
||||
package meshtastic;
|
||||
|
||||
/* trunk-ignore(buf-lint/COMPILE) */
|
||||
import "meshtastic/channel.proto";
|
||||
import "meshtastic/config.proto";
|
||||
import "meshtastic/localonly.proto";
|
||||
@@ -12,7 +13,7 @@ import "nanopb.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "DeviceOnly";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
option (nanopb_fileopt).include = "<vector>";
|
||||
|
||||
@@ -49,6 +50,11 @@ message PositionLite {
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
Position.LocSource location_source = 5;
|
||||
|
||||
/*
|
||||
* Indicates the bits of precision set by the sending node
|
||||
*/
|
||||
uint32 precision_bits = 6;
|
||||
}
|
||||
|
||||
message UserLite {
|
||||
@@ -106,20 +112,15 @@ message NodeInfoLite {
|
||||
*/
|
||||
uint32 num = 1;
|
||||
|
||||
/*
|
||||
* The user info for this node
|
||||
*/
|
||||
UserLite user = 2;
|
||||
// Tag 2 was UserLite user; flattened into tags 14..18 (presence via
|
||||
// NODEINFO_BITFIELD_HAS_USER).
|
||||
// Tag 3 was PositionLite position; moved to NodeDatabase.positions.
|
||||
reserved 2, 3;
|
||||
reserved "user", "position";
|
||||
|
||||
/*
|
||||
* This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true.
|
||||
* Position.time now indicates the last time we received a POSITION from that node.
|
||||
*/
|
||||
PositionLite position = 3;
|
||||
|
||||
/*
|
||||
* Returns the Signal-to-noise ratio (SNR) of the last received message,
|
||||
* as measured by the receiver. Return SNR of the last received message in dB
|
||||
* In-memory SNR of the last received message in dB. Not serialised directly:
|
||||
* always zeroed before encode; persisted as snr_q4 = 19 below.
|
||||
*/
|
||||
float snr = 4;
|
||||
|
||||
@@ -127,48 +128,69 @@ message NodeInfoLite {
|
||||
* Set to indicate the last time we received a packet from this node
|
||||
*/
|
||||
fixed32 last_heard = 5;
|
||||
/*
|
||||
* The latest device metrics for the node.
|
||||
*/
|
||||
DeviceMetrics device_metrics = 6;
|
||||
|
||||
// Tag 6 was DeviceMetrics device_metrics; moved to NodeDatabase.telemetry.
|
||||
reserved 6;
|
||||
reserved "device_metrics";
|
||||
|
||||
/*
|
||||
* local channel index we heard that node on. Only populated if its not the default channel.
|
||||
*/
|
||||
uint32 channel = 7;
|
||||
|
||||
/*
|
||||
* True if we witnessed the node over MQTT instead of LoRA transport
|
||||
*/
|
||||
bool via_mqtt = 8;
|
||||
// Tags 8/10/11 were via_mqtt/is_favorite/is_ignored bools; packed into bitfield.
|
||||
reserved 8, 10, 11;
|
||||
reserved "via_mqtt", "is_favorite", "is_ignored";
|
||||
|
||||
/*
|
||||
* Number of hops away from us this node is (0 if direct neighbor)
|
||||
*/
|
||||
optional uint32 hops_away = 9;
|
||||
|
||||
/*
|
||||
* True if node is in our favorites list
|
||||
* Persists between NodeDB internal clean ups
|
||||
*/
|
||||
bool is_favorite = 10;
|
||||
|
||||
/*
|
||||
* True if node is in our ignored list
|
||||
* Persists between NodeDB internal clean ups
|
||||
*/
|
||||
bool is_ignored = 11;
|
||||
|
||||
/*
|
||||
* Last byte of the node number of the node that should be used as the next hop to reach this node.
|
||||
*/
|
||||
uint32 next_hop = 12;
|
||||
|
||||
/*
|
||||
* Bitfield for storing booleans.
|
||||
* LSB 0 is_key_manually_verified
|
||||
* Bitfield for storing booleans. See NODEINFO_BITFIELD_* in src/mesh/NodeDB.h.
|
||||
*/
|
||||
uint32 bitfield = 13;
|
||||
|
||||
// Flattened user fields (formerly UserLite). macaddr dropped (deprecated 1.2.11).
|
||||
|
||||
/*
|
||||
* A full name for this user, i.e. "Kevin Hester".
|
||||
*/
|
||||
string long_name = 14;
|
||||
|
||||
/*
|
||||
* A VERY short name, ideally two characters or an emoji.
|
||||
* Suitable for a tiny OLED screen.
|
||||
*/
|
||||
string short_name = 15;
|
||||
|
||||
/*
|
||||
* Hardware model the user's device is running.
|
||||
*/
|
||||
HardwareModel hw_model = 16;
|
||||
|
||||
/*
|
||||
* The user's role in the mesh.
|
||||
*/
|
||||
Config.DeviceConfig.Role role = 17;
|
||||
|
||||
/*
|
||||
* The public key of the user's device, for PKI-based encrypted DMs.
|
||||
*/
|
||||
bytes public_key = 18;
|
||||
|
||||
/*
|
||||
* Q4-encoded SNR: dB × 4, sint32 zigzag. Matches RouteDiscovery convention.
|
||||
* Encode: snr_q4 = (int32_t)(snr * 4.0f). Decode: snr = snr_q4 / 4.0f.
|
||||
* float snr is always zeroed on disk; this field carries all persisted SNR.
|
||||
*/
|
||||
sint32 snr_q4 = 19;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -234,6 +256,29 @@ message DeviceState {
|
||||
repeated NodeRemoteHardwarePin node_remote_hardware_pins = 13;
|
||||
}
|
||||
|
||||
// Satellite per-node entries; stored alongside the slim NodeInfoLite so nodes
|
||||
// that never report don't pay the embedded cost.
|
||||
|
||||
message NodePositionEntry {
|
||||
uint32 num = 1;
|
||||
PositionLite position = 2;
|
||||
}
|
||||
|
||||
message NodeTelemetryEntry {
|
||||
uint32 num = 1;
|
||||
DeviceMetrics device_metrics = 2;
|
||||
}
|
||||
|
||||
message NodeEnvironmentEntry {
|
||||
uint32 num = 1;
|
||||
EnvironmentMetrics environment_metrics = 2;
|
||||
}
|
||||
|
||||
message NodeStatusEntry {
|
||||
uint32 num = 1;
|
||||
StatusMessage status = 2;
|
||||
}
|
||||
|
||||
message NodeDatabase {
|
||||
/*
|
||||
* A version integer used to invalidate old save files when we make
|
||||
@@ -246,6 +291,13 @@ message NodeDatabase {
|
||||
* New lite version of NodeDB to decrease memory footprint
|
||||
*/
|
||||
repeated NodeInfoLite nodes = 2 [(nanopb).callback_datatype = "std::vector<meshtastic_NodeInfoLite>"];
|
||||
|
||||
// Per-NodeNum satellite arrays. Constrained platforms (e.g. STM32WL) omit
|
||||
// these via MESHTASTIC_EXCLUDE_*DB build flags.
|
||||
repeated NodePositionEntry positions = 3 [(nanopb).callback_datatype = "std::vector<meshtastic_NodePositionEntry>"];
|
||||
repeated NodeTelemetryEntry telemetry = 4 [(nanopb).callback_datatype = "std::vector<meshtastic_NodeTelemetryEntry>"];
|
||||
repeated NodeStatusEntry status = 5 [(nanopb).callback_datatype = "std::vector<meshtastic_NodeStatusEntry>"];
|
||||
repeated NodeEnvironmentEntry environment = 6 [(nanopb).callback_datatype = "std::vector<meshtastic_NodeEnvironmentEntry>"];
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package meshtastic;
|
||||
|
||||
/* trunk-ignore(buf-lint/COMPILE) */
|
||||
import "meshtastic/deviceonly.proto";
|
||||
import "meshtastic/telemetry.proto";
|
||||
import "nanopb.proto";
|
||||
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "DeviceOnlyLegacy";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
option (nanopb_fileopt).include = "<vector>";
|
||||
|
||||
/*
|
||||
* Legacy NodeInfoLite descriptor used only to decode pre-split
|
||||
* /prefs/nodes.proto saves during the v24 -> v25 migration boot.
|
||||
* This preserves the original NodeInfoLite-compatible field numbers needed
|
||||
* to parse old wire bytes cleanly, including user (2), position (3),
|
||||
* device_metrics (6), and the legacy-only compatibility fields via_mqtt (8),
|
||||
* is_favorite (10), and is_ignored (11). Steady-state code does not use
|
||||
* this struct; it is dropped after migration completes. This file should be
|
||||
* removed once DEVICESTATE_MIN_VER advances past 24.
|
||||
*/
|
||||
message NodeInfoLite_Legacy {
|
||||
uint32 num = 1;
|
||||
UserLite user = 2;
|
||||
PositionLite position = 3;
|
||||
float snr = 4;
|
||||
fixed32 last_heard = 5;
|
||||
DeviceMetrics device_metrics = 6;
|
||||
uint32 channel = 7;
|
||||
bool via_mqtt = 8;
|
||||
optional uint32 hops_away = 9;
|
||||
bool is_favorite = 10;
|
||||
bool is_ignored = 11;
|
||||
uint32 next_hop = 12;
|
||||
uint32 bitfield = 13;
|
||||
}
|
||||
|
||||
/*
|
||||
* Legacy NodeDatabase shape: one repeated array of fat NodeInfoLite_Legacy
|
||||
* with no satellite position/telemetry arrays.
|
||||
*/
|
||||
message NodeDatabase_Legacy {
|
||||
uint32 version = 1;
|
||||
repeated NodeInfoLite_Legacy nodes = 2 [(nanopb).callback_datatype = "std::vector<meshtastic_NodeInfoLite_Legacy>"];
|
||||
}
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "InterdeviceProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
// encapsulate up to 1k of NMEA string data
|
||||
|
||||
@@ -8,7 +8,7 @@ import "meshtastic/module_config.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "LocalOnlyProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -131,6 +131,21 @@ message LocalModuleConfig {
|
||||
*/
|
||||
ModuleConfig.PaxcounterConfig paxcounter = 14;
|
||||
|
||||
/*
|
||||
* StatusMessage Config
|
||||
*/
|
||||
ModuleConfig.StatusMessageConfig statusmessage = 15;
|
||||
|
||||
/*
|
||||
* The part of the config that is specific to the Traffic Management module
|
||||
*/
|
||||
ModuleConfig.TrafficManagementConfig traffic_management = 16;
|
||||
|
||||
/*
|
||||
* TAK Config
|
||||
*/
|
||||
ModuleConfig.TAKConfig tak = 17;
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
@@ -13,7 +13,7 @@ import "meshtastic/xmodem.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "MeshProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -388,9 +388,9 @@ enum HardwareModel {
|
||||
LORA_RELAY_V1 = 32;
|
||||
|
||||
/*
|
||||
* TODO: REPLACE
|
||||
* T-Echo Plus device from LilyGo
|
||||
*/
|
||||
NRF52840DK = 33;
|
||||
T_ECHO_PLUS = 33;
|
||||
|
||||
/*
|
||||
* TODO: REPLACE
|
||||
@@ -700,9 +700,9 @@ enum HardwareModel {
|
||||
HELTEC_SENSOR_HUB = 92;
|
||||
|
||||
/*
|
||||
* Reserved Fried Chicken ID for future use
|
||||
* Muzi Works Muzi-Base device
|
||||
*/
|
||||
RESERVED_FRIED_CHICKEN = 93;
|
||||
MUZI_BASE = 93;
|
||||
|
||||
/*
|
||||
* Heltec Magnetic Power Bank with Meshtastic compatible
|
||||
@@ -810,6 +810,129 @@ enum HardwareModel {
|
||||
*/
|
||||
T_WATCH_ULTRA = 114;
|
||||
|
||||
/*
|
||||
* Elecrow ThinkNode M3
|
||||
*/
|
||||
THINKNODE_M3 = 115;
|
||||
|
||||
/*
|
||||
* RAK WISMESH_TAP_V2 with ESP32-S3 CPU
|
||||
*/
|
||||
WISMESH_TAP_V2 = 116;
|
||||
|
||||
/*
|
||||
* RAK3401
|
||||
*/
|
||||
RAK3401 = 117;
|
||||
|
||||
/*
|
||||
* RAK6421 Hat+
|
||||
*/
|
||||
RAK6421 = 118;
|
||||
|
||||
/*
|
||||
* Elecrow ThinkNode M4
|
||||
*/
|
||||
THINKNODE_M4 = 119;
|
||||
|
||||
/*
|
||||
* Elecrow ThinkNode M6
|
||||
*/
|
||||
THINKNODE_M6 = 120;
|
||||
|
||||
/*
|
||||
* Elecrow Meshstick 1262
|
||||
*/
|
||||
MESHSTICK_1262 = 121;
|
||||
|
||||
/*
|
||||
* LilyGo T-Beam 1W
|
||||
*/
|
||||
TBEAM_1_WATT = 122;
|
||||
|
||||
/*
|
||||
* LilyGo T5 S3 ePaper Pro (V1 and V2)
|
||||
*/
|
||||
T5_S3_EPAPER_PRO = 123;
|
||||
|
||||
/*
|
||||
* LilyGo T-Beam BPF (144-148Mhz)
|
||||
*/
|
||||
TBEAM_BPF = 124;
|
||||
|
||||
/*
|
||||
* LilyGo T-Mini E-paper S3 Kit
|
||||
*/
|
||||
MINI_EPAPER_S3 = 125;
|
||||
|
||||
/*
|
||||
* LilyGo T-Display S3 Pro LR1121
|
||||
*/
|
||||
TDISPLAY_S3_PRO = 126;
|
||||
|
||||
/*
|
||||
* Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen.
|
||||
*/
|
||||
HELTEC_MESH_NODE_T096 = 127;
|
||||
|
||||
/*
|
||||
* Seeed studio T1000-E Pro tracker card. NRF52840 w/ LR2021 radio,
|
||||
* GPS, button, buzzer, and sensors.
|
||||
*/
|
||||
TRACKER_T1000_E_PRO = 128;
|
||||
|
||||
/*
|
||||
* Elecrow ThinkNode M7, M8 and M9
|
||||
*/
|
||||
THINKNODE_M7 = 129;
|
||||
THINKNODE_M8 = 130;
|
||||
THINKNODE_M9 = 131;
|
||||
|
||||
/*
|
||||
* The Heltec-V4-R8 uses an ESP32S3R8 chip, plus an SX1262.
|
||||
*/
|
||||
HELTEC_V4_R8 = 132;
|
||||
|
||||
/*
|
||||
* The HELTEC_MESH_NODE_T1 uses an NRF52840 chip, plus an SX1262.
|
||||
*/
|
||||
HELTEC_MESH_NODE_T1 = 133;
|
||||
|
||||
/*
|
||||
* B&Q Consulting Station G3: TBD
|
||||
*/
|
||||
STATION_G3 = 134;
|
||||
|
||||
/*
|
||||
* Lilygo T-Impulse-Plus
|
||||
*/
|
||||
T_IMPULSE_PLUS = 135;
|
||||
|
||||
/*
|
||||
* Lilygo T-Echo Card
|
||||
*/
|
||||
T_ECHO_CARD = 136;
|
||||
|
||||
/*
|
||||
* Seeed Tracker L2
|
||||
*/
|
||||
SEEED_WIO_TRACKER_L2 = 137;
|
||||
|
||||
/*
|
||||
* Elecrow CrowPanel Advance P4 models, ESP32-P4 and TFT with SX1262 radio plugin
|
||||
*/
|
||||
CROWPANEL_P4 = 138;
|
||||
|
||||
/*
|
||||
* Heltec Mesh Tower V2
|
||||
*/
|
||||
HELTEC_MESH_TOWER_V2 = 139;
|
||||
|
||||
/*
|
||||
* Meshnology W10
|
||||
*/
|
||||
MESHNOLOGY_W10 = 140;
|
||||
|
||||
/*
|
||||
* ------------------------------------------------------------------------------------------------------------------------------------------
|
||||
* 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.
|
||||
@@ -851,6 +974,9 @@ message User {
|
||||
|
||||
/*
|
||||
* A full name for this user, i.e. "Kevin Hester"
|
||||
* Limited to 24 bytes of UTF-8: longer names are accepted from senders
|
||||
* built against the older 39-byte limit, but devices truncate them before
|
||||
* storing or rebroadcasting. Clients should enforce 24 bytes in their UI.
|
||||
*/
|
||||
string long_name = 2;
|
||||
|
||||
@@ -1020,6 +1146,12 @@ message Routing {
|
||||
* This typically enforced per portnum and is used to prevent a single node from monopolizing airtime
|
||||
*/
|
||||
RATE_LIMIT_EXCEEDED = 38;
|
||||
|
||||
/*
|
||||
* PKI encryption failed, due to no public key for the remote node
|
||||
* This is different from PKI_UNKNOWN_PUBKEY which indicates a failure upon receiving a packet
|
||||
*/
|
||||
PKI_SEND_FAIL_PUBLIC_KEY = 39;
|
||||
}
|
||||
|
||||
oneof variant {
|
||||
@@ -1101,6 +1233,11 @@ message Data {
|
||||
* Bitfield for extra flags. First use is to indicate that user approves the packet being uploaded to MQTT.
|
||||
*/
|
||||
optional uint32 bitfield = 9;
|
||||
|
||||
/*
|
||||
* XEdDSA signature for the payload
|
||||
*/
|
||||
bytes xeddsa_signature = 10;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1124,6 +1261,176 @@ message KeyVerification {
|
||||
bytes hash2 = 3;
|
||||
}
|
||||
|
||||
/*
|
||||
* The actual over-the-mesh message doing store and forward++
|
||||
*/
|
||||
message StoreForwardPlusPlus {
|
||||
/*
|
||||
* Enum of message types
|
||||
*/
|
||||
enum SFPP_message_type {
|
||||
/*
|
||||
* Send an announcement of the canonical tip of a chain
|
||||
*/
|
||||
CANON_ANNOUNCE = 0;
|
||||
|
||||
/*
|
||||
* Query whether a specific link is on the chain
|
||||
*/
|
||||
CHAIN_QUERY = 1;
|
||||
|
||||
/*
|
||||
* Request the next link in the chain
|
||||
*/
|
||||
LINK_REQUEST = 3;
|
||||
|
||||
/*
|
||||
* Provide a link to add to the chain
|
||||
*/
|
||||
LINK_PROVIDE = 4;
|
||||
|
||||
/*
|
||||
* If we must fragment, send the first half
|
||||
*/
|
||||
LINK_PROVIDE_FIRSTHALF = 5;
|
||||
|
||||
/*
|
||||
* If we must fragment, send the second half
|
||||
*/
|
||||
LINK_PROVIDE_SECONDHALF = 6;
|
||||
}
|
||||
|
||||
/*
|
||||
* Which message type is this
|
||||
*/
|
||||
SFPP_message_type sfpp_message_type = 1;
|
||||
|
||||
/*
|
||||
* The hash of the specific message
|
||||
*/
|
||||
bytes message_hash = 2;
|
||||
|
||||
/*
|
||||
* The hash of a link on a chain
|
||||
*/
|
||||
bytes commit_hash = 3;
|
||||
|
||||
/*
|
||||
* the root hash of a chain
|
||||
*/
|
||||
bytes root_hash = 4;
|
||||
|
||||
/*
|
||||
* The encrypted bytes from a message
|
||||
*/
|
||||
bytes message = 5;
|
||||
|
||||
/*
|
||||
* Message ID of the contained message
|
||||
*/
|
||||
uint32 encapsulated_id = 6;
|
||||
|
||||
/*
|
||||
* Destination of the contained message
|
||||
*/
|
||||
uint32 encapsulated_to = 7;
|
||||
|
||||
/*
|
||||
* Sender of the contained message
|
||||
*/
|
||||
uint32 encapsulated_from = 8;
|
||||
|
||||
/*
|
||||
* The receive time of the message in question
|
||||
*/
|
||||
uint32 encapsulated_rxtime = 9;
|
||||
|
||||
/*
|
||||
* Used in a LINK_REQUEST to specify the message X spots back from head
|
||||
*/
|
||||
uint32 chain_count = 10;
|
||||
}
|
||||
|
||||
/*
|
||||
* The actual over-the-mesh message doing RemoteShell
|
||||
*/
|
||||
message RemoteShell {
|
||||
/*
|
||||
* Frame op code for PTY session control and stream transport.
|
||||
*
|
||||
* Values 1-63 are client->server requests.
|
||||
* Values 64-127 are server->client responses/events.
|
||||
*/
|
||||
enum OpCode {
|
||||
OP_UNSET = 0;
|
||||
|
||||
// Client -> server
|
||||
OPEN = 1;
|
||||
INPUT = 2;
|
||||
RESIZE = 3;
|
||||
CLOSE = 4;
|
||||
PING = 5;
|
||||
ACK = 6;
|
||||
|
||||
// Server -> client
|
||||
OPEN_OK = 64;
|
||||
OUTPUT = 65;
|
||||
CLOSED = 66;
|
||||
ERROR = 67;
|
||||
PONG = 68;
|
||||
}
|
||||
|
||||
/*
|
||||
* Structured frame operation.
|
||||
*/
|
||||
OpCode op = 1;
|
||||
|
||||
/*
|
||||
* Logical PTY session identifier.
|
||||
*/
|
||||
uint32 session_id = 2;
|
||||
|
||||
/*
|
||||
* Monotonic sequence number for this frame.
|
||||
*/
|
||||
uint32 seq = 3;
|
||||
|
||||
/*
|
||||
* Cumulative ack sequence number.
|
||||
*/
|
||||
uint32 ack_seq = 4;
|
||||
|
||||
/*
|
||||
* Opaque bytes payload for INPUT/OUTPUT/ERROR and other frame bodies.
|
||||
*/
|
||||
bytes payload = 5;
|
||||
|
||||
/*
|
||||
* Terminal size columns used for OPEN/RESIZE signaling.
|
||||
*/
|
||||
uint32 cols = 6;
|
||||
|
||||
/*
|
||||
* Terminal size rows used for OPEN/RESIZE signaling.
|
||||
*/
|
||||
uint32 rows = 7;
|
||||
|
||||
/*
|
||||
* Bit flags for protocol extensions.
|
||||
*/
|
||||
uint32 flags = 8;
|
||||
|
||||
/*
|
||||
* The last sequence number TX'd.
|
||||
*/
|
||||
uint32 last_tx_seq = 9;
|
||||
|
||||
/*
|
||||
* The last sequence number RX'd.
|
||||
*/
|
||||
uint32 last_rx_seq = 10;
|
||||
}
|
||||
|
||||
/*
|
||||
* Waypoint message, used to share arbitrary locations across the mesh
|
||||
*/
|
||||
@@ -1170,6 +1477,13 @@ message Waypoint {
|
||||
fixed32 icon = 8;
|
||||
}
|
||||
|
||||
/*
|
||||
* Message for node status
|
||||
*/
|
||||
message StatusMessage {
|
||||
string status = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server
|
||||
*/
|
||||
@@ -1345,6 +1659,11 @@ message MeshPacket {
|
||||
* Arrived via API connection
|
||||
*/
|
||||
TRANSPORT_API = 7;
|
||||
|
||||
/*
|
||||
* Arrived via Unicast UDP
|
||||
*/
|
||||
TRANSPORT_UNICAST_UDP = 8;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1356,6 +1675,10 @@ message MeshPacket {
|
||||
|
||||
/*
|
||||
* The (immediate) destination for this packet
|
||||
* If the value is 4,294,967,295 (maximum value of an unsigned 32bit integer), this indicates that the packet was
|
||||
* not destined for a specific node, but for a channel as indicated by the value of `channel` below.
|
||||
* If the value is another, this indicates that the packet was destined for a specific
|
||||
* node (i.e. a kind of "Direct Message" to this node) and not broadcast on a channel.
|
||||
*/
|
||||
fixed32 to = 2;
|
||||
|
||||
@@ -1499,6 +1822,11 @@ message MeshPacket {
|
||||
* Indicates which transport mechanism this packet arrived over
|
||||
*/
|
||||
TransportMechanism transport_mechanism = 21;
|
||||
|
||||
/*
|
||||
* Indicates whether the packet has a valid signature
|
||||
*/
|
||||
bool xeddsa_signed = 22;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1629,6 +1957,19 @@ message NodeInfo {
|
||||
* LSB 0 of the bitfield
|
||||
*/
|
||||
bool is_key_manually_verified = 12;
|
||||
|
||||
/*
|
||||
* True if node has been muted
|
||||
* Persistes between NodeDB internal clean ups
|
||||
*/
|
||||
bool is_muted = 13;
|
||||
|
||||
/*
|
||||
* True if node is signing its packets via XEdDSA
|
||||
* Persists between NodeDB internal clean ups
|
||||
* LSB 1 of the bitfield
|
||||
*/
|
||||
bool has_xeddsa_signed = 14;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1987,9 +2328,105 @@ message FromRadio {
|
||||
* Persistent data for device-ui
|
||||
*/
|
||||
DeviceUIConfig deviceuiConfig = 17;
|
||||
|
||||
/*
|
||||
* Lockdown state notification for hardened firmware builds.
|
||||
* Sent post-config (so unauthorized clients learn they must
|
||||
* provision/unlock) and after each LockdownAuth admin command
|
||||
* to report success or failure. Replaces the earlier scheme of
|
||||
* encoding state as magic-string prefixes inside ClientNotification.
|
||||
*/
|
||||
LockdownStatus lockdown_status = 18;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Lockdown state report from firmware to client (for hardened builds
|
||||
* with MESHTASTIC_LOCKDOWN). Sent immediately after config_complete_id
|
||||
* to inform a freshly-connected unauthorized client what it must do,
|
||||
* and again in response to each LockdownAuth admin command.
|
||||
*/
|
||||
message LockdownStatus {
|
||||
enum State {
|
||||
/* Default; should not be sent. */
|
||||
STATE_UNSPECIFIED = 0;
|
||||
|
||||
/*
|
||||
* No passphrase has ever been provisioned on this device.
|
||||
* Client should prompt the operator to set one.
|
||||
*/
|
||||
NEEDS_PROVISION = 1;
|
||||
|
||||
/*
|
||||
* Storage is locked or this client has not authenticated yet.
|
||||
* lock_reason carries a machine-readable detail string.
|
||||
* Client should present (or auto-replay) a passphrase via
|
||||
* AdminMessage.lockdown_auth.
|
||||
*/
|
||||
LOCKED = 2;
|
||||
|
||||
/*
|
||||
* Passphrase accepted; client is now authorized for this connection.
|
||||
* boots_remaining and valid_until_epoch describe the active session
|
||||
* token's TTL.
|
||||
*/
|
||||
UNLOCKED = 3;
|
||||
|
||||
/*
|
||||
* Passphrase rejected. backoff_seconds is non-zero when rate-limited.
|
||||
*/
|
||||
UNLOCK_FAILED = 4;
|
||||
|
||||
/*
|
||||
* Lockdown is supported by this firmware but not currently active
|
||||
* (no passphrase has been provisioned, or it was disabled via
|
||||
* AdminMessage.lockdown_auth.disable). The device is operating in
|
||||
* normal, non-encrypted mode. Clients render the lockdown-mode
|
||||
* toggle as OFF on receiving this. Distinct from NEEDS_PROVISION,
|
||||
* which is only used during an in-progress enable flow.
|
||||
*/
|
||||
DISABLED = 5;
|
||||
}
|
||||
|
||||
/* Current lockdown state being reported. */
|
||||
State state = 1;
|
||||
|
||||
/*
|
||||
* For LOCKED: machine-readable reason. Known values:
|
||||
* "needs_auth" — storage already unlocked, client must auth
|
||||
* "token_missing" — no boot token on flash
|
||||
* "token_expired" — boot token wall-clock TTL elapsed
|
||||
* "token_boots_zero" — boot token boot-count TTL exhausted
|
||||
* "token_hmac_fail" — token tampered or wrong device
|
||||
* "token_dek_fail" — token DEK decrypt failed
|
||||
* "token_wrong_size" — token file corrupted
|
||||
* "token_bad_magic" — token file corrupted
|
||||
* "not_provisioned" — should generally use NEEDS_PROVISION state instead
|
||||
* Other values may be added; clients should treat unknown values as
|
||||
* "locked, ask for passphrase".
|
||||
*/
|
||||
string lock_reason = 2;
|
||||
|
||||
/*
|
||||
* For UNLOCKED: remaining boots on the issued session token.
|
||||
* Decrements by 1 on each subsequent boot.
|
||||
*/
|
||||
uint32 boots_remaining = 3;
|
||||
|
||||
/*
|
||||
* For UNLOCKED: wall-clock expiry of the issued session token,
|
||||
* absolute Unix-epoch seconds. 0 = no time limit.
|
||||
*/
|
||||
uint32 valid_until_epoch = 4;
|
||||
|
||||
/*
|
||||
* For UNLOCK_FAILED: seconds the client must wait before another
|
||||
* passphrase attempt will be accepted. 0 = wrong passphrase, no
|
||||
* backoff (immediate retry allowed but advisable to prompt user).
|
||||
*/
|
||||
uint32 backoff_seconds = 5;
|
||||
}
|
||||
|
||||
/*
|
||||
* A notification message from the device to the client
|
||||
* To be used for important messages that should to be displayed to the user
|
||||
|
||||
@@ -2,10 +2,12 @@ syntax = "proto3";
|
||||
|
||||
package meshtastic;
|
||||
|
||||
import "meshtastic/atak.proto";
|
||||
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "ModuleConfigProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -51,9 +53,9 @@ message ModuleConfig {
|
||||
bool encryption_enabled = 5;
|
||||
|
||||
/*
|
||||
* Whether to send / consume json packets on MQTT
|
||||
* Deprecated: JSON packet support on MQTT was removed, and this field is ignored.
|
||||
*/
|
||||
bool json_enabled = 6;
|
||||
bool json_enabled = 6 [deprecated = true];
|
||||
|
||||
/*
|
||||
* If true, we attempt to establish a secure connection using TLS
|
||||
@@ -295,6 +297,82 @@ message ModuleConfig {
|
||||
int32 ble_threshold = 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* Config for the Traffic Management module.
|
||||
* Provides packet inspection and traffic shaping to help reduce channel utilization
|
||||
*/
|
||||
message TrafficManagementConfig {
|
||||
/*
|
||||
* Master enable for traffic management module
|
||||
*/
|
||||
bool enabled = 1;
|
||||
|
||||
/*
|
||||
* Enable position deduplication to drop redundant position broadcasts
|
||||
*/
|
||||
bool position_dedup_enabled = 2;
|
||||
|
||||
/*
|
||||
* Number of bits of precision for position deduplication (0-32)
|
||||
*/
|
||||
uint32 position_precision_bits = 3;
|
||||
|
||||
/*
|
||||
* Minimum interval in seconds between position updates from the same node
|
||||
*/
|
||||
uint32 position_min_interval_secs = 4;
|
||||
|
||||
/*
|
||||
* Enable direct response to NodeInfo requests from local cache
|
||||
*/
|
||||
bool nodeinfo_direct_response = 5;
|
||||
|
||||
/*
|
||||
* Minimum hop distance from requestor before responding to NodeInfo requests
|
||||
*/
|
||||
uint32 nodeinfo_direct_response_max_hops = 6;
|
||||
|
||||
/*
|
||||
* Enable per-node rate limiting to throttle chatty nodes
|
||||
*/
|
||||
bool rate_limit_enabled = 7;
|
||||
|
||||
/*
|
||||
* Time window in seconds for rate limiting calculations
|
||||
*/
|
||||
uint32 rate_limit_window_secs = 8;
|
||||
|
||||
/*
|
||||
* Maximum packets allowed per node within the rate limit window
|
||||
*/
|
||||
uint32 rate_limit_max_packets = 9;
|
||||
|
||||
/*
|
||||
* Enable dropping of unknown/undecryptable packets per rate_limit_window_secs
|
||||
*/
|
||||
bool drop_unknown_enabled = 10;
|
||||
|
||||
/*
|
||||
* Number of unknown packets before dropping from a node
|
||||
*/
|
||||
uint32 unknown_packet_threshold = 11;
|
||||
|
||||
/*
|
||||
* Set hop_limit to 0 for relayed telemetry broadcasts (own packets unaffected)
|
||||
*/
|
||||
bool exhaust_hop_telemetry = 12;
|
||||
|
||||
/*
|
||||
* Set hop_limit to 0 for relayed position broadcasts (own packets unaffected)
|
||||
*/
|
||||
bool exhaust_hop_position = 13;
|
||||
|
||||
/*
|
||||
* Preserve hop_limit for router-to-router traffic
|
||||
*/
|
||||
bool router_preserve_hops = 14;
|
||||
}
|
||||
|
||||
/*
|
||||
* Serial Config
|
||||
*/
|
||||
@@ -337,9 +415,12 @@ message ModuleConfig {
|
||||
// VE.Direct is a serial protocol used by Victron Energy products
|
||||
// https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable
|
||||
VE_DIRECT = 7;
|
||||
//Used to configure and view some parameters of MeshSolar.
|
||||
//https://heltec.org/project/meshsolar/
|
||||
// Used to configure and view some parameters of MeshSolar.
|
||||
// https://heltec.org/project/meshsolar/
|
||||
MS_CONFIG = 8;
|
||||
// Logs mesh traffic to the serial pins, ideal for logging via openLog or similar.
|
||||
LOG = 9; // includes other packets
|
||||
LOGTEXT = 10; // only text (channel & DM)
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -621,6 +702,11 @@ message ModuleConfig {
|
||||
* Note: We will still send telemtry to the connected phone / client every minute over the API
|
||||
*/
|
||||
bool device_telemetry_enabled = 14;
|
||||
|
||||
/*
|
||||
* Enable/Disable the air quality telemetry measurement module on-device display
|
||||
*/
|
||||
bool air_quality_screen_enabled = 15;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -761,6 +847,16 @@ message ModuleConfig {
|
||||
uint32 blue = 5;
|
||||
}
|
||||
|
||||
/*
|
||||
* StatusMessage config - Allows setting a status message for a node to periodically rebroadcast
|
||||
*/
|
||||
message StatusMessageConfig {
|
||||
/*
|
||||
* The actual status string
|
||||
*/
|
||||
string node_status = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
@@ -829,6 +925,37 @@ message ModuleConfig {
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
PaxcounterConfig paxcounter = 13;
|
||||
|
||||
/*
|
||||
* TODO: REPLACE
|
||||
*/
|
||||
StatusMessageConfig statusmessage = 14;
|
||||
|
||||
/*
|
||||
* Traffic management module config for mesh network optimization
|
||||
*/
|
||||
TrafficManagementConfig traffic_management = 15;
|
||||
|
||||
/*
|
||||
* TAK team/role configuration for TAK_TRACKER
|
||||
*/
|
||||
TAKConfig tak = 16;
|
||||
}
|
||||
|
||||
/*
|
||||
* TAK team/role configuration
|
||||
*/
|
||||
message TAKConfig {
|
||||
/*
|
||||
* Team color.
|
||||
* Default Unspecifed_Color -> firmware uses Cyan
|
||||
*/
|
||||
Team team = 1;
|
||||
/*
|
||||
* Member role.
|
||||
* Default Unspecifed -> firmware uses TeamMember
|
||||
*/
|
||||
MemberRole role = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import "meshtastic/mesh.proto";
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "MQTTProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "PaxcountProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "Portnums";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -115,6 +115,11 @@ enum PortNum {
|
||||
*/
|
||||
KEY_VERIFICATION_APP = 12;
|
||||
|
||||
/*
|
||||
* Module/port for handling primitive remote shell access.
|
||||
*/
|
||||
REMOTE_SHELL_APP = 13;
|
||||
|
||||
/*
|
||||
* Provides a 'ping' service that replies to any packet it receives.
|
||||
* Also serves as a small example module.
|
||||
@@ -134,6 +139,22 @@ enum PortNum {
|
||||
*/
|
||||
PAXCOUNTER_APP = 34;
|
||||
|
||||
/*
|
||||
* Store and Forward++ module included in the firmware
|
||||
* ENCODING: protobuf
|
||||
* This module is specifically for Native Linux nodes, and provides a Git-style
|
||||
* chain of messages.
|
||||
*/
|
||||
STORE_FORWARD_PLUSPLUS_APP = 35;
|
||||
|
||||
/*
|
||||
* Node Status module
|
||||
* ENCODING: protobuf
|
||||
* This module allows setting an extra string of status for a node.
|
||||
* Broadcasts on change and on a timer, possibly once a day.
|
||||
*/
|
||||
NODE_STATUS_APP = 36;
|
||||
|
||||
/*
|
||||
* Provides a hardware serial interface to send and receive from the Meshtastic network.
|
||||
* Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic
|
||||
@@ -211,6 +232,12 @@ enum PortNum {
|
||||
*/
|
||||
POWERSTRESS_APP = 74;
|
||||
|
||||
/*
|
||||
* LoraWAN Payload Transport
|
||||
* ENCODING: compact binary LoRaWAN uplink (10-byte RF metadata + PHY payload) - see LoRaWANBridgeModule
|
||||
*/
|
||||
LORAWAN_BRIDGE = 75;
|
||||
|
||||
/*
|
||||
* Reticulum Network Stack Tunnel App
|
||||
* ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface
|
||||
@@ -224,6 +251,20 @@ enum PortNum {
|
||||
*/
|
||||
CAYENNE_APP = 77;
|
||||
|
||||
/*
|
||||
* ATAK Plugin V2
|
||||
* Portnum for payloads from the official Meshtastic ATAK plugin using
|
||||
* TAKPacketV2 with zstd dictionary compression.
|
||||
*/
|
||||
ATAK_PLUGIN_V2 = 78;
|
||||
|
||||
/*
|
||||
* GroupAlarm integration
|
||||
* Used for transporting GroupAlarm-related messages between Meshtastic nodes
|
||||
* and companion applications/services.
|
||||
*/
|
||||
GROUPALARM_APP = 112;
|
||||
|
||||
/*
|
||||
* Private applications should use portnums >= 256.
|
||||
* To simplify initial development and testing you can use "PRIVATE_APP"
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "PowerMonProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/* Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs).
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "RemoteHardware";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "RTTTLConfigProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package meshtastic;
|
||||
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "SerialHal";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
// SerialHalCommand messages are sent from host to device over the SerialHal
|
||||
// framing stream. Responses normally come back as SerialHalResponse with the
|
||||
// same transaction_id.
|
||||
//
|
||||
// Interrupt notifications are the one asynchronous exception: the device emits
|
||||
// an unsolicited SerialHalResponse with transaction_id == 0 and value == pin.
|
||||
// Host implementations should treat those frames as interrupt events rather
|
||||
// than replies to an outstanding request.
|
||||
|
||||
message SerialHalCommand {
|
||||
enum Type {
|
||||
UNSET = 0;
|
||||
PIN_MODE = 1;
|
||||
DIGITAL_WRITE = 2;
|
||||
DIGITAL_READ = 3;
|
||||
ATTACH_INTERRUPT = 4;
|
||||
DETACH_INTERRUPT = 5;
|
||||
SPI_TRANSFER = 6;
|
||||
NOOP = 7;
|
||||
}
|
||||
|
||||
// Host-assigned request id. Replies echo this id back in
|
||||
// SerialHalResponse.transaction_id.
|
||||
uint32 transaction_id = 1;
|
||||
Type type = 2;
|
||||
uint32 pin = 3;
|
||||
uint32 value = 4;
|
||||
uint32 mode = 5;
|
||||
bytes data = 6;
|
||||
}
|
||||
|
||||
message SerialHalResponse {
|
||||
enum Result {
|
||||
OK = 0;
|
||||
ERROR = 1;
|
||||
BAD_REQUEST = 2;
|
||||
UNSUPPORTED = 3;
|
||||
}
|
||||
|
||||
// Matches the originating SerialHalCommand.transaction_id for normal
|
||||
// request/response traffic.
|
||||
//
|
||||
// A value of 0 indicates an unsolicited interrupt notification generated by
|
||||
// the device. In that case, the host should interpret value as the GPIO pin
|
||||
// that triggered.
|
||||
uint32 transaction_id = 1;
|
||||
Result result = 2;
|
||||
// Used by DIGITAL_READ replies and interrupt notifications. For interrupt
|
||||
// notifications (transaction_id == 0), this carries the pin number.
|
||||
uint32 value = 3;
|
||||
bytes data = 4;
|
||||
string error = 5;
|
||||
}
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "StoreAndForwardProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "TelemetryProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
/*
|
||||
@@ -153,6 +153,11 @@ message EnvironmentMetrics {
|
||||
* Soil temperature measured (*C)
|
||||
*/
|
||||
optional float soil_temperature = 22;
|
||||
|
||||
/*
|
||||
* One-wire temperature (*C)
|
||||
*/
|
||||
repeated float one_wire_temperature = 23;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -443,6 +448,51 @@ message LocalStats {
|
||||
* Number of packets that were dropped because the transmit queue was full.
|
||||
*/
|
||||
uint32 num_tx_dropped = 14;
|
||||
|
||||
/*
|
||||
* Noise floor value measured in dBm
|
||||
*/
|
||||
int32 noise_floor = 15;
|
||||
}
|
||||
|
||||
/*
|
||||
* Traffic management statistics for mesh network optimization
|
||||
*/
|
||||
message TrafficManagementStats {
|
||||
/*
|
||||
* Total number of packets inspected by traffic management
|
||||
*/
|
||||
uint32 packets_inspected = 1;
|
||||
|
||||
/*
|
||||
* Number of position packets dropped due to deduplication
|
||||
*/
|
||||
uint32 position_dedup_drops = 2;
|
||||
|
||||
/*
|
||||
* Number of NodeInfo requests answered from cache
|
||||
*/
|
||||
uint32 nodeinfo_cache_hits = 3;
|
||||
|
||||
/*
|
||||
* Number of packets dropped due to rate limiting
|
||||
*/
|
||||
uint32 rate_limit_drops = 4;
|
||||
|
||||
/*
|
||||
* Number of unknown/undecryptable packets dropped
|
||||
*/
|
||||
uint32 unknown_packet_drops = 5;
|
||||
|
||||
/*
|
||||
* Number of packets with hop_limit exhausted for local-only broadcast
|
||||
*/
|
||||
uint32 hop_exhausted_packets = 6;
|
||||
|
||||
/*
|
||||
* Number of times router hop preservation was applied
|
||||
*/
|
||||
uint32 router_hops_preserved = 7;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -560,6 +610,11 @@ message Telemetry {
|
||||
* Linux host metrics
|
||||
*/
|
||||
HostMetrics host_metrics = 8;
|
||||
|
||||
/*
|
||||
* Traffic management statistics
|
||||
*/
|
||||
TrafficManagementStats traffic_management_stats = 9;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -603,7 +658,7 @@ enum TelemetrySensorType {
|
||||
BMP280 = 6;
|
||||
|
||||
/*
|
||||
* High accuracy temperature and humidity
|
||||
* TODO - REMOVE High accuracy temperature and humidity
|
||||
*/
|
||||
SHTC3 = 7;
|
||||
|
||||
@@ -628,7 +683,7 @@ enum TelemetrySensorType {
|
||||
QMC5883L = 11;
|
||||
|
||||
/*
|
||||
* High accuracy temperature and humidity
|
||||
* TODO - REMOVE High accuracy temperature and humidity
|
||||
*/
|
||||
SHT31 = 12;
|
||||
|
||||
@@ -653,7 +708,7 @@ enum TelemetrySensorType {
|
||||
RCWL9620 = 16;
|
||||
|
||||
/*
|
||||
* Sensirion High accuracy temperature and humidity
|
||||
* TODO - REMOVE Sensirion High accuracy temperature and humidity
|
||||
*/
|
||||
SHT4X = 17;
|
||||
|
||||
@@ -786,10 +841,56 @@ enum TelemetrySensorType {
|
||||
* SEN5X PM SENSORS
|
||||
*/
|
||||
SEN5X = 43;
|
||||
|
||||
/*
|
||||
* TSL2561 light sensor
|
||||
*/
|
||||
TSL2561 = 44;
|
||||
|
||||
/*
|
||||
* BH1750 light sensor
|
||||
*/
|
||||
BH1750 = 45;
|
||||
|
||||
/*
|
||||
* HDC1080 Temperature and Humidity Sensor
|
||||
*/
|
||||
HDC1080 = 46;
|
||||
|
||||
/*
|
||||
* TODO - REMOVE STH21 Temperature and R. Humidity sensor
|
||||
*/
|
||||
SHT21 = 47;
|
||||
|
||||
/*
|
||||
* Sensirion STC31 CO2 sensor
|
||||
*/
|
||||
STC31 = 48;
|
||||
|
||||
/*
|
||||
* SCD30 CO2, humidity, temperature sensor
|
||||
*/
|
||||
SCD30 = 49;
|
||||
|
||||
/*
|
||||
* SHT family of sensors for temperature and humidity
|
||||
*/
|
||||
SHTXX = 50;
|
||||
|
||||
/*
|
||||
* DS248X Bridge for one-wire temperature sensors
|
||||
*/
|
||||
DS248X = 51;
|
||||
|
||||
/*
|
||||
* MMC5983MA 3-Axis Digital Magnetic Sensor
|
||||
*/
|
||||
MMC5983MA = 52;
|
||||
|
||||
/*
|
||||
* ICM-42607-P 6‑Axis IMU
|
||||
*/
|
||||
ICM42607P = 53;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -806,3 +907,38 @@ message Nau7802Config {
|
||||
*/
|
||||
float calibrationFactor = 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* SEN5X State, for saving to flash
|
||||
*/
|
||||
message SEN5XState {
|
||||
/*
|
||||
* Last cleaning time for SEN5X
|
||||
*/
|
||||
uint32 last_cleaning_time = 1;
|
||||
|
||||
/*
|
||||
* Last cleaning time for SEN5X - valid flag
|
||||
*/
|
||||
bool last_cleaning_valid = 2;
|
||||
|
||||
/*
|
||||
* Config flag for one-shot mode (see admin.proto)
|
||||
*/
|
||||
bool one_shot_mode = 3;
|
||||
|
||||
/*
|
||||
* Last VOC state time for SEN55
|
||||
*/
|
||||
optional uint32 voc_state_time = 4;
|
||||
|
||||
/*
|
||||
* Last VOC state validity flag for SEN55
|
||||
*/
|
||||
optional bool voc_state_valid = 5;
|
||||
|
||||
/*
|
||||
* VOC state array (8x uint8t) for SEN55
|
||||
*/
|
||||
optional fixed64 voc_state_array = 6;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ package meshtastic;
|
||||
option csharp_namespace = "Meshtastic.Protobufs";
|
||||
option go_package = "github.com/meshtastic/go/generated";
|
||||
option java_outer_classname = "XmodemProtos";
|
||||
option java_package = "com.geeksville.mesh";
|
||||
option java_package = "org.meshtastic.proto";
|
||||
option swift_prefix = "";
|
||||
|
||||
message XModem {
|
||||
|
||||
Reference in New Issue
Block a user