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