From 0044b741ac9f6fb8fc4b1ff8388e47c8bb8efd9b Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Wed, 8 Jan 2020 03:00:38 +0300 Subject: [PATCH] contact input: two-way long click INCREASE and DECREASE (%) commands for volume, hue, sat --- lighthub/inputs.cpp | 39 +++++++++++++++----- lighthub/inputs.h | 17 +++++---- lighthub/item.cpp | 88 +++++++++++++++++++++++++++++++++++++++++--- lighthub/item.h | 3 ++ lighthub/options.h | 2 + lighthub/textconst.h | 3 ++ 6 files changed, 129 insertions(+), 23 deletions(-) diff --git a/lighthub/inputs.cpp b/lighthub/inputs.cpp index 9bc4db5..e4ae9de 100644 --- a/lighthub/inputs.cpp +++ b/lighthub/inputs.cpp @@ -452,7 +452,7 @@ void Input::dht22Poll() { } #endif -bool Input::executeCommand(aJsonObject* cmd, char* defCmd) +bool Input::executeCommand(aJsonObject* cmd, int8_t toggle, char* defCmd) { if (!cmd) return false; @@ -465,7 +465,7 @@ bool Input::executeCommand(aJsonObject* cmd, char* defCmd) aJsonObject * command = cmd->child; while (command) { - executeCommand(command,defCmd); + executeCommand(command,toggle,defCmd); command = command->next; } } @@ -474,15 +474,19 @@ bool Input::executeCommand(aJsonObject* cmd, char* defCmd) { aJsonObject *item = aJson.getObjectItem(cmd, "item"); aJsonObject *icmd = aJson.getObjectItem(cmd, "icmd"); + aJsonObject *irev = aJson.getObjectItem(cmd, "irev"); aJsonObject *ecmd = aJson.getObjectItem(cmd, "ecmd"); + aJsonObject *erev = aJson.getObjectItem(cmd, "erev"); aJsonObject *emit = aJson.getObjectItem(cmd, "emit"); char * itemCommand; - if(icmd) itemCommand = icmd->valuestring; + if (irev && toggle) itemCommand = irev->valuestring; + else if(icmd) itemCommand = icmd->valuestring; else itemCommand = defCmd; char * emitCommand; - if(ecmd) emitCommand = ecmd->valuestring; + if (erev && toggle) itemCommand = erev->valuestring; + else if(ecmd) emitCommand = ecmd->valuestring; else emitCommand = defCmd; debugSerial << F("IN:") << (pin) << F(" : ") <delayedState) return false; //State changing is postponed already (( giving up aJsonObject *cmd = NULL; +int8_t toggle=0; switch (newState) { @@ -554,12 +559,15 @@ aJsonObject *cmd = NULL; { case IS_RELEASED: //click cmd = aJson.getObjectItem(inputObj, "click"); + toggle=store->toggle1; break; case IS_RELEASED2: //doubleclick cmd = aJson.getObjectItem(inputObj, "dclick"); + toggle=store->toggle2; break; case IS_PRESSED3: //tripple click cmd = aJson.getObjectItem(inputObj, "tclick"); + toggle=store->toggle3; break; case IS_WAITPRESS: //do nothing break; @@ -570,37 +578,50 @@ aJsonObject *cmd = NULL; break; case IS_PRESSED: //scmd cmd = aJson.getObjectItem(inputObj, "scmd"); + toggle=store->toggle1; + store->toggle1 = !store->toggle1; break; case IS_PRESSED2: //scmd2 cmd = aJson.getObjectItem(inputObj, "scmd2"); + toggle=store->toggle2; + store->toggle2 = !store->toggle2; break; case IS_PRESSED3: //scmd3 cmd = aJson.getObjectItem(inputObj, "scmd3"); + toggle=store->toggle3; + store->toggle3 = !store->toggle3; break; case IS_RELEASED: //rcmd case IS_WAITPRESS: case IS_RELEASED2: cmd = aJson.getObjectItem(inputObj, "rcmd"); + // toggle=state->toggle1; break; case IS_LONG: //lcmd cmd = aJson.getObjectItem(inputObj, "lcmd"); + toggle=store->toggle1; break; case IS_REPEAT: //rpcmd cmd = aJson.getObjectItem(inputObj, "rpcmd"); + toggle=store->toggle1; break; case IS_LONG2: //lcmd2 cmd = aJson.getObjectItem(inputObj, "lcmd2"); + toggle=store->toggle2; break; case IS_REPEAT2: //rpcmd2 cmd = aJson.getObjectItem(inputObj, "rpcmd2"); + toggle=store->toggle2; break; case IS_LONG3: //lcmd3 cmd = aJson.getObjectItem(inputObj, "lcmd3"); + toggle=store->toggle3; break; case IS_REPEAT3: //rpcmd3 cmd = aJson.getObjectItem(inputObj, "rpcmd3"); + toggle=store->toggle3; break; } @@ -611,9 +632,9 @@ aJsonObject *cmd = NULL; } if (cause != CHECK_INTERRUPT) { - executeCommand(cmd); - //Executed store->state=newState; + executeCommand(cmd,toggle); + //Executed store->delayedState=false; return true; } @@ -721,9 +742,9 @@ switch (store->state) //Timer based transitions if (inType & IN_PUSH_TOGGLE) { //To refactore if (currentInputState) { //react on leading edge only (change from 0 to 1) - store->logicState = !store->logicState; + //store->logicState = !store->logicState; store->lastValue = currentInputState; - onContactChanged(store->logicState); + onContactChanged(store->toggle1); } } else @@ -774,7 +795,7 @@ switch (store->state) //Timer based transitions break; } if (res) { //State changed or postponed - store->logicState = currentInputState; + // store->logicState = currentInputState; store->lastValue = currentInputState; } } diff --git a/lighthub/inputs.h b/lighthub/inputs.h index 22005ce..a6c477e 100644 --- a/lighthub/inputs.h +++ b/lighthub/inputs.h @@ -56,10 +56,10 @@ e-mail anklimov@gmail.com #define ANALOG_STATE_ATTEMPTS 6 #define ANALOG_NOIZE 1 -#define CHECK_INPUT 1 -#define CHECK_SENSOR 2 +#define CHECK_SENSOR 1 +#define CHECK_INPUT 2 #define CHECK_INTERRUPT 3 -#define CHECK_DELAYED 4 + #define T_LONG 1000 #define T_IDLE 600 @@ -107,16 +107,17 @@ typedef union { // Analog input structure struct { uint8_t reserved; - uint8_t reserved2; + uint8_t logicState; int16_t currentValue; }; // Digital input structure struct { - uint8_t reserved3:1; + uint8_t toggle1:1; + uint8_t toggle2:1; + uint8_t toggle3:1; uint8_t lastValue:1; - uint8_t logicState:1; uint8_t delayedState:1; - uint8_t bounce:4; + uint8_t bounce:3; uint8_t state:4; uint8_t reqState:4; uint16_t timestamp16; @@ -179,5 +180,5 @@ protected: char* getIdxField(); bool changeState(uint8_t newState, short cause); - bool executeCommand(aJsonObject* cmd, char* defCmd = NULL); + bool executeCommand(aJsonObject* cmd, int8_t toggle = -1, char* defCmd = NULL); }; diff --git a/lighthub/item.cpp b/lighthub/item.cpp index 29ed8e0..c9cd10a 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -57,6 +57,7 @@ int txt2cmd(char *payload) { // Check for command if (*payload == '-' || (*payload >= '0' && *payload <= '9')) cmd = CMD_NUM; + else if (*payload == '%') cmd = CMD_UP; else if (strcmp_P(payload, ON_P) == 0) cmd = CMD_ON; else if (strcmp_P(payload, OFF_P) == 0) cmd = CMD_OFF; else if (strcmp_P(payload, REST_P) == 0) cmd = CMD_RESTORE; @@ -96,6 +97,8 @@ int txt2subItem(char *payload) { else if (strcmp_P(payload, HSV_P) == 0) cmd = S_HSV; else if (strcmp_P(payload, RGB_P) == 0) cmd = S_RGB; else if (strcmp_P(payload, FAN_P) == 0) cmd = S_FAN; + else if (strcmp_P(payload, HUE_P) == 0) cmd = S_HUE; + else if (strcmp_P(payload, SAT_P) == 0) cmd = S_SAT; /* UnUsed now else if (strcmp_P(payload, SETPOINT_P) == 0) cmd = S_SETPOINT; else if (strcmp_P(payload, TEMP_P) == 0) cmd = S_TEMP; @@ -423,9 +426,13 @@ debugSerial<Ctrl(CMD_ON, n, Parameters, send, suffixCode, subItem); + res = driver->Ctrl(CMD_ON, n, Par, send, suffixCode, subItem); setCmd(CMD_XON); } else @@ -566,7 +638,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode case CMD_HALT: if (chActive>0) //if channel was active before CMD_HALT { - res = driver->Ctrl(CMD_OFF, n, Parameters, send, suffixCode, subItem); + res = driver->Ctrl(CMD_OFF, n, Par, send, suffixCode, subItem); setCmd(CMD_HALT); return res; } @@ -579,7 +651,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode case CMD_OFF: if (getCmd() != CMD_HALT) //Halted, ignore OFF { - res = driver->Ctrl(cmd, n, Parameters, send, suffixCode, subItem); + res = driver->Ctrl(cmd, n, Par, send, suffixCode, subItem); setCmd(CMD_OFF); } else @@ -594,7 +666,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode break; */ default: - res = driver->Ctrl(cmd, n, Parameters, send, suffixCode, subItem); + res = driver->Ctrl(cmd, n, Par, send, suffixCode, subItem); if (cmd) setCmd(cmd); } return res; @@ -1759,6 +1831,10 @@ int Item::SendStatus(int sendFlags) { } } - +int Item::getChanType() +{ +if (driver) return driver->getChanType(); +return itemType; +} ///////////////////////////////////////// diff --git a/lighthub/item.h b/lighthub/item.h index 22d43fd..1ea1f00 100644 --- a/lighthub/item.h +++ b/lighthub/item.h @@ -33,6 +33,8 @@ e-mail anklimov@gmail.com #define S_RGB 4 #define S_FAN 5 #define S_MODE 6 +#define S_HUE 7 +#define S_SAT 8 #define S_ADDITIONAL 64 /* @@ -190,6 +192,7 @@ class Item int Poll(short cause); int SendStatus(int sendFlags); int isActive(); + int getChanType(); protected: //short cmd2changeActivity(int lastActivity, short defaultCmd = CMD_SET); int VacomSetFan (int8_t val, int8_t cmd=0); diff --git a/lighthub/options.h b/lighthub/options.h index f58996a..21fcfaa 100644 --- a/lighthub/options.h +++ b/lighthub/options.h @@ -134,6 +134,8 @@ #define LAN_INIT_DELAY 500 #endif +#define DEFAULT_INC_STEP 5 + #if defined(ARDUINO_ARCH_AVR) //All options available #ifdef CONTROLLINO diff --git a/lighthub/textconst.h b/lighthub/textconst.h index b8d71c6..681700a 100644 --- a/lighthub/textconst.h +++ b/lighthub/textconst.h @@ -67,6 +67,8 @@ const char SET_P[] PROGMEM = "set"; const char CMD_P[] PROGMEM = "cmd"; const char MODE_P[] PROGMEM = "mode"; const char FAN_P[] PROGMEM = "fan"; +const char HUE_P[] PROGMEM = "hue"; +const char SAT_P[] PROGMEM = "sat"; /* const char TEMP_P[] PROGMEM = "temp"; const char SETPOINT_P[] PROGMEM = "setpoint"; @@ -76,6 +78,7 @@ const char HEAT_P[] PROGMEM = "heat"; */ const char HSV_P[] PROGMEM = "HSV"; const char RGB_P[] PROGMEM = "RGB"; + /* const char RPM_P[] PROGMEM = "rpm"; const char STATE_P[] PROGMEM = "state";