⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statscollectorp.nc

📁 tinyos-2.x.rar
💻 NC
字号:
/* Copyright (c) 2007 Johns Hopkins University.
*  All rights reserved.
*
*  Permission to use, copy, modify, and distribute this software and its
*  documentation for any purpose, without fee, and without written
*  agreement is hereby granted, provided that the above copyright
*  notice, the (updated) modification history and the author appear in
*  all copies of this source code.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
*  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
*  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
*  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
*  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA,
*  OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
*  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
*  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
*  THE POSSIBILITY OF SUCH DAMAGE.
*/

/**
 * @author Chieh-Jan Mike Liang <cliang4@cs.jhu.edu>
 * @author Razvan Musaloiu-E. <razvanm@cs.jhu.edu>
 */

module StatsCollectorP
{
  provides {
    interface StatsCollector;
  }
  uses {
    interface LocalTime<TMilli> as LocalTime;
    interface Globals;
    interface Timer<TMilli> as Timer;
    interface AMSend;
  }
}

implementation
{
  enum {
    TIMER = 0,
    FORCED_START = 1,
    FORCED_END = 2
  };
  
  enum {
    BROADCAST_REQ = 0,
    START_RECV_DATA = 1,
    END_RECV_DATA = 2
  };
  
  typedef nx_struct StatsReport {
    nx_uint8_t text[5];
    nx_uint32_t NumPubPktTrans;
    nx_uint32_t NumRecvPageTrans;
    nx_uint32_t AvgPubPktTransTime;
    nx_uint32_t AvgRecvPageTransTime;
    nx_uint32_t NumPubPktRetrans;
    nx_uint32_t NumRecvHSRetrans;
  } StatsReport;
  
  typedef nx_struct StatusReport {
    nx_uint8_t text[5];
    nx_uint8_t flag;
    nx_uint8_t channel;
  } StatusReport;
  
  typedef nx_struct VariableReport {
    nx_uint8_t text[5];
    nx_uint32_t value;
  } VariableReport;
  
  uint32_t startPubTime = 0;
  uint32_t startRecvTime = 0;
  uint32_t startCCTime = 0;   // Change channel
  message_t stats_msg;
  message_t status_msg;
  message_t variable_msg;
 
  void startTimer() {
    if(call Timer.isRunning() == FALSE || call Timer.isOneShot() == TRUE) {
      call Timer.startPeriodic(5000);
    }
  }
  
  void stopTimer() {
    if(call Timer.isRunning() == TRUE) {
      call Timer.stop();
    }
  }
  
  void sendStatsReport() {
    StatsReport *report = (StatsReport *)call AMSend.getPayload(&stats_msg);

    report->text[0] = 's';
    report->text[1] = 't';
    report->text[2] = 'a';
    report->text[3] = 't';
    report->text[4] = 's';
    report->NumPubPktTrans = call Globals.getNumPubPktTrans();
    report->NumRecvPageTrans = call Globals.getNumRecvPageTrans();
    report->AvgPubPktTransTime = call Globals.getAvgPubPktTransTime();
    report->AvgRecvPageTransTime = call Globals.getAvgRecvPageTransTime();
    report->NumPubPktRetrans = call Globals.getNumPubPktRetrans();
    report->NumRecvHSRetrans = call Globals.getNumRecvHSRetrans();
    
    call AMSend.send(AM_BROADCAST_ADDR, &stats_msg, sizeof(StatsReport));
  }
  
  void sendStatusMsg(uint8_t flag, uint8_t channel) {
    StatusReport *report = (StatusReport *)call AMSend.getPayload(&status_msg);
    
    report->text[0] = 's';
    report->text[1] = 't';
    report->text[2] = 't';
    report->text[3] = 'u';
    report->text[4] = 's';
    report->flag = flag;
    report->channel = channel;
    
    call AMSend.send(AM_BROADCAST_ADDR, &status_msg, sizeof(StatusReport));
  }
  
  command void StatsCollector.sendVariableReport(uint32_t value) {
    VariableReport *report = (VariableReport *)call AMSend.getPayload(&variable_msg);
    
    report->text[0] = 'r';
    report->text[1] = 'e';
    report->text[2] = 'p';
    report->text[3] = 'r';
    report->text[4] = 't';
    report->value = value;
    
    call AMSend.send(AM_BROADCAST_ADDR, &variable_msg, sizeof(VariableReport));
  }
  
  command void StatsCollector.msg_bcastReq() {
    sendStatusMsg(BROADCAST_REQ, CC2420_DEF_CHANNEL);
  }
  
  event void Timer.fired() {
    sendStatsReport();
  }
  
  event void AMSend.sendDone(message_t* pstats_msg, error_t error) { }
  
  command void StatsCollector.startStatsCollector()
  {
    startTimer();
  }
  
  command void StatsCollector.stopStatsCollector()
  {
    stopTimer();
    call Timer.startOneShot(500);
    //sendStatsReport();   // Just in case
  }
  
  command void StatsCollector.startPubPktTransTime()
  {
    startPubTime = call LocalTime.get();
  }
  command void StatsCollector.endPubPktTransTime()
  {
    uint32_t diff = (call LocalTime.get()) - startPubTime;
    uint32_t temp = (call Globals.getAvgPubPktTransTime()) * (call Globals.getNumPubPktTrans());
    call Globals.incNumPubPktTrans();
    call Globals.setAvgPubPktTransTime((temp + diff) / (call Globals.getNumPubPktTrans()));
  }
  command void StatsCollector.startRecvPageTransTime(uint8_t channel)
  {
    startRecvTime = call LocalTime.get();
    sendStatusMsg(START_RECV_DATA, channel);
  }
  command void StatsCollector.endRecvPageTransTime(uint8_t senderAddr)
  {
    uint32_t curTime = call LocalTime.get();
    uint32_t temp = (call Globals.getAvgRecvPageTransTime()) * (call Globals.getNumRecvPageTrans());
    call Globals.incNumRecvPageTrans();
    call Globals.setAvgRecvPageTransTime((temp + (curTime - startRecvTime)) / (call Globals.getNumRecvPageTrans()));
    sendStatusMsg(END_RECV_DATA, senderAddr);
  }
  
  command void StatsCollector.incPub_numPktRetrans()
  {
    call Globals.incNumPubPktRetrans();
  }
  
  command void StatsCollector.startCCTime() {
    startCCTime = call LocalTime.get();
  }
  
  command void StatsCollector.endCCTime() {
    uint32_t diff = (call LocalTime.get()) - startCCTime;
    call StatsCollector.sendVariableReport(diff);
  }
  
  command void StatsCollector.incNumRecvHSRetrans() {
    call Globals.incNumRecvHSRetrans();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -