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