uint8_t* findDataFrame(uint8_t* data, size_t size)
{
	for (auto i = 0u; i < size;++i)
	{
		if(data[i] == static_cast<uint8_t>(0xa5) && checkDataFrame(data + i))
		{
			return (data + i);
		}
	}
	return NULL;
}
Example #2
0
// --------------------------------------------------------------------------
static void fsm_recvblk_waitForData(fsm_recvblk_instance_t *instance)
{
	header_content_t hdr_content;
	nrf24com_frm_data *frame_data;
	nrf24com_frm_init *frame_init;
	UINT8 rx_pipe;

	UINT8 retry = 0;
	UINT8 data_len = (instance->remaining_len > DATAFRAME_PAYLOAD_SIZE)?(DATAFRAME_PAYLOAD_SIZE):(instance->remaining_len);

	do
	{
		if (NRF24_PAYLOAD_SIZE_MAX == nrf24Receive(instance->buffer, NRF24_PAYLOAD_SIZE_MAX, &rx_pipe, instance->timeout_ms))
		{
			// now we expect something in private pipe
			if (PRIVATE_PIPE == rx_pipe)
			{
				hdr_content = checkHeader((nrf24com_hdr_t*)instance->buffer, NRF24COM_FRM_DATA);
				if (CHECKHDR_OK == hdr_content)
				{
					frame_data = (nrf24com_frm_data*)instance->buffer;
					if (checkDataFrame(frame_data, instance->seq_id))
					{
						// copy data and update status for next data frame
						memcpy(instance->data + instance->data_pos, instance->buffer + sizeof(nrf24com_frm_data), data_len);
						instance->data_pos += data_len;
						instance->remaining_len -= data_len;
						instance->state = FSM_RECVBLK_SEND_DATAACK;
						return;
					}
					else
						break;
				}
			}
			// only init frame is interesting on network pipe
			else if (NET_PIPE == rx_pipe)
			{
				nrf24comm_debug("something in network pipe, send wait if init frame\n");
				hdr_content = checkHeader((nrf24com_hdr_t*)instance->buffer, NRF24COM_FRM_INIT);
				if (CHECKHDR_OK == hdr_content)
				{
					frame_init = (nrf24com_frm_init*)instance->buffer;
					if (checkInitFrame(frame_init))
					{
						nrf24comm_debug("sending wait\n");
						prepareInitAckFrame(instance->buffer, frame_init->src_node_id, NRF24COM_DST_STATE_WAIT);
						// set tx addr for network pipe and send initack with wait request to sender
						configureNetworkPipes(true);
						nrf24Send(instance->buffer, sizeof(nrf24com_frm_initack), false, true);
						// restore tx addr of private pipe
						configurePrivatePipes(current_node_id);
						continue;
					}
				}
				else
				{
					nrf24comm_debug("not init frame, discarding it\n");
				}
			}
		}
		++retry;
		nrf24comm_debug("retrying: %d/%d\n", retry, instance->retries);
	} while (retry < instance->retries);

	instance->state = FSM_SENDBLK_END;
}