fix sml calculate vars option (=m)

This commit is contained in:
gemu2015 2021-02-28 09:01:13 +01:00
parent c3c0a06961
commit ec330d70f8

View File

@ -1296,6 +1296,7 @@ void sml_shift_in(uint32_t meters,uint32_t shard) {
} }
} else if (meter_desc_p[meters].type=='v') { } else if (meter_desc_p[meters].type=='v') {
if (iob==EBUS_SYNC) { if (iob==EBUS_SYNC) {
sb_counter = 0;
SML_Decode(meters); SML_Decode(meters);
smltbuf[meters][0] = iob; smltbuf[meters][0] = iob;
meter_spos[meters] = 1; meter_spos[meters] = 1;
@ -1385,6 +1386,7 @@ void SML_Decode(uint8_t index) {
uint8_t *cp; uint8_t *cp;
uint8_t dindex = 0, vindex = 0; uint8_t dindex = 0, vindex = 0;
delay(0); delay(0);
while (mp != NULL) { while (mp != NULL) {
// check list of defines // check list of defines
if (*mp == 0) break; if (*mp == 0) break;
@ -1418,17 +1420,17 @@ void SML_Decode(uint8_t index) {
// 1. index // 1. index
double dvar; double dvar;
uint8_t opr; uint8_t opr;
uint32_t ind; uint8_t mind;
ind=atoi(mp); int32_t ind;
while (*mp>='0' && *mp<='9') mp++; mind = strtol((char*)mp, (char**)&mp, 10);
if (ind<1 || ind>SML_MAX_VARS) ind=1; if (mind < 1 || mind > SML_MAX_VARS) mind = 1;
dvar=meter_vars[ind-1]; dvar = meter_vars[mind - 1];
for (uint8_t p = 0; p < 5; p++) { while (*mp==' ') mp++;
for (uint8_t p = 0; p < 8; p++) {
if (*mp == '@') { if (*mp == '@') {
// store result // store result
meter_vars[vindex] = dvar; meter_vars[vindex] = dvar;
mp++; mp++;
SML_Immediate_MQTT((const char*)mp,vindex,mindex);
break; break;
} }
opr = *mp; opr = *mp;
@ -1438,25 +1440,25 @@ void SML_Decode(uint8_t index) {
iflg = 1; iflg = 1;
mp++; mp++;
} }
ind=atoi(mp); ind = strtol((char*)mp, (char**)&mp, 10);
while (*mp>='0' && *mp<='9') mp++; mind = ind;
if (ind<1 || ind>SML_MAX_VARS) ind=1; if (mind < 1 || mind > SML_MAX_VARS) mind = 1;
switch (opr) { switch (opr) {
case '+': case '+':
if (iflg) dvar += ind; if (iflg) dvar += ind;
else dvar+=meter_vars[ind-1]; else dvar += meter_vars[mind - 1];
break; break;
case '-': case '-':
if (iflg) dvar -= ind; if (iflg) dvar -= ind;
else dvar-=meter_vars[ind-1]; else dvar -= meter_vars[mind - 1];
break; break;
case '*': case '*':
if (iflg) dvar *= ind; if (iflg) dvar *= ind;
else dvar*=meter_vars[ind-1]; else dvar *= meter_vars[mind - 1];
break; break;
case '/': case '/':
if (iflg) dvar /= ind; if (iflg) dvar /= ind;
else dvar/=meter_vars[ind-1]; else dvar /= meter_vars[mind - 1];
break; break;
} }
while (*mp==' ') mp++; while (*mp==' ') mp++;
@ -1464,10 +1466,13 @@ void SML_Decode(uint8_t index) {
// store result // store result
meter_vars[vindex] = dvar; meter_vars[vindex] = dvar;
mp++; mp++;
SML_Immediate_MQTT((const char*)mp,vindex,mindex);
break; break;
} }
} }
double fac = CharToDouble((char*)mp);
meter_vars[vindex] /= fac;
SML_Immediate_MQTT((const char*)mp, vindex, mindex);
// get sfac
} else if (*mp=='d') { } else if (*mp=='d') {
// calc deltas d ind 10 (eg every 10 secs) // calc deltas d ind 10 (eg every 10 secs)
if (dindex < MAX_DVARS) { if (dindex < MAX_DVARS) {
@ -1489,6 +1494,8 @@ void SML_Decode(uint8_t index) {
mp=strchr(mp,'@'); mp=strchr(mp,'@');
if (mp) { if (mp) {
mp++; mp++;
double fac = CharToDouble((char*)mp);
meter_vars[vindex] /= fac;
SML_Immediate_MQTT((const char*)mp, vindex, mindex); SML_Immediate_MQTT((const char*)mp, vindex, mindex);
} }
} }
@ -1953,6 +1960,12 @@ void SML_Show(boolean json) {
} else { } else {
mid=0; mid=0;
} }
} else if (*cp=='b') {
// bit value
#ifdef SML_BIT_TEXT
sprintf_P(tpowstr, PSTR("\"%s\""), (uint8_t)meter_vars[index]?D_ON:D_OFF);
mid = 2;
#endif
} else { } else {
mid = 0; mid = 0;
} }
@ -2721,7 +2734,7 @@ uint8_t sml_hexnibble(char chr) {
// send sequence every N Seconds // send sequence every N Seconds
void SML_Send_Seq(uint32_t meter,char *seq) { void SML_Send_Seq(uint32_t meter,char *seq) {
uint8_t sbuff[32]; uint8_t sbuff[48];
uint8_t *ucp = sbuff, slen = 0; uint8_t *ucp = sbuff, slen = 0;
char *cp = seq; char *cp = seq;
uint8_t rflg = 0; uint8_t rflg = 0;
@ -2736,7 +2749,7 @@ void SML_Send_Seq(uint32_t meter,char *seq) {
cp += 2; cp += 2;
*ucp++ = iob; *ucp++ = iob;
slen++; slen++;
if (slen>=sizeof(sbuff)) break; if (slen >= sizeof(sbuff)-6) break; // leave space for checksum
} }
if (script_meter_desc[meter].type == 'm' || script_meter_desc[meter].type == 'M') { if (script_meter_desc[meter].type == 'm' || script_meter_desc[meter].type == 'M') {
if (!rflg) { if (!rflg) {
@ -2766,10 +2779,14 @@ void SML_Send_Seq(uint32_t meter,char *seq) {
} }
meter_ss[meter]->write(sbuff, slen); meter_ss[meter]->write(sbuff, slen);
if (dump2log) { if (dump2log) {
#ifdef SML_DUMP_OUT_ALL
Hexdump(sbuff, slen);
#else
uint8_t type = meter_desc_p[(dump2log&7) - 1].type; uint8_t type = meter_desc_p[(dump2log&7) - 1].type;
if (type == 'm' || type == 'M') { if (type == 'm' || type == 'M') {
Hexdump(sbuff, slen); Hexdump(sbuff, slen);
} }
#endif
} }
} }