@@ -109,9 +109,10 @@ uint32_t mavlink_from_uart_packets = 0;
109
109
uint32_t mavlink_to_uart_packets = 0 ;
110
110
uint32_t mavlink_from_uart_drops = 0 ;
111
111
uint32_t mavlink_to_uart_drops = 0 ;
112
+ uint32_t mavlink_from_uart_overflows = 0 ;
112
113
constexpr 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
115
116
mavlink_message_t mavlink_to_gcs_buf[mavlink_to_uart_buf_size];
116
117
uint8_t mavlink_to_gcs_buf_count = 0 ;
117
118
#endif
@@ -476,10 +477,11 @@ static void WebMAVLinkHandler(AsyncWebServerRequest *request)
476
477
{
477
478
DynamicJsonDocument json (1024 );
478
479
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;
483
485
json[" ports" ][" listen" ] = MAVLINK_PORT_LISTEN;
484
486
json[" ports" ][" send" ] = MAVLINK_PORT_SEND;
485
487
@@ -726,39 +728,58 @@ static void HandleWebUpdate()
726
728
727
729
if (servicesStarted)
728
730
{
729
- while (Serial.available ()) {
731
+ while (Serial.available ())
732
+ {
730
733
#if defined(MAVLINK_ENABLED)
731
- if (wifiService == WIFI_SERVICE_UPDATE) {
734
+ if (wifiService == WIFI_SERVICE_UPDATE)
735
+ {
732
736
int val = Serial.read ();
733
737
logBuffer[logPos++] = val;
734
738
logBuffer[logPos] = 0 ;
735
- if (val == ' \n ' || logPos == sizeof (logBuffer)-1 ) {
739
+ if (val == ' \n ' || logPos == sizeof (logBuffer) - 1 )
740
+ {
736
741
logging.send (logBuffer);
737
742
logPos = 0 ;
738
743
}
739
- } else if (wifiService == WIFI_SERVICE_MAVLINK_TX) {
740
- mavlink_message_t msg;
744
+ }
745
+ else if (wifiService == WIFI_SERVICE_MAVLINK_TX)
746
+ {
741
747
mavlink_status_t status;
742
748
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
+ {
745
758
// 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
+ }
754
771
}
772
+ expectedSeq = seq + 1 ;
773
+ expectedSeqSet = true ;
774
+ mavlink_to_gcs_buf_count++;
755
775
}
756
776
}
757
777
#else
758
778
int val = Serial.read ();
759
779
logBuffer[logPos++] = val;
760
780
logBuffer[logPos] = 0 ;
761
- if (val == ' \n ' || logPos == sizeof (logBuffer)-1 ) {
781
+ if (val == ' \n ' || logPos == sizeof (logBuffer) - 1 )
782
+ {
762
783
logging.send (logBuffer);
763
784
logPos = 0 ;
764
785
}
@@ -785,7 +806,6 @@ static void HandleWebUpdate()
785
806
{
786
807
break ;
787
808
mavlinkUDP.endPacket ();
788
- delay (2 );
789
809
mavlinkUDP.beginPacket (broadcast, MAVLINK_PORT_SEND);
790
810
sent = mavlinkUDP.write (buf + sent, len - sent);
791
811
mavlinkUDP.endPacket ();
@@ -815,7 +835,7 @@ static void HandleWebUpdate()
815
835
#endif
816
836
// When in STA mode, a small delay reduces power use from 90mA to 30mA when idle
817
837
// 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 )
819
839
delay (1 );
820
840
if (do_flash) {
821
841
do_flash = false ;
0 commit comments