Beispiel #1
0
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);

}
Beispiel #2
0
/**
 * @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;
	}
}