@@ -109,9 +109,10 @@ uint32_t mavlink_from_uart_packets = 0;
109109uint32_t mavlink_to_uart_packets = 0 ;
110110uint32_t mavlink_from_uart_drops = 0 ;
111111uint32_t mavlink_to_uart_drops = 0 ;
112+ uint32_t mavlink_from_uart_overflows = 0 ;
112113constexpr size_t mavlink_to_uart_buf_size = 16 ;
113- constexpr size_t mavlink_to_uart_buf_threshold = mavlink_to_uart_buf_size / 4 ;
114- constexpr size_t mavlink_to_uart_buf_timeout = 5 ; // 5ms
114+ constexpr size_t mavlink_to_uart_buf_threshold = mavlink_to_uart_buf_size / 2 ;
115+ constexpr size_t mavlink_to_uart_buf_timeout = 500 ; // ms
115116mavlink_message_t mavlink_to_gcs_buf[mavlink_to_uart_buf_size];
116117uint8_t mavlink_to_gcs_buf_count = 0 ;
117118#endif
@@ -476,10 +477,11 @@ static void WebMAVLinkHandler(AsyncWebServerRequest *request)
476477{
477478 DynamicJsonDocument json (1024 );
478479 json[" enabled" ] = wifiService == WIFI_SERVICE_MAVLINK_TX;
479- json[" counters" ][" packets_to_gcs" ] = mavlink_from_uart_packets;
480- json[" counters" ][" packets_to_aircraft" ] = mavlink_to_uart_packets;
481- json[" counters" ][" drops_to_gcs" ] = mavlink_from_uart_drops;
482- json[" counters" ][" drops_to_aircraft" ] = mavlink_to_uart_drops;
480+ json[" counters" ][" packets_from_aircraft" ] = mavlink_from_uart_packets;
481+ json[" counters" ][" packets_from_gcs" ] = mavlink_to_uart_packets;
482+ json[" counters" ][" drops_from_aircraft" ] = mavlink_from_uart_drops;
483+ json[" counters" ][" drops_from_gcs" ] = mavlink_to_uart_drops;
484+ json[" counters" ][" overflows_from_aircraft" ] = mavlink_from_uart_overflows;
483485 json[" ports" ][" listen" ] = MAVLINK_PORT_LISTEN;
484486 json[" ports" ][" send" ] = MAVLINK_PORT_SEND;
485487
@@ -726,39 +728,58 @@ static void HandleWebUpdate()
726728
727729 if (servicesStarted)
728730 {
729- while (Serial.available ()) {
731+ while (Serial.available ())
732+ {
730733#if defined(MAVLINK_ENABLED)
731- if (wifiService == WIFI_SERVICE_UPDATE) {
734+ if (wifiService == WIFI_SERVICE_UPDATE)
735+ {
732736 int val = Serial.read ();
733737 logBuffer[logPos++] = val;
734738 logBuffer[logPos] = 0 ;
735- if (val == ' \n ' || logPos == sizeof (logBuffer)-1 ) {
739+ if (val == ' \n ' || logPos == sizeof (logBuffer) - 1 )
740+ {
736741 logging.send (logBuffer);
737742 logPos = 0 ;
738743 }
739- } else if (wifiService == WIFI_SERVICE_MAVLINK_TX) {
740- mavlink_message_t msg;
744+ }
745+ else if (wifiService == WIFI_SERVICE_MAVLINK_TX)
746+ {
741747 mavlink_status_t status;
742748 char val = Serial.read ();
743- static uint8_t seq = 0 ;
744- if (mavlink_parse_char (MAVLINK_COMM_0, val, &msg, &status)) {
749+ static uint8_t expectedSeq = 0 ;
750+ static bool expectedSeqSet = false ;
751+ if (mavlink_to_gcs_buf_count >= mavlink_to_uart_buf_size)
752+ {
753+ mavlink_from_uart_overflows++;
754+ return ;
755+ }
756+ if (mavlink_frame_char (MAVLINK_COMM_0, val, &mavlink_to_gcs_buf[mavlink_to_gcs_buf_count], &status) != MAVLINK_FRAMING_INCOMPLETE)
757+ {
745758 // Track gaps in the sequence number, add to a dropped counter
746- if (seq != 0 && msg.seq != seq + 1 ) {
747- mavlink_from_uart_drops += msg.seq - seq - 1 ;
748- }
749- seq = msg.seq ;
750- if (mavlink_to_gcs_buf_count < mavlink_to_uart_buf_size) {
751- mavlink_to_gcs_buf[mavlink_to_gcs_buf_count++] = msg;
752- } else {
753- // TODO: log buffer overflow
759+ uint8_t seq = mavlink_to_gcs_buf[mavlink_to_gcs_buf_count].seq ;
760+ if (expectedSeqSet && seq != expectedSeq)
761+ {
762+ // account for rollovers
763+ if (seq < expectedSeq)
764+ {
765+ mavlink_from_uart_drops += (UINT8_MAX - expectedSeq) + seq;
766+ }
767+ else
768+ {
769+ mavlink_from_uart_drops += seq - expectedSeq;
770+ }
754771 }
772+ expectedSeq = seq + 1 ;
773+ expectedSeqSet = true ;
774+ mavlink_to_gcs_buf_count++;
755775 }
756776 }
757777#else
758778 int val = Serial.read ();
759779 logBuffer[logPos++] = val;
760780 logBuffer[logPos] = 0 ;
761- if (val == ' \n ' || logPos == sizeof (logBuffer)-1 ) {
781+ if (val == ' \n ' || logPos == sizeof (logBuffer) - 1 )
782+ {
762783 logging.send (logBuffer);
763784 logPos = 0 ;
764785 }
@@ -785,7 +806,6 @@ static void HandleWebUpdate()
785806 {
786807 break ;
787808 mavlinkUDP.endPacket ();
788- delay (2 );
789809 mavlinkUDP.beginPacket (broadcast, MAVLINK_PORT_SEND);
790810 sent = mavlinkUDP.write (buf + sent, len - sent);
791811 mavlinkUDP.endPacket ();
@@ -815,7 +835,7 @@ static void HandleWebUpdate()
815835 #endif
816836 // When in STA mode, a small delay reduces power use from 90mA to 30mA when idle
817837 // In AP mode, it doesn't seem to make a measurable difference, but does not hurt
818- if (!updater.isRunning ())
838+ if (!updater.isRunning () && wifiService != WIFI_SERVICE_MAVLINK_TX )
819839 delay (1 );
820840 if (do_flash) {
821841 do_flash = false ;
0 commit comments