Service Pack 1 PID, FLOAT and TENS types compatib.

This commit is contained in:
2021-03-14 15:44:50 +03:00
parent a444ef9b31
commit 0d231345c2
33 changed files with 30262 additions and 29782 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -16,6 +16,15 @@ short colorChannel::getChannelAddr(short n)
return item->getArg(n); return item->getArg(n);
} }
int colorChannel::isActive()
{
itemCmd st;
st.loadItem(item);
int val = st.getInt();
debugSerial<< F(" val:")<<val<<endl;
return val;
}
int colorChannel::Ctrl(itemCmd cmd, char* subItem, bool toExecute) int colorChannel::Ctrl(itemCmd cmd, char* subItem, bool toExecute)
{ {
debugSerial<<F("clrCtr: "); debugSerial<<F("clrCtr: ");
@@ -25,11 +34,12 @@ if (cmd.isCommand()) suffixCode = S_CMD;
else suffixCode = cmd.getSuffix(); else suffixCode = cmd.getSuffix();
switch(suffixCode) switch(suffixCode)
{ { int vol;
case S_NOTFOUND: case S_NOTFOUND:
// turn on and set // turn on and set
toExecute = true; toExecute = true;
case S_SET: case S_SET:
case S_ESET:
case S_HSV: case S_HSV:
PixelCtrl(cmd, subItem, toExecute); PixelCtrl(cmd, subItem, toExecute);
return 1; return 1;
@@ -38,6 +48,12 @@ case S_CMD:
switch (cmd.getCmd()) switch (cmd.getCmd())
{ {
case CMD_ON: case CMD_ON:
if (vol=cmd.getPercents()<MIN_VOLUME && vol>=0)
{
cmd.setPercents(INIT_VOLUME);
cmd.saveItem(item);
item->SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
};
PixelCtrl(cmd,subItem, true); PixelCtrl(cmd,subItem, true);
// item->SendStatus(SEND_COMMAND | SEND_PARAMETERS ); // item->SendStatus(SEND_COMMAND | SEND_PARAMETERS );
return 1; return 1;

View File

@@ -17,6 +17,7 @@ public:
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override; int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override;
virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) =0; virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) =0;
short getChannelAddr(short n =0); short getChannelAddr(short n =0);
int isActive() override;
protected: protected:
short iaddr; short iaddr;
short numArgs; short numArgs;

View File

@@ -103,7 +103,7 @@ int txt2subItem(char *payload) {
return cmd; return cmd;
} }
const short defval[4] = {0, 0, 0, 0}; //Type,Arg,Val,Cmd //const short defval[4] = {0, 0, 0, 0}; //Type,Arg,Val,Cmd
Item::Item(aJsonObject *obj)//Constructor Item::Item(aJsonObject *obj)//Constructor
{ {
@@ -116,8 +116,8 @@ 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( (long int) aJson.addItemToArray(itemArr, aJson.createItem( (long int) 0));
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);
itemVal = aJson.getArrayItem(itemArr, I_VAL); itemVal = aJson.getArrayItem(itemArr, I_VAL);
@@ -502,42 +502,47 @@ st.setSuffix(suffixCode);
st.Cmd(0); st.Cmd(0);
case CMD_VOID: case CMD_VOID:
{ {
//Parsing integers from payload //Parsing numbers from payload
short i = 0; short i = 0;
int Par[4]; short k = 0;
while (payload && i < 4) itemCmd Par0 = getNumber((char **) &payload);
Par[i++] = getInt((char **) &payload); Par0.setSuffix(suffixCode);
if (Par0.getArgType()) i++;
int Par[3];
while (payload && k < 3)
Par[k++] = getInt((char **) &payload);
i=i+k; //i=total # of parameters
switch(suffixCode) switch(suffixCode)
{case S_HUE: {case S_HUE:
st.setH(Par[0]); st.setH(Par0.getInt());
break; break;
case S_SAT: case S_SAT:
st.setS(Par[0]); st.setS(Par0.getInt());
break; break;
case S_TEMP: case S_TEMP:
st.setColorTemp(Par[0]); st.setColorTemp(Par0.getInt());
break; break;
default: default:
switch (i) //Number of params switch (i) //Number of params
{ {
case 1: case 1: st=Par0;
if (set255flag) //if (set255flag)
st.Percents255(Par[0]); // st.Percents255(Par[0]);
else st.Percents(Par[0]); //ToDo float //else st.Percents(Par[0]); //ToDo float
break; break;
case 2: st.HS(Par[0],Par[1]); case 2: st.HS(Par0.getInt(),Par[0]);
break; break;
case 3: case 3:
if (set255flag) if (set255flag)
st.HSV255(Par[0],Par[1],Par[2]); st.HSV255(Par0.getInt(),Par[0],Par[1]);
else st.HSV(Par[0],Par[1],Par[2]); else st.HSV(Par0.getInt(),Par[0],Par[1]);
break; break;
case 4: case 4:
if (set255flag) if (set255flag)
st.HSV255(Par[0],Par[1],Par[2]); st.HSV255(Par0.getInt(),Par[0],Par[1]);
else st.HSV(Par[0],Par[1],Par[2]); else st.HSV(Par0.getInt(),Par[0],Par[1]);
st.setColorTemp(Par[3]); st.setColorTemp(Par[2]);
break; break;
default:; default:;
} }
@@ -609,6 +614,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
bool chActive = (isActive()>0); bool chActive = (isActive()>0);
bool toExecute = (chActive>0); // execute if channel is active now bool toExecute = (chActive>0); // execute if channel is active now
debugSerial<<endl;
if (itemType != CH_GROUP ) if (itemType != CH_GROUP )
{ {
@@ -696,7 +702,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
case S_NOTFOUND: case S_NOTFOUND:
toExecute=true; toExecute=true;
case S_SET: case S_SET:
//case S_ESET: case S_ESET:
if (st.incrementPercents(step)) if (st.incrementPercents(step))
{ {
st.saveItem(this); st.saveItem(this);
@@ -704,15 +710,19 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
} }
break; break;
case S_HUE: case S_HUE:
if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
if (st.incrementH(step)) if (st.incrementH(step))
{ {
st.setSuffix(S_SET);
st.saveItem(this); st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED); SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
} }
break; break;
case S_SAT: case S_SAT:
if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
if (st.incrementS(step)) if (st.incrementS(step))
{ {
st.setSuffix(S_SET);
st.saveItem(this); st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED); SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
} }
@@ -735,7 +745,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
// continue processing as SET // continue processing as SET
case S_SET: case S_SET:
//case S_ESET: case S_ESET:
if ((st.getArgType() == ST_RGB || st.getArgType() == ST_RGBW) && if ((st.getArgType() == ST_RGB || st.getArgType() == ST_RGBW) &&
(cmd.getArgType() == ST_HSV ) || (cmd.getArgType() == ST_HSV255)) (cmd.getArgType() == ST_HSV ) || (cmd.getArgType() == ST_HSV255))
st.setArgType(cmd.getArgType()); st.setArgType(cmd.getArgType());
@@ -751,23 +761,26 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
break; break;
case S_SAT: case S_SAT:
if (itemType == CH_GROUP && cmd.isColor()) st.setArgType(ST_HSV);//Extend storage for group channel if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
if (st.setS(cmd.getS())) if (st.setS(cmd.getS()))
{ {
st.setSuffix(S_SET);
st.saveItem(this); st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED); SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
} }
break; break;
case S_HUE: case S_HUE:
if (itemType == CH_GROUP && cmd.isColor()) st.setArgType(ST_HSV);//Extend storage for group channel if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
if (st.setH(cmd.getH())) if (st.setH(cmd.getH()))
{ {
st.setSuffix(S_SET);
st.saveItem(this); st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED); SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
} }
break; break;
case S_TEMP: case S_TEMP:
//st.setSuffix(suffixCode);
st.setColorTemp(cmd.getColorTemp()); st.setColorTemp(cmd.getColorTemp());
st.saveItem(this); st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED); SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
@@ -831,10 +844,15 @@ if (driver) //New style modular code
break; break;
case CMD_VOID: case CMD_VOID:
case CMD_DN:
case CMD_UP:
res = driver->Ctrl(st, subItem, toExecute); res = driver->Ctrl(st, subItem, toExecute);
debugSerial<<F("Driver Res:")<<res<<endl;
break; break;
case CMD_ON:
if (chActive) break;
default: //another command default: //another command
res = driver->Ctrl(st, subItem); res = driver->Ctrl(st, subItem);
if (st.isCommand()) if (st.isCommand())
@@ -843,6 +861,7 @@ if (driver) //New style modular code
SendStatus(SEND_COMMAND); SendStatus(SEND_COMMAND);
} }
} }
debugSerial<<F("Driver Res:")<<res<<endl;
return res; return res;
} }
else //Driver not found else //Driver not found
@@ -909,11 +928,12 @@ switch (itemType) {
if (!tStore.timestamp16) mqttClient.publish("/alarmoff/snsr", itemArr->name); if (!tStore.timestamp16) mqttClient.publish("/alarmoff/snsr", itemArr->name);
tStore.tempX100=st.getFloat()*100.; //Save measurement tStore.tempX100=st.getFloat()*100.; //Save measurement
tStore.timestamp16=millisNZ(8) & 0xFFFF; //And timestamp tStore.timestamp16=millisNZ(8) & 0xFFFF; //And timestamp
debugSerial<<F(" T:")<<F(":")<<tStore.tempX100<<F(" TS:")<<tStore.timestamp16<<endl; debugSerial<<F(" T:")<<tStore.tempX100<<F(" TS:")<<tStore.timestamp16<<endl;
setExt(tStore.asint); setExt(tStore.asint);
} }
break; break;
case S_SET: case S_SET:
case S_ESET:
st.saveItem(this); st.saveItem(this);
break; break;
} }
@@ -922,13 +942,13 @@ switch (itemType) {
#ifndef MODBUS_DISABLE #ifndef MODBUS_DISABLE
case CH_MODBUS: case CH_MODBUS:
modbusDimmerSet(st); if (toExecute) modbusDimmerSet(st);
break; break;
case CH_VC: case CH_VC:
VacomSetFan(st); if (toExecute) VacomSetFan(st);
break; break;
case CH_VCTEMP: case CH_VCTEMP:
VacomSetHeat(st); if (toExecute) VacomSetHeat(st);
break; break;
#endif #endif
@@ -1622,6 +1642,7 @@ int Item::SendStatus(int sendFlags) {
case CMD_RGB: case CMD_RGB:
sendFlags &= ~SEND_COMMAND; // Not send command for parametrized req sendFlags &= ~SEND_COMMAND; // Not send command for parametrized req
break; break;
default: default:
debugSerial<<F("Unknown cmd \n"); debugSerial<<F("Unknown cmd \n");
sendFlags &= ~SEND_COMMAND; sendFlags &= ~SEND_COMMAND;

View File

@@ -238,16 +238,47 @@ bool itemCmd::incrementPercents(int16_t dif)
par+=dif; par+=dif;
if (par>100) par=100; if (par>100) par=100;
if (par<0) par=0; if (par<0) par=0;
param.v=par;
break; break;
case ST_PERCENTS255: case ST_PERCENTS255:
case ST_HSV255: case ST_HSV255:
par+=dif; par+=dif;
if (par>255) par=255; if (par>255) par=255;
if (par<0) par=0; if (par<0) par=0;
param.v=par;
break; break;
case ST_INT32:
case ST_UINT32:
par=param.asInt32;
par+=dif;
if (par>100) par=100;
if (par<0) par=0;
param.asInt32=par;
break;
case ST_FLOAT:
case ST_FLOAT_CELSIUS:
case ST_FLOAT_FARENHEIT:
par=param.asfloat;
par+=dif;
if (par>100) par=100;
if (par<0) par=0;
param.asfloat=par;
break;
case ST_TENS:
par=param.asInt32;
par+=dif*10;
if (par>1000) par=1000;
if (par<0) par=0;
param.asInt32=par;
break;
default: return false; default: return false;
} }
param.v=par;
return true; return true;
} }
@@ -332,6 +363,14 @@ itemCmd itemCmd::assignFrom(itemCmd from)
case ST_PERCENTS: case ST_PERCENTS:
param.v=from.param.v; param.v=from.param.v;
break; break;
case ST_TENS:
param.v=from.param.asInt32/10;
break;
case ST_INT32:
case ST_UINT32:
param.v=constrain(from.param.aslong,0,100);
break;
case ST_HSV255: case ST_HSV255:
param.h=from.param.h; param.h=from.param.h;
//param.s=map(from.param.s,0,255,0,100); //param.s=map(from.param.s,0,255,0,100);
@@ -376,6 +415,12 @@ itemCmd itemCmd::assignFrom(itemCmd from)
case ST_PERCENTS: case ST_PERCENTS:
param.v=map(from.param.v,0,100,0,255); param.v=map(from.param.v,0,100,0,255);
break; break;
case ST_INT32:
case ST_UINT32:
param.v=map(from.param.asInt32,0,100,0,255); //constr
break;
case ST_TENS:
param.v=map(from.param.asInt32,0,1000,0,255);
case ST_HSV255: case ST_HSV255:
param.h=from.param.h; param.h=from.param.h;
param.s=from.param.s; param.s=from.param.s;
@@ -402,8 +447,22 @@ itemCmd itemCmd::assignFrom(itemCmd from)
case ST_INT32: case ST_INT32:
case ST_UINT32: case ST_UINT32:
param.asInt32=from.param.asInt32; case ST_TENS:
cmd.itemArgType=from.cmd.itemArgType; switch (from.cmd.itemArgType)
{
case ST_HS:
param.v=getPercents();
param.h=from.param.h;
param.s=from.param.s;
cmd.itemArgType=ST_HSV;
default:
param.asInt32=from.param.asInt32;
cmd.itemArgType=from.cmd.itemArgType;
}
break;
case ST_HS:
param.v=from.getPercents();
cmd.itemArgType=ST_HSV;
break; break;
case ST_FLOAT_FARENHEIT: case ST_FLOAT_FARENHEIT:
toFarenheit = true; toFarenheit = true;
@@ -442,6 +501,12 @@ itemCmd itemCmd::assignFrom(itemCmd from)
cmd.itemArgType=from.cmd.itemArgType; cmd.itemArgType=from.cmd.itemArgType;
param=from.param; param=from.param;
break; break;
case ST_HS:
param.v=getPercents();
param.h=from.param.h;
param.s=from.param.s;
cmd.itemArgType=ST_HSV;
break;
default: default:
debugSerial<<F("Wrong Assignment ")<<from.cmd.itemArgType<<F("->")<<cmd.itemArgType<<endl; debugSerial<<F("Wrong Assignment ")<<from.cmd.itemArgType<<F("->")<<cmd.itemArgType<<endl;
} }
@@ -454,15 +519,20 @@ itemCmd itemCmd::assignFrom(itemCmd from)
switch (from.cmd.itemArgType) switch (from.cmd.itemArgType)
{ {
case ST_RGBW: case ST_RGBW:
RGBW_flag=true; // RGBW_flag=true;
case ST_RGB: case ST_RGB:
param.asInt32=from.param.asInt32; param.asInt32=from.param.asInt32;
cmd.itemArgType=from.cmd.itemArgType; cmd.itemArgType=from.cmd.itemArgType;
break; return *this;
//break;
// Those types are not possible to apply over RGB without convertion toward HSV // Those types are not possible to apply over RGB without convertion toward HSV
case ST_FLOAT:
case ST_HS:
case ST_INT32:
case ST_PERCENTS255: case ST_PERCENTS255:
case ST_PERCENTS: case ST_PERCENTS:
case ST_HS: case ST_TENS:
case ST_UINT32:
{ {
#ifndef ADAFRUIT_LED #ifndef ADAFRUIT_LED
@@ -472,41 +542,50 @@ itemCmd itemCmd::assignFrom(itemCmd from)
rgb.g = param.g; rgb.g = param.g;
rgb.b = param.b; rgb.b = param.b;
CHSV hsv = rgb2hsv_approximate(rgb); CHSV hsv = rgb2hsv_approximate(rgb);
#endif
// Calculate volume
int vol=0;
switch (from.cmd.itemArgType)
{
case ST_PERCENTS255:
vol=map(from.param.v,0,255,0,100);
break;
case ST_PERCENTS:
vol=from.param.v;
break;
case ST_INT32:
case ST_UINT32:
vol=from.param.asInt32;
break;
case ST_TENS:
vol=from.param.asInt32/10;
break;
case ST_FLOAT:
vol=from.param.asfloat;
break;
case ST_HS:
#ifndef ADAFRUIT_LED
vol=hsv.v;
#else
vol=100;
#endif
}
#ifndef ADAFRUIT_LED
// Restoring HSV from RGB
from.param.h = map(hsv.h, 0, 255, 0, 365);
from.param.s = map(hsv.s, 0, 255, 0, 100);
#else
from.param.h=100;
from.param.s=0;
#endif #endif
switch (from.cmd.itemArgType){ from.cmd.itemArgType=ST_HSV;
case ST_PERCENTS255: from.param.v=vol;
#ifndef ADAFRUIT_LED }
from.param.h = map(hsv.h, 0, 255, 0, 365); // Continue processing with filled from HSV
from.param.s = map(hsv.s, 0, 255, 0, 100); /*
#else
from.param.h=100;
from.param.s=0;
#endif
from.cmd.itemArgType=ST_HSV255;
break;
case ST_PERCENTS:
#ifndef ADAFRUIT_LED
from.param.h = map(hsv.h, 0, 255, 0, 365);
from.param.s = map(hsv.s, 0, 255, 0, 100);
#else
from.param.h=100;
from.param.s=0;
#endif
//from.param.v = map(from.param.v,0,100,0,255);
from.cmd.itemArgType=ST_HSV;//255;
break;
case ST_HS:
#ifndef ADAFRUIT_LED
from.param.v = hsv.v;
#else
from.param.v=100;
#endif
from.cmd.itemArgType=ST_HSV; //255
break;
}
}
//Converting current obj to HSV //Converting current obj to HSV
debugSerial<<F("Conv RGB2HSV:"); from.debugOut(); debugSerial<<F("Conv RGB2HSV:"); from.debugOut();
@@ -514,10 +593,10 @@ itemCmd itemCmd::assignFrom(itemCmd from)
// Do not convert to RGBx ? // Do not convert to RGBx ?
param=from.param; param=from.param;
cmd=from.cmd; cmd=from.cmd;
return *this; return *this; */
case ST_HSV255: case ST_HSV255:
HSV255_flag=true; if (from.cmd.itemArgType==ST_HSV255) HSV255_flag=true;
case ST_HSV: case ST_HSV:
{ // HSV_XX to RGB_XX translation code { // HSV_XX to RGB_XX translation code
int rgbSaturation; int rgbSaturation;
@@ -659,8 +738,10 @@ float itemCmd::getFloat()
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_TENS:
return param.aslong/10;
case ST_PERCENTS: case ST_PERCENTS:
case ST_PERCENTS255: case ST_PERCENTS255:
@@ -695,25 +776,57 @@ short itemCmd::getPercents(bool inverse)
case ST_HSV: case ST_HSV:
if (inverse) return 100-param.v; else return param.v; if (inverse) return 100-param.v; else return param.v;
case ST_INT32:
case ST_UINT32:
if (inverse) return constrain(100-param.asInt32,0,100);
else return constrain(param.asInt32,0,100);
case ST_PERCENTS255: case ST_PERCENTS255:
case ST_HSV255: case ST_HSV255:
if (inverse) return map(param.v,0,255,100,0); if (inverse) return map(param.v,0,255,100,0);
else return map(param.v,0,255,0,100); else return map(param.v,0,255,0,100);
case ST_FLOAT: case ST_FLOAT:
if (inverse) return param.asfloat; if (inverse) return constrain (100-param.asfloat,0,100);
else return 100-param.asfloat; else return constrain (param.asfloat,0,100);
case ST_TENS: case ST_TENS:
if (inverse) return param.asInt32/10; if (inverse) return constrain (100-param.asInt32/10,0,100);
else return 100-param.asInt32/10; else return constrain(param.asInt32/10,0,100);
default: default:
return 0; return -1;
} }
} }
bool itemCmd::setPercents(int percents)
{
switch (cmd.itemArgType) {
case ST_PERCENTS:
case ST_HSV:
param.v=percents;
break;
case ST_INT32:
case ST_UINT32:
param.asInt32=percents;
break;
case ST_PERCENTS255:
case ST_HSV255:
param.v=map(percents,0,100,0,255);
break;
case ST_FLOAT:
param.asfloat=percents;
break;
case ST_TENS:
param.asInt32 = percents*10;
default:
return false;
}
return true;
}
short itemCmd::getPercents255(bool inverse) short itemCmd::getPercents255(bool inverse)
{ {
switch (cmd.itemArgType) { switch (cmd.itemArgType) {
@@ -723,6 +836,11 @@ short itemCmd::getPercents255(bool inverse)
if (inverse) return map(param.v,0,100,255,0); if (inverse) return map(param.v,0,100,255,0);
else return map(param.v,0,100,0,255); else return map(param.v,0,100,0,255);
case ST_INT32:
case ST_UINT32:
if (inverse) return map(param.asInt32,0,100,255,0);
else return map(param.asInt32,0,100,0,255);
case ST_PERCENTS255: case ST_PERCENTS255:
case ST_HSV255: case ST_HSV255:
if (inverse) return 255-param.v; else return param.v; if (inverse) return 255-param.v; else return param.v;
@@ -736,8 +854,9 @@ short itemCmd::getPercents255(bool inverse)
else return map(param.asInt32,0,1000,0,255); else return map(param.asInt32,0,1000,0,255);
default: default:
return 0; return -1;
} }
} }
@@ -757,6 +876,14 @@ itemCmd itemCmd::setArgType(uint8_t type)
return *this; return *this;
} }
itemCmd itemCmd::convertTo(uint8_t type)
{
itemCmd out(type,cmd.cmdCode);
out.assignFrom(*this);
return out;
}
uint8_t itemCmd::getCmdParam() uint8_t itemCmd::getCmdParam()
{ {
if (isCommand()) return cmd.cmdParam; if (isCommand()) return cmd.cmdParam;
@@ -1008,7 +1135,7 @@ char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
snprintf(argPtr, bufLen, "%ld", param.asInt32); snprintf(argPtr, bufLen, "%ld", param.asInt32);
break; break;
case ST_TENS: case ST_TENS:
snprintf(argPtr, bufLen, "%ld.%d", param.asInt32/10, param.asInt32 % 10); snprintf(argPtr, bufLen, "%ld.%d", param.asInt32/10, abs(param.asInt32 % 10));
break; break;
case ST_HSV: case ST_HSV:
case ST_HSV255: case ST_HSV255:

View File

@@ -204,6 +204,7 @@ public:
uint16_t getH(); uint16_t getH();
uint16_t getS(); uint16_t getS();
itemCmd setArgType(uint8_t); itemCmd setArgType(uint8_t);
itemCmd convertTo(uint8_t);
itemCmd Percents(int i); itemCmd Percents(int i);
itemCmd Percents255(int i); itemCmd Percents255(int i);
@@ -219,6 +220,7 @@ public:
long int getSingleInt(); long int getSingleInt();
short getPercents(bool inverse=false); short getPercents(bool inverse=false);
short getPercents255(bool inverse=false); short getPercents255(bool inverse=false);
bool setPercents(int percents);
uint8_t getCmd(); uint8_t getCmd();
uint8_t getArgType(); uint8_t getArgType();
uint8_t getCmdParam(); uint8_t getCmdParam();

View File

@@ -280,6 +280,7 @@ int out_AC::Ctrl(itemCmd cmd, char* subItem , bool toExecute)
switch(suffixCode) switch(suffixCode)
{ {
case S_SET: case S_SET:
case S_ESET:
set_tmp = cmd.getInt(); set_tmp = cmd.getInt();
if (set_tmp >= 10 && set_tmp <= 30) if (set_tmp >= 10 && set_tmp <= 30)
{ {

View File

@@ -30,13 +30,6 @@ int out_dmx::Status()
return driverStatus; return driverStatus;
} }
int out_dmx::isActive()
{
itemArgStore st;
st.aslong = item->getVal(); //Restore old params
debugSerial<< F(" val:")<<st.v<<endl;
return st.v;
}
int out_dmx::Poll(short cause) int out_dmx::Poll(short cause)
{ {

View File

@@ -15,7 +15,7 @@ public:
int Poll(short cause) override; int Poll(short cause) override;
int Stop() override; int Stop() override;
int Status() override; int Status() override;
int isActive() override;
int getChanType() override; int getChanType() override;
// int Ctrl(itemCmd cmd, char* subItem=NULL) override; // int Ctrl(itemCmd cmd, char* subItem=NULL) override;
// int PixelCtrl(itemCmd cmd) override; // int PixelCtrl(itemCmd cmd) override;

View File

@@ -427,6 +427,7 @@ case S_NOTFOUND:
toExecute = true; toExecute = true;
debugSerial<<F("Forced execution"); debugSerial<<F("Forced execution");
case S_SET: case S_SET:
case S_ESET:
if (!cmd.isValue()) return 0; if (!cmd.isValue()) return 0;
//TODO //TODO

View File

@@ -161,8 +161,8 @@ if (digitalPinHasPWM(pinUp))
if (inverted) velocity = map(-dif, 0, 10, 255, 0); if (inverted) velocity = map(-dif, 0, 10, 255, 0);
else velocity = map(-dif, 0, 10, 0, 255); else velocity = map(-dif, 0, 10, 0, 255);
if (velocity>255) velocity=255; velocity = constrain (velocity, MIN_PWM, 255);
if (velocity<0) velocity=0;
analogWrite(pinUp,velocity); analogWrite(pinUp,velocity);
} }
@@ -176,8 +176,7 @@ else if (digitalPinHasPWM(pinDown))
velocity = map(-dif, 0, 10, 0, 255); velocity = map(-dif, 0, 10, 0, 255);
else velocity = map(-dif, 0, 10, 255, 0); else velocity = map(-dif, 0, 10, 255, 0);
if (velocity>255) velocity=255; velocity = constrain (velocity, MIN_PWM, 255);
if (velocity<0) velocity=0;
analogWrite(pinDown,velocity); analogWrite(pinDown,velocity);
} }
else else
@@ -200,11 +199,11 @@ if (digitalPinHasPWM(pinDown))
{ {
//Serial.println("pinDown PWM"); //Serial.println("pinDown PWM");
int velocity; int velocity;
if (inverted) velocity = map(dif, 0, 10, 255, 0); if (inverted) velocity = map(dif, 0, 20, 255, 0);
else velocity = map(dif, 0, 10, 0, 255); else velocity = map(dif, 0, 20, 0, 255);
velocity = constrain (velocity, MIN_PWM, 255);
if (velocity>255) velocity=255;
if (velocity<0) velocity=0;
analogWrite(pinDown,velocity); analogWrite(pinDown,velocity);
} }
else else
@@ -268,6 +267,7 @@ case S_NOTFOUND:
toExecute = true; toExecute = true;
debugSerial<<F("Forced execution"); debugSerial<<F("Forced execution");
case S_SET: case S_SET:
case S_ESET:
if (!cmd.isValue()) return 0; if (!cmd.isValue()) return 0;
// item->setVal(cmd.getPercents()); // item->setVal(cmd.getPercents());
if (item->getExt()) item->setExt(millisNZ()); //Extend motor time if (item->getExt()) item->setExt(millisNZ()); //Extend motor time

View File

@@ -5,9 +5,10 @@
#include <item.h> #include <item.h>
#ifndef POS_ERR #ifndef POS_ERR
#define POS_ERR 2 #define POS_ERR 5
#endif #endif
#define MIN_PWM 70
// The number of simultaniusly working motors // The number of simultaniusly working motors
#ifndef MOTOR_QUOTE #ifndef MOTOR_QUOTE
#define MOTOR_QUOTE 1 #define MOTOR_QUOTE 1

View File

@@ -77,7 +77,8 @@ bool out_pid::getConfig()
{store->pid= new PID (&store->input, &store->output, &store->setpoint, kP, kI, kD, direction); {store->pid= new PID (&store->input, &store->output, &store->setpoint, kP, kI, kD, direction);
if (!store->pid) return false; if (!store->pid) return false;
store->pid->SetMode(AUTOMATIC); store->pid->SetMode(AUTOMATIC);
store->pid->SetOutputLimits(outMin,outMax); //store->pid->SetOutputLimits(outMin,outMax);
store->pid->SetSampleTime(5000);
return true;} return true;}
else errorSerial<<F("PID already initialized")<<endl; else errorSerial<<F("PID already initialized")<<endl;
@@ -136,11 +137,11 @@ int out_pid::Poll(short cause)
if (store && store->pid && (Status() == CST_INITIALIZED) && item && (item->getCmd()!=CMD_OFF)) if (store && store->pid && (Status() == CST_INITIALIZED) && item && (item->getCmd()!=CMD_OFF))
{ {
double prevOut=store->output; double prevOut=store->output;
store->pid->Compute(); if(store->pid->Compute())
if (abs(store->output-prevOut)>OUTPUT_TRESHOLD) //if (abs(store->output-store-prevOut)>OUTPUT_TRESHOLD)
{ {
aJsonObject * oCmd = aJson.getArrayItem(item->itemArg, 1); aJsonObject * oCmd = aJson.getArrayItem(item->itemArg, 1);
itemCmd value((float) store->output); itemCmd value((float) (store->output * (100./255.)));
executeCommand(oCmd,-1,value); executeCommand(oCmd,-1,value);
} }
@@ -182,6 +183,7 @@ return 1;
case S_NOTFOUND: case S_NOTFOUND:
case S_SET: case S_SET:
case S_ESET:
// Setpoint for PID // Setpoint for PID
if (!cmd.isValue()) return 0; if (!cmd.isValue()) return 0;
store->setpoint=cmd.getFloat(); store->setpoint=cmd.getFloat();

View File

@@ -13,6 +13,7 @@ public:
double output; double output;
double input; double input;
double setpoint; double setpoint;
float prevOut;
int driverStatus; int driverStatus;
}; };

View File

@@ -83,13 +83,7 @@ int out_pwm::Status()
return driverStatus; return driverStatus;
} }
int out_pwm::isActive()
{
itemArgStore st;
st.aslong = item->getVal(); //Restore old params
debugSerial<< F(" val:")<<st.v<<endl;
return st.v;
}
int out_pwm::Poll(short cause) int out_pwm::Poll(short cause)
{ {

View File

@@ -15,7 +15,7 @@ public:
int Poll(short cause) override; int Poll(short cause) override;
int Stop() override; int Stop() override;
int Status() override; int Status() override;
int isActive() override;
int getChanType() override; int getChanType() override;
//int Ctrl(itemCmd cmd, char* subItem=NULL) override; //int Ctrl(itemCmd cmd, char* subItem=NULL) override;
int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) override; int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) override;

