diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b3ad8d0e..219549ad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ### Builds after release 0.12.0 +#### Build 2108250 + +- Added Sync groups (PR #2150) +- Added JSON API over Serial support +- Live color correction (PR #1902) + #### Build 2108180 - Fixed JSON IR remote not working with codes greater than 0xFFFFFF (fixes #2135) diff --git a/wled00/set.cpp b/wled00/set.cpp index 94fcec128..5e9a26a21 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -900,7 +900,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) WS2812FX::Segment& seg = strip.getSegment(i); if (!seg.isSelected()) continue; if (effectCurrent != prevEffect) { - seg.mode = effectCurrent; + strip.setMode(i, effectCurrent); effectChanged = true; } if (effectSpeed != prevSpeed) { diff --git a/wled00/wled.h b/wled00/wled.h index 09155c43b..5c83e9b39 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2109032 +#define VERSION 2109061 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG diff --git a/wled00/wled_serial.cpp b/wled00/wled_serial.cpp index be6f72e47..0d3028278 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -21,6 +21,8 @@ enum class AdaState { void handleSerial() { + if (pinManager.isPinAllocated(3)) return; + #ifdef WLED_ENABLE_ADALIGHT static auto state = AdaState::Header_A; static uint16_t count = 0; @@ -32,13 +34,35 @@ void handleSerial() while (Serial.available() > 0) { yield(); - byte next = Serial.read(); + byte next = Serial.peek(); switch (state) { case AdaState::Header_A: if (next == 'A') state = AdaState::Header_d; else if (next == 0xC9) { //TPM2 start byte state = AdaState::TPM2_Header_Type; } + else if (next == '{') { //JSON API + bool verboseResponse = false; + { + DynamicJsonDocument doc(JSON_BUFFER_SIZE); + Serial.setTimeout(100); + DeserializationError error = deserializeJson(doc, Serial); + if (error) return; + fileDoc = &doc; + verboseResponse = deserializeState(doc.as()); + fileDoc = nullptr; + } + //only send response if TX pin is unused for other purposes + if (verboseResponse && !pinManager.isPinAllocated(1)) { + DynamicJsonDocument doc(JSON_BUFFER_SIZE); + JsonObject state = doc.createNestedObject("state"); + serializeState(state); + JsonObject info = doc.createNestedObject("info"); + serializeInfo(info); + + serializeJson(doc, Serial); + } + } break; case AdaState::Header_d: if (next == 'd') state = AdaState::Header_a; @@ -98,6 +122,7 @@ void handleSerial() } break; } + Serial.read(); //discard the byte } #endif }