fix(mavlink): route daemon status output through logger

MAVLink status output was still written with printf(), which bypasses the daemon-client output relay and can disappear or interleave poorly when commands run through px4-*.exe clients on Windows. Use PX4_INFO_RAW for the multi-line status and stream dumps so the text follows the same raw log path as other daemon-visible module output.

The change keeps the formatting intact for local shells while making external daemon clients see the same status text without relying on process stdout ownership.

Signed-off-by: Nuno Marques <n.marques21@hotmail.com>
This commit is contained in:
Nuno Marques
2026-05-05 21:01:12 -07:00
parent d1500fda9e
commit 4012e7d250
2 changed files with 57 additions and 57 deletions
+46 -46
View File
@@ -383,7 +383,7 @@ Mavlink::destroy_all_instances()
} else { } else {
iterations++; iterations++;
printf("."); PX4_INFO_RAW(".");
fflush(stdout); fflush(stdout);
px4_usleep(10000); px4_usleep(10000);
} }
@@ -422,7 +422,7 @@ Mavlink::get_status_all_instances(bool show_streams_status)
for (Mavlink *inst : mavlink_module_instances) { for (Mavlink *inst : mavlink_module_instances) {
if (inst != nullptr) { if (inst != nullptr) {
printf("\ninstance #%u:\n", iterations); PX4_INFO_RAW("\ninstance #%u:\n", iterations);
if (show_streams_status) { if (show_streams_status) {
inst->display_status_streams(); inst->display_status_streams();
@@ -3125,83 +3125,83 @@ Mavlink::display_status()
#endif // !CONSTRAINED_FLASH #endif // !CONSTRAINED_FLASH
if (_tstatus.heartbeat_type_gcs) { if (_tstatus.heartbeat_type_gcs) {
printf("\tGCS heartbeat valid\n"); PX4_INFO_RAW("\tGCS heartbeat valid\n");
} }
printf("\tmavlink chan: #%u\n", static_cast<unsigned>(_channel)); PX4_INFO_RAW("\tmavlink chan: #%u\n", static_cast<unsigned>(_channel));
if (_tstatus.timestamp > 0) { if (_tstatus.timestamp > 0) {
printf("\ttype:\t\t"); PX4_INFO_RAW("\ttype:\t\t");
if (_radio_status_available) { if (_radio_status_available) {
printf("RADIO Link\n"); PX4_INFO_RAW("RADIO Link\n");
printf("\t rssi:\t\t%" PRIu8 "\n", _rstatus.rssi); PX4_INFO_RAW("\t rssi:\t\t%" PRIu8 "\n", _rstatus.rssi);
printf("\t remote rssi:\t%" PRIu8 "\n", _rstatus.remote_rssi); PX4_INFO_RAW("\t remote rssi:\t%" PRIu8 "\n", _rstatus.remote_rssi);
printf("\t txbuf:\t%" PRIu8 "\n", _rstatus.txbuf); PX4_INFO_RAW("\t txbuf:\t%" PRIu8 "\n", _rstatus.txbuf);
printf("\t noise:\t%" PRIu8 "\n", _rstatus.noise); PX4_INFO_RAW("\t noise:\t%" PRIu8 "\n", _rstatus.noise);
printf("\t remote noise:\t%" PRIu8 "\n", _rstatus.remote_noise); PX4_INFO_RAW("\t remote noise:\t%" PRIu8 "\n", _rstatus.remote_noise);
printf("\t rx errors:\t%" PRIu16 "\n", _rstatus.rxerrors); PX4_INFO_RAW("\t rx errors:\t%" PRIu16 "\n", _rstatus.rxerrors);
printf("\t fixed:\t%" PRIu16 "\n", _rstatus.fix); PX4_INFO_RAW("\t fixed:\t%" PRIu16 "\n", _rstatus.fix);
} else if (_tstatus.type == telemetry_status_s::LINK_TYPE_USB) { } else if (_tstatus.type == telemetry_status_s::LINK_TYPE_USB) {
printf("USB CDC\n"); PX4_INFO_RAW("USB CDC\n");
} else { } else {
printf("GENERIC LINK OR RADIO\n"); PX4_INFO_RAW("GENERIC LINK OR RADIO\n");
} }
} else { } else {
printf("\tno radio status.\n"); PX4_INFO_RAW("\tno radio status.\n");
} }
printf("\tflow control: %s\n", _flow_control_mode ? "ON" : "OFF"); PX4_INFO_RAW("\tflow control: %s\n", _flow_control_mode ? "ON" : "OFF");
printf("\trates:\n"); PX4_INFO_RAW("\trates:\n");
printf("\t tx: %.1f B/s\n", (double)_tstatus.tx_rate_avg); PX4_INFO_RAW("\t tx: %.1f B/s\n", (double)_tstatus.tx_rate_avg);
printf("\t txerr: %.1f B/s\n", (double)_tstatus.tx_error_rate_avg); PX4_INFO_RAW("\t txerr: %.1f B/s\n", (double)_tstatus.tx_error_rate_avg);
printf("\t tx rate mult: %.3f\n", (double)_rate_mult); PX4_INFO_RAW("\t tx rate mult: %.3f\n", (double)_rate_mult);
printf("\t tx rate max: %i B/s\n", _datarate); PX4_INFO_RAW("\t tx rate max: %i B/s\n", _datarate);
printf("\t rx: %.1f B/s\n", (double)_tstatus.rx_rate_avg); PX4_INFO_RAW("\t rx: %.1f B/s\n", (double)_tstatus.rx_rate_avg);
printf("\t rx loss: %.1f%%\n", (double)_tstatus.rx_message_lost_rate); PX4_INFO_RAW("\t rx loss: %.1f%%\n", (double)_tstatus.rx_message_lost_rate);
#if !defined(CONSTRAINED_FLASH) #if !defined(CONSTRAINED_FLASH)
_receiver.print_detailed_rx_stats(); _receiver.print_detailed_rx_stats();
#endif // !CONSTRAINED_FLASH #endif // !CONSTRAINED_FLASH
if (_mavlink_ulog) { if (_mavlink_ulog) {
printf("\tULog rate: %.1f%% of max %.1f%%\n", (double)_mavlink_ulog->current_data_rate() * 100., PX4_INFO_RAW("\tULog rate: %.1f%% of max %.1f%%\n", (double)_mavlink_ulog->current_data_rate() * 100.,
(double)_mavlink_ulog->maximum_data_rate() * 100.); (double)_mavlink_ulog->maximum_data_rate() * 100.);
} }
printf("\tFTP enabled: %s, TX enabled: %s\n", PX4_INFO_RAW("\tFTP enabled: %s, TX enabled: %s\n",
_ftp_on ? "YES" : "NO", _ftp_on ? "YES" : "NO",
_transmitting_enabled ? "YES" : "NO"); _transmitting_enabled ? "YES" : "NO");
printf("\tmode: %s\n", mavlink_mode_str(_mode)); PX4_INFO_RAW("\tmode: %s\n", mavlink_mode_str(_mode));
if (_mode == MAVLINK_MODE_IRIDIUM) { if (_mode == MAVLINK_MODE_IRIDIUM) {
printf("\t iridium tx freq: %.3f\n", (double)(_high_latency_freq)); PX4_INFO_RAW("\t iridium tx freq: %.3f\n", (double)(_high_latency_freq));
} }
printf("\tForwarding: %s\n", get_forwarding_on() ? "On" : "Off"); PX4_INFO_RAW("\tForwarding: %s\n", get_forwarding_on() ? "On" : "Off");
printf("\tMAVLink version: %" PRId8 "\n", _protocol_version); PX4_INFO_RAW("\tMAVLink version: %" PRId8 "\n", _protocol_version);
printf("\ttransport protocol: "); PX4_INFO_RAW("\ttransport protocol: ");
switch (_protocol) { switch (_protocol) {
#if defined(MAVLINK_UDP) #if defined(MAVLINK_UDP)
case Protocol::UDP: case Protocol::UDP:
printf("UDP (%hu, remote port: %hu)\n", _network_port, _remote_port); PX4_INFO_RAW("UDP (%hu, remote port: %hu)\n", _network_port, _remote_port);
printf("\tBroadcast enabled: %s\n", PX4_INFO_RAW("\tBroadcast enabled: %s\n",
broadcast_enabled() ? "YES" : "NO"); broadcast_enabled() ? "YES" : "NO");
#if defined(CONFIG_NET_IGMP) && defined(CONFIG_NET_ROUTE) #if defined(CONFIG_NET_IGMP) && defined(CONFIG_NET_ROUTE)
printf("\tMulticast enabled: %s\n", PX4_INFO_RAW("\tMulticast enabled: %s\n",
multicast_enabled() ? "YES" : "NO"); multicast_enabled() ? "YES" : "NO");
#endif #endif
#ifdef __PX4_POSIX #ifdef __PX4_POSIX
if (get_client_source_initialized()) { if (get_client_source_initialized()) {
printf("\tpartner IP: %s\n", inet_ntoa(get_client_source_address().sin_addr)); PX4_INFO_RAW("\tpartner IP: %s\n", inet_ntoa(get_client_source_address().sin_addr));
} }
#endif #endif
@@ -3209,24 +3209,24 @@ Mavlink::display_status()
#endif // MAVLINK_UDP #endif // MAVLINK_UDP
case Protocol::SERIAL: case Protocol::SERIAL:
printf("serial (%s @%i)\n", _device_name, _baudrate); PX4_INFO_RAW("serial (%s @%i)\n", _device_name, _baudrate);
break; break;
} }
if (_ping_stats.last_ping_time > 0) { if (_ping_stats.last_ping_time > 0) {
printf("\tping statistics:\n"); PX4_INFO_RAW("\tping statistics:\n");
printf("\t last: %0.2f ms\n", (double)_ping_stats.last_rtt); PX4_INFO_RAW("\t last: %0.2f ms\n", (double)_ping_stats.last_rtt);
printf("\t mean: %0.2f ms\n", (double)_ping_stats.mean_rtt); PX4_INFO_RAW("\t mean: %0.2f ms\n", (double)_ping_stats.mean_rtt);
printf("\t max: %0.2f ms\n", (double)_ping_stats.max_rtt); PX4_INFO_RAW("\t max: %0.2f ms\n", (double)_ping_stats.max_rtt);
printf("\t min: %0.2f ms\n", (double)_ping_stats.min_rtt); PX4_INFO_RAW("\t min: %0.2f ms\n", (double)_ping_stats.min_rtt);
printf("\t dropped packets: %" PRIi32 "\n", _ping_stats.dropped_packets); PX4_INFO_RAW("\t dropped packets: %" PRIi32 "\n", _ping_stats.dropped_packets);
} }
} }
void void
Mavlink::display_status_streams() Mavlink::display_status_streams()
{ {
printf("\t%-20s%-16s %s\n", "Name", "Rate Config (current) [Hz]", "Message Size (if active) [B]"); PX4_INFO_RAW("\t%-20s%-16s %s\n", "Name", "Rate Config (current) [Hz]", "Message Size (if active) [B]");
const float rate_mult = _rate_mult; const float rate_mult = _rate_mult;
@@ -3246,13 +3246,13 @@ Mavlink::display_status_streams()
snprintf(rate_str, sizeof(rate_str), "%6.2f (%.3f)", (double)rate, (double)rate_current); snprintf(rate_str, sizeof(rate_str), "%6.2f (%.3f)", (double)rate, (double)rate_current);
} }
printf("\t%-30s%-16s", stream->get_name(), rate_str); PX4_INFO_RAW("\t%-30s%-16s", stream->get_name(), rate_str);
if (size > 0) { if (size > 0) {
printf(" %3u\n", size); PX4_INFO_RAW(" %3u\n", size);
} else { } else {
printf("\n"); PX4_INFO_RAW("\n");
} }
} }
} }
+3 -3
View File
@@ -3578,11 +3578,11 @@ void MavlinkReceiver::print_detailed_rx_stats() const
{ {
// TODO: add mutex around shared data. // TODO: add mutex around shared data.
if (_component_states_count > 0) { if (_component_states_count > 0) {
printf("\tReceived Messages:\n"); PX4_INFO_RAW("\tReceived Messages:\n");
for (const auto &comp_stat : _component_states) { for (const auto &comp_stat : _component_states) {
if (comp_stat.received_messages > 0) { if (comp_stat.received_messages > 0) {
printf("\t sysid:%3" PRIu8 ", compid:%3" PRIu8 ", Total: %" PRIu32 " (lost: %" PRIu32 ")\n", PX4_INFO_RAW("\t sysid:%3" PRIu8 ", compid:%3" PRIu8 ", Total: %" PRIu32 " (lost: %" PRIu32 ")\n",
comp_stat.system_id, comp_stat.component_id, comp_stat.system_id, comp_stat.component_id,
comp_stat.received_messages, comp_stat.missed_messages); comp_stat.received_messages, comp_stat.missed_messages);
@@ -3602,7 +3602,7 @@ void MavlinkReceiver::print_detailed_rx_stats() const
const float elapsed_s = (now_ms - msg_stat.last_time_received_ms) / 1000.f; const float elapsed_s = (now_ms - msg_stat.last_time_received_ms) / 1000.f;
printf("\t msgid:%5" PRIu16 ", Rate:%5.1f Hz, last %.2fs ago\n", PX4_INFO_RAW("\t msgid:%5" PRIu16 ", Rate:%5.1f Hz, last %.2fs ago\n",
msg_stat.msg_id, (double)msg_stat.avg_rate_hz, (double)elapsed_s); msg_stat.msg_id, (double)msg_stat.avg_rate_hz, (double)elapsed_s);
} }
} }