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; }
// -------------------------------------------------------------------------- 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; }