Lab3 - recepción de paquetes con MsgReader

Lab3 - recepción de paquetes con MsgReader

de Pablo Mazzara Aguirrezabal -
Número de respuestas: 0

Estimados,

Para leer los mensajes tipo TestNetworkMsg con MsgReader hay que realizar algunos cambios en el programa de los motes.

La razón es que el ejemplo está pensado para enviar mensajes tipo CL_TEST = 0x55. El programa manda y recibe los mensajes, que son message_t, con ese tipo.

Si cambiamos ese tipo por AM_TESTNETWORKMSG = 0x05 en TestNetworkAppC, MsgReader leerá esos mensajes, porque son del tipo que él espera, pero el formato no es adecuado y los interprestará mal, ya que van con estructura message_t.

Para que pueda interpretarlos, en TestNetworkC, cuando se reciben los mensajes, hay que extraer el payload del mensaje que llega, formatearlo con el tipo TestNetworkMsg y copiarlo al payload del mensaje que se mandará por la UART.

Para esto hay hacer alguna magia con punteros. Se pueden usar dos punteros: 1) Puntero al payload del mensaje message_t recibido con formato TestNetworkMsg y 2) puntero a un payload de message_t que se mandará por la UART (message_t uartpacket) con el mismo formato y luego realizar una copia de lo que apunta el primero a lo que apunta el segundo puntero. Eso se hace en el evento de recepción:

  event message_t* Receive.receive(message_t* msg, void *payload, uint8_t len) {

// puntero con formato TestNetworkMsg  al payload del mensaje de entrada que llega por la radio como puntero a void:
    TestNetworkMsg* in = (TestNetworkMsg*)payload;

// puntero con el mismo formato al payload del mensaje message_t de salida por UART :
    TestNetworkMsg* out = (TestNetworkMsg*)call UARTSend.getPayload(&uartpacket, sizeof(TestNetworkMsg));

// copiar al payload de salida lo que venía en el payload de entrada:

memcpy(out, in, sizeof(TestNetworkMsg));

Ahora si envío lo que se encuentra en uartpacket por la UART, eso podrá ser interpretado correctamente por MsgReader:

call UARTSend.send(0xffff, &uartpacket, sizeof(TestNetworkMsg);

A todo esto se agrega la dificultad que se origina en el hecho de que la velocidad de los paquetes que llegan por la radio, por momentos, puede ser mayor a la velocidad a la que se pueden mandar por la UART. Para solucionar este problema el programa usa los componentes:

  components new QueueC(message_t*, 12);

  components new PoolC(message_t, 12);

Estos componentes se deben manejar adecuadamente, por ejemplo, guardar en la cola un mensaje que llega en el momento en que la UART se encuentra ocupada. Si bien es cierto que eso se halla implementado, hay que adaptarlo para que funcione con los cambios que hagamos.

Un ejemplo sobre todo esto se puede ver en apps/MultihopOscilloscope.

Saludos,

Pablo