void Relay::poll(void) { // just polling, as the function name said if ((cbsTme != 0) && (millis() > cbsTme)) { // check if we have to send a status message hm->sendInfoActuatorStatus(regCnl, getRlyStat(), 0); // send status cbsTme = 0; // nothing to do any more } // relay timer functions if ((rlyTime == 0) || (rlyTime > millis())) return; // timer set to 0 or time for action not reached, leave rlyTime = 0; // freeze per default // set relay - {no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6} if (nxtStat == 3) { // set relay on adjRly(1); curStat = 3; // adjust relay, status will send from adjRly() } else if (nxtStat == 6) { // set relay off adjRly(0); curStat = 6; // adjust relay, status will send from adjRly() } // adjust nxtStat for trigger11 - {no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6} if (lastTrig == 11) { if (nxtStat == 1) { // dlyOn -> on nxtStat = 3; // next status is on rlyTime = millis() + intTimeCvt(rTime); // set respective timer } else if ((nxtStat == 3) && (dTime > 0)) { // on - > off nxtStat = 6; // next status is off rlyTime = millis() + intTimeCvt(dTime); // set the respective timer } } // adjust nxtStat for trigger40 - {no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6} if (lastTrig == 40) { if (nxtStat == 1) { nxtStat = 3; rlyTime = millis() + byteTimeCvt(OnDly); } else if ((nxtStat == 3) && (OnTime < 255)) { nxtStat = 4; if (OnTime) rlyTime = millis() + byteTimeCvt(OnTime); } else if (nxtStat == 4) { nxtStat = 6; rlyTime = millis() + byteTimeCvt(OffDly); } else if ((nxtStat == 6) && (OffTime < 255)) { nxtStat = 1; if (OffTime) rlyTime = millis() + byteTimeCvt(OffTime); } } //cbM(cnlAss, curStat, nxtStat); }
/** * @brief Here we process the state machine * * TODO: make ready */ void cmMyBlind::stateMachine_poll(uint8_t keyCode, uint8_t keyCount, uint8_t sensorValue) { curStateCount = (curStateCount < 255) ? curStateCount++ : 255; if (l3->ACTION_TYPE != AS_CM_ACTIONTYPE_JUMP_TO_TARGET) return; // only valid for jump table if (keyCode != AS_CM_KEYCODE_NONE) { l3 = (keyCode == AS_CM_KEYCODE_SHORT) ? ((s_l3*)&lstPeer + 1) : ((s_l3*)&lstPeer); // select short or long register values fKeyCount = keyCount; // remember message counter } if ( !delayTmr.done() && (keyCode == AS_CM_KEYCODE_NONE) ) { // check if something is to do return; // else, return } /** * Go ahead only if timer not running and no key was pressed */ if ( (curState == nxtState) && (keyCode == AS_CM_KEYCODE_NONE)) { // no status change expected return; } #ifdef CM_BLIND_DBG debugActionType(l3->ACTION_TYPE); dbg << F(", curState: "); debugState(curState); dbg << F(", nxtState: "); debugState(nxtState); dbg << '\n'; #endif curState = nxtState; // remember the current status curStateCount = 0; if (nxtState == AS_CM_JT_OFF) { #ifdef CM_BLIND_DBG dbg << F("OFF, TIME: ") << l3->OFF_TIME << '\n'; #endif nxtState = l3->JT_OFF; // get the next status from jump table if ( (l3->OFF_TIME) && (l3->OFF_TIME != 0xFF) ) { // check if there is something in the duration timer, set next status accordingly delayTmr.set(byteTimeCvt(l3->OFF_TIME)); // activate the timer and set next status } } else if (nxtState == AS_CM_JT_ONDELAY) { #ifdef CM_BLIND_DBG dbg << F("ONDELAY, TIME: ") << l3->ONDELAY_TIME << '\n'; #endif nxtState = l3->JT_ONDELAY; // get the next status from jump table if (l3->ONDELAY_TIME) { // check if there is something in the duration timer, set next status accordingly delayTmr.set(byteTimeCvt(l3->ONDELAY_TIME)); // activate the timer and set next status } } else if (nxtState == AS_CM_JT_REFON) { #ifdef CM_BLIND_DBG dbg << F("REFON\n"); #endif nxtState = l3->JT_REFON; // get next status from jump table // TODO: REFON-Running-Time } else if (nxtState == AS_CM_JT_RAMPON) { #ifdef CM_BLIND_DBG dbg << F("RAMPON\n"); #endif nxtState = l3->JT_RAMPON; // get next status from jump table^ adjTmr.set( // activate the timer for driving motor calcAdjTime(motorValue, AS_MODULE_MOTOR_DIRECTION_DOWN, modReferenceTimeTopBottom) ); adjTmrStatus = AS_MODULE_TIMER_ARMED; } else if (nxtState == AS_CM_JT_ON) { #ifdef CM_BLIND_DBG dbg << F("ON, TIME: ") << l3->ON_TIME << '\n'; #endif nxtState = l3->JT_ON; // get the next status from jump table if ( (l3->ON_TIME) && (l3->ON_TIME != 0xFF) ) { // check if there is something in the duration timer, set next status accordingly delayTmr.set(byteTimeCvt(l3->ON_TIME)); // activate the timer and set next status } } else if (nxtState == AS_CM_JT_OFFDELAY) { #ifdef CM_BLIND_DBG dbg << F("OFFDELAY, TIME: ") << l3->OFFDELAY_TIME << '\n'; #endif nxtState = l3->JT_OFFDELAY; // get jump table for next state if (l3->OFFDELAY_TIME) { // check if there is something in the duration timer, set next status accordingly delayTmr.set(byteTimeCvt(l3->OFFDELAY_TIME)); // activate the timer and set next status } } else if (nxtState == AS_CM_JT_REFOFF) { #ifdef CM_BLIND_DBG dbg << F("REFOFF"); #endif nxtState = l3->JT_REFOFF; // get jump table for next state } else if (nxtState == AS_CM_JT_RAMPOFF) { #ifdef CM_BLIND_DBG dbg << F("RAMPOFF\n"); #endif nxtState = l3->JT_RAMPOFF; // get jump table for next state adjTmr.set(modReferenceTimeBottomTop); // activate the timer for driving motor adjTmr.set( calcAdjTime(motorValue, AS_MODULE_MOTOR_DIRECTION_UP, modReferenceTimeBottomTop) ); adjTmrStatus = AS_MODULE_TIMER_ARMED; } }