View File

@@ -87,13 +87,7 @@ int out_SPILed::Status()
return driverStatus; return driverStatus;
} }
int out_SPILed::isActive()
{
itemArgStore st;
st.aslong = item->getVal(); //Restore old params
debugSerial<< F(" val:")<<st.v<<endl;
return st.v;
}
int out_SPILed::Poll(short cause) int out_SPILed::Poll(short cause)
{ {

View File

@@ -20,7 +20,6 @@ public:
int Poll(short cause) override; int Poll(short cause) override;
int Stop() override; int Stop() override;
int Status() override; int Status() override;
int isActive() override;
int getChanType() override; int getChanType() override;
//int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL) override; //int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL) override;
//int Ctrl(itemCmd cmd, char* subItem=NULL) override; //int Ctrl(itemCmd cmd, char* subItem=NULL) override;

View File

@@ -106,6 +106,40 @@ int getInt(char **chan) {
} }
// chan is pointer to pointer to string
// Function return first retrived number and move pointer to position next after ','
itemCmd getNumber(char **chan) {
itemCmd val(ST_TENS,CMD_VOID);
int fract =0;
if (chan && *chan && **chan)
{
//Skip non-numeric values
while (**chan && !(**chan == '-' || (**chan >= '0' && **chan<='9'))) *chan += 1;
int ch = atoi(*chan);
char * fractptr = strchr(*chan,'.');
if (fractptr)
{
// fract = atoi(fractptr);
// *chan = fractptr;
fractptr += 1;
fract = constrain(*fractptr-'0',0,9);
}
//Move pointer to next element (after ,)
*chan = strchr(*chan, ',');
if (*chan) *chan += 1;
//Serial.print(F("Par:")); Serial.println(ch);
if (fract)
val.Tens(ch*10+((ch>0)?fract:-fract));
else
val.Int((int32_t)ch);
}
//val.debugOut();
return val;
}
#if defined(ARDUINO_ARCH_ESP32) || defined(ESP8266) #if defined(ARDUINO_ARCH_ESP32) || defined(ESP8266)
unsigned long freeRam () unsigned long freeRam ()
{return system_get_free_heap_size();} {return system_get_free_heap_size();}

View File

@@ -48,6 +48,7 @@ void SetBytes(uint8_t* addr, uint8_t count, char * out);
void SetAddr(char * out, uint8_t* addr); void SetAddr(char * out, uint8_t* addr);
uint8_t HEX2DEC(char i); uint8_t HEX2DEC(char i);
int getInt(char ** chan); int getInt(char ** chan);
itemCmd getNumber(char ** chan);
unsigned long freeRam (); unsigned long freeRam ();
void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base); void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base);
int log(const char *str, ...); int log(const char *str, ...);

View File

@@ -582,8 +582,8 @@ platform = atmelsam
framework = arduino framework = arduino
board = due board = due
build_flags = !python get_build_flags.py lighthub21 build_flags = !python get_build_flags.py lighthub21
;upload_command = arduinoOTA -address 192.168.11.172 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE ;upload_command = arduinoOTA -address 192.168.11.172 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE ;sleep 4
upload_command = arduinoOTA -address 192.168.88.64 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE upload_command = arduinoOTA -address 192.168.88.64 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE;sleep 4
upload_protocol = custom upload_protocol = custom
lib_ignore = lib_ignore =
;DS2482_OneWire //UNCOMMENT for software 1-wire driver ;DS2482_OneWire //UNCOMMENT for software 1-wire driver