Skip to content

Commit be36666

Browse files
committed
Merge pull request #980 from protobufs-v2.8.0
2 parents 2892293 + efb6d1c commit be36666

6 files changed

Lines changed: 68 additions & 41 deletions

File tree

‎bin/inject_nanopb_options.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@
2626
# IntSize enum values from nanopb.proto
2727
INT_SIZE_ENUM = {8: "IS_8", 16: "IS_16", 32: "IS_32", 64: "IS_64"}
2828

29+
# FieldType enum names from nanopb.proto. Only FT_IGNORE carries meaning for a
30+
# Python client (the firmware omits the field entirely); the rest describe C
31+
# storage class, but are passed through so the descriptor mirrors the .options.
32+
FIELD_TYPE_ENUM = frozenset(
33+
{"FT_DEFAULT", "FT_CALLBACK", "FT_POINTER", "FT_STATIC", "FT_IGNORE", "FT_INLINE"}
34+
)
35+
2936
# Options that are valid proto FieldOptions and useful outside of C code generation.
3037
# We skip C-only options (anonymous_oneof, no_unions, skip_message, packed_struct,
3138
# packed_enum, mangle_names, callback_datatype, callback_function, descriptorsize,
@@ -36,6 +43,7 @@
3643
"max_length",
3744
"max_count",
3845
"int_size",
46+
"type",
3947
"fixed_length",
4048
"fixed_count",
4149
"long_names",
@@ -122,6 +130,10 @@ def format_nanopb_opts(opts: Dict[str, Any]) -> str:
122130
if k == "int_size":
123131
enum_val = INT_SIZE_ENUM.get(v, f"IS_{v}")
124132
parts.append(f"(nanopb).int_size = {enum_val}")
133+
elif k == "type":
134+
if v not in FIELD_TYPE_ENUM:
135+
raise ValueError(f"unknown nanopb field type {v!r}")
136+
parts.append(f"(nanopb).type = {v}")
125137
elif isinstance(v, bool):
126138
parts.append(f"(nanopb).{k} = {'true' if v else 'false'}")
127139
else:

‎meshtastic/protobuf/mqtt_pb2.py‎

Lines changed: 10 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎meshtastic/protobuf/telemetry_pb2.py‎

Lines changed: 27 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎meshtastic/tests/test_inject_nanopb_options.py‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
atak_pb2,
2222
config_pb2,
2323
mesh_pb2,
24+
mqtt_pb2,
2425
nanopb_pb2,
2526
telemetry_pb2,
2627
)
@@ -640,7 +641,15 @@ def test_descriptor_multilevel_nested_route_link_uid():
640641

641642
@pytest.mark.unit
642643
def test_descriptor_telemetry_environment_one_wire_temperature():
643-
"""EnvironmentMetrics.one_wire_temperature has max_count = 8 from telemetry.options."""
644+
"""EnvironmentMetrics.one_wire_temperature has type = FT_IGNORE from telemetry.options."""
644645
env = telemetry_pb2.DESCRIPTOR.message_types_by_name["EnvironmentMetrics"]
645646
opts = _field_opts(env, "one_wire_temperature")
646-
assert opts.max_count == 8
647+
assert opts.type == nanopb_pb2.FT_IGNORE
648+
649+
650+
@pytest.mark.unit
651+
def test_descriptor_mqtt_service_envelope_pointer_fields():
652+
"""ServiceEnvelope fields carry type = FT_POINTER from mqtt.options."""
653+
envelope = mqtt_pb2.DESCRIPTOR.message_types_by_name["ServiceEnvelope"]
654+
for name in ("packet", "channel_id", "gateway_id"):
655+
assert _field_opts(envelope, name).type == nanopb_pb2.FT_POINTER

‎meshtastic/tests/test_mesh_interface_traffic_management.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ def test_handleFromRadio_with_traffic_management_module_config():
1212
"""Test _handleFromRadio with moduleConfig.traffic_management."""
1313
iface = MeshInterface(noProto=True)
1414
from_radio = mesh_pb2.FromRadio()
15-
from_radio.moduleConfig.traffic_management.enabled = True
16-
from_radio.moduleConfig.traffic_management.rate_limit_enabled = True
15+
from_radio.moduleConfig.traffic_management.position_min_interval_secs = 30
16+
from_radio.moduleConfig.traffic_management.rate_limit_window_secs = 60
1717

1818
iface._handleFromRadio(from_radio.SerializeToString())
1919

20-
assert iface.localNode.moduleConfig.traffic_management.enabled is True
21-
assert iface.localNode.moduleConfig.traffic_management.rate_limit_enabled is True
20+
assert iface.localNode.moduleConfig.traffic_management.position_min_interval_secs == 30
21+
assert iface.localNode.moduleConfig.traffic_management.rate_limit_window_secs == 60
2222
iface.close()

‎meshtastic/tests/test_node.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,8 +1153,8 @@ def test_writeConfig_traffic_management():
11531153
"""Test writeConfig with traffic_management module config."""
11541154
iface = MagicMock(autospec=SerialInterface)
11551155
anode = Node(iface, 123, noProto=True)
1156-
anode.moduleConfig.traffic_management.enabled = True
1157-
anode.moduleConfig.traffic_management.rate_limit_enabled = True
1156+
anode.moduleConfig.traffic_management.position_min_interval_secs = 30
1157+
anode.moduleConfig.traffic_management.rate_limit_window_secs = 60
11581158

11591159
sent_admin = []
11601160

@@ -1167,8 +1167,8 @@ def capture_send(p, *args, **kwargs): # pylint: disable=W0613
11671167
assert len(sent_admin) == 1
11681168
assert sent_admin[0].HasField("set_module_config")
11691169
assert sent_admin[0].set_module_config.HasField("traffic_management")
1170-
assert sent_admin[0].set_module_config.traffic_management.enabled is True
1171-
assert sent_admin[0].set_module_config.traffic_management.rate_limit_enabled is True
1170+
assert sent_admin[0].set_module_config.traffic_management.position_min_interval_secs == 30
1171+
assert sent_admin[0].set_module_config.traffic_management.rate_limit_window_secs == 60
11721172

11731173

11741174
# TODO

0 commit comments

Comments
 (0)