I want my multihopOscilloscope to send data through radio and Serial port as well

103 Views Asked by At

I am trying to modify the multihop Oscilloscope program so that the sink node is able to send data both to UART and radio medium as well. As far as researched, I found out that the same hardware is used for sending packets via UART and radio too. In this case, how do I modify my code so that I can send data to UART or radio based on a condition I receive. Here in the sample prorgram, I send data via radio on every 10 packets received.

The receive module for my sink node is:

event message_t*  Receive.receive(message_t* msg, void *payload, uint8_t len) {
oscilloscope_t* in = (oscilloscope_t*)payload;
  counter++;
am_addr_t rec = call AMPacket.source(msg);

oscilloscope_t* out;
counter++;
    call Leds.led0On();
if (uartbusy == FALSE) {
  out = (oscilloscope_t*)call SerialSend.getPayload(&uartbuf, sizeof(oscilloscope_t));
  if (len != sizeof(oscilloscope_t) || out == NULL) {
return msg;
  }
  else {
memcpy(out, in, sizeof(oscilloscope_t));
  }
  uartlen = sizeof(oscilloscope_t);
  post uartSendTask();
} else {
  message_t *newmsg = call UARTMessagePool.get();
  if (newmsg == NULL) {
    report_problem();
    return msg;
  }

  //Serial port busy, so enqueue.
  out = (oscilloscope_t*)call SerialSend.getPayload(newmsg, sizeof(oscilloscope_t));
  if (out == NULL) {
return msg;
  }
  memcpy(out, in, sizeof(oscilloscope_t));

  if (call UARTQueue.enqueue(newmsg) != SUCCESS) {

    call UARTMessagePool.put(newmsg);
    fatal_problem();
    return msg;
  }
}
if(counter % 10 == 0){  
oscilloscope_t* btrpkt = (oscilloscope_t*)(call Packet.getPayload(&pkt, sizeof(oscilloscope_t)));
call Leds.led1On();
if (call AMSend.send(rec, &pkt, sizeof(oscilloscope_t)) == SUCCESS) {
call Leds.led0On();
    sendbusy = TRUE;
  }
}
return msg;

}

Once the data sends back to the node from where it received the packet , it is unable to process it through UART again. Could anyone help me how could I solve my problem?

1

There are 1 best solutions below

0
maral On

According to the question and comments:

  1. You must instantiate AMSenderC with the same id as for the receiver. In this case, AM_OSCILLOSCOPE if you want a message to be processed by the same code. Or another id plus a new implementation of the Receive interface.
  2. You missed putting payload into btrpkt.
  3. You must check for sendbusy - it is a bug if you try to use the radio stack when it is busy.