From 9d55712c8036670369fb35c5b5ec7782ea04e995 Mon Sep 17 00:00:00 2001 From: SmokedSeaSalt Date: Tue, 9 Jun 2026 21:42:20 +0200 Subject: [PATCH 1/5] change absb parser to take http stream instead of get entire payload first --- src/services/adsb_client.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/services/adsb_client.cpp b/src/services/adsb_client.cpp index 84be21bb7..78e9285d4 100644 --- a/src/services/adsb_client.cpp +++ b/src/services/adsb_client.cpp @@ -232,20 +232,25 @@ bool fetchUpdate(double center_lat, double center_lon, float fetch_radius_km) { return false; } - String payload; - if (!readResponseBodyWithPoll(http, payload)) { - Serial.println("adsb: empty response"); - http.end(); - return false; - } - http.end(); + // String payload; + // if (!readResponseBodyWithPoll(http, payload)) { + // Serial.println("adsb: empty response"); + // http.end(); + // return false; + // } + WiFiClient* stream = http.getStreamPtr(); + if (!stream) { + http.end(); return false; + } + JsonDocument doc; - const DeserializationError err = deserializeJson(doc, payload); + const DeserializationError err = deserializeJson(doc, *stream); if (err) { Serial.printf("adsb: JSON parse error: %s\n", err.c_str()); return false; } + http.end(); JsonArray ac = doc["ac"].as(); if (ac.isNull()) { From f53d95f6a0d527f8589de85a09df2eb840136f6d Mon Sep 17 00:00:00 2001 From: SmokedSeaSalt Date: Tue, 9 Jun 2026 21:43:40 +0200 Subject: [PATCH 2/5] remove old code --- src/services/adsb_client.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/services/adsb_client.cpp b/src/services/adsb_client.cpp index 78e9285d4..ec1a30f63 100644 --- a/src/services/adsb_client.cpp +++ b/src/services/adsb_client.cpp @@ -232,13 +232,6 @@ bool fetchUpdate(double center_lat, double center_lon, float fetch_radius_km) { return false; } - // String payload; - // if (!readResponseBodyWithPoll(http, payload)) { - // Serial.println("adsb: empty response"); - // http.end(); - // return false; - // } - WiFiClient* stream = http.getStreamPtr(); if (!stream) { http.end(); return false; From 0f5caf92565f08be4262cc7d4dcbf639fdd2a35e Mon Sep 17 00:00:00 2001 From: SmokedSeaSalt Date: Tue, 9 Jun 2026 22:04:44 +0200 Subject: [PATCH 3/5] Added filter to the JSON parser to only store needed nodes to save heap memory --- src/services/adsb_client.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/services/adsb_client.cpp b/src/services/adsb_client.cpp index ec1a30f63..9f9579480 100644 --- a/src/services/adsb_client.cpp +++ b/src/services/adsb_client.cpp @@ -237,8 +237,29 @@ bool fetchUpdate(double center_lat, double center_lon, float fetch_radius_km) { http.end(); return false; } + static JsonDocument filter; + static bool filter_built = false; + if (!filter_built) { + JsonObject f = filter["ac"][0].to(); + f["lat"] = true; + f["lon"] = true; + f["flight"] = true; + f["hex"] = true; + f["t"] = true; + f["alt_baro"] = true; + f["alt_geom"] = true; + f["true_heading"] = true; + f["mag_heading"] = true; + f["track"] = true; + f["dir"] = true; + f["gs"] = true; + f["tas"] = true; + f["ias"] = true; + filter_built = true; + } + JsonDocument doc; - const DeserializationError err = deserializeJson(doc, *stream); + const DeserializationError err = deserializeJson(doc, *stream, DeserializationOption::Filter(filter)); if (err) { Serial.printf("adsb: JSON parse error: %s\n", err.c_str()); return false; From 11de537ff901b3d72de14dff0f8a41c59a10364a Mon Sep 17 00:00:00 2001 From: SmokedSeaSalt Date: Tue, 9 Jun 2026 22:05:34 +0200 Subject: [PATCH 4/5] Add check if enough heap is available, otherwise skip fetch --- src/services/adsb_client.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/services/adsb_client.cpp b/src/services/adsb_client.cpp index 9f9579480..62e6c5a8f 100644 --- a/src/services/adsb_client.cpp +++ b/src/services/adsb_client.cpp @@ -215,6 +215,11 @@ bool fetchUpdate(double center_lat, double center_lon, float fetch_radius_km) { url += "/dist/"; url += String(dist_nm, 1); + if (ESP.getFreeHeap() < 50000) { + Serial.printf("adsb: heap too low (%u), skipping\n", ESP.getFreeHeap()); + return false; + } + WiFiClientSecure client; client.setInsecure(); From 20f46771ae26973cbfabec86a0dea50fae6ab54f Mon Sep 17 00:00:00 2001 From: SmokedSeaSalt Date: Sat, 13 Jun 2026 00:13:24 +0200 Subject: [PATCH 5/5] 1 format fix, 1 extra http.end() in error path --- src/services/adsb_client.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/adsb_client.cpp b/src/services/adsb_client.cpp index 62e6c5a8f..d2ee6f5cd 100644 --- a/src/services/adsb_client.cpp +++ b/src/services/adsb_client.cpp @@ -239,7 +239,8 @@ bool fetchUpdate(double center_lat, double center_lon, float fetch_radius_km) { WiFiClient* stream = http.getStreamPtr(); if (!stream) { - http.end(); return false; + http.end(); + return false; } static JsonDocument filter; @@ -267,6 +268,7 @@ bool fetchUpdate(double center_lat, double center_lon, float fetch_radius_km) { const DeserializationError err = deserializeJson(doc, *stream, DeserializationOption::Filter(filter)); if (err) { Serial.printf("adsb: JSON parse error: %s\n", err.c_str()); + http.end(); return false; } http.end();