interim modbus commit (untested)

This commit is contained in:
2020-12-03 00:34:37 +03:00
parent 71be5a1c7c
commit 0055ad0463
8 changed files with 112 additions and 38 deletions

View File

@@ -10,8 +10,9 @@ public:
abstractOut(Item * _item):abstractCh(){item=_item;}; abstractOut(Item * _item):abstractCh(){item=_item;};
virtual int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) =0; virtual int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) =0;
virtual int isActive(){return 0;}; virtual int isActive(){return 0;};
virtual int getDefaultOnVal(){return 100;}; virtual itemCmd getDefaultOnVal(){return itemCmd(ST_PERCENTS,CMD_VOID).Percents(100);};
virtual int getChanType(){return 0;} virtual int getChanType(){return 0;}
virtual int getDefaultStorageType(){return ST_PERCENTS;}
protected: protected:
Item * item; Item * item;
}; };

View File

@@ -115,11 +115,11 @@ void Input::Parse(aJsonObject * configObj)
} }
// Persistant storage // Persistant storage
itemBuffer = aJson.getObjectItem(inputObj, "S"); itemBuffer = aJson.getObjectItem(inputObj, "@S");
if (!itemBuffer) { if (!itemBuffer) {
debugSerial<<F("In: ")<<pin<<F("/")<<inType<<endl; debugSerial<<F("In: ")<<pin<<F("/")<<inType<<endl;
aJson.addNumberToObject(inputObj, "S", 0); aJson.addNumberToObject(inputObj, "@S", (long int) 0);
itemBuffer = aJson.getObjectItem(inputObj, "S"); itemBuffer = aJson.getObjectItem(inputObj, "@S");
} }
if (itemBuffer) store = (inStore *) &itemBuffer->valueint; if (itemBuffer) store = (inStore *) &itemBuffer->valueint;

View File

