Hi

I have a project:
1. a client sensor broadcast package
2. there are 5 rooms, each room has 2 sensors
3. the sensors receive package, embed the sensor Id
4. send the new package to server through multihop
5. server get the new package through Delta.

How should I change the following nc code to do it?

Code:
#include "CountMsg.h"
module RadioDemoM
{
  provides interface StdControl;
  uses interface Timer;
  uses interface Leds;
  uses interface SendMsg;
  uses interface ReceiveMsg;
  uses interface Button;
}
implementation
{
  uint16_t m_count;
  uint16_t m_lqi;
  uint16_t m_rssi;
  TOS_Msg m_msg;
  bool m_is_sending;
  uint16_t m_timeout;  
  uint16_t m_mode;
  enum {
    MODE_COUNT_RADIO,
    MODE_EXCHANGE_RSSI,
    MODE_EXCHANGE_LQI,
    PERIOD_COUNT_RADIO = 333,
    PERIOD_EXCHANGE_RSSI = 33,
    PERIOD_EXCHANGE_LQI = 33,
    TIMEOUT_EXCHANGE_RSSI = 100,
    TIMEOUT_EXCHANGE_LQI = 100,
  };
  command result_t StdControl.init()
  {
    m_count = 0;
    m_lqi = 0;
    m_timeout = 0;
    m_is_sending = FALSE;
    m_mode = MODE_COUNT_RADIO;
    return SUCCESS;
  }
  command result_t StdControl.start()
  {
    call Button.enable();
    m_mode = MODE_COUNT_RADIO;
    if( TOS_LOCAL_ADDRESS == 1 )
      call Timer.start( TIMER_REPEAT, PERIOD_COUNT_RADIO );
    return SUCCESS;
  }
  command result_t StdControl.stop()
  {
    call Timer.stop();
    return SUCCESS;
  }
  void sendCount( uint16_t count )
  {
    if( m_is_sending == FALSE )
    {
      CountMsg_t* body = (CountMsg_t*)m_msg.data;
      body->n = count;
      body->src = 10000 + m_mode;
      if( call SendMsg.send(TOS_BCAST_ADDR,sizeof(CountMsg_t),&m_msg) == SUCCESS )
      {
 m_is_sending = TRUE;
      }
    }
  }
  event result_t Timer.fired()
  {
    if( TOS_LOCAL_ADDRESS == 1 )
    {
      m_count++;
      switch( m_mode )
      {
 case MODE_COUNT_RADIO:
   call Leds.set( m_count );
   break;
 
 case MODE_EXCHANGE_RSSI:
 case MODE_EXCHANGE_LQI:
   if( m_timeout == 0 )
     call Leds.set(0);
   if( m_timeout > 0 )
     m_timeout--;
   break;
      }
      sendCount( m_count );
    }
    else
    {
      // timeout for address != 1
      call Leds.set(0);
    }
    return SUCCESS;
  }
  event result_t SendMsg.sendDone(TOS_MsgPtr msg, result_t result)
  {
    m_is_sending = FALSE;
    return SUCCESS;
  }
  task void processLQI()
  {
    uint16_t leds = 1;
    if( m_lqi >= 85 ) leds |= 2;
    if( m_lqi >= 106 ) leds |= 4;
    call Leds.set( leds );
  }
  task void processRSSI()
  {
    uint16_t leds = 1;
    if( m_rssi >= 20 ) leds |= 2; //prev 15
    if( m_rssi >= 40 ) leds |= 4; //prev 35
    call Leds.set( leds );
  }
  event TOS_MsgPtr ReceiveMsg.receive( TOS_MsgPtr msg )
  {
    CountMsg_t* body = (CountMsg_t*)msg->data;
    if( body->src >= 10000 )
    {
      if( TOS_LOCAL_ADDRESS == 1 )
      {
 m_timeout = (TIMEOUT_EXCHANGE_LQI + PERIOD_EXCHANGE_LQI - 1) / PERIOD_EXCHANGE_LQI;
 m_lqi = msg->lqi;
 post processLQI();
      }
      else
      {
 m_mode = body->src - 10000;
 switch( m_mode )
 {
   case MODE_COUNT_RADIO:
     m_count = body->n;
     call Leds.set( m_count );
     call Timer.stop(); //stop timeout
     break;
   case MODE_EXCHANGE_RSSI:
     call Timer.start( TIMER_ONE_SHOT, TIMEOUT_EXCHANGE_RSSI ); //timeout
     m_rssi  = (msg->strength + 60) & 255;
     post processRSSI();
     sendCount( m_count );
     break;
   case MODE_EXCHANGE_LQI:
     call Timer.start( TIMER_ONE_SHOT, TIMEOUT_EXCHANGE_LQI ); //timeout
     m_lqi = msg->lqi;
     post processLQI();
     sendCount( m_count );
     break;
 }
      }
    }
    return msg;
  }
  task void switchMode()
  {
    switch( m_mode )
    {
      case MODE_COUNT_RADIO:
 m_mode = MODE_EXCHANGE_RSSI;
 call Timer.start( TIMER_REPEAT, PERIOD_EXCHANGE_RSSI );
 break;
      case MODE_EXCHANGE_RSSI:
 m_mode = MODE_EXCHANGE_LQI;
 call Timer.start( TIMER_REPEAT, PERIOD_EXCHANGE_LQI );
 break;
      case MODE_EXCHANGE_LQI:
      default:
 m_mode = MODE_COUNT_RADIO;
 call Timer.start( TIMER_REPEAT, PERIOD_COUNT_RADIO );
 break;
    }
  }
  async event void Button.pressed(uint32_t time) {
    if( TOS_LOCAL_ADDRESS == 1 )
      post switchMode();
  }
  async event void Button.released(uint32_t time) { }
}
 
