Skip to content

Commit ccd5c55

Browse files
Fixes packet drops & adds some counters - still a few changes to make
1 parent 70325fd commit ccd5c55

File tree

2 files changed

+45
-25
lines changed

2 files changed

+45
-25
lines changed

lib/WIFI/devWIFI.cpp

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ uint32_t mavlink_from_uart_packets = 0;
109109
uint32_t mavlink_to_uart_packets = 0;
110110
uint32_t mavlink_from_uart_drops = 0;
111111
uint32_t mavlink_to_uart_drops = 0;
112+
uint32_t mavlink_from_uart_overflows = 0;
112113
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
115116
mavlink_message_t mavlink_to_gcs_buf[mavlink_to_uart_buf_size];
116117
uint8_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;

src/Tx_main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ void setup()
342342
Serial1.setDebugOutput(true);
343343
#endif
344344
Serial.begin(460800);
345-
Serial.setRxBufferSize(1024);
345+
Serial.setRxBufferSize(4096);
346346

347347
options_init();
348348

0 commit comments

Comments
 (0)