mirror of
https://github.com/wled/WLED.git
synced 2025-07-12 13:26:33 +00:00
Fix: output-glitching on ESPNow remote command reception
Processing of received button command is no longer processed in the callback, instead the value is saved to a variable and processed in the main loop. The actual fix is to not access the file system while data is being sent out: even just trying to open a non-existing file causes glitches on the C3. Waiting for the bus to finish fixes this BUT it causes a frame-delay which is the lesser evil than random color flashes.
This commit is contained in:
parent
2c58a87982
commit
e16d3bf040
@ -231,6 +231,7 @@ bool getPresetName(byte index, String& name);
|
|||||||
|
|
||||||
//remote.cpp
|
//remote.cpp
|
||||||
void handleRemote(uint8_t *data, size_t len);
|
void handleRemote(uint8_t *data, size_t len);
|
||||||
|
void processESPNowButton();
|
||||||
|
|
||||||
//set.cpp
|
//set.cpp
|
||||||
bool isAsterisksOnly(const char* str, byte maxLen);
|
bool isAsterisksOnly(const char* str, byte maxLen);
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include "wled.h"
|
#include "wled.h"
|
||||||
#ifndef WLED_DISABLE_ESPNOW
|
#ifndef WLED_DISABLE_ESPNOW
|
||||||
|
|
||||||
|
#define ESPNOW_BUSWAIT_TIMEOUT 30 // timeout in ms to wait for bus to finish updating
|
||||||
|
|
||||||
#define NIGHT_MODE_DEACTIVATED -1
|
#define NIGHT_MODE_DEACTIVATED -1
|
||||||
#define NIGHT_MODE_BRIGHTNESS 5
|
#define NIGHT_MODE_BRIGHTNESS 5
|
||||||
|
|
||||||
@ -38,6 +40,7 @@ typedef struct WizMoteMessageStructure {
|
|||||||
|
|
||||||
static uint32_t last_seq = UINT32_MAX;
|
static uint32_t last_seq = UINT32_MAX;
|
||||||
static int brightnessBeforeNightMode = NIGHT_MODE_DEACTIVATED;
|
static int brightnessBeforeNightMode = NIGHT_MODE_DEACTIVATED;
|
||||||
|
static uint8_t ESPNowButton = 0; // set in callback if new button value is received
|
||||||
|
|
||||||
// Pulled from the IR Remote logic but reduced to 10 steps with a constant of 3
|
// Pulled from the IR Remote logic but reduced to 10 steps with a constant of 3
|
||||||
static const byte brightnessSteps[] = {
|
static const byte brightnessSteps[] = {
|
||||||
@ -121,6 +124,9 @@ static bool remoteJson(int button)
|
|||||||
|
|
||||||
sprintf_P(objKey, PSTR("\"%d\":"), button);
|
sprintf_P(objKey, PSTR("\"%d\":"), button);
|
||||||
|
|
||||||
|
unsigned long start = millis();
|
||||||
|
while (strip.isUpdating() && millis()-start < ESPNOW_BUSWAIT_TIMEOUT) yield(); // wait for strip to finish updating, accessing FS during sendout causes glitches
|
||||||
|
|
||||||
// attempt to read command from remote.json
|
// attempt to read command from remote.json
|
||||||
readObjectFromFile(PSTR("/remote.json"), objKey, pDoc);
|
readObjectFromFile(PSTR("/remote.json"), objKey, pDoc);
|
||||||
JsonObject fdo = pDoc->as<JsonObject>();
|
JsonObject fdo = pDoc->as<JsonObject>();
|
||||||
@ -202,8 +208,14 @@ void handleRemote(uint8_t *incomingData, size_t len) {
|
|||||||
DEBUG_PRINT(F("] button: "));
|
DEBUG_PRINT(F("] button: "));
|
||||||
DEBUG_PRINTLN(incoming->button);
|
DEBUG_PRINTLN(incoming->button);
|
||||||
|
|
||||||
if (!remoteJson(incoming->button))
|
ESPNowButton = incoming->button; // save state, do not process in callback (can cause glitches)
|
||||||
switch (incoming->button) {
|
last_seq = cur_seq;
|
||||||
|
}
|
||||||
|
|
||||||
|
void processESPNowButton() {
|
||||||
|
if(ESPNowButton > 0) {
|
||||||
|
if (!remoteJson(ESPNowButton))
|
||||||
|
switch (ESPNowButton) {
|
||||||
case WIZMOTE_BUTTON_ON : setOn(); break;
|
case WIZMOTE_BUTTON_ON : setOn(); break;
|
||||||
case WIZMOTE_BUTTON_OFF : setOff(); break;
|
case WIZMOTE_BUTTON_OFF : setOff(); break;
|
||||||
case WIZMOTE_BUTTON_ONE : presetWithFallback(1, FX_MODE_STATIC, 0); break;
|
case WIZMOTE_BUTTON_ONE : presetWithFallback(1, FX_MODE_STATIC, 0); break;
|
||||||
@ -219,7 +231,8 @@ void handleRemote(uint8_t *incomingData, size_t len) {
|
|||||||
case WIZ_SMART_BUTTON_BRIGHT_DOWN : brightnessDown(); break;
|
case WIZ_SMART_BUTTON_BRIGHT_DOWN : brightnessDown(); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
last_seq = cur_seq;
|
}
|
||||||
|
ESPNowButton = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -84,6 +84,9 @@ void WLED::loop()
|
|||||||
#ifndef WLED_DISABLE_INFRARED
|
#ifndef WLED_DISABLE_INFRARED
|
||||||
handleIR();
|
handleIR();
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef WLED_DISABLE_ESPNOW
|
||||||
|
processESPNowButton();
|
||||||
|
#endif
|
||||||
#ifndef WLED_DISABLE_ALEXA
|
#ifndef WLED_DISABLE_ALEXA
|
||||||
handleAlexa();
|
handleAlexa();
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user