From 03e4d65582d6f1ca797c3cef9770754ca9d852e5 Mon Sep 17 00:00:00 2001 From: SteWers Date: Thu, 20 Jan 2022 20:19:50 +0100 Subject: [PATCH] [SML] Serial activity monitor via LED Visualize the activity of one or all serial meters via LED. It is helpful for debugging and also for viewing serial activity easily. The configuration is done via console commands: - LED-GPIO for monitoring serial activity => sensor53 l2, l13, l15 ... or l255 for turn off (default) - meter number for monitoring serial activity => sensor53 m1, m2, m3 ... or m0 for all (default) To start at boot-time, add the entries in the boot-section (>B) of the script. --- tasmota/xsns_53_sml.ino | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index 900558b6b..25a6b81a6 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -1041,6 +1041,9 @@ void ADS1115_init(void) { char sml_start; uint8_t dump2log=0; +uint8_t ser_act_LED_pin=255; +uint8_t ser_act_meter_num=0; + #define SML_SAVAILABLE Serial_available() #define SML_SREAD Serial_read() #define SML_SPEAK Serial_peek() @@ -1623,6 +1626,9 @@ uint32_t meters; if (meter_desc_p[meters].type != 'c') { // poll for serial input if (!meter_ss[meters]) continue; + if (ser_act_LED_pin!=255 && (ser_act_meter_num==0 || ser_act_meter_num-1==meters)) { + digitalWrite(ser_act_LED_pin, meter_ss[meters]->available() && !digitalRead(ser_act_LED_pin)); // Invert LED, if queue is continuously full + } while (meter_ss[meters]->available()) { sml_shift_in(meters, 0); } @@ -3253,9 +3259,11 @@ uint8_t parity=0; // dump to log shows serial data on console // has to be off for normal use -// in console sensor53 d1,d2,d3 .. or. d0 for normal use +// in console sensor53 d1, d2, d3 ... or d0 for normal use // set counter => sensor53 c1 xxxx // restart driver => sensor53 r +// meter number for monitoring serial activity => sensor53 m1, m2, m3 ... or m0 for all (default) +// LED-GPIO for monitoring serial activity => sensor53 l2, l13, l15 ... or l255 for turn off (default) bool XSNS_53_cmd(void) { bool serviced = true; @@ -3272,7 +3280,7 @@ bool XSNS_53_cmd(void) { dump2log=index; ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"dump: %d\"}}"),dump2log); } else if (*cp=='c') { - // set ounter + // set counter cp++; uint8_t index=*cp&7; if (index<1 || index>MAX_COUNTERS) index=1; @@ -3296,6 +3304,27 @@ bool XSNS_53_cmd(void) { ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"restart\"}}")); SML_CounterSaveState(); SML_Init(); + } else if (*cp=='m') { + // meter number for serial activity + cp++; + if (!isdigit(*cp)) { + ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"ser_act_meter_num: %d\"}}"),ser_act_meter_num); + } else { + ser_act_meter_num=atoi(cp); + ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"ser_act_meter_num: %d\"}}"),ser_act_meter_num); + } + } else if (*cp=='l') { + // serial activity LED-GPIO + cp++; + if (!isdigit(*cp)) { + ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"ser_act_LED_pin: %d\"}}"),ser_act_LED_pin); + } else { + ser_act_LED_pin=atoi(cp); + if (ser_act_LED_pin!=255) { + pinMode(ser_act_LED_pin, OUTPUT); + } + ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"ser_act_LED_pin: %d\"}}"),ser_act_LED_pin); + } } else { serviced=false; }