diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4a424fc..55ad877 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -86,12 +86,12 @@ jobs: --proto_path=proto \ --python_out=clients/python/src \ --grpc_python_out=clients/python/src \ - proto/mavlink_bridge.proto proto/mavlink/common.proto + proto/mavlink2grpc/mavlink2grpc.proto proto/mavlink2grpc/mavlink/common.proto # Add __init__.py files to make it a package - touch clients/python/src/__init__.py - mkdir -p clients/python/src/mavlink - touch clients/python/src/mavlink/__init__.py + mkdir -p clients/python/src/mavlink2grpc/mavlink + touch clients/python/src/mavlink2grpc/__init__.py + touch clients/python/src/mavlink2grpc/mavlink/__init__.py - name: Build Python Package run: | @@ -132,9 +132,9 @@ jobs: python3 generator/main.py --dialect common --proto-out proto --cpp-out bridge/src/mavlink # Copy proto files to npm package folder - mkdir -p clients/node/proto/mavlink - cp proto/mavlink_bridge.proto clients/node/proto/ - cp proto/mavlink/*.proto clients/node/proto/mavlink/ + mkdir -p clients/node/proto/mavlink2grpc/mavlink + cp proto/mavlink2grpc/mavlink2grpc.proto clients/node/proto/mavlink2grpc/ + cp proto/mavlink2grpc/mavlink/*.proto clients/node/proto/mavlink2grpc/mavlink/ - name: Publish to npm env: diff --git a/bridge/CMakeLists.txt b/bridge/CMakeLists.txt index c3a0a0f..f237cf9 100644 --- a/bridge/CMakeLists.txt +++ b/bridge/CMakeLists.txt @@ -27,11 +27,12 @@ set(PROTO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../proto) set(GENERATED_PROTOBUF_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../generated) file(MAKE_DIRECTORY ${GENERATED_PROTOBUF_PATH}) -file(MAKE_DIRECTORY ${GENERATED_PROTOBUF_PATH}/mavlink) +file(MAKE_DIRECTORY ${GENERATED_PROTOBUF_PATH}/mavlink2grpc) +file(MAKE_DIRECTORY ${GENERATED_PROTOBUF_PATH}/mavlink2grpc/mavlink) # Collect all proto files -file(GLOB MAVLINK_PROTO_FILES "${PROTO_PATH}/mavlink/*.proto") -file(GLOB ROOT_PROTO_FILES "${PROTO_PATH}/*.proto") +file(GLOB MAVLINK_PROTO_FILES "${PROTO_PATH}/mavlink2grpc/mavlink/*.proto") +file(GLOB ROOT_PROTO_FILES "${PROTO_PATH}/mavlink2grpc/*.proto") # Combine all proto files and their outputs set(ALL_PROTO_FILES ${MAVLINK_PROTO_FILES} ${ROOT_PROTO_FILES}) diff --git a/bridge/src/Bridge.cc b/bridge/src/Bridge.cc index acfe7e3..3cef6a3 100644 --- a/bridge/src/Bridge.cc +++ b/bridge/src/Bridge.cc @@ -147,7 +147,7 @@ Bridge::Bridge(const std::string& connection_url, // Create gRPC service with router and send callback service_ = std::make_shared( *router_, - [this](const mavlink::MavlinkMessage& proto_msg) -> bool { + [this](const mavlink2grpc::MavlinkMessage& proto_msg) -> bool { if (!active_connection_ || !active_connection_->alive()) { Logger::Warn("Cannot send message: No active MAVLink connection"); return false; diff --git a/bridge/src/service/Router.cc b/bridge/src/service/Router.cc index 6dfce5c..b013c92 100644 --- a/bridge/src/service/Router.cc +++ b/bridge/src/service/Router.cc @@ -10,7 +10,7 @@ namespace mavlink2grpc { -bool StreamSubscription::matches(const mavlink::MavlinkMessage& msg) const { +bool StreamSubscription::matches(const mavlink2grpc::MavlinkMessage& msg) const { // Check system ID filter (0 = all systems) if (filter.system_id() != 0 && msg.system_id() != filter.system_id()) { return false; @@ -39,7 +39,7 @@ bool StreamSubscription::matches(const mavlink::MavlinkMessage& msg) const { } uint64_t Router::subscribe( - const mavlink::StreamFilter& filter, + const mavlink2grpc::StreamFilter& filter, StreamSubscription::WriteCallback write_func) { std::lock_guard lock(subscriptions_mutex_); @@ -85,7 +85,7 @@ bool Router::unsubscribe(uint64_t subscription_id) { return false; } -size_t Router::route_message(const mavlink::MavlinkMessage& msg) { +size_t Router::route_message(const mavlink2grpc::MavlinkMessage& msg) { std::lock_guard lock(subscriptions_mutex_); size_t delivered = 0; diff --git a/bridge/src/service/Router.h b/bridge/src/service/Router.h index 8a46bb9..631236d 100644 --- a/bridge/src/service/Router.h +++ b/bridge/src/service/Router.h @@ -10,7 +10,7 @@ #pragma once -#include +#include #include #include @@ -26,11 +26,11 @@ namespace mavlink2grpc { * optional filtering by system ID, component ID, and message IDs. */ struct StreamSubscription { - using WriteCallback = std::function; + using WriteCallback = std::function; uint64_t id; ///< Unique subscription ID WriteCallback write_func; ///< Function to write message to stream - mavlink::StreamFilter filter; ///< Filter criteria + mavlink2grpc::StreamFilter filter; ///< Filter criteria bool active; ///< Is subscription still active /** @@ -39,7 +39,7 @@ struct StreamSubscription { * @param msg Message to check * @return true if message passes filter, false otherwise */ - bool matches(const mavlink::MavlinkMessage& msg) const; + bool matches(const mavlink2grpc::MavlinkMessage& msg) const; }; /** @@ -87,7 +87,7 @@ class Router { * @return Subscription ID (use for unsubscribe) */ uint64_t subscribe( - const mavlink::StreamFilter& filter, + const mavlink2grpc::StreamFilter& filter, StreamSubscription::WriteCallback write_func); /** @@ -107,7 +107,7 @@ class Router { * @param msg Message to route * @return Number of subscribers that received the message */ - size_t route_message(const mavlink::MavlinkMessage& msg); + size_t route_message(const mavlink2grpc::MavlinkMessage& msg); /** * @brief Get number of active subscriptions. diff --git a/bridge/src/service/Service.cc b/bridge/src/service/Service.cc index d6a37fa..ff2f334 100644 --- a/bridge/src/service/Service.cc +++ b/bridge/src/service/Service.cc @@ -19,8 +19,8 @@ MavlinkBridgeServiceImpl::MavlinkBridgeServiceImpl( grpc::Status MavlinkBridgeServiceImpl::StreamMessages( grpc::ServerContext* context, - const mavlink::StreamFilter* request, - grpc::ServerWriter* writer) { + const mavlink2grpc::StreamFilter* request, + grpc::ServerWriter* writer) { { std::ostringstream oss; @@ -33,7 +33,7 @@ grpc::Status MavlinkBridgeServiceImpl::StreamMessages( // Subscribe to router with filter uint64_t sub_id = router_.subscribe( *request, - [writer](const mavlink::MavlinkMessage& msg) -> bool { + [writer](const mavlink2grpc::MavlinkMessage& msg) -> bool { // Write to gRPC stream return writer->Write(msg); } @@ -62,11 +62,11 @@ grpc::Status MavlinkBridgeServiceImpl::StreamMessages( grpc::Status MavlinkBridgeServiceImpl::SendMessage( grpc::ServerContext* /* context */, - const mavlink::MavlinkMessage* request, - mavlink::SendResponse* response) { + const mavlink2grpc::MavlinkMessage* request, + mavlink2grpc::SendResponse* response) { // Validate request has payload - if (request->payload_case() == mavlink::MavlinkMessage::PAYLOAD_NOT_SET) { + if (request->payload_case() == mavlink2grpc::MavlinkMessage::PAYLOAD_NOT_SET) { response->set_success(false); response->set_error("No payload in message"); Logger::Warn("SendMessage RPC failed: No payload"); diff --git a/bridge/src/service/Service.h b/bridge/src/service/Service.h index 40c5689..db62f00 100644 --- a/bridge/src/service/Service.h +++ b/bridge/src/service/Service.h @@ -12,7 +12,7 @@ #include "Router.h" -#include +#include #include #include @@ -32,7 +32,7 @@ namespace mavlink2grpc { * * Thread-safe and supports multiple concurrent clients. */ -class MavlinkBridgeServiceImpl final : public mavlink::MavlinkBridge::Service { +class MavlinkBridgeServiceImpl final : public mavlink2grpc::MavlinkBridge::Service { public: /** * @brief Callback type for sending MAVLink messages. @@ -40,7 +40,7 @@ class MavlinkBridgeServiceImpl final : public mavlink::MavlinkBridge::Service { * @param msg Proto message to convert and send * @return true if sent successfully, false otherwise */ - using SendMessageCallback = std::function; + using SendMessageCallback = std::function; /** * @brief Construct service with router and send callback. @@ -65,8 +65,8 @@ class MavlinkBridgeServiceImpl final : public mavlink::MavlinkBridge::Service { */ grpc::Status StreamMessages( grpc::ServerContext* context, - const mavlink::StreamFilter* request, - grpc::ServerWriter* writer) override; + const mavlink2grpc::StreamFilter* request, + grpc::ServerWriter* writer) override; /** * @brief Send MAVLink message to connected system. @@ -80,8 +80,8 @@ class MavlinkBridgeServiceImpl final : public mavlink::MavlinkBridge::Service { */ grpc::Status SendMessage( grpc::ServerContext* context, - const mavlink::MavlinkMessage* request, - mavlink::SendResponse* response) override; + const mavlink2grpc::MavlinkMessage* request, + mavlink2grpc::SendResponse* response) override; /** * @brief Shutdown the service and notify all active streams. diff --git a/bridge/test/test_router.cc b/bridge/test/test_router.cc index 678170c..8505577 100644 --- a/bridge/test/test_router.cc +++ b/bridge/test/test_router.cc @@ -19,12 +19,12 @@ void test_router_basic() { TEST_ASSERT(router.subscription_count() == 0); // Subscribe client 1 with no filters (system_id=0, component_id=0) - mavlink::StreamFilter filter1; + mavlink2grpc::StreamFilter filter1; filter1.set_system_id(0); filter1.set_component_id(0); size_t client1_received = 0; - uint64_t sub1 = router.subscribe(filter1, [&](const mavlink::MavlinkMessage&) { + uint64_t sub1 = router.subscribe(filter1, [&](const mavlink2grpc::MavlinkMessage&) { client1_received++; return true; }); @@ -33,7 +33,7 @@ void test_router_basic() { TEST_ASSERT(router.subscription_count() == 1); // Send a message - mavlink::MavlinkMessage msg1; + mavlink2grpc::MavlinkMessage msg1; msg1.set_system_id(1); msg1.set_component_id(1); msg1.set_message_id(0); // HEARTBEAT @@ -59,19 +59,19 @@ void test_router_filters() { Router router; // Filter for system 1, component 1, message 30 (ATTITUDE) only - mavlink::StreamFilter filter; + mavlink2grpc::StreamFilter filter; filter.set_system_id(1); filter.set_component_id(1); filter.add_message_ids(30); size_t received = 0; - router.subscribe(filter, [&](const mavlink::MavlinkMessage&) { + router.subscribe(filter, [&](const mavlink2grpc::MavlinkMessage&) { received++; return true; }); // Message 1: Matches all - mavlink::MavlinkMessage msg1; + mavlink2grpc::MavlinkMessage msg1; msg1.set_system_id(1); msg1.set_component_id(1); msg1.set_message_id(30); @@ -79,7 +79,7 @@ void test_router_filters() { TEST_ASSERT(received == 1); // Message 2: Different system ID (2) - mavlink::MavlinkMessage msg2; + mavlink2grpc::MavlinkMessage msg2; msg2.set_system_id(2); msg2.set_component_id(1); msg2.set_message_id(30); @@ -87,7 +87,7 @@ void test_router_filters() { TEST_ASSERT(received == 1); // shouldn't increase // Message 3: Different component ID (2) - mavlink::MavlinkMessage msg3; + mavlink2grpc::MavlinkMessage msg3; msg3.set_system_id(1); msg3.set_component_id(2); msg3.set_message_id(30); @@ -95,7 +95,7 @@ void test_router_filters() { TEST_ASSERT(received == 1); // shouldn't increase // Message 4: Different message ID (0 - HEARTBEAT) - mavlink::MavlinkMessage msg4; + mavlink2grpc::MavlinkMessage msg4; msg4.set_system_id(1); msg4.set_component_id(1); msg4.set_message_id(0); @@ -109,17 +109,17 @@ void test_router_cleanup() { std::cout << "Running test_router_cleanup..." << std::endl; Router router; - mavlink::StreamFilter filter; + mavlink2grpc::StreamFilter filter; // Client whose write fails (simulates disconnected client) - router.subscribe(filter, [](const mavlink::MavlinkMessage&) { + router.subscribe(filter, [](const mavlink2grpc::MavlinkMessage&) { return false; // write failed }); TEST_ASSERT(router.subscription_count() == 1); // Route a message - this will trigger write failure and mark inactive - mavlink::MavlinkMessage msg; + mavlink2grpc::MavlinkMessage msg; size_t routed = router.route_message(msg); TEST_ASSERT(routed == 0); diff --git a/clients/node/index.d.ts b/clients/node/index.d.ts index 9fd3fcb..a924221 100644 --- a/clients/node/index.d.ts +++ b/clients/node/index.d.ts @@ -3,7 +3,7 @@ */ /** - * Path to the main MAVLink bridge proto definition file (mavlink_bridge.proto) + * Path to the main MAVLink bridge proto definition file (mavlink2grpc.proto) */ export const protoPath: string; diff --git a/clients/node/index.js b/clients/node/index.js index 506df59..c51b5c4 100644 --- a/clients/node/index.js +++ b/clients/node/index.js @@ -2,5 +2,5 @@ const path = require('path'); module.exports = { protoDir: path.join(__dirname, 'proto'), - protoPath: path.join(__dirname, 'proto', 'mavlink_bridge.proto') + protoPath: path.join(__dirname, 'proto', 'mavlink2grpc', 'mavlink2grpc.proto') }; diff --git a/examples/inspector/package.json b/examples/inspector/package.json index 487cb29..3ab6286 100644 --- a/examples/inspector/package.json +++ b/examples/inspector/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "node server.js", "dev": "nodemon server.js", - "proto:generate": "grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated --proto_path=../proto ../proto/mavlink_bridge.proto ../proto/mavlink/common.proto" + "proto:generate": "grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated --proto_path=../proto ../proto/mavlink2grpc/mavlink2grpc.proto ../proto/mavlink2grpc/mavlink/common.proto" }, "keywords": [ "mavlink", diff --git a/examples/inspector/server.js b/examples/inspector/server.js index bac7813..ecb383b 100644 --- a/examples/inspector/server.js +++ b/examples/inspector/server.js @@ -134,7 +134,7 @@ class GRPCClient { async connect() { try { // Load proto file - const PROTO_PATH = path.join(__dirname, '..', '..', 'proto', 'mavlink_bridge.proto'); + const PROTO_PATH = path.join(__dirname, '..', '..', 'proto', 'mavlink2grpc', 'mavlink2grpc.proto'); const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, @@ -147,7 +147,7 @@ class GRPCClient { const proto = grpc.loadPackageDefinition(packageDefinition); // Create client - note: service name is MavlinkBridge (capital B in proto, but proto loader makes it camelCase) - this.client = new proto.mavlink.MavlinkBridge( + this.client = new proto.mavlink2grpc.MavlinkBridge( this.serverAddress, grpc.credentials.createInsecure() ); diff --git a/examples/python/README.md b/examples/python/README.md index a912145..fdcfbc5 100644 --- a/examples/python/README.md +++ b/examples/python/README.md @@ -9,7 +9,7 @@ Python examples demonstrating how to use the mavlink2grpc bridge. pip install grpcio grpcio-tools # Create python files from generated protos -python3 -m grpc_tools.protoc -I./proto --python_out=./generated --grpc_python_out=./generated ./proto/mavlink_bridge.proto ./proto/mavlink/common.proto +python3 -m grpc_tools.protoc -I./proto --python_out=./generated --grpc_python_out=./generated ./proto/mavlink2grpc/mavlink2grpc.proto ./proto/mavlink2grpc/mavlink/common.proto ``` ## Available Examples diff --git a/examples/python/stream_telemetry.py b/examples/python/stream_telemetry.py index 6f0778d..c4df7bc 100644 --- a/examples/python/stream_telemetry.py +++ b/examples/python/stream_telemetry.py @@ -14,9 +14,9 @@ # Add generated proto files to path sys.path.insert(0, str(Path(__file__).parent.parent.parent / "generated")) -import mavlink_bridge_pb2 -import mavlink_bridge_pb2_grpc -from mavlink import common_pb2 +from mavlink2grpc import mavlink2grpc_pb2 +from mavlink2grpc import mavlink2grpc_pb2_grpc +from mavlink2grpc.mavlink import common_pb2 def main(): @@ -32,14 +32,14 @@ def main(): # 1. Connect to gRPC channel print(f"Connecting to gRPC bridge at {args.host}...") channel = grpc.insecure_channel(args.host) - stub = mavlink_bridge_pb2_grpc.MavlinkBridgeStub(channel) + stub = mavlink2grpc_pb2_grpc.MavlinkBridgeStub(channel) # 2. Define message filters # We filter by message IDs: # 0 = HEARTBEAT # 30 = ATTITUDE # 33 = GLOBAL_POSITION_INT - stream_filter = mavlink_bridge_pb2.StreamFilter( + stream_filter = mavlink2grpc_pb2.StreamFilter( system_id=0, # 0 means listen to all systems component_id=0, # 0 means listen to all components message_ids=[0, 30, 33] diff --git a/examples/python/takeoff.py b/examples/python/takeoff.py index 5125ba4..d75f837 100755 --- a/examples/python/takeoff.py +++ b/examples/python/takeoff.py @@ -20,9 +20,9 @@ # Add generated proto files to path sys.path.insert(0, str(Path(__file__).parent.parent.parent / "generated")) -import mavlink_bridge_pb2 -import mavlink_bridge_pb2_grpc -from mavlink import common_pb2 +from mavlink2grpc import mavlink2grpc_pb2 +from mavlink2grpc import mavlink2grpc_pb2_grpc +from mavlink2grpc.mavlink import common_pb2 def send_command(stub, target_system, target_component, command, params, command_name="command"): @@ -42,7 +42,7 @@ def send_command(stub, target_system, target_component, command, params, command param7=params[6] ) - message = mavlink_bridge_pb2.MavlinkMessage( + message = mavlink2grpc_pb2.MavlinkMessage( system_id=254, component_id=190, message_id=76, @@ -68,7 +68,7 @@ def send_command(stub, target_system, target_component, command, params, command def wait_for_ack(stub, command_name, timeout=5.0): """Wait for COMMAND_ACK""" - stream_filter = mavlink_bridge_pb2.StreamFilter( + stream_filter = mavlink2grpc_pb2.StreamFilter( system_id=0, component_id=0, message_ids=[77] # COMMAND_ACK @@ -135,7 +135,7 @@ def arm_vehicle(stub, target_system, target_component, force=False): def get_current_position(stub, timeout=5.0): """Get current latitude and longitude from vehicle (GLOBAL_POSITION_INT)""" - stream_filter = mavlink_bridge_pb2.StreamFilter( + stream_filter = mavlink2grpc_pb2.StreamFilter( system_id=0, component_id=0, message_ids=[33] # GLOBAL_POSITION_INT @@ -162,7 +162,7 @@ def get_current_altitude(stub, timeout=5.0): """Get current altitude from vehicle""" # Stream GLOBAL_POSITION_INT messages - stream_filter = mavlink_bridge_pb2.StreamFilter( + stream_filter = mavlink2grpc_pb2.StreamFilter( system_id=0, component_id=0, message_ids=[33] # GLOBAL_POSITION_INT @@ -228,7 +228,7 @@ def main(): print(f"Connecting: {args.host}") channel = grpc.insecure_channel(args.host) - stub = mavlink_bridge_pb2_grpc.MavlinkBridgeStub(channel) + stub = mavlink2grpc_pb2_grpc.MavlinkBridgeStub(channel) try: # Get current altitude first diff --git a/generator/src/generator.py b/generator/src/generator.py index c4a70ef..dfc250f 100644 --- a/generator/src/generator.py +++ b/generator/src/generator.py @@ -123,12 +123,12 @@ def resolve_enum_package(enum_name: str, current_dialect_name: str) -> str: # Generate individual dialect protos for dialect in dialects: - proto_file = output_dir / "mavlink" / f"{dialect.name}.proto" + proto_file = output_dir / "mavlink2grpc" / "mavlink" / f"{dialect.name}.proto" self.generate_dialect_proto(dialect, proto_file) dialect_dict[dialect.name] = dialect # Generate bridge service proto - bridge_file = output_dir / "mavlink_bridge.proto" + bridge_file = output_dir / "mavlink2grpc" / "mavlink2grpc.proto" self.generate_bridge_service(dialect_dict, bridge_file) print(f"\n[OK] Generated {len(dialects)} dialect proto(s) + 1 bridge service") diff --git a/generator/templates/bridge_service.proto.j2 b/generator/templates/bridge_service.proto.j2 index e799199..bf54adb 100644 --- a/generator/templates/bridge_service.proto.j2 +++ b/generator/templates/bridge_service.proto.j2 @@ -1,15 +1,15 @@ syntax = "proto3"; -package mavlink; +package mavlink2grpc; {% for dialect_name in dialect_names %} -import "mavlink/{{ dialect_name }}.proto"; +import "mavlink2grpc/mavlink/{{ dialect_name }}.proto"; {% endfor %} option cc_enable_arenas = true; -option go_package = "github.com/youruser/mavlink2grpc/gen/go/mavlink"; -option java_package = "com.mavlink"; -option java_outer_classname = "BridgeProto"; +option go_package = "github.com/youruser/mavlink2grpc/gen/go/mavlink2grpc"; +option java_package = "com.mavlink2grpc"; +option java_outer_classname = "Mavlink2grpcProto"; // ============================================================================ // MAVLink Bridge Service @@ -66,7 +66,7 @@ message MavlinkMessage { {% for dialect_name in dialect_names %} {% set dialect_messages = dialects[dialect_name].messages %} {% for msg_id, message in dialect_messages.items() %} - {{ dialect_name }}.{{ sanitize_message_name(message.name) }} {{ message.name.lower() }} = {{ 100 + msg_id }}; + mavlink2grpc.{{ dialect_name }}.{{ sanitize_message_name(message.name) }} {{ message.name.lower() }} = {{ 100 + msg_id }}; {% endfor %} {% endfor %} } diff --git a/generator/templates/dialect.proto.j2 b/generator/templates/dialect.proto.j2 index 4f9fb71..3ecf785 100644 --- a/generator/templates/dialect.proto.j2 +++ b/generator/templates/dialect.proto.j2 @@ -1,10 +1,10 @@ syntax = "proto3"; -package mavlink.{{ dialect.name }}; +package mavlink2grpc.{{ dialect.name }}; option cc_enable_arenas = true; -option go_package = "github.com/youruser/mavlink2grpc/gen/go/mavlink/{{ dialect.name }}"; -option java_package = "com.mavlink.{{ dialect.name }}"; +option go_package = "github.com/youruser/mavlink2grpc/gen/go/mavlink2grpc/{{ dialect.name }}"; +option java_package = "com.mavlink2grpc.{{ dialect.name }}"; option java_outer_classname = "{{ dialect.name | title }}Proto"; // Generated from {{ dialect.name }}.xml diff --git a/generator/templates/message_converter.cc.j2 b/generator/templates/message_converter.cc.j2 index 257a0da..e18e36a 100644 --- a/generator/templates/message_converter.cc.j2 +++ b/generator/templates/message_converter.cc.j2 @@ -19,10 +19,10 @@ uint64_t MessageConverter::get_timestamp_usec() { return std::chrono::duration_cast(duration).count(); } -std::optional +std::optional MessageConverter::to_proto(const mav::Message& mavlink_msg, std::optional timestamp_usec) { - mavlink::MavlinkMessage proto_msg; + mavlink2grpc::MavlinkMessage proto_msg; // Set header fields proto_msg.set_system_id(mavlink_msg.header().systemId()); @@ -45,12 +45,12 @@ MessageConverter::to_proto(const mav::Message& mavlink_msg, } std::optional -MessageConverter::from_proto(const mavlink::MavlinkMessage& proto_msg, +MessageConverter::from_proto(const mavlink2grpc::MavlinkMessage& proto_msg, const mav::MessageSet& message_set) { // Handle different payload types switch (proto_msg.payload_case()) { {% for msg in messages %} - case mavlink::MavlinkMessage::k{{ sanitize_message_name(msg.name) }}: { + case mavlink2grpc::MavlinkMessage::k{{ sanitize_message_name(msg.name) }}: { auto msg = message_set.create("{{ msg.name }}"); if (convert_{{ msg.name|lower }}_from_proto( proto_msg.{{ msg.name|lower }}(), @@ -61,7 +61,7 @@ MessageConverter::from_proto(const mavlink::MavlinkMessage& proto_msg, } {% endfor %} - case mavlink::MavlinkMessage::PAYLOAD_NOT_SET: + case mavlink2grpc::MavlinkMessage::PAYLOAD_NOT_SET: return std::nullopt; default: @@ -76,7 +76,7 @@ MessageConverter::from_proto(const mavlink::MavlinkMessage& proto_msg, void MessageConverter::convert_{{ msg.name|lower }}_to_proto( const mav::Message& mavlink_msg, - mavlink::MavlinkMessage& proto_msg) { + mavlink2grpc::MavlinkMessage& proto_msg) { // Create proto message auto* proto = proto_msg.mutable_{{ msg.name|lower }}(); @@ -101,7 +101,7 @@ void MessageConverter::convert_{{ msg.name|lower }}_to_proto( for (const auto& val : vec) { {% if field.type_info.is_enum %} proto->add_{{ sanitize_field_name(field.name) }}( - static_cast(val)); + static_cast(val)); {% else %} proto->add_{{ sanitize_field_name(field.name) }}(val); {% endif %} @@ -112,7 +112,7 @@ void MessageConverter::convert_{{ msg.name|lower }}_to_proto( // Scalar field: {{ field.name }} {% if field.type_info.is_enum %} proto->set_{{ sanitize_field_name(field.name) }}( - static_cast( + static_cast( mavlink_msg["{{ field.name }}"].as<{{ field.type_info.cpp_type }}>())); {% else %} proto->set_{{ sanitize_field_name(field.name) }}( @@ -123,7 +123,7 @@ void MessageConverter::convert_{{ msg.name|lower }}_to_proto( } bool MessageConverter::convert_{{ msg.name|lower }}_from_proto( - const mavlink::{{ msg.dialect }}::{{ sanitize_message_name(msg.name) }}& proto, + const mavlink2grpc::{{ msg.dialect }}::{{ sanitize_message_name(msg.name) }}& proto, mav::Message& mavlink_msg) { {% for field in msg.fields %} diff --git a/generator/templates/message_converter.h.j2 b/generator/templates/message_converter.h.j2 index e71ef58..76e87e9 100644 --- a/generator/templates/message_converter.h.j2 +++ b/generator/templates/message_converter.h.j2 @@ -10,9 +10,9 @@ #include #include -#include +#include {% for dialect_name in dialect_names %} -#include +#include {% endfor %} #include @@ -31,7 +31,7 @@ public: /** * @brief Converts libmav Message to Protocol Buffer. */ - static std::optional + static std::optional to_proto(const mav::Message& mavlink_msg, std::optional timestamp_usec = std::nullopt); @@ -39,7 +39,7 @@ public: * @brief Converts Protocol Buffer message to libmav Message. */ static std::optional - from_proto(const mavlink::MavlinkMessage& proto_msg, + from_proto(const mavlink2grpc::MavlinkMessage& proto_msg, const mav::MessageSet& message_set); private: @@ -49,10 +49,10 @@ private: {% for msg in messages %} static void convert_{{ msg.name|lower }}_to_proto( const mav::Message& mavlink_msg, - mavlink::MavlinkMessage& proto_msg); + mavlink2grpc::MavlinkMessage& proto_msg); static bool convert_{{ msg.name|lower }}_from_proto( - const mavlink::{{ msg.dialect }}::{{ sanitize_message_name(msg.name) }}& proto, + const mavlink2grpc::{{ msg.dialect }}::{{ sanitize_message_name(msg.name) }}& proto, mav::Message& mavlink_msg); {% endfor %} }; diff --git a/generator/test/test_generator.py b/generator/test/test_generator.py index 0339d8c..2cc3240 100644 --- a/generator/test/test_generator.py +++ b/generator/test/test_generator.py @@ -113,14 +113,14 @@ def validate_all_protos(proto_dir: Path, dialect_names: list) -> dict: task = progress.add_task("Validating protos...", total=len(dialect_names)) for name in dialect_names: - proto_file = proto_dir / "mavlink" / f"{name}.proto" + proto_file = proto_dir / "mavlink2grpc" / "mavlink" / f"{name}.proto" if not proto_file.exists(): results["error"].append((name, "File not generated")) progress.update(task, advance=1) continue - status, message = validate_proto(proto_file, proto_dir) + status, message = validate_proto(proto_file, proto_dir / "mavlink2grpc") results[status].append((name, message)) progress.update(task, advance=1) @@ -183,7 +183,7 @@ def main(): for name, _ in val_results["valid"]: if name in dialects: dialect = dialects[name] - proto_file = output_dir / "mavlink" / f"{name}.proto" + proto_file = output_dir / "mavlink2grpc" / "mavlink" / f"{name}.proto" size = proto_file.stat().st_size if proto_file.exists() else 0 table.add_row( name, @@ -197,7 +197,7 @@ def main(): for name, msg in val_results["warning"]: if name in dialects: dialect = dialects[name] - proto_file = output_dir / "mavlink" / f"{name}.proto" + proto_file = output_dir / "mavlink2grpc" / "mavlink" / f"{name}.proto" size = proto_file.stat().st_size if proto_file.exists() else 0 warning_line = msg.split('\n')[0] if msg else "Unknown warning" table.add_row(