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

📄 uartdebugsenderp.nc

📁 tinyos2.0版本驱动
💻 NC
字号:
#include <CollectionDebugMsg.h>module UARTDebugSenderP {    provides {        interface CollectionDebug;    }    uses {        interface Boot;        interface Pool<message_t> as MessagePool;        interface Queue<message_t*> as SendQueue;        interface AMSend as UARTSend;    }} implementation {    message_t uartPacket;    bool sending;    uint8_t len;    uint16_t statLogReceived = 0;    uint16_t statEnqueueFail = 0;    uint16_t statSendFail = 0;    uint16_t statSendDoneFail = 0;    uint16_t statSendDoneOk = 0;    uint16_t statSendDoneBug = 0;     event void Boot.booted() {        sending = FALSE;        len = sizeof(CollectionDebugMsg);        statSendFail = 0;        statLogReceived = 0;        statEnqueueFail = 0;        statSendDoneOk = 0;        statSendDoneFail = 0;        statSendDoneBug = 0;    }    task void sendTask() {        if (sending) {            return;        } else if (call SendQueue.empty()) {            return;        } else {            message_t* smsg = call SendQueue.head();            error_t eval = call UARTSend.send(AM_BROADCAST_ADDR, smsg, len);            if (eval == SUCCESS) {                sending = TRUE;                return;            } else {                //Drop packet. Don't retry.                statSendFail++;                call SendQueue.dequeue();                call MessagePool.put(smsg);                if (! call SendQueue.empty())                    post sendTask();            }        }    }    event void UARTSend.sendDone(message_t *msg, error_t error) {        message_t* qh = call SendQueue.head();        if (qh == NULL || qh != msg) {            //bad mojo            statSendDoneBug++;        } else {            call SendQueue.dequeue();            call MessagePool.put(msg);              if (error == SUCCESS)                 statSendDoneOk++;            else                 statSendDoneFail++;        }        sending = FALSE;        if (!call SendQueue.empty())             post sendTask();    }    command error_t CollectionDebug.logEvent(uint8_t type) {        statLogReceived++;        if (call MessagePool.empty()) {            return FAIL;        } else {            message_t* msg = call MessagePool.get();            CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg));	    if (dbg_msg == NULL) {	      return FAIL;	    }	                memset(dbg_msg, 0, len);            dbg_msg->type = type;            dbg_msg->seqno = statLogReceived;            if (call SendQueue.enqueue(msg) == SUCCESS) {                post sendTask();                return SUCCESS;            } else {                statEnqueueFail++;                call MessagePool.put(msg);                return FAIL;            }        }    }    /* Used for FE_SENT_MSG, FE_RCV_MSG, FE_FWD_MSG, FE_DST_MSG */    command error_t TRUSTEDBLOCK CollectionDebug.logEventMsg(uint8_t type, uint16_t msg_id, am_addr_t origin, am_addr_t node) {        statLogReceived++;        if (call MessagePool.empty()) {            return FAIL;        } else {            message_t* msg = call MessagePool.get();            CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg));	    if (dbg_msg == NULL) {	      return FAIL;	    }            memset(dbg_msg, 0, len);            dbg_msg->type = type;            dbg_msg->data.msg.msg_uid = msg_id;            dbg_msg->data.msg.origin = origin;            dbg_msg->data.msg.other_node = node;            dbg_msg->seqno = statLogReceived;            if (call SendQueue.enqueue(msg) == SUCCESS) {                post sendTask();                return SUCCESS;            } else {                statEnqueueFail++;                call MessagePool.put(msg);                return FAIL;            }        }    }    /* Used for TREE_NEW_PARENT, TREE_ROUTE_INFO */    command error_t TRUSTEDBLOCK CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) {        statLogReceived++;        if (call MessagePool.empty()) {            return FAIL;        } else {            message_t* msg = call MessagePool.get();            CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg));	    if (dbg_msg == NULL) {	      return FAIL;	    }            memset(dbg_msg, 0, len);            dbg_msg->type = type;            dbg_msg->data.route_info.parent = parent;            dbg_msg->data.route_info.hopcount = hopcount;            dbg_msg->data.route_info.metric = metric;            dbg_msg->seqno = statLogReceived;            if (call SendQueue.enqueue(msg) == SUCCESS) {                post sendTask();                return SUCCESS;            } else {                statEnqueueFail++;                call MessagePool.put(msg);                return FAIL;            }        }    }    /* Used for DBG_1 */     command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) {        statLogReceived++;        if (call MessagePool.empty()) {            return FAIL;        } else {            message_t* msg = call MessagePool.get();            CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg));	    if (dbg_msg == NULL) {	      return FAIL;	    }            memset(dbg_msg, 0, len);            dbg_msg->type = type;            dbg_msg->data.arg = arg;            dbg_msg->seqno = statLogReceived;            if (call SendQueue.enqueue(msg) == SUCCESS) {                post sendTask();                return SUCCESS;            } else {                statEnqueueFail++;                call MessagePool.put(msg);                return FAIL;            }        }    }    /* Used for DBG_2, DBG_3 */    command TRUSTEDBLOCK error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) {        statLogReceived++;        if (call MessagePool.empty()) {            return FAIL;        } else {            message_t* msg = call MessagePool.get();            CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg));	    if (dbg_msg == NULL) {	      return FAIL;	    }            memset(dbg_msg, 0, len);            dbg_msg->type = type;            dbg_msg->data.dbg.a = arg1;            dbg_msg->data.dbg.b = arg2;            dbg_msg->data.dbg.c = arg3;            dbg_msg->seqno = statLogReceived;            if (call SendQueue.enqueue(msg) == SUCCESS) {                post sendTask();                return SUCCESS;            } else {                statEnqueueFail++;                call MessagePool.put(msg);                return FAIL;            }        }    }}    

⌨️ 快捷键说明

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