//----------------------------------------------------------------------------------------------
 
includes CountMsg;
module CountReceiveM
{
  provides interface StdControl;
  uses interface ReceiveMsg;
  uses interface Leds;
}
implementation
{
  command result_t StdControl.init()
  {
    call Leds.init();
    return SUCCESS;
  }
  command result_t StdControl.start()
  {
    return SUCCESS;
  }
  command result_t StdControl.stop()
  {
    return SUCCESS;
  }
  event TOS_MsgPtr ReceiveMsg.receive( TOS_MsgPtr msg )
  {
    CountMsg_t* body = (CountMsg_t*)msg->data;
    call Leds.set( body->n );
    return msg;
  }
}
 
//-----------------------------------------------------------------------------------------------
 
includes CountMsg;
module CountSendM
{
  provides interface StdControl;
  uses interface Timer;
  uses interface SendMsg;
  uses interface Leds;
}
implementation
{
  TOS_Msg m_msg;
  int m_int;
  bool m_sending;
  command result_t StdControl.init()
  {
    m_int = 0;
    m_sending = FALSE;
    call Leds.init();
    return SUCCESS;
  }
  command result_t StdControl.start()
  {
    call Timer.start( TIMER_REPEAT, 200 );
    return SUCCESS;
  }
  command result_t StdControl.stop()
  {
    return SUCCESS;
  }
  event result_t Timer.fired()
  {
    if( m_sending == FALSE )
    {
      CountMsg_t* body = (CountMsg_t*)m_msg.data;
      body->n = m_int;
      body->src = TOS_LOCAL_ADDRESS;
      if( call SendMsg.send( TOS_BCAST_ADDR, sizeof(CountMsg_t), &m_msg ) == SUCCESS )
      {
 call Leds.set( m_int );
 m_sending = TRUE;
      }
    }
    m_int++;
    return SUCCESS;
  }
  event result_t SendMsg.sendDone( TOS_MsgPtr msg, result_t success )
  {
    m_sending = FALSE;
    return SUCCESS;
  }
}
 
//-----------------------------------------------------------------------------------------
 
#include "Delta.h"
#include "circularQueue.h"
module DeltaM {
  provides {
    interface StdControl;
  }
  uses {
    interface Send as SendDeltaMsg;
    interface Intercept as SnoopDeltaMsg;
    interface RouteControl;
    interface RouteStatistics;
    interface ADC;
    interface Timer;
    interface Timer as TimerBlink;
    interface Leds;
  }
}
implementation {
  /************************* VARIABLES *******************************/
  uint16_t m_adc;
  uint32_t m_seqno;
  TOS_Msg msg[DELTA_QUEUE_SIZE];
  CircularQueue_t queue;
  /************************* HELPER FUNCTIONS ************************/
  task void sendData() {
    uint16_t _length;
    int i;
    uint16_t neighbors[MHOP_PARENT_SIZE];
    uint16_t quality[MHOP_PARENT_SIZE];

    if (cqueue_pushBack( &queue ) == SUCCESS) {
      DeltaMsg* dmsg = (DeltaMsg*)call SendDeltaMsg.getBuffer(&msg[queue.back], &_length);
      atomic dmsg->reading = m_adc;
      dmsg->parent = call RouteControl.getParent();
      call RouteStatistics.getNeighbors(neighbors, MHOP_PARENT_SIZE);
      call RouteStatistics.getNeighborQuality(quality, MHOP_PARENT_SIZE);
      for (i = 0; i < MHOP_PARENT_SIZE; i++) {
 dmsg->neighbors[i] = neighbors[i];
 dmsg->quality[i] = quality[i];
      }
      dmsg->neighborsize = MHOP_PARENT_SIZE;
      dmsg->retransmissions = call RouteStatistics.getRetransmissions();
      dmsg->seqno = m_seqno;
      if (call SendDeltaMsg.send( &msg[queue.back], sizeof(DeltaMsg) ) == SUCCESS) {
 call Leds.redOn();
      }
      else {
 // remove from queue
 cqueue_popBack( &queue );
      }
    }
    // always increase seqno.  gives a better idea of how many packets
    // really have been dropped
    m_seqno++;
  }
  void blinkBlue() {
    call Leds.yellowOn();
    call TimerBlink.start(TIMER_ONE_SHOT, 20);
  }
  /************************* STD CONTROL *****************************/
  command result_t StdControl.init() {
    cqueue_init( &queue, DELTA_QUEUE_SIZE );
    return SUCCESS;
  }
  command result_t StdControl.start() {
    call Timer.start( TIMER_REPEAT, DELTA_TIME );
    return SUCCESS;
  }
  command result_t StdControl.stop() {
    return SUCCESS;
  }
  /************************* TIMER ***********************************/
  event result_t Timer.fired() {
    call ADC.getData();
    return SUCCESS;
  }
  event result_t TimerBlink.fired() {
    call Leds.yellowOff();
    return SUCCESS;
  }
  /************************* ADC *************************************/
  async event result_t ADC.dataReady(uint16_t data) {
    m_adc = data;
    post sendData();
    return SUCCESS;
  }
  /************************* SEND ************************************/
  event result_t SendDeltaMsg.sendDone(TOS_MsgPtr _msg, result_t _success) {
    cqueue_popFront( &queue );
    if (cqueue_isEmpty( &queue )) {
      call Leds.redOff();
    }
    return SUCCESS;
  }
  /************************* SEND ************************************/
  event result_t SnoopDeltaMsg.intercept(TOS_MsgPtr _msg, void* payload, uint16_t payloadLen) {
    blinkBlue();
    return SUCCESS;
  }
}