mirror of
https://github.com/meshtastic/web.git
synced 2026-08-01 15:36:28 -04:00
* 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.
390 lines
5.5 KiB
Protocol Buffer
390 lines
5.5 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package meshtastic;
|
|
|
|
option csharp_namespace = "Meshtastic.Protobufs";
|
|
option go_package = "github.com/meshtastic/go/generated";
|
|
option java_outer_classname = "DeviceUIProtos";
|
|
option java_package = "org.meshtastic.proto";
|
|
option swift_prefix = "";
|
|
|
|
/*
|
|
* Protobuf structures for device-ui persistency
|
|
*/
|
|
|
|
message DeviceUIConfig {
|
|
/*
|
|
* A version integer used to invalidate saved files when we make incompatible changes.
|
|
*/
|
|
uint32 version = 1;
|
|
|
|
/*
|
|
* TFT display brightness 1..255
|
|
*/
|
|
uint32 screen_brightness = 2;
|
|
|
|
/*
|
|
* Screen timeout 0..900
|
|
*/
|
|
uint32 screen_timeout = 3;
|
|
|
|
/*
|
|
* Screen/Settings lock enabled
|
|
*/
|
|
bool screen_lock = 4;
|
|
bool settings_lock = 5;
|
|
uint32 pin_code = 6;
|
|
|
|
/*
|
|
* Color theme
|
|
*/
|
|
Theme theme = 7;
|
|
|
|
/*
|
|
* Audible message, banner and ring tone
|
|
*/
|
|
bool alert_enabled = 8;
|
|
bool banner_enabled = 9;
|
|
uint32 ring_tone_id = 10;
|
|
|
|
/*
|
|
* Localization
|
|
*/
|
|
Language language = 11;
|
|
|
|
/*
|
|
* Node list filter
|
|
*/
|
|
NodeFilter node_filter = 12;
|
|
|
|
/*
|
|
* Node list highlightening
|
|
*/
|
|
NodeHighlight node_highlight = 13;
|
|
|
|
/*
|
|
* 8 integers for screen calibration data
|
|
*/
|
|
bytes calibration_data = 14;
|
|
|
|
/*
|
|
* Map related data
|
|
*/
|
|
Map map_data = 15;
|
|
|
|
/*
|
|
* Compass mode
|
|
*/
|
|
CompassMode compass_mode = 16;
|
|
|
|
/*
|
|
* RGB color for BaseUI
|
|
* 0xRRGGBB format, e.g. 0xFF0000 for red
|
|
*/
|
|
uint32 screen_rgb_color = 17;
|
|
|
|
/*
|
|
* Clockface analog style
|
|
* true for analog clockface, false for digital clockface
|
|
*/
|
|
bool is_clockface_analog = 18;
|
|
|
|
/*
|
|
* How the GPS coordinates are formatted on the OLED screen.
|
|
*/
|
|
GpsCoordinateFormat gps_format = 19;
|
|
|
|
/*
|
|
* How the GPS coordinates are displayed on the OLED screen.
|
|
*/
|
|
enum GpsCoordinateFormat {
|
|
/*
|
|
* GPS coordinates are displayed in the normal decimal degrees format:
|
|
* DD.DDDDDD DDD.DDDDDD
|
|
*/
|
|
DEC = 0;
|
|
|
|
/*
|
|
* GPS coordinates are displayed in the degrees minutes seconds format:
|
|
* DD°MM'SS"C DDD°MM'SS"C, where C is the compass point representing the locations quadrant
|
|
*/
|
|
DMS = 1;
|
|
|
|
/*
|
|
* Universal Transverse Mercator format:
|
|
* ZZB EEEEEE NNNNNNN, where Z is zone, B is band, E is easting, N is northing
|
|
*/
|
|
UTM = 2;
|
|
|
|
/*
|
|
* Military Grid Reference System format:
|
|
* ZZB CD EEEEE NNNNN, where Z is zone, B is band, C is the east 100k square, D is the north 100k square,
|
|
* E is easting, N is northing
|
|
*/
|
|
MGRS = 3;
|
|
|
|
/*
|
|
* Open Location Code (aka Plus Codes).
|
|
*/
|
|
OLC = 4;
|
|
|
|
/*
|
|
* Ordnance Survey Grid Reference (the National Grid System of the UK).
|
|
* Format: AB EEEEE NNNNN, where A is the east 100k square, B is the north 100k square,
|
|
* E is the easting, N is the northing
|
|
*/
|
|
OSGR = 5;
|
|
|
|
/*
|
|
* Maidenhead Locator System
|
|
* Described here: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
|
|
*/
|
|
MLS = 6;
|
|
}
|
|
}
|
|
|
|
message NodeFilter {
|
|
/*
|
|
* Filter unknown nodes
|
|
*/
|
|
bool unknown_switch = 1;
|
|
|
|
/*
|
|
* Filter offline nodes
|
|
*/
|
|
bool offline_switch = 2;
|
|
|
|
/*
|
|
* Filter nodes w/o public key
|
|
*/
|
|
bool public_key_switch = 3;
|
|
|
|
/*
|
|
* Filter based on hops away
|
|
*/
|
|
int32 hops_away = 4;
|
|
|
|
/*
|
|
* Filter nodes w/o position
|
|
*/
|
|
bool position_switch = 5;
|
|
|
|
/*
|
|
* Filter nodes by matching name string
|
|
*/
|
|
string node_name = 6;
|
|
|
|
/*
|
|
* Filter based on channel
|
|
*/
|
|
int32 channel = 7;
|
|
}
|
|
|
|
message NodeHighlight {
|
|
/*
|
|
* Hightlight nodes w/ active chat
|
|
*/
|
|
bool chat_switch = 1;
|
|
|
|
/*
|
|
* Highlight nodes w/ position
|
|
*/
|
|
bool position_switch = 2;
|
|
|
|
/*
|
|
* Highlight nodes w/ telemetry data
|
|
*/
|
|
bool telemetry_switch = 3;
|
|
|
|
/*
|
|
* Highlight nodes w/ iaq data
|
|
*/
|
|
bool iaq_switch = 4;
|
|
|
|
/*
|
|
* Highlight nodes by matching name string
|
|
*/
|
|
string node_name = 5;
|
|
}
|
|
|
|
message GeoPoint {
|
|
/*
|
|
* Zoom level
|
|
*/
|
|
int32 zoom = 1;
|
|
|
|
/*
|
|
* Coordinate: latitude
|
|
*/
|
|
int32 latitude = 2;
|
|
|
|
/*
|
|
* Coordinate: longitude
|
|
*/
|
|
int32 longitude = 3;
|
|
}
|
|
|
|
message Map {
|
|
/*
|
|
* Home coordinates
|
|
*/
|
|
GeoPoint home = 1;
|
|
|
|
/*
|
|
* Map tile style
|
|
*/
|
|
string style = 2;
|
|
|
|
/*
|
|
* Map scroll follows GPS
|
|
*/
|
|
bool follow_gps = 3;
|
|
}
|
|
|
|
enum CompassMode {
|
|
/*
|
|
* Compass with dynamic ring and heading
|
|
*/
|
|
DYNAMIC = 0;
|
|
|
|
/*
|
|
* Compass with fixed ring and heading
|
|
*/
|
|
FIXED_RING = 1;
|
|
|
|
/*
|
|
* Compass with heading and freeze option
|
|
*/
|
|
FREEZE_HEADING = 2;
|
|
}
|
|
|
|
enum Theme {
|
|
/*
|
|
* Dark
|
|
*/
|
|
DARK = 0;
|
|
/*
|
|
* Light
|
|
*/
|
|
LIGHT = 1;
|
|
/*
|
|
* Red
|
|
*/
|
|
RED = 2;
|
|
}
|
|
|
|
/*
|
|
* Localization
|
|
*/
|
|
enum Language {
|
|
/*
|
|
* English
|
|
*/
|
|
ENGLISH = 0;
|
|
|
|
/*
|
|
* French
|
|
*/
|
|
FRENCH = 1;
|
|
|
|
/*
|
|
* German
|
|
*/
|
|
GERMAN = 2;
|
|
|
|
/*
|
|
* Italian
|
|
*/
|
|
ITALIAN = 3;
|
|
|
|
/*
|
|
* Portuguese
|
|
*/
|
|
PORTUGUESE = 4;
|
|
|
|
/*
|
|
* Spanish
|
|
*/
|
|
SPANISH = 5;
|
|
|
|
/*
|
|
* Swedish
|
|
*/
|
|
SWEDISH = 6;
|
|
|
|
/*
|
|
* Finnish
|
|
*/
|
|
FINNISH = 7;
|
|
|
|
/*
|
|
* Polish
|
|
*/
|
|
POLISH = 8;
|
|
|
|
/*
|
|
* Turkish
|
|
*/
|
|
TURKISH = 9;
|
|
|
|
/*
|
|
* Serbian
|
|
*/
|
|
SERBIAN = 10;
|
|
|
|
/*
|
|
* Russian
|
|
*/
|
|
RUSSIAN = 11;
|
|
|
|
/*
|
|
* Dutch
|
|
*/
|
|
DUTCH = 12;
|
|
|
|
/*
|
|
* Greek
|
|
*/
|
|
GREEK = 13;
|
|
|
|
/*
|
|
* Norwegian
|
|
*/
|
|
NORWEGIAN = 14;
|
|
|
|
/*
|
|
* Slovenian
|
|
*/
|
|
SLOVENIAN = 15;
|
|
|
|
/*
|
|
* Ukrainian
|
|
*/
|
|
UKRAINIAN = 16;
|
|
|
|
/*
|
|
* Bulgarian
|
|
*/
|
|
BULGARIAN = 17;
|
|
|
|
/*
|
|
* Czech
|
|
*/
|
|
CZECH = 18;
|
|
|
|
/*
|
|
* Danish
|
|
*/
|
|
DANISH = 19;
|
|
|
|
/*
|
|
* Simplified Chinese (experimental)
|
|
*/
|
|
SIMPLIFIED_CHINESE = 30;
|
|
|
|
/*
|
|
* Traditional Chinese (experimental)
|
|
*/
|
|
TRADITIONAL_CHINESE = 31;
|
|
}
|