Hi! I am working on an experiment where one telosb acts as a sink and others
act as sensor nodes. The sink broadcasts commands to all sensor nodes and
after a random delay according to each sensor's id, they send data to sink.
However, it seems that the sink can only receive the first packet during
each interval. I don't know why. Please help me. Thank you!

Codes in sink:

#include "Timer.h"
#include "TestSerial.h"

module TestSerialC {
  uses {
    interface SplitControl as Control;
    interface Leds;
    interface Boot;
    interface Receive;
    interface AMSend as RadioSend;
    interface AMSend;
    interface Timer<TMilli> as MilliTimer;
    interface Packet;
    interface Packet as RadioPacket;
    interface SplitControl as RadioControl;
  }
}
implementation {

  message_t packet;

  bool locked = FALSE;
  bool radioLock = FALSE;
  bool recieveLock = FALSE;
  uint16_t counter = 0;
  uint8_t ledCnt1 = 0;
  uint8_t ledCnt2 = 0;
  uint8_t cmdCnt = 0;

  event void Boot.booted() {
    call Control.start();
    call RadioControl.start();
  }

  event void RadioControl.startDone(error_t err) {
    if (err == SUCCESS) {
      //call MilliTimer.startPeriodic(1000);
    }
  }
  event void RadioControl.stopDone(error_t err) {}

  event void MilliTimer.fired() {
    if (radioLock) {
      return;
    }
    else {
      commandPkt * cPkt = (commandPkt*)call RadioPacket.getPayload(&packet,
sizeof(commandPkt));
      if (cPkt == NULL) {return;}
      if (call RadioPacket.maxPayloadLength() < sizeof(commandPkt)) {
        return;
      }
      ++cmdCnt;
      if(cmdCnt % 2)
        call Leds.led1On();
      else
        call Leds.led1Off();

      cPkt->code = STARTSAMPLE;
      if(call RadioSend.send(AM_BROADCAST_ADDR, &packet, sizeof(commandPkt))
== SUCCESS){
        radioLock = TRUE;
      }
      /*if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(commandPkt))
== SUCCESS) {
        locked = TRUE;
      }*/
    }
  }

  event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t
len) {
    ++ledCnt1;
    if(ledCnt1 % 2)
      call Leds.led0On();
    else
      call Leds.led0Off();
    if (len != sizeof(radio_sense_msg_t)) {return bufPtr;}
    else {
      if(locked){
        return bufPtr;
      }
      else{
        radio_sense_msg_t* rsm = (radio_sense_msg_t*)payload;
        test_serial_msg_t * pkt = (test_serial_msg_t*)call
Packet.getPayload(&packet, sizeof(test_serial_msg_t));
        if(pkt == NULL) return bufPtr;
        if(call Packet.maxPayloadLength() < sizeof(test_serial_msg_t)){
          return bufPtr;
        }
        pkt->id = rsm->id;
        pkt->data = rsm->data;
        if(call AMSend.send(AM_BROADCAST_ADDR, &packet,
sizeof(test_serial_msg_t)) == SUCCESS){
          locked = TRUE;
        }

      }
    }


    return bufPtr;

  }

  event void AMSend.sendDone(message_t* bufPtr, error_t error) {
    if (&packet == bufPtr) {
      locked = FALSE;
      ++ledCnt2;
        if(ledCnt2 % 2)
          call Leds.led2On();
        else
          call Leds.led2Off();
    }
  }

  event void Control.startDone(error_t err) {
    if (err == SUCCESS) {
      call MilliTimer.startPeriodic(4000);
    }
  }
  event void Control.stopDone(error_t err) {}

  event void RadioSend.sendDone(message_t* bufPtr, error_t error){
    if(&packet == bufPtr){
      radioLock = FALSE;
    }
  }
}
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to