@@ -119,7 +119,7 @@ void Item::Parse() {
if (isValid()) { if (isValid()) {
// Todo - avoid static enlarge for every types // Todo - avoid static enlarge for every types
for (int i = aJson.getArraySize(itemArr); i < 4; i++) for (int i = aJson.getArraySize(itemArr); i < 4; i++)
aJson.addItemToArray(itemArr, aJson.createItem( aJson.addItemToArray(itemArr, aJson.createItem( (long int)
int(defval[i]))); //Enlarge item to 4 elements. VAL=int if no other definition in conf int(defval[i]))); //Enlarge item to 4 elements. VAL=int if no other definition in conf
itemType = aJson.getArrayItem(itemArr, I_TYPE)->valueint; itemType = aJson.getArrayItem(itemArr, I_TYPE)->valueint;
itemArg = aJson.getArrayItem(itemArr, I_ARG); itemArg = aJson.getArrayItem(itemArr, I_ARG);
@@ -374,7 +374,7 @@ void Item::setExt(long int par) // Only store if VAL is int (autogenerated or c
if (!itemExt) if (!itemExt)
{ {
for (int i = aJson.getArraySize(itemArr); i <= 4; i++) for (int i = aJson.getArraySize(itemArr); i <= 4; i++)
aJson.addItemToArray(itemArr, itemExt=aJson.createItem(0)); aJson.addItemToArray(itemArr, itemExt=aJson.createItem((long int)0));
//itemExt = aJson.getArrayItem(itemArr, I_EXT); //itemExt = aJson.getArrayItem(itemArr, I_EXT);
}; };
@@ -396,7 +396,7 @@ chPersistent * Item::setPersistent(chPersistent * par)
if (!itemExt) if (!itemExt)
{ {
for (int i = aJson.getArraySize(itemArr); i <= 4; i++) for (int i = aJson.getArraySize(itemArr); i <= 4; i++)
aJson.addItemToArray(itemArr, itemExt = aJson.createItem(0)); aJson.addItemToArray(itemArr, itemExt = aJson.createItem((long int)0));
//itemExt = aJson.getArrayItem(itemArr, I_EXT); //itemExt = aJson.getArrayItem(itemArr, I_EXT);
}; };
@@ -858,7 +858,7 @@ switch (itemType) {
iaddr = -iaddr; iaddr = -iaddr;
inverse = 1; inverse = 1;
} }
if (iaddr <=PINS_COUNT && iaddr>0) if (iaddr <= (short) PINS_COUNT && iaddr>0)
{ {
pinMode(iaddr, OUTPUT); pinMode(iaddr, OUTPUT);
@@ -1263,17 +1263,17 @@ int Item::checkFM() {
debugSerial<<_HEX(data)<<F("-"); debugSerial<<_HEX(data)<<F("-");
} }
debugSerial<<endl; debugSerial<<endl;
int RPM; long int RPM;
// aJson.addNumberToObject(out,"gsw", (int) node.getResponseBuffer(1)); // aJson.addNumberToObject(out,"gsw", (int) node.getResponseBuffer(1));
aJson.addNumberToObject(out, "V", (int) node.getResponseBuffer(2) / 100.); aJson.addNumberToObject(out, "V", (long int) node.getResponseBuffer(2) / 100.);
// aJson.addNumberToObject(out,"f", (int) node.getResponseBuffer(3)/100.); // aJson.addNumberToObject(out,"f", (int) node.getResponseBuffer(3)/100.);
aJson.addNumberToObject(out, "RPM", RPM=(int) node.getResponseBuffer(4)); aJson.addNumberToObject(out, "RPM", RPM=(long int) node.getResponseBuffer(4));
aJson.addNumberToObject(out, "I", (int) node.getResponseBuffer(5) / 100.); aJson.addNumberToObject(out, "I", (long int) node.getResponseBuffer(5) / 100.);
aJson.addNumberToObject(out, "M", (int) node.getResponseBuffer(6) / 10.); aJson.addNumberToObject(out, "M", (long int) node.getResponseBuffer(6) / 10.);
// aJson.addNumberToObject(out,"P", (int) node.getResponseBuffer(7)/10.); // aJson.addNumberToObject(out,"P", (int) node.getResponseBuffer(7)/10.);
// aJson.addNumberToObject(out,"U", (int) node.getResponseBuffer(8)/10.); // aJson.addNumberToObject(out,"U", (int) node.getResponseBuffer(8)/10.);
// aJson.addNumberToObject(out,"Ui", (int) node.getResponseBuffer(9)); // aJson.addNumberToObject(out,"Ui", (int) node.getResponseBuffer(9));
aJson.addNumberToObject(out, "sw", (int) node.getResponseBuffer(0)); aJson.addNumberToObject(out, "sw", (long int) node.getResponseBuffer(0));
if (RPM && itemArg->type == aJson_Array) { if (RPM && itemArg->type == aJson_Array) {
aJsonObject *airGateObj = aJson.getArrayItem(itemArg, 1); aJsonObject *airGateObj = aJson.getArrayItem(itemArg, 1);
if (airGateObj && airGateObj->type == aJson_String) { if (airGateObj && airGateObj->type == aJson_String) {
@@ -1290,11 +1290,11 @@ int Item::checkFM() {
if (node.getResponseBuffer(0) & 8) //Active fault if (node.getResponseBuffer(0) & 8) //Active fault
{ {
result = node.readHoldingRegisters(2111 - 1, 1); result = node.readHoldingRegisters(2111 - 1, 1);
if (result == node.ku8MBSuccess) aJson.addNumberToObject(out, "flt", (int) node.getResponseBuffer(0)); if (result == node.ku8MBSuccess) aJson.addNumberToObject(out, "flt", (long int) node.getResponseBuffer(0));
modbusBusy=0; modbusBusy=0;
if (isActive()>0) Off(); //Shut down /// if (isActive()>0) Off(); //Shut down ///
modbusBusy=1; modbusBusy=1;
} else aJson.addNumberToObject(out, "flt", 0); } else aJson.addNumberToObject(out, "flt", (long int)0);
delay(50); delay(50);
result = node.readHoldingRegisters(20 - 1, 4); result = node.readHoldingRegisters(20 - 1, 4);
@@ -1316,7 +1316,7 @@ int Item::checkFM() {
int16_t pwr = node.getResponseBuffer(3); int16_t pwr = node.getResponseBuffer(3);
if (pwr > 0) if (pwr > 0)
aJson.addNumberToObject(out, "pwr", pwr / 10.); aJson.addNumberToObject(out, "pwr", pwr / 10.);
else aJson.addNumberToObject(out, "pwr", 0); else aJson.addNumberToObject(out, "pwr", (long int) 0);
if (ftemp > FM_OVERHEAT_CELSIUS && set) { if (ftemp > FM_OVERHEAT_CELSIUS && set) {
if (mqttClient.connected() && !ethernetIdleCount) if (mqttClient.connected() && !ethernetIdleCount)

View File

@@ -552,6 +552,7 @@ long int itemCmd::getInt()
case ST_UINT32: case ST_UINT32:
case ST_RGB: case ST_RGB:
case ST_RGBW: case ST_RGBW:
case ST_TENS:
return param.aslong; return param.aslong;
case ST_PERCENTS: case ST_PERCENTS:
@@ -571,6 +572,11 @@ long int itemCmd::getInt()
} }
} }
long int itemCmd::getSingleInt()
{
if (cmd.cmdCode) return cmd.cmdCode;
return getInt();
}
short itemCmd::getPercents(bool inverse) short itemCmd::getPercents(bool inverse)
{ {
@@ -683,8 +689,21 @@ itemCmd itemCmd::Int(int32_t i)
return *this; return *this;
} }
itemCmd itemCmd::Int(uint32_t i)
{
cmd.itemArgType=ST_UINT32;
param.asUint32=i;
return *this;
}
itemCmd itemCmd::Tens(int32_t i)
{
cmd.itemArgType=ST_TENS;
param.asInt32=i;
return *this;
}
itemCmd itemCmd::HSV(uint16_t h, uint8_t s, uint8_t v) itemCmd itemCmd::HSV(uint16_t h, uint8_t s, uint8_t v)
{ {
cmd.itemArgType=ST_HSV; cmd.itemArgType=ST_HSV;
@@ -737,12 +756,7 @@ itemCmd itemCmd::RGBW(uint8_t r, uint8_t g, uint8_t b, uint8_t w)
return *this; return *this;
} }
itemCmd itemCmd::Int(uint32_t i)
{
cmd.itemArgType=ST_UINT32;
param.asUint32=i;
return *this;
}
itemCmd itemCmd::Cmd(uint8_t i) itemCmd itemCmd::Cmd(uint8_t i)
@@ -797,6 +811,17 @@ return false;
} }
int itemCmd::doMapping(aJsonObject *mappingData)
{
}
int itemCmd::doReverseMapping (aJsonObject *mappingData)
{
}
char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags ) char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
{ {
@@ -826,7 +851,9 @@ char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
break; break;
case ST_INT32: case ST_INT32:
snprintf(argPtr, bufLen, "%ld", param.asInt32); snprintf(argPtr, bufLen, "%ld", param.asInt32);
break;
case ST_TENS:
snprintf(argPtr, bufLen, "%ld.%d", param.asInt32/10, param.asInt32 % 10);
break; break;
case ST_HSV: case ST_HSV:
case ST_HSV255: case ST_HSV255:

View File

@@ -19,6 +19,7 @@ e-mail anklimov@gmail.com
*/ */
#pragma once #pragma once
#include "Arduino.h" #include "Arduino.h"
#include "aJson.h"
typedef char cmdstr[9]; typedef char cmdstr[9];
@@ -110,6 +111,8 @@ ST_FLOAT = 13//,
#define ST_STRING 13 /// pointer to string (for further use) #define ST_STRING 13 /// pointer to string (for further use)
#define ST_FLOAT 14 /// generic Float value #define ST_FLOAT 14 /// generic Float value
#define MAP_SCALE 1
#define MAP_VAL_CMD 2
#pragma pack(push, 1) #pragma pack(push, 1)
@@ -184,6 +187,7 @@ public:
itemCmd Int(int32_t i); itemCmd Int(int32_t i);
itemCmd Int(uint32_t i); itemCmd Int(uint32_t i);
itemCmd Tens(int32_t i);
itemCmd Cmd(uint8_t i); itemCmd Cmd(uint8_t i);
itemCmd HSV(uint16_t h, uint8_t s, uint8_t v); itemCmd HSV(uint16_t h, uint8_t s, uint8_t v);
itemCmd HSV255(uint16_t h, uint8_t s, uint8_t v); itemCmd HSV255(uint16_t h, uint8_t s, uint8_t v);
@@ -208,6 +212,7 @@ public:
bool incrementS(int16_t); bool incrementS(int16_t);
long int getInt(); long int getInt();
long int getSingleInt();
short getPercents(bool inverse=false); short getPercents(bool inverse=false);
short getPercents255(bool inverse=false); short getPercents255(bool inverse=false);
uint8_t getCmd(); uint8_t getCmd();
@@ -222,6 +227,11 @@ public:
itemCmd setDefault(); itemCmd setDefault();
itemCmd setChanType(short chanType); itemCmd setChanType(short chanType);
void debugOut(); void debugOut();
int doMapping(aJsonObject *mappingData);
int doReverseMapping (aJsonObject *mappingData);
}; };
#pragma pack(pop) #pragma pack(pop)

View File

@@ -2161,7 +2161,7 @@ short thermoSetCurTemp(char *name, float t) {
extArray = aJson.createArray(); //Create Ext Array extArray = aJson.createArray(); //Create Ext Array
aJsonObject *ocurt = aJson.createItem(t); //Create float aJsonObject *ocurt = aJson.createItem(t); //Create float
aJsonObject *oattempts = aJson.createItem(T_ATTEMPTS); //Create int aJsonObject *oattempts = aJson.createItem((long int) T_ATTEMPTS); //Create int
aJson.addItemToArray(extArray, ocurt); aJson.addItemToArray(extArray, ocurt);
aJson.addItemToArray(extArray, oattempts); aJson.addItemToArray(extArray, oattempts);
aJson.addItemToArray(thermoItem, extArray); //Adding to thermoItem aJson.addItemToArray(thermoItem, extArray); //Adding to thermoItem

View File

@@ -36,6 +36,7 @@ struct serial_t
#define PAR_I8L 6 #define PAR_I8L 6
#define PAR_U8H 7 #define PAR_U8H 7
#define PAR_U8L 8 #define PAR_U8L 8
#define PAR_TENS 9
const reg_t regSize_P[] PROGMEM = const reg_t regSize_P[] PROGMEM =
@@ -47,7 +48,8 @@ const reg_t regSize_P[] PROGMEM =
{ "i8h", (uint8_t) PAR_I8H }, { "i8h", (uint8_t) PAR_I8H },
{ "i8l", (uint8_t) PAR_I8L }, { "i8l", (uint8_t) PAR_I8L },
{ "u8h", (uint8_t) PAR_U8H }, { "u8h", (uint8_t) PAR_U8H },
{ "u8l", (uint8_t) PAR_U8L } { "u8l", (uint8_t) PAR_U8L },
{ "x10", (uint8_t) PAR_TENS }
} ; } ;
#define regSizeNum sizeof(regSize_P)/sizeof(reg_t) #define regSizeNum sizeof(regSize_P)/sizeof(reg_t)
@@ -223,40 +225,75 @@ int out_Modbus::findRegister(int registerNum, int posInBuffer)
int8_t regType = PAR_I16; int8_t regType = PAR_I16;
uint32_t param =0; uint32_t param =0;
itemCmd mappedParam; itemCmd mappedParam;
bool isSigned=false; char buf[16];
//bool isSigned=false;
if (typeObj && typeObj->type == aJson_String) regType=str2regSize(typeObj->valuestring); if (typeObj && typeObj->type == aJson_String) regType=str2regSize(typeObj->valuestring);
switch(regType) { switch(regType) {
case PAR_I16: case PAR_I16:
isSigned=true; //isSigned=true;
mappedParam.Int((int32_t)data);
break;
case PAR_U16: case PAR_U16:
param=data; mappedParam.Int((uint32_t)data);
//param=data;
break; break;
case PAR_I32: case PAR_I32:
isSigned=true; //isSigned=true;
param = data | (node.getResponseBuffer(posInBuffer+1)<<16);
mappedParam.Int((int32_t)param);
break;
case PAR_U32: case PAR_U32:
param = data | (node.getResponseBuffer(posInBuffer+1)<<16); param = data | (node.getResponseBuffer(posInBuffer+1)<<16);
mappedParam.Int((uint32_t)param);
break; break;
case PAR_U8L: case PAR_U8L:
is8bit=true; //is8bit=true;
param = data & 0xFF; param = data & 0xFF;
mappedParam.Int((uint32_t)param);
break; break;
case PAR_U8H: case PAR_U8H:
is8bit=true; //is8bit=true;
param = data << 8; param = data << 8;
mappedParam.Int((uint32_t)param);
break;
case PAR_TENS:
mappedParam.Tens((int32_t) data);
} }
if (mapObj && (mapObj->type==aJson_Array || mapObj->type==aJson_Object)) if (mapObj && (mapObj->type==aJson_Array || mapObj->type==aJson_Object))
mappedParam = mapInt(param,mapObj); mappedParam.doMapping(mapObj);
else mappedParam.Int(param);
debugSerial << F("MB got ")<<mappedParam.toString(buf,sizeof(buf))<< F(" from ")<<regType<<F(":")<<paramObj->name<<endl;
if (itemParametersObj && itemParametersObj->type ==aJson_Object) if (itemParametersObj && itemParametersObj->type ==aJson_Object)
{ {
aJsonObject *execObj = aJson.getObjectItem(itemParametersObj,paramObj->name); aJsonObject *execObj = aJson.getObjectItem(itemParametersObj,paramObj->name);
if (execObj) executeCommand(execObj, -1, mappedParam); if (execObj)
{
bool submitParam=true;
//Retrive previous data
aJsonObject *lastMeasured = aJson.getObjectItem(execObj,"@S");
if (lastMeasured)
{
if (lastMeasured->valueint == mappedParam.getSingleInt())
submitParam=false; //supress repeating execution for same val
else lastMeasured->valueint=mappedParam.getSingleInt();
}
else //No container to store value yet
{
debugSerial<<F("Add @S: ")<<paramObj->name<<endl;
aJson.addNumberToObject(execObj, "@S", mappedParam.getSingleInt());
}
if (submitParam) executeCommand(execObj, -1, mappedParam);
}
} }
debugSerial << F("MB got ")<<param<< F(" from ")<<regType<<F(":")<<paramObj->name<<endl;
if (!is8bit) return 1; if (!is8bit) return 1;
} }
paramObj=paramObj->next; paramObj=paramObj->next;

View File

@@ -16,7 +16,6 @@ public:
uint32_t timestamp; uint32_t timestamp;
aJsonObject * pollingRegisters; aJsonObject * pollingRegisters;
aJsonObject * parameters; aJsonObject * parameters;
}; };