Fix web UI hang: explicit content length with 1KB chunked delivery; Optimize ISR with direct GPIO writes to safely run 500kHz LFSR

Made-with: Cursor
This commit is contained in:
drjones
2026-04-03 12:57:14 -07:00
parent adf2b51d70
commit 5232624404
2 changed files with 43 additions and 15 deletions

View File

@@ -1572,17 +1572,33 @@ static void IRAM_ATTR noiseISR() {
if (s_noiseIsPulse) {
static uint32_t pulseToggle = 0;
pulseToggle ^= 1;
if (s_noiseEn1) gpio_set_level((gpio_num_t)CC1101_1_GDO0, pulseToggle);
else gpio_set_level((gpio_num_t)CC1101_1_GDO0, 0);
if (s_noiseEn2) gpio_set_level((gpio_num_t)CC1101_2_GDO0, pulseToggle);
else gpio_set_level((gpio_num_t)CC1101_2_GDO0, 0);
if (s_noiseEn1) {
if (pulseToggle) GPIO.out_w1ts = (1 << CC1101_1_GDO0);
else GPIO.out_w1tc = (1 << CC1101_1_GDO0);
} else {
GPIO.out_w1tc = (1 << CC1101_1_GDO0);
}
if (s_noiseEn2) {
if (pulseToggle) GPIO.out_w1ts = (1 << CC1101_2_GDO0);
else GPIO.out_w1tc = (1 << CC1101_2_GDO0);
} else {
GPIO.out_w1tc = (1 << CC1101_2_GDO0);
}
} else {
const uint32_t s = lfsrStep(s_lfsr);
s_lfsr = s;
if (s_noiseEn1) gpio_set_level((gpio_num_t)CC1101_1_GDO0, (s >> 0) & 1u);
else gpio_set_level((gpio_num_t)CC1101_1_GDO0, 0);
if (s_noiseEn2) gpio_set_level((gpio_num_t)CC1101_2_GDO0, (s >> 7) & 1u);
else gpio_set_level((gpio_num_t)CC1101_2_GDO0, 0);
if (s_noiseEn1) {
if (s & 1u) GPIO.out_w1ts = (1 << CC1101_1_GDO0);
else GPIO.out_w1tc = (1 << CC1101_1_GDO0);
} else {
GPIO.out_w1tc = (1 << CC1101_1_GDO0);
}
if (s_noiseEn2) {
if ((s >> 7) & 1u) GPIO.out_w1ts = (1 << CC1101_2_GDO0);
else GPIO.out_w1tc = (1 << CC1101_2_GDO0);
} else {
GPIO.out_w1tc = (1 << CC1101_2_GDO0);
}
}
}
@@ -2248,9 +2264,21 @@ static void handleRoot() {
server.sendHeader("Pragma", "no-cache");
server.sendHeader("Expires", "0");
// Send directly from flash. WebServer::send_P handles Content-Length and TCP chunking
// internally without allocating a 15 KB String on the heap.
server.send_P(200, "text/html; charset=utf-8", kHtml, sizeof(kHtml) - 1);
// Set explicit content length to avoid Transfer-Encoding: chunked (which some mobile browsers drop)
const size_t total = sizeof(kHtml) - 1;
server.setContentLength(total);
server.send(200, "text/html; charset=utf-8", "");
// Stream the HTML out of flash in 1KB chunks with a tiny delay.
// Pushing 15KB in one shot blocks the ESP32 WiFi TX task and causes browser timeouts.
size_t off = 0;
while (off < total) {
size_t n = total - off;
if (n > 1024) n = 1024;
server.sendContent_P(kHtml + off, n);
off += n;
delay(2); // Let the Pro CPU / WiFi stack process TCP ACKs
}
}
static void handleLog() {