MASSIVE refactoring. /set scale changed 100 -> 255

This commit is contained in:
2021-04-08 00:32:21 +03:00
parent 0474c0ac48
commit 7c642ec286
37 changed files with 30318 additions and 30425 deletions

23
lighthub/abstractout.cpp Normal file
View File

@@ -0,0 +1,23 @@
#include "item.h"
#include "abstractout.h"
#include "itemCmd.h"
int abstractOut::isActive()
{itemCmd st;
switch (item->getCmd())
{
case CMD_OFF:
case CMD_HALT:
return 0;
break;
default:
st.loadItem(item);
return st.getPercents255();
}
};
int abstractOut::Setup()
{
if (item) item->setCmd(CMD_OFF);
}

View File

@@ -9,10 +9,11 @@ class abstractOut : public abstractCh{
public:
abstractOut(Item * _item):abstractCh(){item=_item;};
virtual int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) =0;
virtual int isActive(){return 0;};
virtual itemCmd getDefaultOnVal(){return itemCmd(ST_PERCENTS,CMD_VOID).Percents(100);};
virtual int isActive();
virtual itemCmd getDefaultOnVal(){return itemCmd().Percents255(255);};
virtual int getChanType(){return 0;}
virtual int getDefaultStorageType(){return ST_PERCENTS;}
virtual int getDefaultStorageType(){return ST_PERCENTS255;} /// Remove?? Now getChanType used instead
int Setup() override;
protected:
Item * item;
};

View File

@@ -16,6 +16,23 @@ short colorChannel::getChannelAddr(short n)
return item->getArg(n);
}
int colorChannel::getDefaultStorageType()
{
if (item)
switch (numArgs)
{
case 3:
case 4:
return ST_HSV255;
case 1:
return ST_PERCENTS255;
}
return ST_VOID;
}
/*
int colorChannel::isActive()
{
itemCmd st;
@@ -24,6 +41,7 @@ int val = st.getInt();
debugSerial<< F(" val:")<<val<<endl;
return val;
}
*/
int colorChannel::Ctrl(itemCmd cmd, char* subItem, bool toExecute)
{
@@ -39,7 +57,7 @@ case S_NOTFOUND:
// turn on and set
toExecute = true;
case S_SET:
case S_ESET:
//case S_ESET:
case S_HSV:
PixelCtrl(cmd, subItem, toExecute);
return 1;

View File

@@ -15,9 +15,10 @@ public:
numArgs = item->getArgCount(); // and how many addresses is configured
};
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override;
int getDefaultStorageType()override;
virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) =0;
short getChannelAddr(short n =0);
int isActive() override;
// int isActive() override;
protected:
short iaddr;
short numArgs;

View File

