cancel
Showing results for 
Search instead for 
Did you mean: 

Router having trouble handling frames

LVolp.2
Associate II

Hello, 

I have an OpenThread network with two devices : one end device (STM32WB5MMG) and one router (NUCLEO WB55) 

I acquire data with the end device and I try to send 180 000 samples (uint16) to the router 

When I try to send, it seems that the router does not handle the data received 

Here is the pseudo code sending data for the end device : 

 

 

 

 

 

 

typedef struct __attribute__((packed))
{
	FrameHeader header;

	uint16_t cdf_id;
	uint8_t measure_type;
	uint16_t sdf_id;
	uint16_t total_frame_id;
	int8_t data[MAXSDFDATA];
} FrameSDF;

void Acquire(uint8_t ffreq_select, uint32_t samples_to_send) {

	//Init
	...

	//declaration
	uint32_t samples_sent = 0;
	uint16_t sample_counter = 0;
	uint16_t frame_amount = 0;

	sampleRes_select = 60000;
	samples_to_send = sampleRes_select * 2 * 3;
	frame_amount = ceil((float32_t) samples_to_send / (float32_t) MAXSDFDATA);

	uint16_t adddressDBG = 0, trial_address = 0;
	int16_t acceleration[3];

	do {
		adddressDBG = Get_I2C_Address(&hi2c1);
		trial_address++;
	} while (adddressDBG != KX_I2C_ADDRESS && trial_address < 3);

	FrameADF adf;

	if (adddressDBG == KX_I2C_ADDRESS) {
		FrameSDF sdf;
		BuildFrame(SDF_SEN, (uint8_t*) &sdf);
		sdf.total_frame_id = frame_amount;
		HAL_Delay(500);
		sdf.sdf_id = 0x0000;
		for (int i = 0; i < frame_amount; i++) {
			APP_DBG("Frame %d #%d/%d",sdf.sdf_id, i,frame_amount);
			APP_DBG("***************************");

			int16_t *dataPtr = sdf.data;

			if (i == frame_amount - 1) {
				sample_counter = samples_to_send - (i * MAXSDFDATA);
			} else {
				sample_counter = MAXSDFDATA;
			}

			for (int j = 0; j < sample_counter / 3; j++) { //sample_counter / 3 because 3 values acquired at once
				//APP_DBG("Samples #%d", j);

				//Acquisitions 
                                ...

			}
			SHCI_C2_RADIO_AllowLowPower(THREAD_IP, FALSE);
			APP_THREAD_SDFSend(&sdf, sizeof(FrameSDF));
			UTIL_SEQ_WaitEvt(EVENT_ACK_SDF);
			HW_TS_Start(timeOutTimerID, (uint32_t) 100);
			UTIL_SEQ_WaitEvt(EVENT_TIMER);
			sdf.sdf_id++;
			samples_sent += sample_counter;
		}
		sdf.sdf_id = 0x0000; // Reset SDFID because everything was sent.
		BuildFrame(ADF_SEN, (uint8_t*) &adf);
		adf.error_code = appError;
		APP_DBG("****** AppError Value %u ******", adf.error_code);
		APP_THREAD_ADFSend(&adf);
		UTIL_SEQ_WaitEvt(EVENT_ACK_ADF);
		SHCI_C2_RADIO_AllowLowPower(THREAD_IP, TRUE);
		UTIL_SEQ_SetEvt(EVENT_SNDCMPLT);

		HAL_GPIO_WritePin(VCC_KX_GPIO_Port, VCC_KX_Pin, GPIO_PIN_RESET);
		otLinkSetPollPeriod(NULL, 500);
		UTIL_LPM_SetStopMode(1 << CFG_LPM_APP, UTIL_LPM_ENABLE);
		FeedWDT();
		UpdateState(AppState, APP_STATE_SLEEP);

	} else {
		APP_DBG("Wrong address ERROR");
		appError = 0xFF;
		BuildFrame(ADF_SEN, (uint8_t*) &adf);
		adf.error_code = appError;
		APP_THREAD_ADFSend(&adf);
		UTIL_SEQ_WaitEvt(EVENT_ACK_ADF);
		UpdateState(AppState, APP_STATE_SLEEP);

	}
}

 

 

 

 

 

 

 

Here is the code of the function handling SDF for the router : 

 

 

 

 

 

 

static void APP_THREAD_SDFRespHandler(void *pContext, otMessage *pMessage,
		const otMessageInfo *pMessageInfo)

{
	//TODO Manage SDF response.
	APP_DBG("********* SDF Req Handler *********");

	uint16_t payloadOffset = otMessageGetOffset(pMessage);
	uint16_t payloadLength = otMessageGetLength(pMessage) - payloadOffset;

	otMessageRead(pMessage, payloadOffset, PayloadRead, payloadLength);

	FrameSDF *sdf=(FrameSDF*)&PayloadRead[0];
	APP_DBG("sdf_id %d",sdf->sdf_id);
	APP_DBG("sdf_meas %d",sdf->measure_type);
	free(sdf);

	/* If Message is Confirmable, send response */
	if (otCoapMessageGetType(pMessage) == OT_COAP_TYPE_CONFIRMABLE) {
		//TODO Send Response
		APP_THREAD_CoapSendDataResponse(pMessage, pMessageInfo);
	}

}

 

 

 

 

 

 

Here are the logs of both devices (end device on the left / router on the right) : 

LVolp2_0-1689086927093.png

As you can see, the router is blocked and the end device continues to send data  
The error occurring for the end device (err code = 2) is a message drop 
I progressively remarked latency for the end device while sending

Do you what could prevent the router to receive data ? 
Do you know why the router stays blocked ? 

PS : acquisition part and frame allocation was checked and does not seem to be problematic 
These two devices are the only devices of the network

0 REPLIES 0