diff --git a/lighthub/inputs.cpp b/lighthub/inputs.cpp index e4ae9de..e289463 100644 --- a/lighthub/inputs.cpp +++ b/lighthub/inputs.cpp @@ -551,7 +551,7 @@ else if (store->delayedState) aJsonObject *cmd = NULL; int8_t toggle=0; - +if (newState!=store->state) debugSerial<state<") <toggle2; break; case IS_REPEAT2: //rpcmd2 - cmd = aJson.getObjectItem(inputObj, "rpcmd2"); + cmd = aJson.getObjectItem(inputObj, "rpcmd2"); toggle=store->toggle2; break; case IS_LONG3: //lcmd3 @@ -634,7 +634,7 @@ int8_t toggle=0; { store->state=newState; executeCommand(cmd,toggle); - //Executed + //Executed store->delayedState=false; return true; } @@ -758,11 +758,13 @@ switch (store->state) //Timer based transitions { case IS_IDLE: res = changeState(IS_PRESSED, cause); + if (!aJson.getObjectItem(inputObj, "lcmd") && !aJson.getObjectItem(inputObj, "rpcmd")) changeState(IS_WAITRELEASE, cause); break; case IS_RELEASED: case IS_WAITPRESS: res = changeState(IS_PRESSED2, cause); + if (!aJson.getObjectItem(inputObj, "lcmd2") && !aJson.getObjectItem(inputObj, "rpcmd2")) changeState(IS_WAITRELEASE, cause); break; case IS_RELEASED2: @@ -774,6 +776,7 @@ switch (store->state) //Timer based transitions switch (store->state) //Button released state transitions { case IS_PRESSED: + case IS_WAITRELEASE: res = changeState(IS_RELEASED, cause); break; diff --git a/lighthub/inputs.h b/lighthub/inputs.h index 3aa3e5e..4edc03f 100644 --- a/lighthub/inputs.h +++ b/lighthub/inputs.h @@ -48,6 +48,7 @@ e-mail anklimov@gmail.com #define IS_PRESSED3 10u #define IS_LONG3 11u #define IS_REPEAT3 12u +#define IS_WAITRELEASE 13u #define IS_REQSTATE 0xFF @@ -62,7 +63,7 @@ e-mail anklimov@gmail.com #define T_LONG 1000 -#define T_IDLE 700 +#define T_IDLE 600 #define T_RPT 300 #define T_RPT_PULSE 150 diff --git a/lighthub/item.cpp b/lighthub/item.cpp index a6b209c..cbb8200 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -520,6 +520,29 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode CHstore st; switch (cmd) { int t; + case CMD_ON: + if (getChanType()==CH_RGBW && getCmd() == CMD_ON && send && (chActive>0)) { + debugSerial<0) cmd = CMD_OFF; else cmd = CMD_ON; @@ -618,21 +641,28 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode break; case CMD_NUM: if (itemType == CH_GROUP || n!=1) break; - st.aslong = getVal(); - switch (suffixCode) - { - case S_SAT: - Par[1] = Par[0]; - Par[0] = st.h; - Par[2] = st.v; - n=3; - break; - case S_HUE: - Par[1] = st.s; - Par[2] = st.v; - n=3; - } + int cType=getChanType(); + if ( cType == CH_RGB || cType == CH_RGBW) + { + st.aslong = getVal(); + switch (suffixCode) + { + case S_SAT: + Par[1] = Par[0]; + Par[0] = st.h; + Par[2] = st.v; + n=3; + break; + + case S_HUE: + Par[1] = st.s; + Par[2] = st.v; + n=3; + } + } + else // Non-color channel + if (suffixCode == S_SAT || suffixCode == S_HUE) return -3; } @@ -697,6 +727,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode case 0: // No command - set params if (!suffixCode) toExecute= true; + if (suffixCode == S_HUE || suffixCode == S_SAT) break; switch (itemType) { case CH_RGBW: //only if configured VAL array @@ -733,10 +764,15 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode if (!suffixCode) { // if (chActive>0 && !st.v) setCmd(CMD_OFF); - if (chActive==0 && st.v) setCmd(CMD_ON); + else if (chActive==0 && st.v) setCmd(CMD_ON); + else setCmd(0); SendStatus(SEND_COMMAND | SEND_PARAMETERS | SEND_DEFFERED); } - else SendStatus(SEND_PARAMETERS | SEND_DEFFERED); + else + { + setCmd(0); + SendStatus(SEND_PARAMETERS | SEND_DEFFERED); + } break; case CH_PWM: case CH_VC: @@ -773,25 +809,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode debugSerial<0)/*&& getEnableCMD(500) */) { - debugSerial<