Пример #1
0
//returns 0 for no payload or number of bytes written in the payload buffer
int BaseRFApplication::returnACKPayload(uint8_t src, uint8_t port, void* buf, uint8_t len, void* bufACK, size_t lenACK) {

	MW_LOG_DEBUG_TRACE(MW_LOG_BASERF) << PSTR("[ACK] Src=") << src << PSTR(", Len=") << len << endl;
	MW_LOG_ARRAY(MW_LOG_BASERF, PSTR("\t...L7 DATA RECV: "), buf, len);
	MW_LOG_DEBUG_TRACE(MW_LOG_BASERF) << endl << endl;

	setLastMessageValid(false);

	if ( src != BASERF_MESSAGE_PORT ) {
		return handleCustomReturnACKPayload(src, port, buf, len, bufACK, lenACK);
	} else {
		m_last_message.msg_header.src = src;
		m_last_message.msg_header.port = port;

		//3) parse the L7 payload structure (Seq, ID, Data)
		getMessageFromData(&m_last_message, len, (uint8_t*) buf);

		//3.1) update m_last_recv_request
		m_last_recv_request_time = RTT::millis();

		//3.2) update m_recv_request_count
		m_recv_request_count ++;

		if ( m_last_message.msg_header.cmd_id == BASERF_CMD_PROPERTY_GET || m_last_message.msg_header.cmd_id == BASERF_CMD_PROPERTY_SET ) {
			m_last_message_clusterID = m_last_message.data[0];
			m_last_message_endpointID = m_last_message.data[1];
			Endpoint* endpoint = m_device->getEndpoint(m_last_message_clusterID, m_last_message_endpointID);

			if ( endpoint != NULL ) {
				setLastMessageValid(true);//really needed?

				//4.b.1) if SET then continue
				Endpoint::endpoint_set_status_t status;
				Endpoint::endpoint_value_t value;
				value.len = m_last_message.msg_header.dataLen;
				value.pvalue = m_last_message.data;

				//6.b.1) SET: read data into empty endpoint_value_t, create empty endpoint_set_status_t and call setProperty
				endpoint->setProperty(&value, &status);

				//6.b.2) send back ACK(endpoint_set_status_t)
				return prepareACKPayload(&m_last_message, status.status, status.pvalue, status.len, &bufACK, lenACK);
			} else {
				return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_INVALID, NULL, 0, &bufACK, lenACK);
			}

#ifdef MW_SUPPORT_BASERF_SUPPORTED_META
		} else if ( m_last_message.msg_header.cmd_id == BASERF_CMD_META_ENDPOINT_GET ) {
			m_last_message_meta_flags = m_last_message.data[0];
			m_last_message_clusterID = m_last_message.data[1];
			m_last_message_endpointID = m_last_message.data[2];
			if ( m_device->getEndpoint(m_last_message_clusterID, m_last_message_endpointID) ) {
				setLastMessageValid(true);
				return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_PROCESSED, NULL, 0, &bufACK, lenACK);
			} else {
				return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_INVALID, NULL, 0, &bufACK, lenACK);
			}
		} else if ( m_last_message.msg_header.cmd_id == BASERF_CMD_META_CLUSTER_GET ) {
			m_last_message_meta_flags = m_last_message.data[0];
			m_last_message_clusterID = m_last_message.data[1];
			if ( m_device->getCluster(m_last_message_clusterID) ) {
				setLastMessageValid(true);
				return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_PROCESSED, NULL, 0, &bufACK, lenACK);
			} else {
				return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_INVALID, NULL, 0, &bufACK, lenACK);
			}
		} else if ( m_last_message.msg_header.cmd_id == BASERF_CMD_META_DEVICE_GET ) {
			m_last_message_meta_flags = m_last_message.data[0];
			setLastMessageValid(true);
			return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_PROCESSED, NULL, 0, &bufACK, lenACK);
#endif

		} else if ( m_last_message.msg_header.cmd_id == BASERF_CMD_ACK ) {
			//4.c.1) else return
			MW_LOG_DEBUG_TRACE(MW_LOG_BASERF) << PSTR("INVALID") << m_last_message.msg_header.cmd_id << endl;
			return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_INVALID, NULL, 0, &bufACK, lenACK);
		} else {
			//4.c.1) else return
			if ( handleCustomCommand(&m_last_message) == BASERF_CMD_ACK_STATUS_NOT_SUPPORTED ) {
				MW_LOG_DEBUG_TRACE(MW_LOG_BASERF) << PSTR("NOT_SUPPORTED: ") << m_last_message.msg_header.cmd_id << endl;
				return prepareACKPayload(&m_last_message, BASERF_CMD_ACK_STATUS_NOT_SUPPORTED, NULL, 0, &bufACK, lenACK);
			} else {//else no ACK
				return 0;
			}
		}
	}
}