@@ -21,6 +21,8 @@ enum class AdaState {
2121
2222void handleSerial ()
2323{
24+ if (pinManager.isPinAllocated (3 )) return ;
25+
2426 #ifdef WLED_ENABLE_ADALIGHT
2527 static auto state = AdaState::Header_A;
2628 static uint16_t count = 0 ;
@@ -32,13 +34,35 @@ void handleSerial()
3234 while (Serial.available () > 0 )
3335 {
3436 yield ();
35- byte next = Serial.read ();
37+ byte next = Serial.peek ();
3638 switch (state) {
3739 case AdaState::Header_A:
3840 if (next == ' A' ) state = AdaState::Header_d;
3941 else if (next == 0xC9 ) { // TPM2 start byte
4042 state = AdaState::TPM2_Header_Type;
4143 }
44+ else if (next == ' {' ) { // JSON API
45+ bool verboseResponse = false ;
46+ {
47+ DynamicJsonDocument doc (JSON_BUFFER_SIZE);
48+ Serial.setTimeout (100 );
49+ DeserializationError error = deserializeJson (doc, Serial);
50+ if (error) return ;
51+ fileDoc = &doc;
52+ verboseResponse = deserializeState (doc.as <JsonObject>());
53+ fileDoc = nullptr ;
54+ }
55+ // only send response if TX pin is unused for other purposes
56+ if (verboseResponse && !pinManager.isPinAllocated (1 )) {
57+ DynamicJsonDocument doc (JSON_BUFFER_SIZE);
58+ JsonObject state = doc.createNestedObject (" state" );
59+ serializeState (state);
60+ JsonObject info = doc.createNestedObject (" info" );
61+ serializeInfo (info);
62+
63+ serializeJson (doc, Serial);
64+ }
65+ }
4266 break ;
4367 case AdaState::Header_d:
4468 if (next == ' d' ) state = AdaState::Header_a;
@@ -98,6 +122,7 @@ void handleSerial()
98122 }
99123 break ;
100124 }
125+ Serial.read (); // discard the byte
101126 }
102127 #endif
103128}
0 commit comments