📄 statscollectorp.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 + -