From 9bf4a87d88a971c89aba1ad2bd9c33fac4f411f5 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 30 Apr 2026 13:20:20 -0500 Subject: [PATCH 1/2] Experminental PR for adding metadata to protobufs --- meshtastic/config.proto | 5 +++-- meshtastic/field_metadata.proto | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 meshtastic/field_metadata.proto diff --git a/meshtastic/config.proto b/meshtastic/config.proto index c5c2492e8..84f6d24b7 100644 --- a/meshtastic/config.proto +++ b/meshtastic/config.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package meshtastic; import "meshtastic/device_ui.proto"; +import "meshtastic/field_metadata.proto"; option csharp_namespace = "Meshtastic.Protobufs"; option go_package = "github.com/meshtastic/go/generated"; @@ -398,12 +399,12 @@ message Config { /* * (Re)define GPS_RX_PIN for your board. */ - uint32 rx_gpio = 8; + uint32 rx_gpio = 8 [(meshtastic.config_field).diy_only = true]; /* * (Re)define GPS_TX_PIN for your board. */ - uint32 tx_gpio = 9; + uint32 tx_gpio = 9 [(meshtastic.config_field).diy_only = true]; /* * The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled diff --git a/meshtastic/field_metadata.proto b/meshtastic/field_metadata.proto new file mode 100644 index 000000000..f1123a888 --- /dev/null +++ b/meshtastic/field_metadata.proto @@ -0,0 +1,21 @@ +syntax = "proto2"; + +package meshtastic; + +import "google/protobuf/descriptor.proto"; + +option csharp_namespace = "Meshtastic.Protobufs"; +option go_package = "github.com/meshtastic/go/generated"; +option java_outer_classname = "FieldMetadataProtos"; +option java_package = "org.meshtastic.proto"; +option swift_prefix = ""; + +// Metadata attached to config fields via FieldOptions. +message ConfigFieldMetadata { + required bool diy_only = 1 [default = false]; +} + +extend google.protobuf.FieldOptions { + // Private-use extension number range is 50000-99999. + optional ConfigFieldMetadata config_field = 51001; +} From fc5a1a25de8a79fd28dbf1b6ec7bd61100f7eb71 Mon Sep 17 00:00:00 2001 From: James Rich Date: Thu, 30 Apr 2026 15:41:42 -0500 Subject: [PATCH 2/2] refactor: flatten config_field to scalar bool extension Replace the ConfigFieldMetadata message wrapper with a direct scalar bool extension on FieldOptions. This allows Wire 6's native emitAppliedOptions to generate @DiyOnlyOption annotations without a custom SchemaHandler, and simplifies access for all downstream clients (Swift, Python, Go). Usage: [(meshtastic.diy_only) = true] instead of [(meshtastic.config_field).diy_only = true] --- meshtastic/config.proto | 4 ++-- meshtastic/field_metadata.proto | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/meshtastic/config.proto b/meshtastic/config.proto index 84f6d24b7..df9146ea4 100644 --- a/meshtastic/config.proto +++ b/meshtastic/config.proto @@ -399,12 +399,12 @@ message Config { /* * (Re)define GPS_RX_PIN for your board. */ - uint32 rx_gpio = 8 [(meshtastic.config_field).diy_only = true]; + uint32 rx_gpio = 8 [(meshtastic.diy_only) = true]; /* * (Re)define GPS_TX_PIN for your board. */ - uint32 tx_gpio = 9 [(meshtastic.config_field).diy_only = true]; + uint32 tx_gpio = 9 [(meshtastic.diy_only) = true]; /* * The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled diff --git a/meshtastic/field_metadata.proto b/meshtastic/field_metadata.proto index f1123a888..ab96ce2fd 100644 --- a/meshtastic/field_metadata.proto +++ b/meshtastic/field_metadata.proto @@ -10,12 +10,8 @@ option java_outer_classname = "FieldMetadataProtos"; option java_package = "org.meshtastic.proto"; option swift_prefix = ""; -// Metadata attached to config fields via FieldOptions. -message ConfigFieldMetadata { - required bool diy_only = 1 [default = false]; -} - extend google.protobuf.FieldOptions { // Private-use extension number range is 50000-99999. - optional ConfigFieldMetadata config_field = 51001; + // Field is only relevant to DIY hardware builds. + optional bool diy_only = 51001 [default = false]; }