From fc92896ef5e4adf30d6b3118b68f3437a94548d5 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Tue, 4 Feb 2020 07:07:56 +0100 Subject: [PATCH] sml dynamic baud and transmit support --- tasmota/xdrv_10_scripter.ino | 24 ++++++++++++++++++++ tasmota/xsns_53_sml.ino | 44 ++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 09406e810..c874ab85c 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1714,6 +1714,30 @@ chknext: len=0; goto exit; } +#endif +#ifdef USE_SML_SCRIPT_CMD + if (!strncmp(vname,"sml(",4)) { + lp+=4; + float fvar1; + lp=GetNumericResult(lp,OPER_EQU,&fvar1,0); + SCRIPT_SKIP_SPACES + float fvar2; + lp=GetNumericResult(lp,OPER_EQU,&fvar2,0); + SCRIPT_SKIP_SPACES + if (fvar2==0) { + float fvar3; + lp=GetNumericResult(lp,OPER_EQU,&fvar3,0); + fvar=SML_SetBaud(fvar1,fvar3); + } else { + char str[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,str,0); + fvar=SML_Write(fvar1,str); + } + lp++; + fvar=0; + len=0; + goto exit; + } #endif break; case 't': diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index 1af1f526c..ebc534113 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -2109,6 +2109,50 @@ init10: } +#ifdef USE_SML_SCRIPT_CMD +uint32_t SML_SetBaud(uint32_t meter, uint32_t br) { + if (meter<1 || meter>meters_used) return 0; + meter--; + if (!meter_ss[meter]) return 0; + if (meter_ss[meter]->begin(br)) { + meter_ss[meter]->flush(); + } + if (meter_ss[meter]->hardwareSerial()) { + if (meter_desc_p[meter].type=='M') { + Serial.begin(br, SERIAL_8E1); + } + } + return 1; +} + +uint32_t SML_Write(uint32_t meter,char *hstr) { + if (meter<1 || meter>meters_used) return 0; + meter--; + if (!meter_ss[meter]) return 0; + + SML_Send_Seq(meter,hstr); + + /* + + uint8_t sbuff[32]; + uint8_t *ucp=sbuff,slen=0; + char *cp=hstr; + while (*cp) { + if (!*cp || !*(cp+1)) break; + uint8_t iob=(sml_hexnibble(*cp) << 4) | sml_hexnibble(*(cp+1)); + cp+=2; + *ucp++=iob; + slen++; + if (slen>=sizeof(sbuff)) break; + } + meter_ss[meter]->write(sbuff,slen); + return slen; + */ + return 1; +} +#endif + + void SetDBGLed(uint8_t srcpin, uint8_t ledpin) { pinMode(ledpin, OUTPUT); if (digitalRead(srcpin)) {