septentrio: add single wire uart option

This commit is contained in:
Alexander Lerach
2025-06-03 18:37:08 +02:00
parent 0e32b155f3
commit 31041d7410
3 changed files with 57 additions and 9 deletions
+28 -2
View File
@@ -1,12 +1,22 @@
module_name: Septentrio module_name: Septentrio
serial_config: 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: port_config_param:
name: SEP_PORT2_CFG name: SEP_PORT2_CFG
group: Septentrio group: Septentrio
label: Secondary GPS port 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: port_config_param:
name: SEP_PORT1_CFG name: SEP_PORT1_CFG
group: Septentrio group: Septentrio
@@ -15,6 +25,22 @@ serial_config:
parameters: parameters:
- group: Septentrio - group: Septentrio
definitions: 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: SEP_STREAM_MAIN:
description: description:
short: Main stream used during automatic configuration short: Main stream used during automatic configuration
+25 -6
View File
@@ -144,10 +144,12 @@ uint32_t SeptentrioDriver::k_supported_baud_rates[] {0, 38400, 57600, 115200, 23
uint32_t SeptentrioDriver::k_default_baud_rate {230400}; uint32_t SeptentrioDriver::k_default_baud_rate {230400};
orb_advert_t SeptentrioDriver::k_mavlink_log_pub {nullptr}; 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), Device(MODULE_NAME),
_instance(instance), _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); strncpy(_port, device_path, sizeof(_port) - 1);
// Enforce null termination. // Enforce null termination.
@@ -253,7 +255,8 @@ int SeptentrioDriver::print_status()
break; 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("controller -> receiver data rate: %lu B/s", output_data_rate());
PX4_INFO("receiver -> controller data rate: %lu B/s", input_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"); PX4_INFO("sat info: %s", (_message_satellite_info != nullptr) ? "enabled" : "disabled");
@@ -278,6 +281,10 @@ void SeptentrioDriver::run()
_uart.setPort(_port); _uart.setPort(_port);
if (_uart.open()) { if (_uart.open()) {
if (_single_wire_uart) {
_uart.setSingleWireMode();
}
_state = State::DetectingBaudRate; _state = State::DetectingBaudRate;
} else { } else {
@@ -465,7 +472,8 @@ SeptentrioDriver *SeptentrioDriver::instantiate(int argc, char *argv[], Instance
if (instance == Instance::Main) { if (instance == Instance::Main) {
if (Serial::validatePort(arguments.device_path_main)) { if (Serial::validatePort(arguments.device_path_main)) {
gps = new SeptentrioDriver(arguments.device_path_main, instance, 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 { } else {
PX4_ERR("Invalid device (-d) %s", arguments.device_path_main ? arguments.device_path_main : ""); 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 { } else {
if (Serial::validatePort(arguments.device_path_secondary)) { if (Serial::validatePort(arguments.device_path_secondary)) {
gps = new SeptentrioDriver(arguments.device_path_secondary, instance, 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 { } else {
PX4_ERR("Invalid secondary device (-e) %s", arguments.device_path_secondary ? arguments.device_path_secondary : ""); 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_INT('b', 0, 57600, 1500000, "Primary receiver baud rate", true);
PRINT_MODULE_USAGE_PARAM_STRING('e', nullptr, "<file:dev>", "Secondary receiver port", true); PRINT_MODULE_USAGE_PARAM_STRING('e', nullptr, "<file:dev>", "Secondary receiver port", true);
PRINT_MODULE_USAGE_PARAM_INT('g', 0, 57600, 1500000, "Secondary receiver baud rate", 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_DEFAULT_COMMANDS();
PRINT_MODULE_USAGE_COMMAND_DESCR("reset", "Reset connected receiver"); 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}; int myoptind{1};
const char *myoptarg{nullptr}; 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) { switch (ch) {
case 'b': case 'b':
if (px4_get_parameter_value(myoptarg, arguments.baud_rate_main) != 0) { 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; arguments.device_path_secondary = myoptarg;
break; break;
case 's':
arguments.single_wire_uart_main = true;
break;
case 't':
arguments.single_wire_uart_secondary = true;
break;
case '?': case '?':
return PX4_ERROR; return PX4_ERROR;
+4 -1
View File
@@ -76,6 +76,8 @@ struct ModuleArguments {
int baud_rate_secondary {0}; int baud_rate_secondary {0};
const char *device_path_main {nullptr}; const char *device_path_main {nullptr};
const char *device_path_secondary {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<SeptentrioDriver>, public device::Device class SeptentrioDriver : public ModuleBase<SeptentrioDriver>, public device::Device
{ {
public: 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; ~SeptentrioDriver() override;
/** @see ModuleBase */ /** @see ModuleBase */
@@ -715,6 +717,7 @@ private:
bool _time_synced {false}; ///< Receiver time in sync with GPS time 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 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 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<SeptentrioDriver *> _secondary_instance; static px4::atomic<SeptentrioDriver *> _secondary_instance;
hrt_abstime _sleep_end {0}; ///< End time for sleeping hrt_abstime _sleep_end {0}; ///< End time for sleeping
State _resume_state {State::OpeningSerialPort}; ///< Resume state after sleep State _resume_state {State::OpeningSerialPort}; ///< Resume state after sleep