@@ -89,7 +89,7 @@ int txt2subItem(char *payload) {
if (!payload || !strlen(payload)) return S_NOTFOUND;
// Check for command
if (strcmp_P(payload, SET_P) == 0) cmd = S_SET;
else if (strcmp_P(payload, ESET_P) == 0) cmd = S_ESET;
//else if (strcmp_P(payload, ESET_P) == 0) cmd = S_ESET;
else if (strcmp_P(payload, CMD_P) == 0) cmd = S_CMD;
else if (strcmp_P(payload, MODE_P) == 0) cmd = S_MODE;
else if (strcmp_P(payload, HSV_P) == 0) cmd = S_HSV;
@@ -476,12 +476,11 @@ int cmd = txt2cmd(payload);
debugSerial<<F("Txt2Cmd:")<<cmd<<endl;
itemCmd st(ST_VOID,cmd);
bool set255flag=false;
bool set255flag=true;
switch (suffixCode) {
case S_ESET:
set255flag=true;
suffixCode=S_SET;
case S_NOTFOUND:
set255flag=false;
break;
case S_HSV:
cmd=CMD_HSV;
@@ -526,10 +525,9 @@ st.setSuffix(suffixCode);
default:
switch (i) //Number of params
{
case 1: st=Par0;
//if (set255flag)
// st.Percents255(Par[0]);
//else st.Percents(Par[0]); //ToDo float
case 1:
if (set255flag) st=Par0;
else st.Percents(Par0.getInt());
break;
case 2: st.HS(Par0.getInt(),Par[0]);
break;
@@ -581,6 +579,7 @@ st.setSuffix(suffixCode);
return 0;
}
int Item::Ctrl(itemCmd cmd, char* subItem)
{
//char stringBuffer[16];
@@ -702,15 +701,16 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
case S_NOTFOUND:
toExecute=true;
case S_SET:
case S_ESET:
// case S_ESET:
if (st.incrementPercents(step))
{
st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
}
break;
case S_HUE:
if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
if (cmd.isColor()) st.convertTo(ST_HSV255);//Extend storage for color channel
if (st.incrementH(step))
{
st.setSuffix(S_SET);
@@ -719,12 +719,13 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
}
break;
case S_SAT:
if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
if (cmd.isColor()) st.convertTo(ST_HSV255);//Extend storage for color channel
if (st.incrementS(step))
{
st.setSuffix(S_SET);
st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
}
} //switch suffix
@@ -736,7 +737,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
//// if ( cType == CH_RGB || cType == CH_RGBW || cType == CH_GROUP )
switch (suffixCode)
{
case S_NOTFOUND: //For empty (universal) suffix - turn ON/OFF automatically
case S_NOTFOUND: //For empty (universal) OPENHAB suffix - turn ON/OFF automatically
toExecute=true;
if (chActive>0 && !cmd.getInt()) st.Cmd(CMD_OFF);
if (chActive==0 && cmd.getInt()) st.Cmd(CMD_ON);
@@ -745,13 +746,16 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
// continue processing as SET
case S_SET:
case S_ESET:
// case S_ESET:
// if previous color was in RGB notation but new value is HSV - discard previous val and change type;
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());
if (itemType == CH_GROUP && cmd.isColor()) st.setArgType(ST_HSV);//Extend storage for group channel
st.assignFrom(cmd);
if (itemType == CH_GROUP && cmd.isColor()) st.setArgType(ST_HSV255);//Extend storage for group channel
//Convert value to most approptiate type for channel
st.assignFrom(cmd,getChanType());
st.saveItem(this);
SendStatus(SEND_PARAMETERS | SEND_DEFFERED);
@@ -761,7 +765,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
break;
case S_SAT:
if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
//if (cmd.isColor()) st.convertTo(ST_HSV255);//Extend storage for color channel
if (st.setS(cmd.getS()))
{
st.setSuffix(S_SET);
@@ -771,7 +775,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem)
break;
case S_HUE:
if (cmd.isColor()) st.convertTo(ST_HSV);//Extend storage for color channel
//if (cmd.isColor()) st.convertTo(ST_HSV255);//Extend storage for color channel
if (st.setH(cmd.getH()))
{
st.setSuffix(S_SET);
@@ -823,7 +827,7 @@ if (driver) //New style modular code
SendStatus(SEND_COMMAND);
return res;
}
else
else
{
debugSerial<<F("Already Inactive\n");
return -3;
@@ -933,7 +937,7 @@ switch (itemType) {
}
break;
case S_SET:
case S_ESET:
// case S_ESET:
st.saveItem(this);
break;
}
@@ -983,7 +987,7 @@ if (active) debugSerial<<F(" active ");
}
int Item::isActive() {
itemArgStore st;
itemCmd st;
int val = 0;
@@ -1020,7 +1024,7 @@ int Item::isActive() {
return active;
}
// No driver - check value
st.aslong = getVal();
st.loadItem(this);
switch (itemType) {
case CH_GROUP: //make recursive calculation - is it some active in group
@@ -1045,19 +1049,20 @@ int Item::isActive() {
break;
case CH_RGBW:
case CH_RGB:
val = st.v; //Light volume
break;
case CH_DIMMER: //Legacy channels
//case CH_RGBW:
//case CH_RGB:
//case CH_DIMMER: //Legacy channels
case CH_MODBUS:
case CH_VC:
val = st.getPercents255(); //Light volume
break;
case CH_VCTEMP:
case CH_PWM:
val = st.aslong;
val = st.getInt();
break;
default:
debugSerial<<F(" unknown\n");
@@ -1159,8 +1164,9 @@ int Item::VacomSetFan(itemCmd st) {
int addr = getArg();
debugSerial<<F("VC#")<<addr<<F("=")<<val<<endl;
if (modbusBusy) {
setCmd(cmd);
setVal(val);
// setCmd(cmd);
// setVal(val);
st.saveItem(this,true);
mb_fail();
return 0;
}
@@ -1203,8 +1209,9 @@ int addr;
debugSerial<<F("VC_heat#")<<addr<<F("=")<<val<<F(" cmd=")<<cmd<<endl;
if (modbusBusy) {
setCmd(cmd);
setVal(val);
//setCmd(cmd);
//setVal(val);
st.saveItem(this,true);
mb_fail();
return 0;
}
@@ -1330,7 +1337,7 @@ int Item::checkFM() {
Item item(airGateObj->valuestring);
if (item.isValid())
// item.Ctrl(0, 1, &val);
item.Ctrl(itemCmd(ST_PERCENTS,CMD_VOID).Percents(val));
item.Ctrl(itemCmd().Percents(val));
}
}
} else
@@ -1500,8 +1507,10 @@ return 1;
int Item::checkModbusDimmer(int data) {
short mask = getArg(2);
itemCmd st;
if (mask < 0) return 0;
st.loadItem(this);
short maxVal = getArg(3);
if (maxVal<=0) maxVal = 0x3f;
@@ -1509,15 +1518,17 @@ int Item::checkModbusDimmer(int data) {
if (mask == 1) d >>= 8;
if (mask == 0 || mask == 1) d &= 0xff;
if (maxVal) d = map(d, 0, maxVal, 0, 100);
if (maxVal) d = map(d, 0, maxVal, 0, 255);
int cmd = getCmd();
//debugSerial<<d);
if (getVal() != d || d && cmd == CMD_OFF || d && cmd == CMD_HALT) //volume changed or turned on manualy
if (st.getPercents255() != d || d && cmd == CMD_OFF || d && cmd == CMD_HALT) //volume changed or turned on manualy
{
if (d) { // Actually turned on
if (cmd != CMD_XON && cmd != CMD_ON) setCmd(CMD_ON); //store command
setVal(d); //store value
st.Percents255(d);
st.saveItem(this);
//setVal(d); //store value
if (cmd == CMD_OFF || cmd == CMD_HALT) SendStatus(SEND_COMMAND); //update OH with ON if it was turned off before
SendStatus(SEND_PARAMETERS); //update OH with value
} else {
@@ -1608,21 +1619,6 @@ int Item::SendStatus(int sendFlags) {
char valstr[20] = "";
char cmdstr[8] = "";
if (sendFlags & SEND_PARAMETERS)
{
// Preparing parameters payload //////////
switch (st.getArgType()) {
case ST_RGB:
case ST_RGBW:
//valstr[0]='#';
st.Cmd(CMD_RGB);
st.toString(valstr, sizeof(valstr), SEND_PARAMETERS|SEND_COMMAND);
break;
default:
st.toString(valstr, sizeof(valstr), SEND_PARAMETERS);
}
}
if (sendFlags & SEND_COMMAND)
{
// Preparing Command payload //////////////
@@ -1648,32 +1644,43 @@ int Item::SendStatus(int sendFlags) {
sendFlags &= ~SEND_COMMAND;
}
}
if (st.getArgType()!=ST_RGB && st.getArgType()!=ST_RGBW) {
//publish to MQTT - OpenHab Legacy style to myhome/s_out/item flat values
setTopic(addrstr,sizeof(addrstr),T_OUT);
strncat(addrstr, itemArr->name, sizeof(addrstr)-1);
// publish to MQTT - OpenHab Legacy style to
// myhome/s_out/item - mix: value and command
// send only for OH bus supported types
if (mqttClient.connected() && !ethernetIdleCount)
{
if (sendFlags & SEND_PARAMETERS && st.getCmd() != CMD_OFF && st.getCmd() != CMD_HALT)
{
mqttClient.publish(addrstr, valstr, true);
debugSerial<<F("Pub: ")<<addrstr<<F("->")<<valstr<<endl;
switch (st.getArgType())
{
case ST_PERCENTS255:
case ST_HSV255:
case ST_FLOAT_CELSIUS:
}
if (mqttClient.connected() && !ethernetIdleCount)
{
setTopic(addrstr,sizeof(addrstr),T_OUT);
strncat(addrstr, itemArr->name, sizeof(addrstr)-1);
st.toString(valstr, sizeof(valstr), SEND_PARAMETERS,100);
if (sendFlags & SEND_PARAMETERS && st.getCmd() != CMD_OFF && st.getCmd() != CMD_HALT)
{
mqttClient.publish(addrstr, valstr, true);
debugSerial<<F("Pub: ")<<addrstr<<F("->")<<valstr<<endl;
}
else if (sendFlags & SEND_COMMAND)
{
mqttClient.publish(addrstr, cmdstr, true);
debugSerial<<F("Pub: ")<<addrstr<<F("->")<<cmdstr<<endl;
{
mqttClient.publish(addrstr, cmdstr, true);
debugSerial<<F("Pub: ")<<addrstr<<F("->")<<cmdstr<<endl;
}
}
}
else
{
setFlag(sendFlags);
return 0;
}
}
}
// publush to MQTT - New style to
// myhome/s_out/item/cmd
// myhome/s_out/item/set
@@ -1683,16 +1690,28 @@ int Item::SendStatus(int sendFlags) {
setTopic(addrstr,sizeof(addrstr),T_OUT);
strncat(addrstr, itemArr->name, sizeof(addrstr)-1);
strncat(addrstr, "/", sizeof(addrstr));
// Preparing parameters payload //////////
switch (st.getArgType()) {
case ST_RGB:
case ST_RGBW:
//valstr[0]='#';
st.Cmd(CMD_RGB);
st.toString(valstr, sizeof(valstr), SEND_PARAMETERS|SEND_COMMAND);
break;
default:
st.toString(valstr, sizeof(valstr), SEND_PARAMETERS);
}
switch (st.getArgType()) {
case ST_RGB:
case ST_RGBW:
strncat_P(addrstr, SET_P, sizeof(addrstr));
break;
case ST_PERCENTS255:
case ST_HSV255:
strncat_P(addrstr, ESET_P, sizeof(addrstr));
break;
// case ST_PERCENTS255:
// case ST_HSV255:
// strncat_P(addrstr, ESET_P, sizeof(addrstr));
// break;
default:
strncat_P(addrstr, SET_P, sizeof(addrstr));
}

View File

@@ -26,7 +26,7 @@ e-mail anklimov@gmail.com
//#define S_SETnCMD 0
#define S_CMD 1
#define S_SET 2
#define S_ESET 4
//#define S_ESET 4
#define S_HSV 5
#define S_RGB 6
#define S_FAN 7

View File

@@ -77,31 +77,39 @@ itemCmd::itemCmd(Item *item)
itemCmd itemCmd::setChanType(short chanType)
{
cmd.itemArgType=getStoragetypeByChanType(chanType);
return *this;
}
uint8_t itemCmd::getStoragetypeByChanType(short chanType)
{
switch (chanType)
{
case CH_RGB:
case CH_RGBW:
case CH_SPILED:
cmd.itemArgType=ST_HSV;
return ST_HSV255;
break;
case CH_AC:
case CH_THERMO:
case CH_VCTEMP:
cmd.itemArgType=ST_FLOAT_CELSIUS;
return ST_FLOAT_CELSIUS;
break;
case CH_DIMMER:
case CH_MOTOR:
case CH_PWM:
case CH_RELAY:
cmd.itemArgType=ST_PERCENTS;
return ST_PERCENTS255;
break;
default:
cmd.itemArgType=ST_PERCENTS;
return ST_VOID;
}
return *this;
}
itemCmd itemCmd::setDefault()
{
switch (cmd.itemArgType){
@@ -109,14 +117,10 @@ itemCmd itemCmd::setDefault()
break;
case ST_FLOAT_FARENHEIT: param.asfloat=75.;
break;
case ST_HSV:
case ST_HS:
param.h=100; param.s=0; param.v=100;
break;
case ST_HSV255: param.h=100; param.s=0; param.v=255;
break;
case ST_PERCENTS: param.v=100;
break;
case ST_PERCENTS255: param.v=255;
break;
default:
@@ -131,8 +135,7 @@ bool itemCmd::setH(uint16_t h)
switch (cmd.itemArgType)
{
case ST_VOID:
cmd.itemArgType=ST_HSV;
case ST_HSV:
cmd.itemArgType=ST_HSV255;
case ST_HSV255:
if (par>365) par=365;
if (par<0) par=0;
@@ -152,18 +155,11 @@ bool itemCmd::setS(uint8_t s)
switch (cmd.itemArgType)
{
case ST_VOID:
cmd.itemArgType=ST_HSV;
case ST_HSV:
cmd.itemArgType=ST_HSV255;
case ST_HSV255:
if (par>100) par=100;
param.s=par;
break;
/*
case ST_HSV255:
if (par>255) par=255;
if (par<0) par=0;
param.s=par;
break;*/
default:
// debugSerial<<F("Can't assign saturation to type ")<<cmd.itemArgType<<endl;
return false;
@@ -181,10 +177,8 @@ bool itemCmd::setColorTemp(int t)
switch (cmd.itemArgType)
{
case ST_VOID:
cmd.itemArgType=ST_HSV;
case ST_HSV:
cmd.itemArgType=ST_HSV255;
case ST_HS:
case ST_PERCENTS:
case ST_PERCENTS255:
case ST_HSV255:
if (par>100) par=100;
@@ -207,9 +201,7 @@ int itemCmd::getColorTemp()
switch (cmd.itemArgType)
{
case ST_HSV:
case ST_HS:
case ST_PERCENTS:
case ST_PERCENTS255:
case ST_HSV255:
@@ -233,13 +225,6 @@ bool itemCmd::incrementPercents(int16_t dif)
{ int par=param.v;
switch (cmd.itemArgType)
{
case ST_PERCENTS:
case ST_HSV:
par+=dif;
if (par>100) par=100;
if (par<0) par=0;
param.v=par;
break;
case ST_PERCENTS255:
case ST_HSV255:
par+=dif;
@@ -286,7 +271,7 @@ bool itemCmd::incrementH(int16_t dif)
{ int par=param.h;
switch (cmd.itemArgType)
{
case ST_HSV:
//case ST_HSV:
case ST_HSV255:
par+=dif;
if (par>365) par=0;
@@ -303,20 +288,12 @@ bool itemCmd::incrementS(int16_t dif)
{int par=param.s;
switch (cmd.itemArgType)
{
//case ST_PERCENTS:
case ST_HSV:
case ST_HSV255:
par+=dif;
if (par>100) par=100;
if (par<0) par=0;
break;
/*
//case ST_PERCENTS255:
case ST_HSV255:
par+=dif;
if (par>255) par=255;
if (par<0) par=0;
break; */
default: return false;
}
param.s=par;
@@ -325,11 +302,11 @@ bool itemCmd::incrementS(int16_t dif)
}
itemCmd itemCmd::assignFrom(itemCmd from)
itemCmd itemCmd::assignFrom(itemCmd from, short chanType)
{
bool RGBW_flag = false;
bool HSV255_flag = false;
bool toFarenheit = false;
short prefferedStorageType = getStoragetypeByChanType(chanType);
int t=from.getColorTemp();
@@ -341,58 +318,6 @@ itemCmd itemCmd::assignFrom(itemCmd from)
switch (cmd.itemArgType){ //Destination
case ST_HSV:
case ST_PERCENTS:
switch (from.cmd.itemArgType)
{
case ST_RGBW:
param.w=from.param.w;
case ST_RGB:
param.r=from.param.r;
param.g=from.param.g;
param.b=from.param.b;
cmd.itemArgType=from.cmd.itemArgType; //Changing if type
break;
case ST_HSV:
param.v=from.param.v;
case ST_HS:
param.h=from.param.h;
param.s=from.param.s;
break;
case ST_PERCENTS:
param.v=from.param.v;
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:
param.h=from.param.h;
//param.s=map(from.param.s,0,255,0,100);
param.s=from.param.s;
param.v=map(from.param.v,0,255,0,100);
break;
case ST_PERCENTS255:
param.v=map(from.param.v,0,255,0,100);
break;
case ST_FLOAT:
if (cmd.itemArgType == ST_HSV)
param.v = constrain(from.param.asfloat,0,100);
else
{
param=from.param;
cmd.itemArgType=from.cmd.itemArgType;
}
break;
default:
debugSerial<<F("Wrong Assignment ")<<from.cmd.itemArgType<<F("->")<<cmd.itemArgType<<endl;
}
break;
case ST_HSV255:
case ST_PERCENTS255:
switch (from.cmd.itemArgType)
@@ -405,22 +330,16 @@ itemCmd itemCmd::assignFrom(itemCmd from)
param.b=from.param.b;
cmd.itemArgType=from.cmd.itemArgType;
break;
case ST_HSV:
param.v=map(from.param.v,0,100,0,255);
case ST_HS:
param.h=from.param.h;
param.s=from.param.s;
//param.s=map(from.param.s,0,100,0,255);
break;
case ST_PERCENTS:
param.v=map(from.param.v,0,100,0,255);
break;
case ST_INT32:
case ST_UINT32:
param.v=map(from.param.asInt32,0,100,0,255); //constr
param.v=constrain(from.param.asInt32,0,255);
break;
case ST_TENS:
param.v=map(from.param.asInt32,0,1000,0,255);
param.v=map(from.param.asInt32,0,2550,0,255);
case ST_HSV255:
param.h=from.param.h;
param.s=from.param.s;
@@ -430,13 +349,7 @@ itemCmd itemCmd::assignFrom(itemCmd from)
param.v=from.param.v;
break;
case ST_FLOAT:
if (cmd.itemArgType == ST_HSV255)
param.v = constrain(map(from.param.asfloat,0,100,0,255),0,255);
else
{
param=from.param;
cmd.itemArgType=from.cmd.itemArgType;
}
param.v=constrain(from.param.asfloat,0.,255.);
break;
default:
debugSerial<<F("Wrong Assignment ")<<from.cmd.itemArgType<<F("->")<<cmd.itemArgType<<endl;
@@ -451,18 +364,18 @@ itemCmd itemCmd::assignFrom(itemCmd from)
switch (from.cmd.itemArgType)
{
case ST_HS:
param.v=getPercents();
param.v=getPercents255();
param.h=from.param.h;
param.s=from.param.s;
cmd.itemArgType=ST_HSV;
cmd.itemArgType=ST_HSV255;
default:
param.asInt32=from.param.asInt32;
cmd.itemArgType=from.cmd.itemArgType;
}
break;
case ST_HS:
param.v=from.getPercents();
cmd.itemArgType=ST_HSV;
param.v=from.getPercents255();
cmd.itemArgType=ST_HSV255;
break;
case ST_FLOAT_FARENHEIT:
toFarenheit = true;
@@ -473,8 +386,6 @@ itemCmd itemCmd::assignFrom(itemCmd from)
case ST_TENS:
param.asfloat=from.param.asInt32/10.;
break;
case ST_PERCENTS:
case ST_PERCENTS255:
param.asfloat=from.param.v;
break;
@@ -495,17 +406,16 @@ itemCmd itemCmd::assignFrom(itemCmd from)
param.asfloat=from.param.asfloat;
break;
case ST_HSV255:
case ST_HSV:
case ST_RGB:
case ST_RGBW:
cmd.itemArgType=from.cmd.itemArgType;
param=from.param;
break;
case ST_HS:
param.v=getPercents();
param.v=getPercents255();
param.h=from.param.h;
param.s=from.param.s;
cmd.itemArgType=ST_HSV;
cmd.itemArgType=ST_HSV255;
break;
default:
debugSerial<<F("Wrong Assignment ")<<from.cmd.itemArgType<<F("->")<<cmd.itemArgType<<endl;
@@ -530,7 +440,6 @@ itemCmd itemCmd::assignFrom(itemCmd from)
case ST_HS:
case ST_INT32:
case ST_PERCENTS255:
case ST_PERCENTS:
case ST_TENS:
case ST_UINT32:
{
@@ -551,9 +460,6 @@ itemCmd itemCmd::assignFrom(itemCmd from)
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;
@@ -568,7 +474,7 @@ itemCmd itemCmd::assignFrom(itemCmd from)
#ifndef ADAFRUIT_LED
vol=hsv.v;
#else
vol=100;
vol=255;
#endif
}
@@ -581,38 +487,19 @@ itemCmd itemCmd::assignFrom(itemCmd from)
from.param.s=0;
#endif
from.cmd.itemArgType=ST_HSV;
from.cmd.itemArgType=ST_HSV255;
from.param.v=vol;
}
// Continue processing with filled from HSV
/*
//Converting current obj to HSV
debugSerial<<F("Conv RGB2HSV:"); from.debugOut();
// Do not convert to RGBx ?
param=from.param;
cmd=from.cmd;
return *this; */
case ST_HSV255:
if (from.cmd.itemArgType==ST_HSV255) HSV255_flag=true;
case ST_HSV:
{ // HSV_XX to RGB_XX translation code
int rgbSaturation;
int rgbValue;
if (HSV255_flag)
{
//rgbSaturation = from.param.s;
rgbSaturation =map(from.param.s, 0, 100, 0, 255);
rgbValue = from.param.v;
}
else
{
rgbSaturation =map(from.param.s, 0, 100, 0, 255);
rgbValue = map(from.param.v, 0, 100, 0, 255);
}
short colorT=from.param.colorTemp-1;
@@ -679,6 +566,9 @@ itemCmd itemCmd::assignFrom(itemCmd from)
} //Translation to RGB_XX
break;
} //Destination
if (prefferedStorageType) convertTo(prefferedStorageType);
return *this;
}
@@ -694,7 +584,9 @@ return (cmd.itemArgType);
bool itemCmd::isColor()
{
return (cmd.itemArgType==ST_HS || cmd.itemArgType==ST_HSV || cmd.itemArgType==ST_HSV255 || cmd.itemArgType==ST_RGB || cmd.itemArgType==ST_RGBW);
return (cmd.itemArgType==ST_HS || cmd.itemArgType==ST_HSV255 || cmd.itemArgType==ST_RGB || cmd.itemArgType==ST_RGBW);
}
@@ -708,10 +600,7 @@ long int itemCmd::getInt()
case ST_RGBW:
return param.aslong;
case ST_PERCENTS:
case ST_PERCENTS255:
case ST_HSV:
case ST_HSV255:
return param.v;
@@ -743,9 +632,7 @@ float itemCmd::getFloat()
case ST_TENS:
return param.aslong/10;
case ST_PERCENTS:
case ST_PERCENTS255:
case ST_HSV:
case ST_HSV255:
return param.v;
@@ -771,10 +658,6 @@ long int itemCmd::getSingleInt()
short itemCmd::getPercents(bool inverse)
{
switch (cmd.itemArgType) {
case ST_PERCENTS:
case ST_HSV:
if (inverse) return 100-param.v; else return param.v;
case ST_INT32:
case ST_UINT32:
@@ -804,23 +687,19 @@ 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;
param.asInt32=map(percents,0,100,0,255);
break;
case ST_PERCENTS255:
case ST_HSV255:
param.v=map(percents,0,100,0,255);
break;
case ST_FLOAT:
param.asfloat=percents;
param.asfloat=map(percents,0,100,0,255);;
break;
case ST_TENS:
param.asInt32 = percents*10;
param.asInt32 = map(percents,0,100,0,2550);;
default:
return false;
}
@@ -831,29 +710,19 @@ short itemCmd::getPercents255(bool inverse)
{
switch (cmd.itemArgType) {
case ST_PERCENTS:
case ST_HSV:
if (inverse) return map(param.v,0,100,255,0);
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);
if (inverse) return 255-constrain(param.asInt32,0,255); else return constrain(param.asInt32,0,255);
case ST_PERCENTS255:
case ST_HSV255:
if (inverse) return 255-param.v; else return param.v;
case ST_FLOAT:
if (inverse) return map(param.asfloat,0,100,255,0);
else return map(param.asfloat,0,100,0,255);
if (inverse) return 255-constrain(param.asfloat,0,255); else return constrain(param.asfloat,0,255);
case ST_TENS:
if (inverse) return map(param.asInt32,0,1000,255,0);
else return map(param.asInt32,0,1000,0,255);
if (inverse) return 255-constrain(param.asInt32/10,0,255); else return constrain(param.asInt32/10,0,255);
default:
return -1;
@@ -879,9 +748,12 @@ itemCmd itemCmd::setArgType(uint8_t type)
itemCmd itemCmd::convertTo(uint8_t type)
{
if (cmd.itemArgType == type) return *this;
debugSerial << F("Converting ") << cmd.itemArgType << F("->") << type << F(" ");
itemCmd out(type,cmd.cmdCode);
out.assignFrom(*this);
return out;
*this=out.assignFrom(*this);
debugOut();
return *this;
}
uint8_t itemCmd::getCmdParam()
@@ -897,19 +769,13 @@ itemCmd itemCmd::Percents(int i)
switch (cmd.itemArgType)
{
case ST_HSV:
case ST_PERCENTS:
param.v=i;
break;
case ST_HSV255:
case ST_PERCENTS255:
param.v=map(i,0,100,0,255);
break;
default:
cmd.itemArgType=ST_PERCENTS;
param.v=i;
cmd.itemArgType=ST_PERCENTS255;
}
param.v=map(i,0,100,0,255);
return *this;
}
@@ -920,11 +786,6 @@ itemCmd itemCmd::Percents(int i)
switch (cmd.itemArgType)
{
case ST_HSV:
case ST_PERCENTS:
param.v=map(i,0,255,0,100);
break;
case ST_HSV255:
case ST_PERCENTS255:
param.v=i;
@@ -966,10 +827,10 @@ itemCmd itemCmd::Tens(int32_t i)
itemCmd itemCmd::HSV(uint16_t h, uint8_t s, uint8_t v)
{
cmd.itemArgType=ST_HSV;
cmd.itemArgType=ST_HSV255;
param.h=h;
param.s=s;
param.v=v;
param.v=map(v,0,100,0,255);
return *this;
}
@@ -1074,7 +935,7 @@ bool itemCmd::saveItem(Item * item, bool includeCommand)
item->setVal(param.asInt32);
item->setSubtype(cmd.itemArgType);
if (includeCommand) item->setCmd(cmd.cmdCode);
debugSerial<<F("Saved :");
debugSerial<<F("Saved:");
debugOut();
return true;
}
@@ -1104,7 +965,7 @@ int itemCmd::doMappingCmd(aJsonObject *mappingData)
}
char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags, int base )
{
if (!Buffer || !bufLen) return NULL;
@@ -1124,9 +985,8 @@ char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
switch (cmd.itemArgType)
{ short colorTemp;
case ST_PERCENTS:
case ST_PERCENTS255:
snprintf(argPtr, bufLen, "%u", param.v);
snprintf(argPtr, bufLen, "%u", map (param.v,0,255,0,base));
break;
case ST_UINT32:
snprintf(argPtr, bufLen, "%lu", param.asUint32);
@@ -1137,14 +997,13 @@ char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
case ST_TENS:
snprintf(argPtr, bufLen, "%ld.%d", param.asInt32/10, abs(param.asInt32 % 10));
break;
case ST_HSV:
case ST_HSV255:
colorTemp=getColorTemp();
if (colorTemp<0)
snprintf(argPtr, bufLen, "%d,%d,%d", param.h, param.s, param.v);
snprintf(argPtr, bufLen, "%d,%d,%d", param.h, param.s, map (param.v,0,255,0,base));
else
snprintf(argPtr, bufLen, "%d,%d,%d,%d", param.h, param.s, param.v, colorTemp);
snprintf(argPtr, bufLen, "%d,%d,%d,%d", param.h, param.s, map (param.v,0,255,0,base), colorTemp);
break;
case ST_HS:
@@ -1155,18 +1014,17 @@ char * itemCmd::toString(char * Buffer, int bufLen, int sendFlags )
case ST_FLOAT_FARENHEIT:
case ST_FLOAT:
{
//char *tmpSign = (param.asfloat < 0) ? "-" : "";
float tmpVal = (param.asfloat < 0) ? -param.asfloat : param.asfloat;
int tmpInt1 = tmpVal; // Get the integer
float tmpFrac = tmpVal - tmpInt1; // Get fraction
int tmpInt2 = trunc(tmpFrac * 10000); // Turn into integer
int tmpInt2 = trunc(tmpFrac * 100); // Turn into integer
// Print as parts, note that you need 0-padding for fractional bit.
if (param.asfloat < 0)
snprintf (argPtr, bufLen, "-%d.%04d", tmpInt1, tmpInt2);
else snprintf (argPtr, bufLen, "%d.%04d", tmpInt1, tmpInt2);
snprintf (argPtr, bufLen, "-%d.%02d", tmpInt1, tmpInt2);
else snprintf (argPtr, bufLen, "%d.%02d", tmpInt1, tmpInt2);
}
// snprintf(argPtr, bufLen, "%.1f", param.asfloat);
break;
case ST_RGB:
snprintf(argPtr, bufLen, "%d,%d,%d", param.r, param.g, param.b);

View File

@@ -74,42 +74,26 @@ const cmdstr commands_P[] PROGMEM =
int txt2cmd (char * payload);
/*
enum itemStoreType {
ST_VOID = 0,
ST_PERCENTS = 1,
ST_TENS = 2,
ST_HSV = 3,
ST_FLOAT_CELSIUS= 4,
ST_FLOAT_FARENHEIT= 5,
ST_RGB = 6,
ST_RGBW = 7,
ST_PERCENTS255 = 8,
ST_HSV255 = 9,
ST_INT32 = 10,
ST_UINT32 = 11,
ST_STRING = 12,
ST_FLOAT = 13//,
//ST_COMMAND = 15
};
*/
///Definition of all possible types of argument, contained in class
#define ST_VOID 0 /// Not defined
#define ST_PERCENTS 1 /// Percent value 0..100
#define ST_TENS 2 /// Int representation of Float point value in tens part (ex 12.3 = 123 in "tens")
#define ST_HSV 3 /// HUE-SATURATION-VALUE representation of color (0..365, 0..100, 0..100)
#define ST_HS 4 /// just hue and saturation
#define ST_FLOAT_CELSIUS 5 /// Float value - temperature in Celsium
#define ST_FLOAT_FARENHEIT 6 /// Float value - temperature in Farenheit
#define ST_RGB 7 /// RGB replesentation of color
#define ST_RGBW 8 /// RGB + White channel
#define ST_PERCENTS255 9 /// Percent value 0..255
#define ST_HSV255 10 /// HUE-SATURATION-VALUE representation of color (0..365, 0..255, 0..255)
#define ST_INT32 11 /// 32 bits signed integer
#define ST_UINT32 12 /// 32 bits unsigned integer
#define ST_STRING 13 /// pointer to string (for further use)
#define ST_FLOAT 14 /// generic Float value
#define ST_PERCENTS255 1 /// Percent value 0..255
#define ST_HSV255 2 /// HUE-SATURATION-VALUE representation of color (0..365, 0..100, 0..255)
#define ST_HS 3 /// just hue and saturation
#define ST_RGB 4 /// RGB replesentation of color
#define ST_RGBW 5 /// RGB + White channel
#define ST_TENS 6 /// Int representation of Float point value in tens part (ex 12.3 = 123 in "tens")
#define ST_FLOAT 7 /// generic Float value
#define ST_FLOAT_CELSIUS 8 /// Float value - temperature in Celsium
#define ST_FLOAT_FARENHEIT 9 /// Float value - temperature in Farenheit
#define ST_INT32 10 /// 32 bits signed integer
#define ST_UINT32 11 /// 32 bits unsigned integer
#define ST_STRING 12 /// pointer to string (for further use)
#define MAP_SCALE 1
#define MAP_VAL_CMD 2
@@ -182,7 +166,7 @@ public:
itemCmd(float val);
itemCmd(Item *item);
itemCmd assignFrom(itemCmd from);
itemCmd assignFrom(itemCmd from, short chanType=-1);
bool loadItem(Item * item, bool includeCommand=false );
bool saveItem(Item * item, bool includeCommand=false);
@@ -205,6 +189,8 @@ public:
uint16_t getS();
itemCmd setArgType(uint8_t);
itemCmd convertTo(uint8_t);
uint8_t getStoragetypeByChanType(short chanType);
itemCmd Percents(int i);
itemCmd Percents255(int i);
@@ -224,7 +210,7 @@ public:
uint8_t getCmd();
uint8_t getArgType();
uint8_t getCmdParam();
char * toString(char * Buffer, int bufLen, int sendFlags = SEND_COMMAND | SEND_PARAMETERS );
char * toString(char * Buffer, int bufLen, int sendFlags = SEND_COMMAND | SEND_PARAMETERS, int base = 255);
bool isCommand();
bool isValue();

View File

@@ -2177,129 +2177,3 @@ publishStat();
}
/*
bool isThermostatWithMinArraySize(aJsonObject *item, int minimalArraySize) {
return (item->type == aJson_Array) && (aJson.getArrayItem(item, I_TYPE)->valueint == CH_THERMO) &&
(aJson.getArraySize(item) >= minimalArraySize);
}
bool thermoDisabledOrDisconnected(aJsonObject *thermoExtensionArray, int thermoStateCommand) {
if (aJson.getArrayItem(thermoExtensionArray, IET_ATTEMPTS)->valueint == 0) return true;
switch (thermoStateCommand) {
case CMD_ON:
case CMD_XON:
case CMD_AUTO:
case CMD_HEAT:
return false;
default: return true;
}
}
//TODO: refactoring
void thermoLoop(void) {
// if (millis() < timerThermostatCheck)
if (!isTimeOver(timerThermostatCheck,millis(),THERMOSTAT_CHECK_PERIOD))
return;
if (!items) return;
bool thermostatCheckPrinted = false;
configLocked++;
for (aJsonObject *thermoItem = items->child; thermoItem; thermoItem = thermoItem->next) {
if (isThermostatWithMinArraySize(thermoItem, 5)) {
aJsonObject *thermoExtensionArray = aJson.getArrayItem(thermoItem, I_EXT);
if (thermoExtensionArray && (aJson.getArraySize(thermoExtensionArray) > 1)) {
Item thermostat(thermoItem);
if (!thermostat.isValid()) continue;
itemCmd thermostatCmd(&thermostat);
//int thermoPin = aJson.getArrayItem(thermoItem, I_ARG)->valueint;
int thermoPin = thermostat.getArg(0);
//float thermoSetting = aJson.getArrayItem(thermoItem, I_VAL)->valueint; ///
float thermoSetting = thermostatCmd.getFloat();
int thermoStateCommand = aJson.getArrayItem(thermoItem, I_CMD)->valueint;
float curTemp = aJson.getArrayItem(thermoExtensionArray, IET_TEMP)->valuefloat;
if (!aJson.getArrayItem(thermoExtensionArray, IET_ATTEMPTS)->valueint) {
errorSerial<<thermoItem->name<<F(" Expired\n");
} else {
if (!(--aJson.getArrayItem(thermoExtensionArray, IET_ATTEMPTS)->valueint))
mqttClient.publish("/alarm/snsr", thermoItem->name);
}
if (curTemp > THERMO_OVERHEAT_CELSIUS) mqttClient.publish("/alarm/ovrht", thermoItem->name);
debugSerial << endl << thermoItem->name << F(" Set:") << thermoSetting << F(" Cur:") << curTemp
<< F(" cmd:") << thermoStateCommand;
if (thermoPin<0) pinMode(-thermoPin, OUTPUT); else pinMode(thermoPin, OUTPUT);
if (thermoDisabledOrDisconnected(thermoExtensionArray, thermoStateCommand)) {
if (thermoPin<0) digitalWrite(-thermoPin, LOW); else digitalWrite(thermoPin, LOW);
// Caution - for water heaters (negative pin#) if some comes wrong (or no connection with termometers output is LOW - valve OPEN)
// OFF - also VALVE is OPEN (no teat control)
debugSerial<<F(" OFF");
} else {
if (curTemp < thermoSetting - THERMO_GIST_CELSIUS) {
if (thermoPin<0) digitalWrite(-thermoPin, LOW); else digitalWrite(thermoPin, HIGH);
debugSerial<<F(" ON");
} //too cold
else if (curTemp >= thermoSetting) {
if (thermoPin<0) digitalWrite(-thermoPin, HIGH); else digitalWrite(thermoPin, LOW);
debugSerial<<F(" OFF");
} //Reached settings
else debugSerial<<F(" -target zone-"); // Nothing to do
}
thermostatCheckPrinted = true;
}
}
}
configLocked--;
timerThermostatCheck = millis();// + THERMOSTAT_CHECK_PERIOD;
publishStat();
#ifndef DISABLE_FREERAM_PRINT
(thermostatCheckPrinted) ? debugSerial<<F("\nRAM=")<<freeRam()<<" " : debugSerial<<F(" ")<<freeRam()<<F(" ");
#endif
}
short thermoSetCurTemp(char *name, float t) {
if (!name || !strlen(name)) return 0;
if (items) {
aJsonObject *thermoItem = aJson.getObjectItem(items, name);
if (!thermoItem) return 0;
if (isThermostatWithMinArraySize(thermoItem, 4)) {
aJsonObject *extArray = NULL;
if (aJson.getArraySize(thermoItem) == 4) //No thermo extension yet
{
extArray = aJson.createArray(); //Create Ext Array
aJsonObject *ocurt = aJson.createItem(t); //Create float
aJsonObject *oattempts = aJson.createItem((long int) T_ATTEMPTS); //Create int
aJson.addItemToArray(extArray, ocurt);
aJson.addItemToArray(extArray, oattempts);
aJson.addItemToArray(thermoItem, extArray); //Adding to thermoItem
}
else if (extArray = aJson.getArrayItem(thermoItem, I_EXT)) {
aJsonObject *att = aJson.getArrayItem(extArray, IET_ATTEMPTS);
aJson.getArrayItem(extArray, IET_TEMP)->valuefloat = t;
if (att->valueint == 0) mqttClient.publish("/alarmoff/snsr", thermoItem->name);
att->valueint = (int) T_ATTEMPTS;
}
}
return 1;}
return 0;}
*/

View File

@@ -213,6 +213,7 @@ inline unsigned char toHex( char ch ){
int out_AC::Setup()
{
abstractOut::Setup();
Serial.println("AC Init");
AC_Serial.begin(9600);
driverStatus = CST_INITIALIZED;
@@ -280,7 +281,7 @@ int out_AC::Ctrl(itemCmd cmd, char* subItem , bool toExecute)
switch(suffixCode)
{
case S_SET:
case S_ESET:
//case S_ESET:
set_tmp = cmd.getInt();
if (set_tmp >= 10 && set_tmp <= 30)
{

View File

@@ -2,6 +2,7 @@
#pragma once
#ifndef AC_DISABLE
#include <abstractout.h>
#include "itemCmd.h"
#define LEN_B 37
#define B_CUR_TMP 13 //Текущая температура
@@ -29,7 +30,7 @@ public:
int Stop() override;
int Status() override;
int isActive() override;
//int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL) override;
int getDefaultStorageType(){return ST_FLOAT_CELSIUS;};
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override;
protected:

View File

@@ -13,6 +13,7 @@ static int driverStatus = CST_UNKNOWN;
int out_dmx::Setup()
{
abstractOut::Setup();
debugSerial<<F("DMX-Out Init")<<endl;
driverStatus = CST_INITIALIZED;
return 1;
@@ -88,7 +89,7 @@ if (cType==CH_DIMMER) //Single channel
storageType=ST_RGBW;
break;
default:
storageType=ST_PERCENTS;
storageType=ST_PERCENTS255;
}
itemCmd st(storageType,CMD_VOID);

View File

@@ -155,6 +155,7 @@ bool out_Modbus::getConfig()
int out_Modbus::Setup()
{
abstractOut::Setup();
if (!store) store= (mbPersistent *)item->setPersistent(new mbPersistent);
if (!store)
{ errorSerial<<F("MBUS: Out of memory")<<endl;
@@ -194,10 +195,6 @@ if (store)
return CST_UNKNOWN;
}
int out_Modbus::isActive()
{
return item->getVal();
}
bool readModbus(uint16_t reg, int regType, int count)
@@ -464,7 +461,7 @@ case S_NOTFOUND:
toExecute = true;
debugSerial<<F("Forced execution");
case S_SET:
case S_ESET:
//case S_ESET:
if (!cmd.isValue()) return 0;
//TODO

View File

@@ -3,6 +3,7 @@
#ifndef MBUS_DISABLE
#include <abstractout.h>
#include <item.h>
#include "itemCmd.h"
#if defined(ESP32)
#define serialParamType uint32_t
@@ -34,9 +35,9 @@ public:
int Poll(short cause) override;
int Stop() override;
int Status() override;
int isActive() override;
int getChanType() override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override;
int getDefaultStorageType(){return ST_INT32;};
//int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL) override;
protected:

View File

@@ -48,6 +48,7 @@ void out_Motor::getConfig()
int out_Motor::Setup()
{
abstractOut::Setup();
getConfig();
Serial.println("Motor Init");
pinMode(pinUp,OUTPUT);
@@ -82,7 +83,7 @@ int out_Motor::Status()
{
return driverStatus;
}
/*
int out_Motor::isActive()
{
itemCmd st;
@@ -94,10 +95,10 @@ switch (item->getCmd())
break;
default:
st.loadItem(item);
return st.getPercents();
return st.getPercents255();
}
}
*/
int out_Motor::Poll(short cause)
{
int curPos = -1;
@@ -118,7 +119,7 @@ if (!item->getFlag(ACTION_IN_PROCESS))
uint32_t motorOfftime = item->getExt();
itemCmd st;
st.loadItem(item);
targetPos = st.getPercents();// item->getVal();
targetPos = st.getPercents255();// item->getVal();
switch (item->getCmd())
{
@@ -137,18 +138,17 @@ int fb=-1;
if (pinFeedback && isAnalogPin(pinFeedback))
{
curPos=map((fb=analogRead(pinFeedback)),feedbackClosed,feedbackOpen,0,100);
curPos=map((fb=analogRead(pinFeedback)),feedbackClosed,feedbackOpen,0,255);
if (curPos<0) curPos=0;
if (curPos>100) curPos=100;
if (curPos>255) curPos=255;
}
//if (motorOfftime && motorOfftime<millis()) //Time over
if (motorOfftime && isTimeOver(motorOfftime,millis(),maxOnTime))
{dif = 0; debugSerial<<F("Motor timeout")<<endl;}
else if (curPos>=0)
dif=targetPos-curPos;
else
dif=targetPos-50; // Have No feedback
dif=targetPos-255/2; // Have No feedback
debugSerial<<F("In:")<<pinFeedback<<F(" Val:")<<fb<<F("/")<<curPos<<F("->")<<targetPos<<F(" delta:")<<dif<<endl;
@@ -168,8 +168,8 @@ if (digitalPinHasPWM(pinUp))
{
//Serial.println("pinUP PWM");
int velocity;
if (inverted) velocity = map(-dif, 0, 10, 255, 0);
else velocity = map(-dif, 0, 10, 0, 255);
if (inverted) velocity = map(-dif, 0, 255/10, 255, 0);
else velocity = map(-dif, 0, 255/10, 0, 255);
velocity = constrain (velocity, MIN_PWM, 255);
@@ -183,8 +183,8 @@ else if (digitalPinHasPWM(pinDown))
int velocity;
if (inverted)
velocity = map(-dif, 0, 10, 0, 255);
else velocity = map(-dif, 0, 10, 255, 0);
velocity = map(-dif, 0, 255/10, 0, 255);
else velocity = map(-dif, 0, 255/10, 255, 0);
velocity = constrain (velocity, MIN_PWM, 255);
analogWrite(pinDown,velocity);
@@ -209,8 +209,8 @@ if (digitalPinHasPWM(pinDown))
{
//Serial.println("pinDown PWM");
int velocity;
if (inverted) velocity = map(dif, 0, 20, 255, 0);
else velocity = map(dif, 0, 20, 0, 255);
if (inverted) velocity = map(dif, 0, 255/5, 255, 0);
else velocity = map(dif, 0, 255/5, 0, 255);
velocity = constrain (velocity, MIN_PWM, 255);
@@ -223,8 +223,8 @@ if (digitalPinHasPWM(pinUp))
digitalWrite(pinDown,ACTIVE);
int velocity;
if (inverted) velocity = map(dif, 0, 10, 0, 255);
else velocity = map(dif, 0, 10, 255, 0);
if (inverted) velocity = map(dif, 0, 255/10, 0, 255);
else velocity = map(dif, 0, 255/10, 255, 0);
if (velocity>255) velocity=255;
if (velocity<0) velocity=0;
@@ -277,7 +277,7 @@ case S_NOTFOUND:
toExecute = true;
debugSerial<<F("Forced execution");
case S_SET:
case S_ESET:
//case S_ESET:
if (!cmd.isValue()) return 0;
// item->setVal(cmd.getPercents());
if (item->getExt()) item->setExt(millisNZ()); //Extend motor time

View File

@@ -3,9 +3,10 @@
#ifndef MOTOR_DISABLE
#include <abstractout.h>
#include <item.h>
#include "itemCmd.h"
#ifndef POS_ERR
#define POS_ERR 5
#define POS_ERR 10
#endif
#define MIN_PWM 70
@@ -24,8 +25,9 @@ public:
int Poll(short cause) override;
int Stop() override;
int Status() override;
int isActive() override;
//int isActive() override;
int getChanType() override;
int getDefaultStorageType(){return ST_PERCENTS255;};
//int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL) override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override;

View File

@@ -29,7 +29,7 @@ bool out_pid::getConfig()
return false;
}
double outMin=0.;
double outMax=100.;
double outMax=255.;
aJsonObject * param;
switch (aJson.getArraySize(kPIDObj))
{ case 5:
@@ -89,6 +89,7 @@ bool out_pid::getConfig()
int out_pid::Setup()
{
abstractOut::Setup();
if (!store) store= (pidPersistent *)item->setPersistent(new pidPersistent);
if (!store)
{ errorSerial<<F("PID: Out of memory")<<endl;
@@ -98,6 +99,7 @@ store->pid=NULL;
if (getConfig())
{
infoSerial<<F("PID config loaded ")<< item->itemArr->name<<endl;
item->On(); // Turn ON pid by default
store->driverStatus = CST_INITIALIZED;
return 1;
}
@@ -141,7 +143,7 @@ if (store && store->pid && (Status() == CST_INITIALIZED) && item && (item->getCm
//if (abs(store->output-store-prevOut)>OUTPUT_TRESHOLD)
{
aJsonObject * oCmd = aJson.getArrayItem(item->itemArg, 1);
itemCmd value((float) (store->output * (100./255.)));
itemCmd value((float) (store->output));// * (100./255.)));
executeCommand(oCmd,-1,value);
}
@@ -183,7 +185,7 @@ return 1;
case S_NOTFOUND:
case S_SET:
case S_ESET:
//case S_ESET:
// Setpoint for PID
if (!cmd.isValue()) return 0;
store->setpoint=cmd.getFloat();

View File

@@ -4,6 +4,7 @@
#include <abstractout.h>
#include <item.h>
#include <PID_v1.h>
#include "itemCmd.h"
#define OUTPUT_TRESHOLD 1
@@ -29,6 +30,7 @@ public:
int Status() override;
int isActive() override;
int getChanType() override;
int getDefaultStorageType(){return ST_FLOAT;};
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true) override;

View File

@@ -19,6 +19,7 @@ void analogWrite(int pin, int val)
int out_pwm::Setup()
{
abstractOut::Setup();
debugSerial<<F("PWM-Out Init")<<endl;
if (!item || iaddr) return 0;
@@ -142,7 +143,7 @@ switch (cmd.getCmd()){
storageType=ST_RGBW;
break;
default:
storageType=ST_PERCENTS;
storageType=ST_PERCENTS255;
}
itemCmd st(storageType,CMD_VOID);

View File

@@ -43,6 +43,7 @@ void out_SPILed::getConfig()
int out_SPILed::Setup()
{
abstractOut::Setup();
getConfig();
Serial.println("SPI-LED Init");

View File

@@ -37,7 +37,7 @@
#define TIMEOUT_REINIT 5000UL
#define TIMEOUT_RETAIN 5000UL
#define INTERVAL_1W 5000UL
#define PERIOD_THERMOSTAT_FAILED (300 * 1000UL)>>8
#define PERIOD_THERMOSTAT_FAILED (500 * 1000UL)>>8
//#define T_ATTEMPTS 200
//#define IET_TEMP 0