Example #1
0
/**
 * @brief Process events from sensor devices.
 *
 * TODO: make ready
 *
 * @param msgLong:  1 for a long key message
 * @param keyCount: the key counter. increments on each key release
 */
void cmMyBlind::trigger41(uint8_t msgLong, uint8_t keyCount, uint8_t msgVal) {
	uint8_t isLng = (msgLong & 0x40) ? 1 : 0;												// is it a long message?
	uint8_t ctTbl;

	// set short or long
	l3 = (isLng)?(s_l3*)&lstPeer+1 :(s_l3*)&lstPeer;										// set pointer to the right part of the list3, short or long

//	ctTbl = stateMachine_setNextState(curState);
	
	// X GE COND_VALUE_LO                         - geLo -  > low           - 0
	// X GE COND_VALUE_HI                         - geHi -  > high          - 1
	// X LT COND_VALUE_LO                         - ltLo -  < low           - 2
	// X LT COND_VALUE_HI                         - ltHi -  < high          - 3
	// COND_VALUE_LO LE X LT COND_VALUE_HIGH      - betW -  low <> high     - 4
	// X LT COND_VALUE_LO OR X GE COND_VALUE_HIGH - outS -  < low or > high - 5

	//dbg << "curState: " << curState  << ", isLng: " << isLng << ", val: " << msgVal  << ", cond: " << ctTbl << '\n';

	if ( ((ctTbl == AS_CM_JT_NONE) && (msgVal > l3->COND_VALUE_LO)) ||
	     ((ctTbl == AS_CM_JT_ONDELAY) && (msgVal > l3->COND_VALUE_HI)) ||
	     ((ctTbl == AS_CM_JT_RAMPON) and (msgVal < l3->COND_VALUE_LO)) ||
	     ((ctTbl == AS_CM_JT_ON) && (msgVal < l3->COND_VALUE_HI)) ||
	     ((ctTbl == AS_CM_JT_OFFDELAY) && (msgVal > l3->COND_VALUE_LO) && (msgVal < l3->COND_VALUE_HI)) ||
	     ((ctTbl == AS_CM_JT_RAMPOFF) && (msgVal < l3->COND_VALUE_LO) && (msgVal > l3->COND_VALUE_HI)) ) {

		trigger40(isLng, keyCount);
	}
}
Example #2
0
void Relay::hmEventCol(uint8_t by3, uint8_t by10, uint8_t by11, uint8_t *data, uint8_t len) {
	if  (by3 == 0x00)                    poll();
	if ((by3 == 0x01) && (by11 == 0x06)) configCngEvent();
	if ((by3 == 0x11) && (by10 == 0x02)) pairSetEvent(data, len);
	if ((by3 == 0x01) && (by11 == 0x0E)) pairStatusReq();
	if ((by3 == 0x01) && (by11 == 0x01)) peerAddEvent(data, len);
	if  (by3 >= 0x3E)                    peerMsgEvent(by3, data, len);

	if ((by3 == 0x11) && (by10 == 0x02)) trigger11(data[0], &data[1], &data[3]);	
	if  (by3 == 0x40)                    trigger40((by10 & 0x40), data[0]);
}
Example #3
0
/**
 * @brief We received a peer event.
 *       In type you will find the type of peer event.
 *          0x3E = switch
 *          0x40 = remote
 *          0x41 = sensor
 *
 *       Appropriate answer is an ACK
 */
void cmMyBlind::peerMsgEvent(uint8_t type, uint8_t *data, uint8_t len) {
	#ifdef CM_BLIND_DBG
		dbg << F("peer message type: ")  << _HEXB(type) << F(", data: ")  << _HEX(data, len) << '\n';
	#endif
	
	if ( (type == 0x40) || (type == 0x41) ) {
		if (type == 0x40) {
			trigger40( ((data[0] & 0x40) ? 1 : 0), data[1]);							// filter out the long message bit

		} else if (type == 0x41) {
			trigger41( (data[0] & 0x7F), data[1], data[2]);
		}

		stateToSend = AS_CM_STATETOSEND_ACK;										// ACK should be send
		//msgTmr.set(100);															// immediately

	} else {
		hm->sendACK();
	}
}