mirror of
https://github.com/anklimov/lighthub
synced 2025-12-06 11:49:51 +03:00
pins protection,core fixes for grp ch stat& sched
This commit is contained in:
@@ -60,7 +60,7 @@ toExecute = true;
|
|||||||
case S_SET:
|
case S_SET:
|
||||||
//case S_ESET:
|
//case S_ESET:
|
||||||
case S_HSV:
|
case S_HSV:
|
||||||
PixelCtrl(cmd, subItem, toExecute);
|
PixelCtrl(cmd, subItem, toExecute, authorized);
|
||||||
return 1;
|
return 1;
|
||||||
case S_CMD:
|
case S_CMD:
|
||||||
//item->setCmd(cmd.getCmd());
|
//item->setCmd(cmd.getCmd());
|
||||||
@@ -74,13 +74,13 @@ case S_CMD:
|
|||||||
cmd.saveItem(item);
|
cmd.saveItem(item);
|
||||||
item->SendStatus(FLAG_PARAMETERS | FLAG_SEND_DEFFERED);
|
item->SendStatus(FLAG_PARAMETERS | FLAG_SEND_DEFFERED);
|
||||||
};
|
};
|
||||||
PixelCtrl(cmd,subItem, true);
|
PixelCtrl(cmd,subItem, true, authorized);
|
||||||
// item->SendStatus(FLAG_COMMAND | FLAG_PARAMETERS );
|
// item->SendStatus(FLAG_COMMAND | FLAG_PARAMETERS );
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case CMD_OFF:
|
case CMD_OFF:
|
||||||
cmd.param.asInt32=0;
|
cmd.param.asInt32=0;
|
||||||
PixelCtrl(cmd, subItem, true);
|
PixelCtrl(cmd, subItem, true,authorized);
|
||||||
// item->SendStatus(FLAG_COMMAND);
|
// item->SendStatus(FLAG_COMMAND);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public:
|
|||||||
};
|
};
|
||||||
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized=false) override;
|
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized=false) override;
|
||||||
int getDefaultStorageType()override;
|
int getDefaultStorageType()override;
|
||||||
virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) =0;
|
virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true, bool authorized = false ) =0;
|
||||||
short getChannelAddr(short n =0);
|
short getChannelAddr(short n =0);
|
||||||
// int isActive() override;
|
// int isActive() override;
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -598,14 +598,12 @@ if (suffixCode == S_RAW)
|
|||||||
ic.setSuffix(suffixCode);
|
ic.setSuffix(suffixCode);
|
||||||
return Ctrl(ic,subItem);
|
return Ctrl(ic,subItem);
|
||||||
}
|
}
|
||||||
//debugSerial<<F("SuffixCode: ")<<suffixCode<<endl;
|
|
||||||
|
|
||||||
bool authorized = false;
|
bool authorized = false;
|
||||||
char * authPos = strchr(payload,'@');
|
char * authPos = strchr(payload,'@');
|
||||||
if (authPos)
|
if (authPos)
|
||||||
{
|
{
|
||||||
*authPos=0;
|
*authPos=0;
|
||||||
//char * authToken=payload;
|
|
||||||
authorized = checkToken(payload,authPos+1);
|
authorized = checkToken(payload,authPos+1);
|
||||||
payload=authPos+1;
|
payload=authPos+1;
|
||||||
}
|
}
|
||||||
@@ -614,7 +612,6 @@ int i=0;
|
|||||||
while (payload[i]) {payload[i]=toupper(payload[i]);i++;};
|
while (payload[i]) {payload[i]=toupper(payload[i]);i++;};
|
||||||
|
|
||||||
int cmd = txt2cmd(payload);
|
int cmd = txt2cmd(payload);
|
||||||
//debugSerial<<F("Txt2Cmd:")<<cmd<<endl;
|
|
||||||
|
|
||||||
itemCmd st(ST_VOID,cmd);
|
itemCmd st(ST_VOID,cmd);
|
||||||
|
|
||||||
@@ -770,30 +767,50 @@ aJsonObject *timestampObj = aJson.getArrayItem(itemArr, I_TIMESTAMP);
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item::scheduleOppositeCommand(itemCmd cmd,bool authorized)
|
int Item::scheduleOppositeCommand(itemCmd cmd,bool isActiveNow,bool authorized)
|
||||||
{
|
{
|
||||||
itemCmd nextCmd=cmd;
|
itemCmd nextCmd=cmd;
|
||||||
|
|
||||||
switch (cmd.getCmd()){
|
switch (cmd.getCmd()){
|
||||||
case CMD_XON: nextCmd.Cmd(CMD_XOFF);
|
case CMD_XON:
|
||||||
|
if (isActiveNow && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_XOFF);
|
||||||
break;
|
break;
|
||||||
case CMD_XOFF: nextCmd.Cmd(CMD_XON);
|
case CMD_XOFF:
|
||||||
|
if (!isActiveNow && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_XON);
|
||||||
break;
|
break;
|
||||||
case CMD_ON: nextCmd.Cmd(CMD_OFF);
|
case CMD_ON:
|
||||||
|
if (isActiveNow && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_OFF);
|
||||||
break;
|
break;
|
||||||
case CMD_OFF: nextCmd.Cmd(CMD_ON);
|
case CMD_OFF:
|
||||||
|
if (!isActiveNow && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_ON);
|
||||||
break;
|
break;
|
||||||
case CMD_ENABLE: nextCmd.Cmd(CMD_DISABLE);
|
case CMD_ENABLE:
|
||||||
|
if (!getFlag(FLAG_DISABLED) && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_DISABLE);
|
||||||
break;
|
break;
|
||||||
case CMD_DISABLE: nextCmd.Cmd(CMD_ENABLE);
|
case CMD_DISABLE:
|
||||||
|
if (getFlag(FLAG_DISABLED) && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_ENABLE);
|
||||||
break;
|
break;
|
||||||
case CMD_FREEZE: nextCmd.Cmd(CMD_UNFREEZE);
|
case CMD_FREEZE:
|
||||||
|
if (getFlag(FLAG_FREEZED) && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_UNFREEZE);
|
||||||
break;
|
break;
|
||||||
case CMD_UNFREEZE: nextCmd.Cmd(CMD_FREEZE);
|
case CMD_UNFREEZE:
|
||||||
|
if (!getFlag(FLAG_FREEZED) && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_FREEZE);
|
||||||
break;
|
break;
|
||||||
case CMD_HALT: nextCmd.Cmd(CMD_RESTORE);
|
case CMD_HALT:
|
||||||
|
if (!isActiveNow && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_RESTORE);
|
||||||
break;
|
break;
|
||||||
case CMD_RESTORE: nextCmd.Cmd(CMD_HALT);
|
case CMD_RESTORE:
|
||||||
|
if (isActiveNow && !isScheduled()) return 0;
|
||||||
|
nextCmd.Cmd(CMD_HALT);
|
||||||
break;
|
break;
|
||||||
case CMD_TOGGLE: nextCmd.Cmd(CMD_TOGGLE);
|
case CMD_TOGGLE: nextCmd.Cmd(CMD_TOGGLE);
|
||||||
break;
|
break;
|
||||||
@@ -1033,6 +1050,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
}
|
}
|
||||||
if (itemType==CH_GROUP)
|
if (itemType==CH_GROUP)
|
||||||
{
|
{
|
||||||
|
bool scheduledOppositeCommand = false;
|
||||||
if (fr<350)
|
if (fr<350)
|
||||||
{
|
{
|
||||||
errorSerial<<F("CTRL: Not enough memory for group operation")<<endl;
|
errorSerial<<F("CTRL: Not enough memory for group operation")<<endl;
|
||||||
@@ -1042,16 +1060,23 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
{
|
{
|
||||||
chActive=(isActive()>0);
|
chActive=(isActive()>0);
|
||||||
digGroup(itemArg,&cmd,subItem,authorized);
|
digGroup(itemArg,&cmd,subItem,authorized);
|
||||||
}
|
|
||||||
res=1;
|
|
||||||
|
|
||||||
|
if ((suffixCode==S_CMD) && cmd.isValue())
|
||||||
|
{
|
||||||
|
scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
|
scheduledOppositeCommand = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res=1;
|
||||||
|
|
||||||
|
|
||||||
// Post-processing of group command - converting HALT,REST,XON,XOFF to conventional ON/OFF for status
|
// Post-processing of group command - converting HALT,REST,XON,XOFF to conventional ON/OFF for status
|
||||||
switch (cmd.getCmd()) {
|
switch (cmd.getCmd()) {
|
||||||
int t;
|
int t;
|
||||||
case CMD_RESTORE: // individual for group members
|
case CMD_RESTORE: // individual for group members
|
||||||
switch (t = getCmd()) {
|
switch (t = getCmd()) {
|
||||||
case CMD_HALT: //previous command was HALT ?
|
case CMD_HALT: //previous command was HALT ?
|
||||||
if ((suffixCode==S_CMD) && cmd.isValue() && (!chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
///if ((suffixCode==S_CMD) && cmd.isValue() && (!chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
||||||
debugSerial << F("CTRL: Restored from:") << t << endl;
|
debugSerial << F("CTRL: Restored from:") << t << endl;
|
||||||
cmd.loadItemDef(this);
|
cmd.loadItemDef(this);
|
||||||
cmd.Cmd(CMD_ON); //turning on
|
cmd.Cmd(CMD_ON); //turning on
|
||||||
@@ -1065,7 +1090,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
case CMD_XOFF: // individual for group members
|
case CMD_XOFF: // individual for group members
|
||||||
switch (t = getCmd()) {
|
switch (t = getCmd()) {
|
||||||
case CMD_XON: //previous command was CMD_XON ?
|
case CMD_XON: //previous command was CMD_XON ?
|
||||||
if ((suffixCode==S_CMD) && cmd.isValue() && (chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
///if ((suffixCode==S_CMD) && cmd.isValue() && (chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
||||||
debugSerial << F("CTRL: Turned off from:") << t << endl;
|
debugSerial << F("CTRL: Turned off from:") << t << endl;
|
||||||
cmd.Cmd(CMD_OFF); //turning Off
|
cmd.Cmd(CMD_OFF); //turning Off
|
||||||
status2Send |= FLAG_COMMAND | FLAG_SEND_IMMEDIATE;
|
status2Send |= FLAG_COMMAND | FLAG_SEND_IMMEDIATE;
|
||||||
@@ -1082,7 +1107,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
{
|
{
|
||||||
if (chActive == -1) chActive=(isActive()>0);
|
if (chActive == -1) chActive=(isActive()>0);
|
||||||
|
|
||||||
if ((suffixCode==S_CMD) && cmd.isValue() && (!chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
///if ((suffixCode==S_CMD) && cmd.isValue() && (!chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
||||||
|
|
||||||
|
|
||||||
if (!chActive) //if channel was'nt active before CMD_XON
|
if (!chActive) //if channel was'nt active before CMD_XON
|
||||||
@@ -1109,7 +1134,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
break;
|
break;
|
||||||
case CMD_HALT:
|
case CMD_HALT:
|
||||||
if (chActive == -1) chActive=(isActive()>0);
|
if (chActive == -1) chActive=(isActive()>0);
|
||||||
if ((suffixCode==S_CMD) && cmd.isValue() && (chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
///if ((suffixCode==S_CMD) && cmd.isValue() && (chActive || isScheduled())) scheduleOppositeCommand(cmd,authorized);
|
||||||
if (chActive) //if channel was active before CMD_HALT /// HERE bug - if cmd == On but 0 = active
|
if (chActive) //if channel was active before CMD_HALT /// HERE bug - if cmd == On but 0 = active
|
||||||
{
|
{
|
||||||
cmd.Cmd(CMD_OFF);
|
cmd.Cmd(CMD_OFF);
|
||||||
@@ -1126,7 +1151,12 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
|
|
||||||
status2Send |= FLAG_SEND_IMMEDIATE;
|
status2Send |= FLAG_SEND_IMMEDIATE;
|
||||||
if (cmd.isChannelCommand()) status2Send |= FLAG_COMMAND;
|
if (cmd.isChannelCommand()) status2Send |= FLAG_COMMAND;
|
||||||
if (cmd.isValue() || cmd.loadItem(this,FLAG_PARAMETERS)) status2Send |= FLAG_PARAMETERS; ;
|
if (cmd.isValue() || cmd.loadItem(this,FLAG_PARAMETERS)) status2Send |= FLAG_PARAMETERS;
|
||||||
|
|
||||||
|
if (scheduledOppositeCommand) status2Send &=~FLAG_PARAMETERS;
|
||||||
|
|
||||||
|
// UPDATE internal variables for GROUP
|
||||||
|
if (status2Send) cmd.saveItem(this,status2Send);
|
||||||
} // end GROUP
|
} // end GROUP
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -1156,7 +1186,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
///// return 0;
|
///// return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool oppositeCommandToBeSchedulled = (suffixCode==S_CMD) && allowRecursion && cmd.isValue();
|
||||||
// Commands for NON GROUP
|
// Commands for NON GROUP
|
||||||
//threating Restore, XOFF (special conditional commands)/ convert to ON, OFF and SET values
|
//threating Restore, XOFF (special conditional commands)/ convert to ON, OFF and SET values
|
||||||
switch (cmd.getCmd()) {
|
switch (cmd.getCmd()) {
|
||||||
@@ -1164,8 +1194,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
case CMD_RESTORE: // individual for group members
|
case CMD_RESTORE: // individual for group members
|
||||||
switch (t = getCmd()) {
|
switch (t = getCmd()) {
|
||||||
case CMD_HALT: //previous command was HALT ?
|
case CMD_HALT: //previous command was HALT ?
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (chActive || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
// if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
|
|
||||||
debugSerial << F("CTRL: Restored from:") << t << endl;
|
debugSerial << F("CTRL: Restored from:") << t << endl;
|
||||||
cmd.loadItemDef(this);
|
cmd.loadItemDef(this);
|
||||||
@@ -1182,8 +1212,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
case CMD_XOFF: // individual for group members
|
case CMD_XOFF: // individual for group members
|
||||||
switch (t = getCmd()) {
|
switch (t = getCmd()) {
|
||||||
case CMD_XON: //previous command was CMD_XON ?
|
case CMD_XON: //previous command was CMD_XON ?
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (chActive || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
debugSerial << F("CTRL: Turned off from:") << t << endl;
|
debugSerial << F("CTRL: Turned off from:") << t << endl;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
cmd.Cmd(CMD_OFF); //turning Off
|
cmd.Cmd(CMD_OFF); //turning Off
|
||||||
@@ -1199,8 +1229,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
case CMD_XON:
|
case CMD_XON:
|
||||||
if (!getFlag(FLAG_DISABLED))
|
if (!getFlag(FLAG_DISABLED))
|
||||||
{
|
{
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (!chActive || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
|
|
||||||
if (!chActive) //if channel was'nt active before CMD_XON
|
if (!chActive) //if channel was'nt active before CMD_XON
|
||||||
{
|
{
|
||||||
@@ -1226,8 +1256,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_HALT:
|
case CMD_HALT:
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (chActive || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
if (chActive) //if channel was active before CMD_HALT
|
if (chActive) //if channel was active before CMD_HALT
|
||||||
{
|
{
|
||||||
cmd.Cmd(CMD_OFF);
|
cmd.Cmd(CMD_OFF);
|
||||||
@@ -1251,16 +1281,16 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
|
|
||||||
if (getCmd() == CMD_HALT) return 3; //Halted, ignore OFF
|
if (getCmd() == CMD_HALT) return 3; //Halted, ignore OFF
|
||||||
|
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (chActive || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
status2Send |= FLAG_COMMAND | FLAG_SEND_IMMEDIATE;
|
status2Send |= FLAG_COMMAND | FLAG_SEND_IMMEDIATE;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ON:
|
case CMD_ON:
|
||||||
|
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (!chActive || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
|
|
||||||
if (!cmd.isChannelCommand()) //Command for driver, not for whole channel
|
if (!cmd.isChannelCommand()) //Command for driver, not for whole channel
|
||||||
{
|
{
|
||||||
@@ -1302,8 +1332,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
status2Send |= FLAG_FLAGS;
|
status2Send |= FLAG_FLAGS;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
||||||
if (allowRecursion && cmd.isValue() && (getFlag(FLAG_DISABLED) || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if (allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DISABLE:
|
case CMD_DISABLE:
|
||||||
@@ -1311,8 +1341,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
status2Send |= FLAG_FLAGS;
|
status2Send |= FLAG_FLAGS;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (!getFlag(FLAG_DISABLED) || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_UNFREEZE:
|
case CMD_UNFREEZE:
|
||||||
@@ -1320,8 +1350,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
status2Send = FLAG_FLAGS;
|
status2Send = FLAG_FLAGS;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (getFlag(FLAG_FREEZED) || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_FREEZE:
|
case CMD_FREEZE:
|
||||||
@@ -1330,8 +1360,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
command2Set = 0;
|
command2Set = 0;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
//debugSerial<<F("Disable Flag is:")<<getFlag(FLAG_DISABLED)<<endl;
|
||||||
if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue() && (!getFlag(FLAG_FREEZED) || isScheduled())) //invoked not as group part, delayed, non Active or re-schedule
|
//if ((suffixCode==S_CMD) && allowRecursion && cmd.isValue()) //invoked not as group part, delayed, non Active or re-schedule
|
||||||
scheduleOppositeCommand(cmd,authorized);
|
// scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1339,6 +1369,12 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion, bool authorized
|
|||||||
if (cmd.isValue()) status2Send |= FLAG_PARAMETERS;
|
if (cmd.isValue()) status2Send |= FLAG_PARAMETERS;
|
||||||
toExecute=true;
|
toExecute=true;
|
||||||
} //Switch commands
|
} //Switch commands
|
||||||
|
|
||||||
|
if (oppositeCommandToBeSchedulled) //invoked not as group part, delayed
|
||||||
|
{
|
||||||
|
scheduleOppositeCommand(cmd,chActive,authorized);
|
||||||
|
status2Send &=~FLAG_PARAMETERS;
|
||||||
|
}
|
||||||
} // NO GROUP
|
} // NO GROUP
|
||||||
if (invalidArgument) return -4;
|
if (invalidArgument) return -4;
|
||||||
|
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ class Item
|
|||||||
inline int Off(){return Ctrl(itemCmd(ST_VOID,CMD_OFF));};
|
inline int Off(){return Ctrl(itemCmd(ST_VOID,CMD_OFF));};
|
||||||
inline int Toggle(){return Ctrl(itemCmd(ST_VOID,CMD_TOGGLE));};
|
inline int Toggle(){return Ctrl(itemCmd(ST_VOID,CMD_TOGGLE));};
|
||||||
int scheduleCommand(itemCmd cmd, bool authorized);
|
int scheduleCommand(itemCmd cmd, bool authorized);
|
||||||
int scheduleOppositeCommand(itemCmd cmd,bool authorized);
|
int scheduleOppositeCommand(itemCmd cmd,bool isActiveNow,bool authorized);
|
||||||
int isScheduled();
|
int isScheduled();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -1439,6 +1439,9 @@ setupSyslog();
|
|||||||
if (cmd<1) it.setCmd(CMD_OFF);
|
if (cmd<1) it.setCmd(CMD_OFF);
|
||||||
it.setFlag(FLAG_COMMAND);
|
it.setFlag(FLAG_COMMAND);
|
||||||
if (it.itemVal) it.setFlag(FLAG_PARAMETERS);
|
if (it.itemVal) it.setFlag(FLAG_PARAMETERS);
|
||||||
|
|
||||||
|
if (isProtectedPin(pin)) {errorSerial<<F("pin protected: ")<<pin<<endl; break;}
|
||||||
|
|
||||||
pinMode(pin, OUTPUT);
|
pinMode(pin, OUTPUT);
|
||||||
digitalWrite(pin, false); //Initially, all thermostates are LOW (OFF for electho heaters, open for water NO)
|
digitalWrite(pin, false); //Initially, all thermostates are LOW (OFF for electho heaters, open for water NO)
|
||||||
debugSerial<<F("Thermo:")<<pin<<F("=LOW")<<F(";");
|
debugSerial<<F("Thermo:")<<pin<<F("=LOW")<<F(";");
|
||||||
@@ -1447,11 +1450,15 @@ setupSyslog();
|
|||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
pinMode(pin, OUTPUT);
|
pinMode(pin, OUTPUT);
|
||||||
if (inverse)
|
if (isProtectedPin(pin)) digitalWrite (pin,LOW);
|
||||||
digitalWrite(pin, k = ((cmd == CMD_ON) ? LOW : HIGH));
|
|
||||||
else
|
else
|
||||||
digitalWrite(pin, k = ((cmd == CMD_ON) ? HIGH : LOW));
|
{
|
||||||
debugSerial<<F("Pin:")<<pin<<F("=")<<k<<F(";");
|
if (inverse)
|
||||||
|
digitalWrite(pin, k = ((cmd == CMD_ON) ? LOW : HIGH));
|
||||||
|
else
|
||||||
|
digitalWrite(pin, k = ((cmd == CMD_ON) ? HIGH : LOW));
|
||||||
|
debugSerial<<F("Pin:")<<pin<<F("=")<<k<<F(";");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} //switch
|
} //switch
|
||||||
@@ -2922,6 +2929,7 @@ enum heaterMode {HEATER_HEAT,HEATER_OFF,HEATER_ERROR};
|
|||||||
void thermoRelay(int pin, heaterMode on)
|
void thermoRelay(int pin, heaterMode on)
|
||||||
{
|
{
|
||||||
int thermoPin = abs(pin);
|
int thermoPin = abs(pin);
|
||||||
|
if(isProtectedPin(thermoPin)) {errorSerial<<F("pin disabled ")<<thermoPin<<endl;return;}
|
||||||
pinMode(thermoPin, OUTPUT);
|
pinMode(thermoPin, OUTPUT);
|
||||||
|
|
||||||
if (on == HEATER_ERROR)
|
if (on == HEATER_ERROR)
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ int out_dmx::getChanType()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int out_dmx::PixelCtrl(itemCmd cmd, char* subItem, bool show)
|
int out_dmx::PixelCtrl(itemCmd cmd, char* subItem, bool show, bool authorized)
|
||||||
//int out_dmx::PixelCtrl(itemCmd cmd)
|
//int out_dmx::PixelCtrl(itemCmd cmd)
|
||||||
{
|
{
|
||||||
if (!item || !show) return 0;
|
if (!item || !show) return 0;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public:
|
|||||||
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;
|
||||||
virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true) override;
|
virtual int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true, bool authorized = false) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ int out_Motor::Setup()
|
|||||||
abstractOut::Setup();
|
abstractOut::Setup();
|
||||||
getConfig();
|
getConfig();
|
||||||
debugSerial.println("Motor: Init");
|
debugSerial.println("Motor: Init");
|
||||||
|
if (isProtectedPin(pinUp)||isProtectedPin(pinDown)) {errorSerial<<F("pin disabled")<<endl;return 0;}
|
||||||
pinMode(pinUp,OUTPUT);
|
pinMode(pinUp,OUTPUT);
|
||||||
pinMode(pinDown,OUTPUT);
|
pinMode(pinDown,OUTPUT);
|
||||||
|
|
||||||
@@ -71,11 +72,13 @@ return 1;
|
|||||||
int out_Motor::Stop()
|
int out_Motor::Stop()
|
||||||
{
|
{
|
||||||
debugSerial.println("Motor: De-Init");
|
debugSerial.println("Motor: De-Init");
|
||||||
|
item->setExt(0);
|
||||||
|
driverStatus = CST_UNKNOWN;
|
||||||
|
|
||||||
|
if (isProtectedPin(pinUp)||isProtectedPin(pinDown)) {errorSerial<<F("pin disabled")<<endl;return 0;}
|
||||||
digitalWrite(pinUp,INACTIVE);
|
digitalWrite(pinUp,INACTIVE);
|
||||||
digitalWrite(pinDown,INACTIVE);
|
digitalWrite(pinDown,INACTIVE);
|
||||||
|
|
||||||
item->setExt(0);
|
|
||||||
driverStatus = CST_UNKNOWN;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,6 +119,8 @@ if (!item->getFlag(FLAG_ACTION_IN_PROCESS))
|
|||||||
}
|
}
|
||||||
else return 0;
|
else return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isProtectedPin(pinUp)||isProtectedPin(pinDown)) {return 0;}
|
||||||
|
|
||||||
uint32_t motorOfftime = item->getExt();
|
uint32_t motorOfftime = item->getExt();
|
||||||
itemCmd st;
|
itemCmd st;
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ int out_pwm::getChanType()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int out_pwm::PixelCtrl(itemCmd cmd, char* subItem, bool show)
|
int out_pwm::PixelCtrl(itemCmd cmd, char* subItem, bool show, bool authorized)
|
||||||
{
|
{
|
||||||
if (!item || !iaddr || !show) return 0;
|
if (!item || !iaddr || !show) return 0;
|
||||||
|
|
||||||
@@ -132,7 +132,8 @@ switch (cmd.getCmd()){
|
|||||||
{
|
{
|
||||||
case CH_PWM:
|
case CH_PWM:
|
||||||
{ short k;
|
{ short k;
|
||||||
analogWrite(iaddr, k=cmd.getPercents255(inverse));
|
if (authorized || !isProtectedPin(iaddr))
|
||||||
|
analogWrite(iaddr, k=cmd.getPercents255(inverse));
|
||||||
debugSerial<<F("Pin:")<<iaddr<<F("=")<<k<<endl;
|
debugSerial<<F("Pin:")<<iaddr<<F("=")<<k<<endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -151,13 +152,20 @@ itemCmd st(storageType,CMD_VOID);
|
|||||||
st.assignFrom(cmd);
|
st.assignFrom(cmd);
|
||||||
|
|
||||||
switch (cType)
|
switch (cType)
|
||||||
{
|
{ short pin;
|
||||||
case CH_RGBW:
|
case CH_RGBW:
|
||||||
analogWrite(getChannelAddr(3), st.param.w);
|
pin=getChannelAddr(3);
|
||||||
|
if (authorized || !isProtectedPin(pin)) analogWrite(pin, st.param.w);
|
||||||
|
|
||||||
case CH_RGB:
|
case CH_RGB:
|
||||||
analogWrite(iaddr, st.param.r);
|
|
||||||
analogWrite(getChannelAddr(1), st.param.g);
|
if (authorized || !isProtectedPin(iaddr)) analogWrite(iaddr, st.param.r);
|
||||||
analogWrite(getChannelAddr(2), st.param.b);
|
|
||||||
|
pin=getChannelAddr(1);
|
||||||
|
if (authorized || !isProtectedPin(pin)) analogWrite(pin, st.param.g);
|
||||||
|
|
||||||
|
pin=getChannelAddr(2);
|
||||||
|
if (authorized || !isProtectedPin(pin)) analogWrite(pin, st.param.b);
|
||||||
break;
|
break;
|
||||||
default: ;
|
default: ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
|
|
||||||
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, bool authorized = false ) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
short numChannels;
|
short numChannels;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ int out_relay::Setup()
|
|||||||
abstractOut::Setup();
|
abstractOut::Setup();
|
||||||
|
|
||||||
debugSerial<<F("Relay-Out #")<<pin<<F(" init")<<endl;
|
debugSerial<<F("Relay-Out #")<<pin<<F(" init")<<endl;
|
||||||
|
if (isProtectedPin(pin)) {errorSerial<<F("pin disabled")<<endl;return 0;}
|
||||||
pinMode(pin, OUTPUT);
|
pinMode(pin, OUTPUT);
|
||||||
digitalWrite(pin,INACTIVE);
|
digitalWrite(pin,INACTIVE);
|
||||||
if (item) item->setExt(0);
|
if (item) item->setExt(0);
|
||||||
@@ -148,6 +148,9 @@ int out_relay::Ctrl(itemCmd cmd, char* subItem, bool toExecute,bool authorized)
|
|||||||
debugSerial<<F("relayCtr: ");
|
debugSerial<<F("relayCtr: ");
|
||||||
cmd.debugOut();
|
cmd.debugOut();
|
||||||
if ((subItem && !strcmp_P(subItem,action_P)) || !item) return 0;
|
if ((subItem && !strcmp_P(subItem,action_P)) || !item) return 0;
|
||||||
|
|
||||||
|
if (isProtectedPin(pin)) {return 0;}
|
||||||
|
|
||||||
int suffixCode;
|
int suffixCode;
|
||||||
if (cmd.isCommand()) suffixCode = S_CMD;
|
if (cmd.isCommand()) suffixCode = S_CMD;
|
||||||
else suffixCode = cmd.getSuffix();
|
else suffixCode = cmd.getSuffix();
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ int out_SPILed::getChanType()
|
|||||||
return CH_RGBW;
|
return CH_RGBW;
|
||||||
}
|
}
|
||||||
|
|
||||||
int out_SPILed::PixelCtrl(itemCmd cmd, char* subItem, bool show )
|
int out_SPILed::PixelCtrl(itemCmd cmd, char* subItem, bool show, bool authorized )
|
||||||
//int out_SPILed::PixelCtrl(itemCmd cmd, int from, int to, bool show)
|
//int out_SPILed::PixelCtrl(itemCmd cmd, int from, int to, bool show)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public:
|
|||||||
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;
|
||||||
int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true ) override;
|
int PixelCtrl(itemCmd cmd, char* subItem=NULL, bool show=true, bool authorized = false ) override;
|
||||||
//int PixelCtrl(itemCmd cmd, int from =0 , int to = 1024, bool show = 1) override;
|
//int PixelCtrl(itemCmd cmd, int from =0 , int to = 1024, bool show = 1) override;
|
||||||
int numLeds;
|
int numLeds;
|
||||||
int8_t pin;
|
int8_t pin;
|
||||||
|
|||||||
Reference in New Issue
Block a user