From 3605db0dbe41d72196f3490342de6ea847823aa2 Mon Sep 17 00:00:00 2001 From: Julian Oes Date: Wed, 24 Apr 2019 13:51:12 +0200 Subject: [PATCH 1/2] backend: allow any connection to be started Instead of limiting the backend to UDP connections we should enable all possible connections using `add_any_connection()`. --- backend/src/backend.cpp | 8 ++++---- backend/src/backend.h | 3 ++- backend/src/backend_api.cpp | 6 +++--- backend/src/backend_api.h | 2 +- backend/src/connection_initiator.h | 9 +++++---- backend/src/dronecode_sdk_server.cpp | 2 +- backend/test/connection_initiator_test.cpp | 14 +++++++------- core/mocks/dronecode_sdk_mock.h | 3 ++- 8 files changed, 25 insertions(+), 22 deletions(-) diff --git a/backend/src/backend.cpp b/backend/src/backend.cpp index 8be85f050b..8b335aba88 100644 --- a/backend/src/backend.cpp +++ b/backend/src/backend.cpp @@ -14,9 +14,9 @@ class DronecodeSDKBackend::Impl { Impl() {} ~Impl() {} - void connect(const int mavlink_listen_port) + void connect(const std::string &connection_url) { - _connection_initiator.start(_dc, 14540); + _connection_initiator.start(_dc, connection_url); _connection_initiator.wait(); } @@ -41,9 +41,9 @@ void DronecodeSDKBackend::startGRPCServer() { _impl->startGRPCServer(); } -void DronecodeSDKBackend::connect(const int mavlink_listen_port) +void DronecodeSDKBackend::connect(const std::string &connection_url) { - return _impl->connect(mavlink_listen_port); + return _impl->connect(connection_url); } void DronecodeSDKBackend::wait() { diff --git a/backend/src/backend.h b/backend/src/backend.h index 9d65b4a258..8a2e2a2284 100644 --- a/backend/src/backend.h +++ b/backend/src/backend.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace dronecode_sdk { namespace backend { @@ -13,7 +14,7 @@ class DronecodeSDKBackend { DronecodeSDKBackend &operator=(DronecodeSDKBackend &&) = delete; void startGRPCServer(); - void connect(const int mavlink_listen_port = 14540); + void connect(const std::string &connection_url = "udp://"); void wait(); private: diff --git a/backend/src/backend_api.cpp b/backend/src/backend_api.cpp index b988540853..ede3948fcd 100644 --- a/backend/src/backend_api.cpp +++ b/backend/src/backend_api.cpp @@ -1,12 +1,12 @@ #include "backend_api.h" - #include "backend.h" +#include -void runBackend(const int mavlink_listen_port, void (*onServerStarted)(void *), void *context) +void runBackend(const char *connection_url, void (*onServerStarted)(void *), void *context) { dronecode_sdk::backend::DronecodeSDKBackend backend; backend.startGRPCServer(); - backend.connect(mavlink_listen_port); + backend.connect(std::string(connection_url)); if (onServerStarted != nullptr) { onServerStarted(context); diff --git a/backend/src/backend_api.h b/backend/src/backend_api.h index f8ea0cf626..a5a0611700 100644 --- a/backend/src/backend_api.h +++ b/backend/src/backend_api.h @@ -5,7 +5,7 @@ extern "C" { #endif __attribute__((visibility("default"))) void -runBackend(int mavlink_listen_port, void (*onServerStarted)(void *), void *context); +runBackend(const char *connection_url, void (*onServerStarted)(void *), void *context); #ifdef __cplusplus } diff --git a/backend/src/connection_initiator.h b/backend/src/connection_initiator.h index 29fb2d72c9..36111c573f 100644 --- a/backend/src/connection_initiator.h +++ b/backend/src/connection_initiator.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "connection_result.h" #include "log.h" @@ -13,14 +14,14 @@ template class ConnectionInitiator { ConnectionInitiator() {} ~ConnectionInitiator() {} - bool start(DronecodeSDK &dc, const int port) + bool start(DronecodeSDK &dc, const std::string &connection_url) { init_mutex(); init_timeout_logging(dc); _discovery_future = wrapped_register_on_discover(dc); - if (!add_udp_connection(dc, port)) { + if (!add_any_connection(dc, connection_url)) { return false; } @@ -38,9 +39,9 @@ template class ConnectionInitiator { [](uint64_t uuid) { LogInfo() << "System timed out [UUID: " << uuid << "]"; }); } - bool add_udp_connection(DronecodeSDK &dc, const int port) + bool add_any_connection(DronecodeSDK &dc, const std::string &connection_url) { - dronecode_sdk::ConnectionResult connection_result = dc.add_udp_connection(port); + dronecode_sdk::ConnectionResult connection_result = dc.add_any_connection(connection_url); if (connection_result != ConnectionResult::SUCCESS) { LogErr() << "Connection failed: " << connection_result_str(connection_result); diff --git a/backend/src/dronecode_sdk_server.cpp b/backend/src/dronecode_sdk_server.cpp index 32b7667685..18a451bac9 100644 --- a/backend/src/dronecode_sdk_server.cpp +++ b/backend/src/dronecode_sdk_server.cpp @@ -2,5 +2,5 @@ int main(int argc, char **argv) { - runBackend(14540, nullptr, nullptr); + runBackend("udp://14540", nullptr, nullptr); } diff --git a/backend/test/connection_initiator_test.cpp b/backend/test/connection_initiator_test.cpp index d0e6ecec5c..8c3bd63c8e 100644 --- a/backend/test/connection_initiator_test.cpp +++ b/backend/test/connection_initiator_test.cpp @@ -13,7 +13,7 @@ using event_callback_t = dronecode_sdk::testing::event_callback_t; using MockDronecodeSDK = NiceMock; using ConnectionInitiator = dronecode_sdk::backend::ConnectionInitiator; -static constexpr auto ARBITRARY_PORT = 1291; +static constexpr auto ARBITRARY_CONNECTION_URL = "udp://1291"; static constexpr auto ARBITRARY_UUID = 1492; ACTION_P(SaveCallback, event_callback) @@ -27,7 +27,7 @@ TEST(ConnectionInitiator, registerDiscoverIsCalledExactlyOnce) MockDronecodeSDK dc; EXPECT_CALL(dc, register_on_discover(_)).Times(1); - initiator.start(dc, ARBITRARY_PORT); + initiator.start(dc, ARBITRARY_CONNECTION_URL); } TEST(ConnectionInitiator, startAddsUDPConnection) @@ -35,9 +35,9 @@ TEST(ConnectionInitiator, startAddsUDPConnection) ConnectionInitiator initiator; MockDronecodeSDK dc; - EXPECT_CALL(dc, add_udp_connection(_)); + EXPECT_CALL(dc, add_any_connection(_)); - initiator.start(dc, ARBITRARY_PORT); + initiator.start(dc, ARBITRARY_CONNECTION_URL); } TEST(ConnectionInitiator, startHangsUntilSystemDiscovered) @@ -48,7 +48,7 @@ TEST(ConnectionInitiator, startHangsUntilSystemDiscovered) EXPECT_CALL(dc, register_on_discover(_)).WillOnce(SaveCallback(&discover_callback)); auto async_future = std::async(std::launch::async, [&initiator, &dc]() { - initiator.start(dc, ARBITRARY_PORT); + initiator.start(dc, ARBITRARY_CONNECTION_URL); initiator.wait(); }); @@ -65,7 +65,7 @@ TEST(ConnectionInitiator, connectionDetectedIfDiscoverCallbackCalledBeforeWait) event_callback_t discover_callback; EXPECT_CALL(dc, register_on_discover(_)).WillOnce(SaveCallback(&discover_callback)); - initiator.start(dc, ARBITRARY_PORT); + initiator.start(dc, ARBITRARY_CONNECTION_URL); discover_callback(ARBITRARY_UUID); initiator.wait(); } @@ -77,7 +77,7 @@ TEST(ConnectionInitiator, doesNotCrashIfDiscoverCallbackCalledMoreThanOnce) event_callback_t discover_callback; EXPECT_CALL(dc, register_on_discover(_)).WillOnce(SaveCallback(&discover_callback)); - initiator.start(dc, ARBITRARY_PORT); + initiator.start(dc, ARBITRARY_CONNECTION_URL); discover_callback(ARBITRARY_UUID); discover_callback(ARBITRARY_UUID); } diff --git a/core/mocks/dronecode_sdk_mock.h b/core/mocks/dronecode_sdk_mock.h index 8cc3f257e0..63ba8b068d 100644 --- a/core/mocks/dronecode_sdk_mock.h +++ b/core/mocks/dronecode_sdk_mock.h @@ -1,3 +1,4 @@ +#include #include #include "connection_result.h" @@ -9,7 +10,7 @@ typedef std::function event_callback_t; class MockDronecodeSDK { public: - MOCK_CONST_METHOD1(add_udp_connection, ConnectionResult(int local_port_number)){}; + MOCK_CONST_METHOD1(add_any_connection, ConnectionResult(const std::string &)){}; MOCK_CONST_METHOD1(register_on_discover, void(event_callback_t)){}; MOCK_CONST_METHOD1(register_on_timeout, void(event_callback_t)){}; }; From 198bfa7d2b997956fb159300659d424b35451675 Mon Sep 17 00:00:00 2001 From: Julian Oes Date: Wed, 24 Apr 2019 14:31:32 +0200 Subject: [PATCH 2/2] backend: add connection URL as arg to backend_bin This allows backend_bin to accept the connection URL as an argument, as well as -h or --help to show the usage. --- backend/src/dronecode_sdk_server.cpp | 38 +++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/backend/src/dronecode_sdk_server.cpp b/backend/src/dronecode_sdk_server.cpp index 18a451bac9..4b569eee83 100644 --- a/backend/src/dronecode_sdk_server.cpp +++ b/backend/src/dronecode_sdk_server.cpp @@ -1,6 +1,42 @@ #include "backend_api.h" +#include +#include + +static void usage(); + +static auto constexpr default_connection = "udp://:14540"; int main(int argc, char **argv) { - runBackend("udp://14540", nullptr, nullptr); + if (argc > 2) { + usage(); + return 1; + } + + if (argc == 2) { + const std::string positional_arg = argv[1]; + if (positional_arg.compare("-h") == 0 || positional_arg.compare("--help") == 0) { + usage(); + return 0; + } + runBackend(positional_arg.c_str(), nullptr, nullptr); + } + + runBackend(default_connection, nullptr, nullptr); +} + +void usage() +{ + std::cout << "Usage: backend_bin [-h | --help]" << std::endl + << " backend_bin [Connection URL]" << std::endl + << std::endl + << "Connection URL format should be:" << std::endl + << " Serial: serial:///path/to/serial/dev[:baudrate]" << std::endl + << " UDP: udp://[bind_host][:bind_port]" << std::endl + << " TCP: tcp://[server_host][:server_port]" << std::endl + << std::endl + << "For example to connect to SITL use: udp://:14540" << std::endl + << std::endl + << "Options:" << std::endl + << " -h | --help : show this help" << std::endl; }