diff --git a/src/drivers/gnss/septentrio/module.yaml b/src/drivers/gnss/septentrio/module.yaml index fc41c3d0c0..16d83d139d 100644 --- a/src/drivers/gnss/septentrio/module.yaml +++ b/src/drivers/gnss/septentrio/module.yaml @@ -1,12 +1,22 @@ module_name: Septentrio serial_config: - - command: set DUAL_GPS_ARGS "-e ${SERIAL_DEV} -g p:${BAUD_PARAM}" + - command: | + if param compare SEP_PORT2_S_WIRE 1 + then + set DUAL_SEP_ARGS "${DUAL_SEP_ARGS} -t" + fi + set DUAL_GPS_ARGS "-e ${SERIAL_DEV} -g p:${BAUD_PARAM} ${DUAL_SEP_ARGS}" port_config_param: name: SEP_PORT2_CFG group: Septentrio label: Secondary GPS port - - command: septentrio start -d ${SERIAL_DEV} -b p:${BAUD_PARAM} ${DUAL_GPS_ARGS} + - command: | + if param compare SEP_PORT1_S_WIRE 1 + then + set SEP_ARGS "${SEP_ARGS} -s" + fi + septentrio start -d ${SERIAL_DEV} -b p:${BAUD_PARAM} ${SEP_ARGS} ${DUAL_GPS_ARGS} port_config_param: name: SEP_PORT1_CFG group: Septentrio @@ -15,6 +25,22 @@ serial_config: parameters: - group: Septentrio definitions: + SEP_PORT1_S_WIRE: + description: + short: Use single wire UART on SEP_PORT1 + long: | + Sets whether single wire UART should be used on SEP_PORT1. + type: boolean + default: 0 + reboot_required: true + SEP_PORT2_S_WIRE: + description: + short: Use single wire UART on SEP_PORT2 + long: | + Sets whether single wire UART should be used on SEP_PORT2. + type: boolean + default: 0 + reboot_required: true SEP_STREAM_MAIN: description: short: Main stream used during automatic configuration diff --git a/src/drivers/gnss/septentrio/septentrio.cpp b/src/drivers/gnss/septentrio/septentrio.cpp index 9bd5a8bb05..dcd623fe5c 100644 --- a/src/drivers/gnss/septentrio/septentrio.cpp +++ b/src/drivers/gnss/septentrio/septentrio.cpp @@ -144,10 +144,12 @@ uint32_t SeptentrioDriver::k_supported_baud_rates[] {0, 38400, 57600, 115200, 23 uint32_t SeptentrioDriver::k_default_baud_rate {230400}; orb_advert_t SeptentrioDriver::k_mavlink_log_pub {nullptr}; -SeptentrioDriver::SeptentrioDriver(const char *device_path, Instance instance, uint32_t baud_rate) : +SeptentrioDriver::SeptentrioDriver(const char *device_path, Instance instance, uint32_t baud_rate, + bool single_wire_uart) : Device(MODULE_NAME), _instance(instance), - _chosen_baud_rate(baud_rate) + _chosen_baud_rate(baud_rate), + _single_wire_uart(single_wire_uart) { strncpy(_port, device_path, sizeof(_port) - 1); // Enforce null termination. @@ -253,7 +255,8 @@ int SeptentrioDriver::print_status() break; } - PX4_INFO("health: %s, port: %s, baud rate: %lu", is_healthy() ? "OK" : "NOT OK", _port, _uart.getBaudrate()); + PX4_INFO("health: %s, port: %s, baud rate: %lu, single wire UART: %u", is_healthy() ? "OK" : "NOT OK", _port, + _uart.getBaudrate(), _single_wire_uart); PX4_INFO("controller -> receiver data rate: %lu B/s", output_data_rate()); PX4_INFO("receiver -> controller data rate: %lu B/s", input_data_rate()); PX4_INFO("sat info: %s", (_message_satellite_info != nullptr) ? "enabled" : "disabled"); @@ -278,6 +281,10 @@ void SeptentrioDriver::run() _uart.setPort(_port); if (_uart.open()) { + if (_single_wire_uart) { + _uart.setSingleWireMode(); + } + _state = State::DetectingBaudRate; } else { @@ -465,7 +472,8 @@ SeptentrioDriver *SeptentrioDriver::instantiate(int argc, char *argv[], Instance if (instance == Instance::Main) { if (Serial::validatePort(arguments.device_path_main)) { gps = new SeptentrioDriver(arguments.device_path_main, instance, - valid_chosen_baud_rate ? arguments.baud_rate_main : k_default_baud_rate); + valid_chosen_baud_rate ? arguments.baud_rate_main : k_default_baud_rate, + arguments.single_wire_uart_main); } else { PX4_ERR("Invalid device (-d) %s", arguments.device_path_main ? arguments.device_path_main : ""); @@ -482,7 +490,8 @@ SeptentrioDriver *SeptentrioDriver::instantiate(int argc, char *argv[], Instance } else { if (Serial::validatePort(arguments.device_path_secondary)) { gps = new SeptentrioDriver(arguments.device_path_secondary, instance, - valid_chosen_baud_rate ? arguments.baud_rate_secondary : k_default_baud_rate); + valid_chosen_baud_rate ? arguments.baud_rate_secondary : k_default_baud_rate, + arguments.single_wire_uart_secondary); } else { PX4_ERR("Invalid secondary device (-e) %s", arguments.device_path_secondary ? arguments.device_path_secondary : ""); @@ -570,6 +579,8 @@ $ gps reset warm PRINT_MODULE_USAGE_PARAM_INT('b', 0, 57600, 1500000, "Primary receiver baud rate", true); PRINT_MODULE_USAGE_PARAM_STRING('e', nullptr, "", "Secondary receiver port", true); PRINT_MODULE_USAGE_PARAM_INT('g', 0, 57600, 1500000, "Secondary receiver baud rate", true); + PRINT_MODULE_USAGE_PARAM_FLAG('s', "Primary receiver, use single wire UART", true); + PRINT_MODULE_USAGE_PARAM_FLAG('t', "Secondary receiver, use single wire UART", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); PRINT_MODULE_USAGE_COMMAND_DESCR("reset", "Reset connected receiver"); @@ -627,7 +638,7 @@ int SeptentrioDriver::parse_cli_arguments(int argc, char *argv[], ModuleArgument int myoptind{1}; const char *myoptarg{nullptr}; - while ((ch = px4_getopt(argc, argv, "d:e:b:g:", &myoptind, &myoptarg)) != EOF) { + while ((ch = px4_getopt(argc, argv, "d:e:b:g:st", &myoptind, &myoptarg)) != EOF) { switch (ch) { case 'b': if (px4_get_parameter_value(myoptarg, arguments.baud_rate_main) != 0) { @@ -649,6 +660,14 @@ int SeptentrioDriver::parse_cli_arguments(int argc, char *argv[], ModuleArgument arguments.device_path_secondary = myoptarg; break; + case 's': + arguments.single_wire_uart_main = true; + break; + + case 't': + arguments.single_wire_uart_secondary = true; + break; + case '?': return PX4_ERROR; diff --git a/src/drivers/gnss/septentrio/septentrio.h b/src/drivers/gnss/septentrio/septentrio.h index d4b0971bbe..2bdf6000fa 100644 --- a/src/drivers/gnss/septentrio/septentrio.h +++ b/src/drivers/gnss/septentrio/septentrio.h @@ -76,6 +76,8 @@ struct ModuleArguments { int baud_rate_secondary {0}; const char *device_path_main {nullptr}; const char *device_path_secondary {nullptr}; + bool single_wire_uart_main {false}; + bool single_wire_uart_secondary {false}; }; /** @@ -229,7 +231,7 @@ enum class ReceiverOutputTracker { class SeptentrioDriver : public ModuleBase, public device::Device { public: - SeptentrioDriver(const char *device_path, Instance instance, uint32_t baud_rate); + SeptentrioDriver(const char *device_path, Instance instance, uint32_t baud_rate, bool single_wire_uart); ~SeptentrioDriver() override; /** @see ModuleBase */ @@ -715,6 +717,7 @@ private: bool _time_synced {false}; ///< Receiver time in sync with GPS time const Instance _instance {Instance::Main}; ///< The receiver that this instance of the driver controls uint32_t _chosen_baud_rate {0}; ///< The baud rate requested by the user + bool _single_wire_uart {false}; ///< Whether single wire UART should be used static px4::atomic _secondary_instance; hrt_abstime _sleep_end {0}; ///< End time for sleeping State _resume_state {State::OpeningSerialPort}; ///< Resume state after sleep