SmartMesh QSL for STM32F4 version

Fork of COG-AD4050_QSL by APS Lab

Committer:
APS_Lab
Date:
Thu Jul 12 09:19:12 2018 +0000
Revision:
1:b909b8399252
Parent:
0:8ca1e814a851
SmartMesh for STM32F4 version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
APS_Lab 0:8ca1e814a851 1 /*
APS_Lab 0:8ca1e814a851 2 Copyright (c) 2015, Dust Networks. All rights reserved.
APS_Lab 0:8ca1e814a851 3
APS_Lab 0:8ca1e814a851 4 C library to connect to a SmartMesh IP Mote.
APS_Lab 0:8ca1e814a851 5
APS_Lab 0:8ca1e814a851 6 \license See attached DN_LICENSE.txt.
APS_Lab 0:8ca1e814a851 7 */
APS_Lab 0:8ca1e814a851 8
APS_Lab 0:8ca1e814a851 9 #include "dn_ipmt.h"
APS_Lab 0:8ca1e814a851 10 #include "dn_lock.h"
APS_Lab 0:8ca1e814a851 11 #include "dn_serial_mt.h"
APS_Lab 0:8ca1e814a851 12
APS_Lab 0:8ca1e814a851 13 //=========================== variables =======================================
APS_Lab 0:8ca1e814a851 14
APS_Lab 0:8ca1e814a851 15 typedef struct {
APS_Lab 0:8ca1e814a851 16 // sending requests
APS_Lab 0:8ca1e814a851 17 uint8_t outputBuf[MAX_FRAME_LENGTH];
APS_Lab 0:8ca1e814a851 18 bool busyTx;
APS_Lab 0:8ca1e814a851 19 uint8_t cmdId;
APS_Lab 0:8ca1e814a851 20 uint8_t paramId;
APS_Lab 0:8ca1e814a851 21 // receiving replies
APS_Lab 0:8ca1e814a851 22 dn_ipmt_reply_cbt replyCb;
APS_Lab 0:8ca1e814a851 23 uint8_t* replyContents;
APS_Lab 0:8ca1e814a851 24 // receiving notifications
APS_Lab 0:8ca1e814a851 25 dn_ipmt_notif_cbt notifCb;
APS_Lab 0:8ca1e814a851 26 uint8_t* notifBuf;
APS_Lab 0:8ca1e814a851 27 uint8_t notifBufLen;
APS_Lab 0:8ca1e814a851 28 } dn_ipmt_vars_t;
APS_Lab 0:8ca1e814a851 29
APS_Lab 0:8ca1e814a851 30 dn_ipmt_vars_t dn_ipmt_vars;
APS_Lab 0:8ca1e814a851 31
APS_Lab 0:8ca1e814a851 32 //=========================== prototypes ======================================
APS_Lab 0:8ca1e814a851 33
APS_Lab 0:8ca1e814a851 34 // API
APS_Lab 0:8ca1e814a851 35 void dn_ipmt_setParameter_macAddress_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 36 void dn_ipmt_setParameter_joinKey_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 37 void dn_ipmt_setParameter_networkId_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 38 void dn_ipmt_setParameter_txPower_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 39 void dn_ipmt_setParameter_joinDutyCycle_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 40 void dn_ipmt_setParameter_eventMask_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 41 void dn_ipmt_setParameter_OTAPLockout_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 42 void dn_ipmt_setParameter_routingMode_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 43 void dn_ipmt_setParameter_powerSrcInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 44 void dn_ipmt_setParameter_advKey_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 45 void dn_ipmt_setParameter_autoJoin_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 46 void dn_ipmt_getParameter_macAddress_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 47 void dn_ipmt_getParameter_networkId_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 48 void dn_ipmt_getParameter_txPower_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 49 void dn_ipmt_getParameter_joinDutyCycle_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 50 void dn_ipmt_getParameter_eventMask_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 51 void dn_ipmt_getParameter_moteInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 52 void dn_ipmt_getParameter_netInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 53 void dn_ipmt_getParameter_moteStatus_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 54 void dn_ipmt_getParameter_time_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 55 void dn_ipmt_getParameter_charge_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 56 void dn_ipmt_getParameter_testRadioRxStats_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 57 void dn_ipmt_getParameter_OTAPLockout_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 58 void dn_ipmt_getParameter_moteId_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 59 void dn_ipmt_getParameter_ipv6Address_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 60 void dn_ipmt_getParameter_routingMode_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 61 void dn_ipmt_getParameter_appInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 62 void dn_ipmt_getParameter_powerSrcInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 63 void dn_ipmt_getParameter_autoJoin_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 64 void dn_ipmt_join_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 65 void dn_ipmt_disconnect_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 66 void dn_ipmt_reset_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 67 void dn_ipmt_lowPowerSleep_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 68 void dn_ipmt_testRadioRx_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 69 void dn_ipmt_clearNV_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 70 void dn_ipmt_requestService_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 71 void dn_ipmt_getServiceInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 72 void dn_ipmt_openSocket_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 73 void dn_ipmt_closeSocket_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 74 void dn_ipmt_bindSocket_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 75 void dn_ipmt_sendTo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 76 void dn_ipmt_search_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 77 void dn_ipmt_testRadioTxExt_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 78 void dn_ipmt_zeroize_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 79 void dn_ipmt_socketInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 80
APS_Lab 0:8ca1e814a851 81 // serial RX
APS_Lab 0:8ca1e814a851 82 void dn_ipmt_rxSerialRequest(uint8_t cmdId, uint8_t flags, uint8_t* payload, uint8_t len);
APS_Lab 0:8ca1e814a851 83
APS_Lab 0:8ca1e814a851 84 //=========================== public ==========================================
APS_Lab 0:8ca1e814a851 85
APS_Lab 0:8ca1e814a851 86 //========== admin
APS_Lab 0:8ca1e814a851 87
APS_Lab 0:8ca1e814a851 88 /**
APS_Lab 0:8ca1e814a851 89 \brief Setting up the instance.
APS_Lab 0:8ca1e814a851 90 */
APS_Lab 0:8ca1e814a851 91 void dn_ipmt_init(dn_ipmt_notif_cbt notifCb, uint8_t* notifBuf, uint8_t notifBufLen, dn_ipmt_reply_cbt replyCb) {
APS_Lab 0:8ca1e814a851 92
APS_Lab 0:8ca1e814a851 93 // reset local variables
APS_Lab 0:8ca1e814a851 94 memset(&dn_ipmt_vars,0,sizeof(dn_ipmt_vars));
APS_Lab 0:8ca1e814a851 95
APS_Lab 0:8ca1e814a851 96 // store params
APS_Lab 0:8ca1e814a851 97 dn_ipmt_vars.notifCb = notifCb;
APS_Lab 0:8ca1e814a851 98 dn_ipmt_vars.notifBuf = notifBuf;
APS_Lab 0:8ca1e814a851 99 dn_ipmt_vars.notifBufLen = notifBufLen;
APS_Lab 0:8ca1e814a851 100 dn_ipmt_vars.replyCb = replyCb;
APS_Lab 0:8ca1e814a851 101
APS_Lab 0:8ca1e814a851 102 // initialize the serial connection
APS_Lab 0:8ca1e814a851 103 dn_serial_mt_init(dn_ipmt_rxSerialRequest);
APS_Lab 0:8ca1e814a851 104 }
APS_Lab 0:8ca1e814a851 105
APS_Lab 0:8ca1e814a851 106 void dn_ipmt_cancelTx() {
APS_Lab 0:8ca1e814a851 107
APS_Lab 0:8ca1e814a851 108 // lock the module
APS_Lab 0:8ca1e814a851 109 dn_lock();
APS_Lab 0:8ca1e814a851 110
APS_Lab 0:8ca1e814a851 111 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 112
APS_Lab 0:8ca1e814a851 113 // unlock the module
APS_Lab 0:8ca1e814a851 114 dn_unlock();
APS_Lab 0:8ca1e814a851 115 }
APS_Lab 0:8ca1e814a851 116
APS_Lab 0:8ca1e814a851 117
APS_Lab 0:8ca1e814a851 118
APS_Lab 0:8ca1e814a851 119 //========== API
APS_Lab 0:8ca1e814a851 120
APS_Lab 0:8ca1e814a851 121 //===== setParameter_macAddress
APS_Lab 0:8ca1e814a851 122
APS_Lab 0:8ca1e814a851 123 /**
APS_Lab 0:8ca1e814a851 124 This command allows user to overwrite the manufacturer-assigned MAC address of
APS_Lab 0:8ca1e814a851 125 the mote. The new value takes effect after the mote resets.
APS_Lab 0:8ca1e814a851 126 */
APS_Lab 0:8ca1e814a851 127 dn_err_t dn_ipmt_setParameter_macAddress(uint8_t* macAddress, dn_ipmt_setParameter_macAddress_rpt* reply) {
APS_Lab 0:8ca1e814a851 128 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 129 dn_err_t rc;
APS_Lab 0:8ca1e814a851 130
APS_Lab 0:8ca1e814a851 131 // lock the module
APS_Lab 0:8ca1e814a851 132 dn_lock();
APS_Lab 0:8ca1e814a851 133
APS_Lab 0:8ca1e814a851 134 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 135 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 136 // unlock the module
APS_Lab 0:8ca1e814a851 137 dn_unlock();
APS_Lab 0:8ca1e814a851 138
APS_Lab 0:8ca1e814a851 139 // return
APS_Lab 0:8ca1e814a851 140 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 141 }
APS_Lab 0:8ca1e814a851 142
APS_Lab 0:8ca1e814a851 143 // store callback information
APS_Lab 0:8ca1e814a851 144 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 145 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 146 dn_ipmt_vars.paramId = PARAMID_MACADDRESS;
APS_Lab 0:8ca1e814a851 147
APS_Lab 0:8ca1e814a851 148 // extraFlags
APS_Lab 0:8ca1e814a851 149 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 150
APS_Lab 0:8ca1e814a851 151 // build outputBuf
APS_Lab 0:8ca1e814a851 152 dn_ipmt_vars.outputBuf[0] = PARAMID_MACADDRESS;
APS_Lab 0:8ca1e814a851 153 memcpy(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_MACADDRESS_REQ_OFFS_MACADDRESS],macAddress,8);
APS_Lab 0:8ca1e814a851 154
APS_Lab 0:8ca1e814a851 155 // send outputBuf
APS_Lab 0:8ca1e814a851 156 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 157 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 158 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 159 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 160 DN_SETPARAMETER_MACADDRESS_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 161 dn_ipmt_setParameter_macAddress_reply // replyCb
APS_Lab 0:8ca1e814a851 162 );
APS_Lab 0:8ca1e814a851 163
APS_Lab 0:8ca1e814a851 164 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 165 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 166 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 167 }
APS_Lab 0:8ca1e814a851 168
APS_Lab 0:8ca1e814a851 169 // unlock the module
APS_Lab 0:8ca1e814a851 170 dn_unlock();
APS_Lab 0:8ca1e814a851 171
APS_Lab 0:8ca1e814a851 172 return rc;
APS_Lab 0:8ca1e814a851 173
APS_Lab 0:8ca1e814a851 174 }
APS_Lab 0:8ca1e814a851 175
APS_Lab 0:8ca1e814a851 176 void dn_ipmt_setParameter_macAddress_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 177 dn_ipmt_setParameter_macAddress_rpt* reply;
APS_Lab 0:8ca1e814a851 178 uint8_t paramId;
APS_Lab 0:8ca1e814a851 179
APS_Lab 0:8ca1e814a851 180 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 181 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 182 return;
APS_Lab 0:8ca1e814a851 183 }
APS_Lab 0:8ca1e814a851 184
APS_Lab 0:8ca1e814a851 185 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 186 paramId = payload[0];
APS_Lab 0:8ca1e814a851 187 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 188 return;
APS_Lab 0:8ca1e814a851 189 }
APS_Lab 0:8ca1e814a851 190
APS_Lab 0:8ca1e814a851 191 // verify length
APS_Lab 0:8ca1e814a851 192 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_MACADDRESS_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 193 return;
APS_Lab 0:8ca1e814a851 194 }
APS_Lab 0:8ca1e814a851 195
APS_Lab 0:8ca1e814a851 196 // cast the replyContent
APS_Lab 0:8ca1e814a851 197 reply = (dn_ipmt_setParameter_macAddress_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 198
APS_Lab 0:8ca1e814a851 199 // store RC
APS_Lab 0:8ca1e814a851 200 reply->RC = rc;
APS_Lab 0:8ca1e814a851 201
APS_Lab 0:8ca1e814a851 202 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 203 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 204
APS_Lab 0:8ca1e814a851 205 }
APS_Lab 0:8ca1e814a851 206
APS_Lab 0:8ca1e814a851 207 // call the callback
APS_Lab 0:8ca1e814a851 208 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 209
APS_Lab 0:8ca1e814a851 210 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 211 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 212 }
APS_Lab 0:8ca1e814a851 213
APS_Lab 0:8ca1e814a851 214 //===== setParameter_joinKey
APS_Lab 0:8ca1e814a851 215
APS_Lab 0:8ca1e814a851 216 /**
APS_Lab 0:8ca1e814a851 217 The setParameter<joinKey> command may be used to set the join key in mote's
APS_Lab 0:8ca1e814a851 218 persistent storage. Join keys are used by motes to establish secure connection
APS_Lab 0:8ca1e814a851 219 with the network. The join key is used at next join.
APS_Lab 0:8ca1e814a851 220
APS_Lab 0:8ca1e814a851 221 Reading the joinKey parameter is prohibited for security reasons.
APS_Lab 0:8ca1e814a851 222 */
APS_Lab 0:8ca1e814a851 223 dn_err_t dn_ipmt_setParameter_joinKey(uint8_t* joinKey, dn_ipmt_setParameter_joinKey_rpt* reply) {
APS_Lab 0:8ca1e814a851 224 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 225 dn_err_t rc;
APS_Lab 0:8ca1e814a851 226
APS_Lab 0:8ca1e814a851 227 // lock the module
APS_Lab 0:8ca1e814a851 228 dn_lock();
APS_Lab 0:8ca1e814a851 229
APS_Lab 0:8ca1e814a851 230 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 231 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 232 // unlock the module
APS_Lab 0:8ca1e814a851 233 dn_unlock();
APS_Lab 0:8ca1e814a851 234
APS_Lab 0:8ca1e814a851 235 // return
APS_Lab 0:8ca1e814a851 236 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 237 }
APS_Lab 0:8ca1e814a851 238
APS_Lab 0:8ca1e814a851 239 // store callback information
APS_Lab 0:8ca1e814a851 240 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 241 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 242 dn_ipmt_vars.paramId = PARAMID_JOINKEY;
APS_Lab 0:8ca1e814a851 243
APS_Lab 0:8ca1e814a851 244 // extraFlags
APS_Lab 0:8ca1e814a851 245 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 246
APS_Lab 0:8ca1e814a851 247 // build outputBuf
APS_Lab 0:8ca1e814a851 248 dn_ipmt_vars.outputBuf[0] = PARAMID_JOINKEY;
APS_Lab 0:8ca1e814a851 249 memcpy(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_JOINKEY_REQ_OFFS_JOINKEY],joinKey,16);
APS_Lab 0:8ca1e814a851 250
APS_Lab 0:8ca1e814a851 251 // send outputBuf
APS_Lab 0:8ca1e814a851 252 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 253 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 254 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 255 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 256 DN_SETPARAMETER_JOINKEY_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 257 dn_ipmt_setParameter_joinKey_reply // replyCb
APS_Lab 0:8ca1e814a851 258 );
APS_Lab 0:8ca1e814a851 259
APS_Lab 0:8ca1e814a851 260 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 261 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 262 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 263 }
APS_Lab 0:8ca1e814a851 264
APS_Lab 0:8ca1e814a851 265 // unlock the module
APS_Lab 0:8ca1e814a851 266 dn_unlock();
APS_Lab 0:8ca1e814a851 267
APS_Lab 0:8ca1e814a851 268 return rc;
APS_Lab 0:8ca1e814a851 269
APS_Lab 0:8ca1e814a851 270 }
APS_Lab 0:8ca1e814a851 271
APS_Lab 0:8ca1e814a851 272 void dn_ipmt_setParameter_joinKey_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 273 dn_ipmt_setParameter_joinKey_rpt* reply;
APS_Lab 0:8ca1e814a851 274 uint8_t paramId;
APS_Lab 0:8ca1e814a851 275
APS_Lab 0:8ca1e814a851 276 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 277 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 278 return;
APS_Lab 0:8ca1e814a851 279 }
APS_Lab 0:8ca1e814a851 280
APS_Lab 0:8ca1e814a851 281 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 282 paramId = payload[0];
APS_Lab 0:8ca1e814a851 283 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 284 return;
APS_Lab 0:8ca1e814a851 285 }
APS_Lab 0:8ca1e814a851 286
APS_Lab 0:8ca1e814a851 287 // verify length
APS_Lab 0:8ca1e814a851 288 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_JOINKEY_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 289 return;
APS_Lab 0:8ca1e814a851 290 }
APS_Lab 0:8ca1e814a851 291
APS_Lab 0:8ca1e814a851 292 // cast the replyContent
APS_Lab 0:8ca1e814a851 293 reply = (dn_ipmt_setParameter_joinKey_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 294
APS_Lab 0:8ca1e814a851 295 // store RC
APS_Lab 0:8ca1e814a851 296 reply->RC = rc;
APS_Lab 0:8ca1e814a851 297
APS_Lab 0:8ca1e814a851 298 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 299 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 300
APS_Lab 0:8ca1e814a851 301 }
APS_Lab 0:8ca1e814a851 302
APS_Lab 0:8ca1e814a851 303 // call the callback
APS_Lab 0:8ca1e814a851 304 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 305
APS_Lab 0:8ca1e814a851 306 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 307 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 308 }
APS_Lab 0:8ca1e814a851 309
APS_Lab 0:8ca1e814a851 310 //===== setParameter_networkId
APS_Lab 0:8ca1e814a851 311
APS_Lab 0:8ca1e814a851 312 /**
APS_Lab 0:8ca1e814a851 313 This command may be used to set the Network ID of the mote. This setting is
APS_Lab 0:8ca1e814a851 314 persistent and is used on next join attempt.
APS_Lab 0:8ca1e814a851 315
APS_Lab 0:8ca1e814a851 316 As of version 1.4.x, a network ID of 0xFFFF can be used to indicate that the
APS_Lab 0:8ca1e814a851 317 mote should join the first network heard.
APS_Lab 0:8ca1e814a851 318
APS_Lab 0:8ca1e814a851 319 0xFFFF is never used over the air as a valid network ID - you should not set
APS_Lab 0:8ca1e814a851 320 the Manager's network ID to 0xFFFF.
APS_Lab 0:8ca1e814a851 321 */
APS_Lab 0:8ca1e814a851 322 dn_err_t dn_ipmt_setParameter_networkId(uint16_t networkId, dn_ipmt_setParameter_networkId_rpt* reply) {
APS_Lab 0:8ca1e814a851 323 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 324 dn_err_t rc;
APS_Lab 0:8ca1e814a851 325
APS_Lab 0:8ca1e814a851 326 // lock the module
APS_Lab 0:8ca1e814a851 327 dn_lock();
APS_Lab 0:8ca1e814a851 328
APS_Lab 0:8ca1e814a851 329 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 330 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 331 // unlock the module
APS_Lab 0:8ca1e814a851 332 dn_unlock();
APS_Lab 0:8ca1e814a851 333
APS_Lab 0:8ca1e814a851 334 // return
APS_Lab 0:8ca1e814a851 335 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 336 }
APS_Lab 0:8ca1e814a851 337
APS_Lab 0:8ca1e814a851 338 // store callback information
APS_Lab 0:8ca1e814a851 339 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 340 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 341 dn_ipmt_vars.paramId = PARAMID_NETWORKID;
APS_Lab 0:8ca1e814a851 342
APS_Lab 0:8ca1e814a851 343 // extraFlags
APS_Lab 0:8ca1e814a851 344 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 345
APS_Lab 0:8ca1e814a851 346 // build outputBuf
APS_Lab 0:8ca1e814a851 347 dn_ipmt_vars.outputBuf[0] = PARAMID_NETWORKID;
APS_Lab 0:8ca1e814a851 348 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_NETWORKID_REQ_OFFS_NETWORKID],networkId);
APS_Lab 0:8ca1e814a851 349
APS_Lab 0:8ca1e814a851 350 // send outputBuf
APS_Lab 0:8ca1e814a851 351 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 352 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 353 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 354 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 355 DN_SETPARAMETER_NETWORKID_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 356 dn_ipmt_setParameter_networkId_reply // replyCb
APS_Lab 0:8ca1e814a851 357 );
APS_Lab 0:8ca1e814a851 358
APS_Lab 0:8ca1e814a851 359 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 360 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 361 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 362 }
APS_Lab 0:8ca1e814a851 363
APS_Lab 0:8ca1e814a851 364 // unlock the module
APS_Lab 0:8ca1e814a851 365 dn_unlock();
APS_Lab 0:8ca1e814a851 366
APS_Lab 0:8ca1e814a851 367 return rc;
APS_Lab 0:8ca1e814a851 368
APS_Lab 0:8ca1e814a851 369 }
APS_Lab 0:8ca1e814a851 370
APS_Lab 0:8ca1e814a851 371 void dn_ipmt_setParameter_networkId_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 372 dn_ipmt_setParameter_networkId_rpt* reply;
APS_Lab 0:8ca1e814a851 373 uint8_t paramId;
APS_Lab 0:8ca1e814a851 374
APS_Lab 0:8ca1e814a851 375 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 376 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 377 return;
APS_Lab 0:8ca1e814a851 378 }
APS_Lab 0:8ca1e814a851 379
APS_Lab 0:8ca1e814a851 380 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 381 paramId = payload[0];
APS_Lab 0:8ca1e814a851 382 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 383 return;
APS_Lab 0:8ca1e814a851 384 }
APS_Lab 0:8ca1e814a851 385
APS_Lab 0:8ca1e814a851 386 // verify length
APS_Lab 0:8ca1e814a851 387 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_NETWORKID_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 388 return;
APS_Lab 0:8ca1e814a851 389 }
APS_Lab 0:8ca1e814a851 390
APS_Lab 0:8ca1e814a851 391 // cast the replyContent
APS_Lab 0:8ca1e814a851 392 reply = (dn_ipmt_setParameter_networkId_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 393
APS_Lab 0:8ca1e814a851 394 // store RC
APS_Lab 0:8ca1e814a851 395 reply->RC = rc;
APS_Lab 0:8ca1e814a851 396
APS_Lab 0:8ca1e814a851 397 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 398 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 399
APS_Lab 0:8ca1e814a851 400 }
APS_Lab 0:8ca1e814a851 401
APS_Lab 0:8ca1e814a851 402 // call the callback
APS_Lab 0:8ca1e814a851 403 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 404
APS_Lab 0:8ca1e814a851 405 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 406 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 407 }
APS_Lab 0:8ca1e814a851 408
APS_Lab 0:8ca1e814a851 409 //===== setParameter_txPower
APS_Lab 0:8ca1e814a851 410
APS_Lab 0:8ca1e814a851 411 /**
APS_Lab 0:8ca1e814a851 412 The setParameter<txPower> command sets the mote output power. This setting is
APS_Lab 0:8ca1e814a851 413 persistent. The command may be issued at any time and takes effect on next
APS_Lab 0:8ca1e814a851 414 transmission. Refer to product datasheets for supported RF output power values.
APS_Lab 0:8ca1e814a851 415 For example, if the mote has a typical RF output power of +8 dBm when the power
APS_Lab 0:8ca1e814a851 416 amplifier (PA) is enabled, then set the txPower parameter to 8 to enable the
APS_Lab 0:8ca1e814a851 417 PA. Similarly, if the mote has a typical RF output power of 0 dBm when the PA
APS_Lab 0:8ca1e814a851 418 is disabled, then set the txPower parameter to 0 to turn off the PA.
APS_Lab 0:8ca1e814a851 419 */
APS_Lab 0:8ca1e814a851 420 dn_err_t dn_ipmt_setParameter_txPower(int8_t txPower, dn_ipmt_setParameter_txPower_rpt* reply) {
APS_Lab 0:8ca1e814a851 421 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 422 dn_err_t rc;
APS_Lab 0:8ca1e814a851 423
APS_Lab 0:8ca1e814a851 424 // lock the module
APS_Lab 0:8ca1e814a851 425 dn_lock();
APS_Lab 0:8ca1e814a851 426
APS_Lab 0:8ca1e814a851 427 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 428 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 429 // unlock the module
APS_Lab 0:8ca1e814a851 430 dn_unlock();
APS_Lab 0:8ca1e814a851 431
APS_Lab 0:8ca1e814a851 432 // return
APS_Lab 0:8ca1e814a851 433 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 434 }
APS_Lab 0:8ca1e814a851 435
APS_Lab 0:8ca1e814a851 436 // store callback information
APS_Lab 0:8ca1e814a851 437 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 438 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 439 dn_ipmt_vars.paramId = PARAMID_TXPOWER;
APS_Lab 0:8ca1e814a851 440
APS_Lab 0:8ca1e814a851 441 // extraFlags
APS_Lab 0:8ca1e814a851 442 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 443
APS_Lab 0:8ca1e814a851 444 // build outputBuf
APS_Lab 0:8ca1e814a851 445 dn_ipmt_vars.outputBuf[0] = PARAMID_TXPOWER;
APS_Lab 0:8ca1e814a851 446 dn_ipmt_vars.outputBuf[DN_SETPARAMETER_TXPOWER_REQ_OFFS_TXPOWER] = (int8_t)txPower;
APS_Lab 0:8ca1e814a851 447
APS_Lab 0:8ca1e814a851 448 // send outputBuf
APS_Lab 0:8ca1e814a851 449 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 450 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 451 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 452 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 453 DN_SETPARAMETER_TXPOWER_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 454 dn_ipmt_setParameter_txPower_reply // replyCb
APS_Lab 0:8ca1e814a851 455 );
APS_Lab 0:8ca1e814a851 456
APS_Lab 0:8ca1e814a851 457 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 458 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 459 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 460 }
APS_Lab 0:8ca1e814a851 461
APS_Lab 0:8ca1e814a851 462 // unlock the module
APS_Lab 0:8ca1e814a851 463 dn_unlock();
APS_Lab 0:8ca1e814a851 464
APS_Lab 0:8ca1e814a851 465 return rc;
APS_Lab 0:8ca1e814a851 466
APS_Lab 0:8ca1e814a851 467 }
APS_Lab 0:8ca1e814a851 468
APS_Lab 0:8ca1e814a851 469 void dn_ipmt_setParameter_txPower_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 470 dn_ipmt_setParameter_txPower_rpt* reply;
APS_Lab 0:8ca1e814a851 471 uint8_t paramId;
APS_Lab 0:8ca1e814a851 472
APS_Lab 0:8ca1e814a851 473 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 474 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 475 return;
APS_Lab 0:8ca1e814a851 476 }
APS_Lab 0:8ca1e814a851 477
APS_Lab 0:8ca1e814a851 478 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 479 paramId = payload[0];
APS_Lab 0:8ca1e814a851 480 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 481 return;
APS_Lab 0:8ca1e814a851 482 }
APS_Lab 0:8ca1e814a851 483
APS_Lab 0:8ca1e814a851 484 // verify length
APS_Lab 0:8ca1e814a851 485 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_TXPOWER_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 486 return;
APS_Lab 0:8ca1e814a851 487 }
APS_Lab 0:8ca1e814a851 488
APS_Lab 0:8ca1e814a851 489 // cast the replyContent
APS_Lab 0:8ca1e814a851 490 reply = (dn_ipmt_setParameter_txPower_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 491
APS_Lab 0:8ca1e814a851 492 // store RC
APS_Lab 0:8ca1e814a851 493 reply->RC = rc;
APS_Lab 0:8ca1e814a851 494
APS_Lab 0:8ca1e814a851 495 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 496 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 497
APS_Lab 0:8ca1e814a851 498 }
APS_Lab 0:8ca1e814a851 499
APS_Lab 0:8ca1e814a851 500 // call the callback
APS_Lab 0:8ca1e814a851 501 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 502
APS_Lab 0:8ca1e814a851 503 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 504 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 505 }
APS_Lab 0:8ca1e814a851 506
APS_Lab 0:8ca1e814a851 507 //===== setParameter_joinDutyCycle
APS_Lab 0:8ca1e814a851 508
APS_Lab 0:8ca1e814a851 509 /**
APS_Lab 0:8ca1e814a851 510 The setParameter<joinDutyCycle> command allows the microprocessor to control
APS_Lab 0:8ca1e814a851 511 the ratio of active listen time to doze time (a low-power radio state) during
APS_Lab 0:8ca1e814a851 512 the period when the mote is searching for the network. If you desire a faster
APS_Lab 0:8ca1e814a851 513 join time at the risk of higher power consumption, use the
APS_Lab 0:8ca1e814a851 514 setParameter<joinDutyCycle> command to increase the join duty cycle up to 100%.
APS_Lab 0:8ca1e814a851 515 This setting is persistent and takes effect immediately if the device is
APS_Lab 0:8ca1e814a851 516 searching for network.
APS_Lab 0:8ca1e814a851 517 */
APS_Lab 0:8ca1e814a851 518 dn_err_t dn_ipmt_setParameter_joinDutyCycle(uint8_t dutyCycle, dn_ipmt_setParameter_joinDutyCycle_rpt* reply) {
APS_Lab 0:8ca1e814a851 519 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 520 dn_err_t rc;
APS_Lab 0:8ca1e814a851 521
APS_Lab 0:8ca1e814a851 522 // lock the module
APS_Lab 0:8ca1e814a851 523 dn_lock();
APS_Lab 0:8ca1e814a851 524
APS_Lab 0:8ca1e814a851 525 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 526 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 527 // unlock the module
APS_Lab 0:8ca1e814a851 528 dn_unlock();
APS_Lab 0:8ca1e814a851 529
APS_Lab 0:8ca1e814a851 530 // return
APS_Lab 0:8ca1e814a851 531 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 532 }
APS_Lab 0:8ca1e814a851 533
APS_Lab 0:8ca1e814a851 534 // store callback information
APS_Lab 0:8ca1e814a851 535 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 536 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 537 dn_ipmt_vars.paramId = PARAMID_JOINDUTYCYCLE;
APS_Lab 0:8ca1e814a851 538
APS_Lab 0:8ca1e814a851 539 // extraFlags
APS_Lab 0:8ca1e814a851 540 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 541
APS_Lab 0:8ca1e814a851 542 // build outputBuf
APS_Lab 0:8ca1e814a851 543 dn_ipmt_vars.outputBuf[0] = PARAMID_JOINDUTYCYCLE;
APS_Lab 0:8ca1e814a851 544 dn_ipmt_vars.outputBuf[DN_SETPARAMETER_JOINDUTYCYCLE_REQ_OFFS_DUTYCYCLE] = dutyCycle;
APS_Lab 0:8ca1e814a851 545
APS_Lab 0:8ca1e814a851 546 // send outputBuf
APS_Lab 0:8ca1e814a851 547 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 548 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 549 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 550 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 551 DN_SETPARAMETER_JOINDUTYCYCLE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 552 dn_ipmt_setParameter_joinDutyCycle_reply // replyCb
APS_Lab 0:8ca1e814a851 553 );
APS_Lab 0:8ca1e814a851 554
APS_Lab 0:8ca1e814a851 555 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 556 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 557 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 558 }
APS_Lab 0:8ca1e814a851 559
APS_Lab 0:8ca1e814a851 560 // unlock the module
APS_Lab 0:8ca1e814a851 561 dn_unlock();
APS_Lab 0:8ca1e814a851 562
APS_Lab 0:8ca1e814a851 563 return rc;
APS_Lab 0:8ca1e814a851 564
APS_Lab 0:8ca1e814a851 565 }
APS_Lab 0:8ca1e814a851 566
APS_Lab 0:8ca1e814a851 567 void dn_ipmt_setParameter_joinDutyCycle_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 568 dn_ipmt_setParameter_joinDutyCycle_rpt* reply;
APS_Lab 0:8ca1e814a851 569 uint8_t paramId;
APS_Lab 0:8ca1e814a851 570
APS_Lab 0:8ca1e814a851 571 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 572 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 573 return;
APS_Lab 0:8ca1e814a851 574 }
APS_Lab 0:8ca1e814a851 575
APS_Lab 0:8ca1e814a851 576 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 577 paramId = payload[0];
APS_Lab 0:8ca1e814a851 578 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 579 return;
APS_Lab 0:8ca1e814a851 580 }
APS_Lab 0:8ca1e814a851 581
APS_Lab 0:8ca1e814a851 582 // verify length
APS_Lab 0:8ca1e814a851 583 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_JOINDUTYCYCLE_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 584 return;
APS_Lab 0:8ca1e814a851 585 }
APS_Lab 0:8ca1e814a851 586
APS_Lab 0:8ca1e814a851 587 // cast the replyContent
APS_Lab 0:8ca1e814a851 588 reply = (dn_ipmt_setParameter_joinDutyCycle_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 589
APS_Lab 0:8ca1e814a851 590 // store RC
APS_Lab 0:8ca1e814a851 591 reply->RC = rc;
APS_Lab 0:8ca1e814a851 592
APS_Lab 0:8ca1e814a851 593 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 594 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 595
APS_Lab 0:8ca1e814a851 596 }
APS_Lab 0:8ca1e814a851 597
APS_Lab 0:8ca1e814a851 598 // call the callback
APS_Lab 0:8ca1e814a851 599 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 600
APS_Lab 0:8ca1e814a851 601 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 602 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 603 }
APS_Lab 0:8ca1e814a851 604
APS_Lab 0:8ca1e814a851 605 //===== setParameter_eventMask
APS_Lab 0:8ca1e814a851 606
APS_Lab 0:8ca1e814a851 607 /**
APS_Lab 0:8ca1e814a851 608 The setParameter<eventMask> command allows the microprocessor to selectively
APS_Lab 0:8ca1e814a851 609 subscribe to event notifications. The default value of eventMask at mote reset
APS_Lab 0:8ca1e814a851 610 is all 1s - all events are enabled. This setting is not persistent.
APS_Lab 0:8ca1e814a851 611
APS_Lab 0:8ca1e814a851 612 New event type may be added in future revisions of mote software. It is
APS_Lab 0:8ca1e814a851 613 recommended that the client code only subscribe to known events and gracefully
APS_Lab 0:8ca1e814a851 614 ignore all unknown events.
APS_Lab 0:8ca1e814a851 615 */
APS_Lab 0:8ca1e814a851 616 dn_err_t dn_ipmt_setParameter_eventMask(uint32_t eventMask, dn_ipmt_setParameter_eventMask_rpt* reply) {
APS_Lab 0:8ca1e814a851 617 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 618 dn_err_t rc;
APS_Lab 0:8ca1e814a851 619
APS_Lab 0:8ca1e814a851 620 // lock the module
APS_Lab 0:8ca1e814a851 621 dn_lock();
APS_Lab 0:8ca1e814a851 622
APS_Lab 0:8ca1e814a851 623 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 624 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 625 // unlock the module
APS_Lab 0:8ca1e814a851 626 dn_unlock();
APS_Lab 0:8ca1e814a851 627
APS_Lab 0:8ca1e814a851 628 // return
APS_Lab 0:8ca1e814a851 629 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 630 }
APS_Lab 0:8ca1e814a851 631
APS_Lab 0:8ca1e814a851 632 // store callback information
APS_Lab 0:8ca1e814a851 633 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 634 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 635 dn_ipmt_vars.paramId = PARAMID_EVENTMASK;
APS_Lab 0:8ca1e814a851 636
APS_Lab 0:8ca1e814a851 637 // extraFlags
APS_Lab 0:8ca1e814a851 638 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 639
APS_Lab 0:8ca1e814a851 640 // build outputBuf
APS_Lab 0:8ca1e814a851 641 dn_ipmt_vars.outputBuf[0] = PARAMID_EVENTMASK;
APS_Lab 0:8ca1e814a851 642 dn_write_uint32_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_EVENTMASK_REQ_OFFS_EVENTMASK],eventMask);
APS_Lab 0:8ca1e814a851 643
APS_Lab 0:8ca1e814a851 644 // send outputBuf
APS_Lab 0:8ca1e814a851 645 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 646 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 647 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 648 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 649 DN_SETPARAMETER_EVENTMASK_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 650 dn_ipmt_setParameter_eventMask_reply // replyCb
APS_Lab 0:8ca1e814a851 651 );
APS_Lab 0:8ca1e814a851 652
APS_Lab 0:8ca1e814a851 653 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 654 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 655 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 656 }
APS_Lab 0:8ca1e814a851 657
APS_Lab 0:8ca1e814a851 658 // unlock the module
APS_Lab 0:8ca1e814a851 659 dn_unlock();
APS_Lab 0:8ca1e814a851 660
APS_Lab 0:8ca1e814a851 661 return rc;
APS_Lab 0:8ca1e814a851 662
APS_Lab 0:8ca1e814a851 663 }
APS_Lab 0:8ca1e814a851 664
APS_Lab 0:8ca1e814a851 665 void dn_ipmt_setParameter_eventMask_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 666 dn_ipmt_setParameter_eventMask_rpt* reply;
APS_Lab 0:8ca1e814a851 667 uint8_t paramId;
APS_Lab 0:8ca1e814a851 668
APS_Lab 0:8ca1e814a851 669 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 670 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 671 return;
APS_Lab 0:8ca1e814a851 672 }
APS_Lab 0:8ca1e814a851 673
APS_Lab 0:8ca1e814a851 674 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 675 paramId = payload[0];
APS_Lab 0:8ca1e814a851 676 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 677 return;
APS_Lab 0:8ca1e814a851 678 }
APS_Lab 0:8ca1e814a851 679
APS_Lab 0:8ca1e814a851 680 // verify length
APS_Lab 0:8ca1e814a851 681 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_EVENTMASK_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 682 return;
APS_Lab 0:8ca1e814a851 683 }
APS_Lab 0:8ca1e814a851 684
APS_Lab 0:8ca1e814a851 685 // cast the replyContent
APS_Lab 0:8ca1e814a851 686 reply = (dn_ipmt_setParameter_eventMask_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 687
APS_Lab 0:8ca1e814a851 688 // store RC
APS_Lab 0:8ca1e814a851 689 reply->RC = rc;
APS_Lab 0:8ca1e814a851 690
APS_Lab 0:8ca1e814a851 691 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 692 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 693
APS_Lab 0:8ca1e814a851 694 }
APS_Lab 0:8ca1e814a851 695
APS_Lab 0:8ca1e814a851 696 // call the callback
APS_Lab 0:8ca1e814a851 697 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 698
APS_Lab 0:8ca1e814a851 699 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 700 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 701 }
APS_Lab 0:8ca1e814a851 702
APS_Lab 0:8ca1e814a851 703 //===== setParameter_OTAPLockout
APS_Lab 0:8ca1e814a851 704
APS_Lab 0:8ca1e814a851 705 /**
APS_Lab 0:8ca1e814a851 706 This command allows the microprocessor to control whether Over-The-Air
APS_Lab 0:8ca1e814a851 707 Programming (OTAP) of motes is allowed. This setting is persistent and takes
APS_Lab 0:8ca1e814a851 708 effect immediately.
APS_Lab 0:8ca1e814a851 709 */
APS_Lab 0:8ca1e814a851 710 dn_err_t dn_ipmt_setParameter_OTAPLockout(bool mode, dn_ipmt_setParameter_OTAPLockout_rpt* reply) {
APS_Lab 0:8ca1e814a851 711 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 712 dn_err_t rc;
APS_Lab 0:8ca1e814a851 713
APS_Lab 0:8ca1e814a851 714 // lock the module
APS_Lab 0:8ca1e814a851 715 dn_lock();
APS_Lab 0:8ca1e814a851 716
APS_Lab 0:8ca1e814a851 717 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 718 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 719 // unlock the module
APS_Lab 0:8ca1e814a851 720 dn_unlock();
APS_Lab 0:8ca1e814a851 721
APS_Lab 0:8ca1e814a851 722 // return
APS_Lab 0:8ca1e814a851 723 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 724 }
APS_Lab 0:8ca1e814a851 725
APS_Lab 0:8ca1e814a851 726 // store callback information
APS_Lab 0:8ca1e814a851 727 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 728 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 729 dn_ipmt_vars.paramId = PARAMID_OTAPLOCKOUT;
APS_Lab 0:8ca1e814a851 730
APS_Lab 0:8ca1e814a851 731 // extraFlags
APS_Lab 0:8ca1e814a851 732 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 733
APS_Lab 0:8ca1e814a851 734 // build outputBuf
APS_Lab 0:8ca1e814a851 735 dn_ipmt_vars.outputBuf[0] = PARAMID_OTAPLOCKOUT;
APS_Lab 0:8ca1e814a851 736 dn_ipmt_vars.outputBuf[DN_SETPARAMETER_OTAPLOCKOUT_REQ_OFFS_MODE] = mode;
APS_Lab 0:8ca1e814a851 737
APS_Lab 0:8ca1e814a851 738 // send outputBuf
APS_Lab 0:8ca1e814a851 739 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 740 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 741 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 742 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 743 DN_SETPARAMETER_OTAPLOCKOUT_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 744 dn_ipmt_setParameter_OTAPLockout_reply // replyCb
APS_Lab 0:8ca1e814a851 745 );
APS_Lab 0:8ca1e814a851 746
APS_Lab 0:8ca1e814a851 747 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 748 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 749 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 750 }
APS_Lab 0:8ca1e814a851 751
APS_Lab 0:8ca1e814a851 752 // unlock the module
APS_Lab 0:8ca1e814a851 753 dn_unlock();
APS_Lab 0:8ca1e814a851 754
APS_Lab 0:8ca1e814a851 755 return rc;
APS_Lab 0:8ca1e814a851 756
APS_Lab 0:8ca1e814a851 757 }
APS_Lab 0:8ca1e814a851 758
APS_Lab 0:8ca1e814a851 759 void dn_ipmt_setParameter_OTAPLockout_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 760 dn_ipmt_setParameter_OTAPLockout_rpt* reply;
APS_Lab 0:8ca1e814a851 761 uint8_t paramId;
APS_Lab 0:8ca1e814a851 762
APS_Lab 0:8ca1e814a851 763 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 764 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 765 return;
APS_Lab 0:8ca1e814a851 766 }
APS_Lab 0:8ca1e814a851 767
APS_Lab 0:8ca1e814a851 768 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 769 paramId = payload[0];
APS_Lab 0:8ca1e814a851 770 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 771 return;
APS_Lab 0:8ca1e814a851 772 }
APS_Lab 0:8ca1e814a851 773
APS_Lab 0:8ca1e814a851 774 // verify length
APS_Lab 0:8ca1e814a851 775 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_OTAPLOCKOUT_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 776 return;
APS_Lab 0:8ca1e814a851 777 }
APS_Lab 0:8ca1e814a851 778
APS_Lab 0:8ca1e814a851 779 // cast the replyContent
APS_Lab 0:8ca1e814a851 780 reply = (dn_ipmt_setParameter_OTAPLockout_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 781
APS_Lab 0:8ca1e814a851 782 // store RC
APS_Lab 0:8ca1e814a851 783 reply->RC = rc;
APS_Lab 0:8ca1e814a851 784
APS_Lab 0:8ca1e814a851 785 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 786 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 787
APS_Lab 0:8ca1e814a851 788 }
APS_Lab 0:8ca1e814a851 789
APS_Lab 0:8ca1e814a851 790 // call the callback
APS_Lab 0:8ca1e814a851 791 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 792
APS_Lab 0:8ca1e814a851 793 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 794 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 795 }
APS_Lab 0:8ca1e814a851 796
APS_Lab 0:8ca1e814a851 797 //===== setParameter_routingMode
APS_Lab 0:8ca1e814a851 798
APS_Lab 0:8ca1e814a851 799 /**
APS_Lab 0:8ca1e814a851 800 This command allows the microprocessor to control whether the mote will become
APS_Lab 0:8ca1e814a851 801 a router once joined the network. If disabled, the manager will keep the mote a
APS_Lab 0:8ca1e814a851 802 leaf node.
APS_Lab 0:8ca1e814a851 803 */
APS_Lab 0:8ca1e814a851 804 dn_err_t dn_ipmt_setParameter_routingMode(bool mode, dn_ipmt_setParameter_routingMode_rpt* reply) {
APS_Lab 0:8ca1e814a851 805 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 806 dn_err_t rc;
APS_Lab 0:8ca1e814a851 807
APS_Lab 0:8ca1e814a851 808 // lock the module
APS_Lab 0:8ca1e814a851 809 dn_lock();
APS_Lab 0:8ca1e814a851 810
APS_Lab 0:8ca1e814a851 811 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 812 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 813 // unlock the module
APS_Lab 0:8ca1e814a851 814 dn_unlock();
APS_Lab 0:8ca1e814a851 815
APS_Lab 0:8ca1e814a851 816 // return
APS_Lab 0:8ca1e814a851 817 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 818 }
APS_Lab 0:8ca1e814a851 819
APS_Lab 0:8ca1e814a851 820 // store callback information
APS_Lab 0:8ca1e814a851 821 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 822 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 823 dn_ipmt_vars.paramId = PARAMID_ROUTINGMODE;
APS_Lab 0:8ca1e814a851 824
APS_Lab 0:8ca1e814a851 825 // extraFlags
APS_Lab 0:8ca1e814a851 826 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 827
APS_Lab 0:8ca1e814a851 828 // build outputBuf
APS_Lab 0:8ca1e814a851 829 dn_ipmt_vars.outputBuf[0] = PARAMID_ROUTINGMODE;
APS_Lab 0:8ca1e814a851 830 dn_ipmt_vars.outputBuf[DN_SETPARAMETER_ROUTINGMODE_REQ_OFFS_MODE] = mode;
APS_Lab 0:8ca1e814a851 831
APS_Lab 0:8ca1e814a851 832 // send outputBuf
APS_Lab 0:8ca1e814a851 833 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 834 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 835 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 836 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 837 DN_SETPARAMETER_ROUTINGMODE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 838 dn_ipmt_setParameter_routingMode_reply // replyCb
APS_Lab 0:8ca1e814a851 839 );
APS_Lab 0:8ca1e814a851 840
APS_Lab 0:8ca1e814a851 841 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 842 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 843 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 844 }
APS_Lab 0:8ca1e814a851 845
APS_Lab 0:8ca1e814a851 846 // unlock the module
APS_Lab 0:8ca1e814a851 847 dn_unlock();
APS_Lab 0:8ca1e814a851 848
APS_Lab 0:8ca1e814a851 849 return rc;
APS_Lab 0:8ca1e814a851 850
APS_Lab 0:8ca1e814a851 851 }
APS_Lab 0:8ca1e814a851 852
APS_Lab 0:8ca1e814a851 853 void dn_ipmt_setParameter_routingMode_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 854 dn_ipmt_setParameter_routingMode_rpt* reply;
APS_Lab 0:8ca1e814a851 855 uint8_t paramId;
APS_Lab 0:8ca1e814a851 856
APS_Lab 0:8ca1e814a851 857 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 858 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 859 return;
APS_Lab 0:8ca1e814a851 860 }
APS_Lab 0:8ca1e814a851 861
APS_Lab 0:8ca1e814a851 862 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 863 paramId = payload[0];
APS_Lab 0:8ca1e814a851 864 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 865 return;
APS_Lab 0:8ca1e814a851 866 }
APS_Lab 0:8ca1e814a851 867
APS_Lab 0:8ca1e814a851 868 // verify length
APS_Lab 0:8ca1e814a851 869 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_ROUTINGMODE_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 870 return;
APS_Lab 0:8ca1e814a851 871 }
APS_Lab 0:8ca1e814a851 872
APS_Lab 0:8ca1e814a851 873 // cast the replyContent
APS_Lab 0:8ca1e814a851 874 reply = (dn_ipmt_setParameter_routingMode_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 875
APS_Lab 0:8ca1e814a851 876 // store RC
APS_Lab 0:8ca1e814a851 877 reply->RC = rc;
APS_Lab 0:8ca1e814a851 878
APS_Lab 0:8ca1e814a851 879 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 880 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 881
APS_Lab 0:8ca1e814a851 882 }
APS_Lab 0:8ca1e814a851 883
APS_Lab 0:8ca1e814a851 884 // call the callback
APS_Lab 0:8ca1e814a851 885 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 886
APS_Lab 0:8ca1e814a851 887 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 888 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 889 }
APS_Lab 0:8ca1e814a851 890
APS_Lab 0:8ca1e814a851 891 //===== setParameter_powerSrcInfo
APS_Lab 0:8ca1e814a851 892
APS_Lab 0:8ca1e814a851 893 /**
APS_Lab 0:8ca1e814a851 894 This command allows the microprocessor to configure power source information on
APS_Lab 0:8ca1e814a851 895 the device. This setting is persistent and is used at network join time.
APS_Lab 0:8ca1e814a851 896 */
APS_Lab 0:8ca1e814a851 897 dn_err_t dn_ipmt_setParameter_powerSrcInfo(uint16_t maxStCurrent, uint8_t minLifetime, uint16_t currentLimit_0, uint16_t dischargePeriod_0, uint16_t rechargePeriod_0, uint16_t currentLimit_1, uint16_t dischargePeriod_1, uint16_t rechargePeriod_1, uint16_t currentLimit_2, uint16_t dischargePeriod_2, uint16_t rechargePeriod_2, dn_ipmt_setParameter_powerSrcInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 898 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 899 dn_err_t rc;
APS_Lab 0:8ca1e814a851 900
APS_Lab 0:8ca1e814a851 901 // lock the module
APS_Lab 0:8ca1e814a851 902 dn_lock();
APS_Lab 0:8ca1e814a851 903
APS_Lab 0:8ca1e814a851 904 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 905 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 906 // unlock the module
APS_Lab 0:8ca1e814a851 907 dn_unlock();
APS_Lab 0:8ca1e814a851 908
APS_Lab 0:8ca1e814a851 909 // return
APS_Lab 0:8ca1e814a851 910 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 911 }
APS_Lab 0:8ca1e814a851 912
APS_Lab 0:8ca1e814a851 913 // store callback information
APS_Lab 0:8ca1e814a851 914 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 915 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 916 dn_ipmt_vars.paramId = PARAMID_POWERSRCINFO;
APS_Lab 0:8ca1e814a851 917
APS_Lab 0:8ca1e814a851 918 // extraFlags
APS_Lab 0:8ca1e814a851 919 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 920
APS_Lab 0:8ca1e814a851 921 // build outputBuf
APS_Lab 0:8ca1e814a851 922 dn_ipmt_vars.outputBuf[0] = PARAMID_POWERSRCINFO;
APS_Lab 0:8ca1e814a851 923 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_MAXSTCURRENT],maxStCurrent);
APS_Lab 0:8ca1e814a851 924 dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_MINLIFETIME] = minLifetime;
APS_Lab 0:8ca1e814a851 925 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_CURRENTLIMIT_0],currentLimit_0);
APS_Lab 0:8ca1e814a851 926 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_DISCHARGEPERIOD_0],dischargePeriod_0);
APS_Lab 0:8ca1e814a851 927 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_RECHARGEPERIOD_0],rechargePeriod_0);
APS_Lab 0:8ca1e814a851 928 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_CURRENTLIMIT_1],currentLimit_1);
APS_Lab 0:8ca1e814a851 929 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_DISCHARGEPERIOD_1],dischargePeriod_1);
APS_Lab 0:8ca1e814a851 930 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_RECHARGEPERIOD_1],rechargePeriod_1);
APS_Lab 0:8ca1e814a851 931 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_CURRENTLIMIT_2],currentLimit_2);
APS_Lab 0:8ca1e814a851 932 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_DISCHARGEPERIOD_2],dischargePeriod_2);
APS_Lab 0:8ca1e814a851 933 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_POWERSRCINFO_REQ_OFFS_RECHARGEPERIOD_2],rechargePeriod_2);
APS_Lab 0:8ca1e814a851 934
APS_Lab 0:8ca1e814a851 935 // send outputBuf
APS_Lab 0:8ca1e814a851 936 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 937 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 938 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 939 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 940 DN_SETPARAMETER_POWERSRCINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 941 dn_ipmt_setParameter_powerSrcInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 942 );
APS_Lab 0:8ca1e814a851 943
APS_Lab 0:8ca1e814a851 944 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 945 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 946 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 947 }
APS_Lab 0:8ca1e814a851 948
APS_Lab 0:8ca1e814a851 949 // unlock the module
APS_Lab 0:8ca1e814a851 950 dn_unlock();
APS_Lab 0:8ca1e814a851 951
APS_Lab 0:8ca1e814a851 952 return rc;
APS_Lab 0:8ca1e814a851 953
APS_Lab 0:8ca1e814a851 954 }
APS_Lab 0:8ca1e814a851 955
APS_Lab 0:8ca1e814a851 956 void dn_ipmt_setParameter_powerSrcInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 957 dn_ipmt_setParameter_powerSrcInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 958 uint8_t paramId;
APS_Lab 0:8ca1e814a851 959
APS_Lab 0:8ca1e814a851 960 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 961 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 962 return;
APS_Lab 0:8ca1e814a851 963 }
APS_Lab 0:8ca1e814a851 964
APS_Lab 0:8ca1e814a851 965 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 966 paramId = payload[0];
APS_Lab 0:8ca1e814a851 967 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 968 return;
APS_Lab 0:8ca1e814a851 969 }
APS_Lab 0:8ca1e814a851 970
APS_Lab 0:8ca1e814a851 971 // verify length
APS_Lab 0:8ca1e814a851 972 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_POWERSRCINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 973 return;
APS_Lab 0:8ca1e814a851 974 }
APS_Lab 0:8ca1e814a851 975
APS_Lab 0:8ca1e814a851 976 // cast the replyContent
APS_Lab 0:8ca1e814a851 977 reply = (dn_ipmt_setParameter_powerSrcInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 978
APS_Lab 0:8ca1e814a851 979 // store RC
APS_Lab 0:8ca1e814a851 980 reply->RC = rc;
APS_Lab 0:8ca1e814a851 981
APS_Lab 0:8ca1e814a851 982 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 983 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 984
APS_Lab 0:8ca1e814a851 985 }
APS_Lab 0:8ca1e814a851 986
APS_Lab 0:8ca1e814a851 987 // call the callback
APS_Lab 0:8ca1e814a851 988 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 989
APS_Lab 0:8ca1e814a851 990 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 991 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 992 }
APS_Lab 0:8ca1e814a851 993
APS_Lab 0:8ca1e814a851 994 //===== setParameter_advKey
APS_Lab 0:8ca1e814a851 995
APS_Lab 0:8ca1e814a851 996 /**
APS_Lab 0:8ca1e814a851 997 Sets the Advertisement MIC key - this key is used to authenticate
APS_Lab 0:8ca1e814a851 998 advertisements, and can be set per vendor/installation to prevent unauthorized
APS_Lab 0:8ca1e814a851 999 devices from being able to respond to advertisements. If changed, it must match
APS_Lab 0:8ca1e814a851 1000 that set on the corresponding AP (using mset on the manager CLI) in order for
APS_Lab 0:8ca1e814a851 1001 the mote to join. It can be reset to default via the clearNV command.
APS_Lab 0:8ca1e814a851 1002 */
APS_Lab 0:8ca1e814a851 1003 dn_err_t dn_ipmt_setParameter_advKey(uint8_t* advKey, dn_ipmt_setParameter_advKey_rpt* reply) {
APS_Lab 0:8ca1e814a851 1004 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1005 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1006
APS_Lab 0:8ca1e814a851 1007 // lock the module
APS_Lab 0:8ca1e814a851 1008 dn_lock();
APS_Lab 0:8ca1e814a851 1009
APS_Lab 0:8ca1e814a851 1010 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1011 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1012 // unlock the module
APS_Lab 0:8ca1e814a851 1013 dn_unlock();
APS_Lab 0:8ca1e814a851 1014
APS_Lab 0:8ca1e814a851 1015 // return
APS_Lab 0:8ca1e814a851 1016 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1017 }
APS_Lab 0:8ca1e814a851 1018
APS_Lab 0:8ca1e814a851 1019 // store callback information
APS_Lab 0:8ca1e814a851 1020 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 1021 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1022 dn_ipmt_vars.paramId = PARAMID_ADVKEY;
APS_Lab 0:8ca1e814a851 1023
APS_Lab 0:8ca1e814a851 1024 // extraFlags
APS_Lab 0:8ca1e814a851 1025 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1026
APS_Lab 0:8ca1e814a851 1027 // build outputBuf
APS_Lab 0:8ca1e814a851 1028 dn_ipmt_vars.outputBuf[0] = PARAMID_ADVKEY;
APS_Lab 0:8ca1e814a851 1029 memcpy(&dn_ipmt_vars.outputBuf[DN_SETPARAMETER_ADVKEY_REQ_OFFS_ADVKEY],advKey,16);
APS_Lab 0:8ca1e814a851 1030
APS_Lab 0:8ca1e814a851 1031 // send outputBuf
APS_Lab 0:8ca1e814a851 1032 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1033 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1034 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1035 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1036 DN_SETPARAMETER_ADVKEY_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1037 dn_ipmt_setParameter_advKey_reply // replyCb
APS_Lab 0:8ca1e814a851 1038 );
APS_Lab 0:8ca1e814a851 1039
APS_Lab 0:8ca1e814a851 1040 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1041 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1042 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1043 }
APS_Lab 0:8ca1e814a851 1044
APS_Lab 0:8ca1e814a851 1045 // unlock the module
APS_Lab 0:8ca1e814a851 1046 dn_unlock();
APS_Lab 0:8ca1e814a851 1047
APS_Lab 0:8ca1e814a851 1048 return rc;
APS_Lab 0:8ca1e814a851 1049
APS_Lab 0:8ca1e814a851 1050 }
APS_Lab 0:8ca1e814a851 1051
APS_Lab 0:8ca1e814a851 1052 void dn_ipmt_setParameter_advKey_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1053 dn_ipmt_setParameter_advKey_rpt* reply;
APS_Lab 0:8ca1e814a851 1054 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1055
APS_Lab 0:8ca1e814a851 1056 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1057 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1058 return;
APS_Lab 0:8ca1e814a851 1059 }
APS_Lab 0:8ca1e814a851 1060
APS_Lab 0:8ca1e814a851 1061 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1062 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1063 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1064 return;
APS_Lab 0:8ca1e814a851 1065 }
APS_Lab 0:8ca1e814a851 1066
APS_Lab 0:8ca1e814a851 1067 // verify length
APS_Lab 0:8ca1e814a851 1068 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_ADVKEY_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1069 return;
APS_Lab 0:8ca1e814a851 1070 }
APS_Lab 0:8ca1e814a851 1071
APS_Lab 0:8ca1e814a851 1072 // cast the replyContent
APS_Lab 0:8ca1e814a851 1073 reply = (dn_ipmt_setParameter_advKey_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1074
APS_Lab 0:8ca1e814a851 1075 // store RC
APS_Lab 0:8ca1e814a851 1076 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1077
APS_Lab 0:8ca1e814a851 1078 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1079 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1080
APS_Lab 0:8ca1e814a851 1081 }
APS_Lab 0:8ca1e814a851 1082
APS_Lab 0:8ca1e814a851 1083 // call the callback
APS_Lab 0:8ca1e814a851 1084 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1085
APS_Lab 0:8ca1e814a851 1086 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1087 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1088 }
APS_Lab 0:8ca1e814a851 1089
APS_Lab 0:8ca1e814a851 1090 //===== setParameter_autoJoin
APS_Lab 0:8ca1e814a851 1091
APS_Lab 0:8ca1e814a851 1092 /**
APS_Lab 0:8ca1e814a851 1093 This command allows the microprocessor to change between automatic and manual
APS_Lab 0:8ca1e814a851 1094 joining by the mote's networking stack. In manual mode, an explicit join
APS_Lab 0:8ca1e814a851 1095 command from the application is required to initiate joining. This setting is
APS_Lab 0:8ca1e814a851 1096 persistent and takes effect after mote reset.
APS_Lab 0:8ca1e814a851 1097
APS_Lab 0:8ca1e814a851 1098 Note that auto join mode must not be set if the application is also configured
APS_Lab 0:8ca1e814a851 1099 to join (e.g combining 'auto join' with 'master' mode will result in mote not
APS_Lab 0:8ca1e814a851 1100 joining).
APS_Lab 0:8ca1e814a851 1101 */
APS_Lab 0:8ca1e814a851 1102 dn_err_t dn_ipmt_setParameter_autoJoin(bool mode, dn_ipmt_setParameter_autoJoin_rpt* reply) {
APS_Lab 0:8ca1e814a851 1103 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1104 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1105
APS_Lab 0:8ca1e814a851 1106 // lock the module
APS_Lab 0:8ca1e814a851 1107 dn_lock();
APS_Lab 0:8ca1e814a851 1108
APS_Lab 0:8ca1e814a851 1109 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1110 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1111 // unlock the module
APS_Lab 0:8ca1e814a851 1112 dn_unlock();
APS_Lab 0:8ca1e814a851 1113
APS_Lab 0:8ca1e814a851 1114 // return
APS_Lab 0:8ca1e814a851 1115 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1116 }
APS_Lab 0:8ca1e814a851 1117
APS_Lab 0:8ca1e814a851 1118 // store callback information
APS_Lab 0:8ca1e814a851 1119 dn_ipmt_vars.cmdId = CMDID_SETPARAMETER;
APS_Lab 0:8ca1e814a851 1120 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1121 dn_ipmt_vars.paramId = PARAMID_AUTOJOIN;
APS_Lab 0:8ca1e814a851 1122
APS_Lab 0:8ca1e814a851 1123 // extraFlags
APS_Lab 0:8ca1e814a851 1124 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1125
APS_Lab 0:8ca1e814a851 1126 // build outputBuf
APS_Lab 0:8ca1e814a851 1127 dn_ipmt_vars.outputBuf[0] = PARAMID_AUTOJOIN;
APS_Lab 0:8ca1e814a851 1128 dn_ipmt_vars.outputBuf[DN_SETPARAMETER_AUTOJOIN_REQ_OFFS_MODE] = mode;
APS_Lab 0:8ca1e814a851 1129
APS_Lab 0:8ca1e814a851 1130 // send outputBuf
APS_Lab 0:8ca1e814a851 1131 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1132 CMDID_SETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1133 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1134 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1135 DN_SETPARAMETER_AUTOJOIN_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1136 dn_ipmt_setParameter_autoJoin_reply // replyCb
APS_Lab 0:8ca1e814a851 1137 );
APS_Lab 0:8ca1e814a851 1138
APS_Lab 0:8ca1e814a851 1139 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1140 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1141 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1142 }
APS_Lab 0:8ca1e814a851 1143
APS_Lab 0:8ca1e814a851 1144 // unlock the module
APS_Lab 0:8ca1e814a851 1145 dn_unlock();
APS_Lab 0:8ca1e814a851 1146
APS_Lab 0:8ca1e814a851 1147 return rc;
APS_Lab 0:8ca1e814a851 1148
APS_Lab 0:8ca1e814a851 1149 }
APS_Lab 0:8ca1e814a851 1150
APS_Lab 0:8ca1e814a851 1151 void dn_ipmt_setParameter_autoJoin_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1152 dn_ipmt_setParameter_autoJoin_rpt* reply;
APS_Lab 0:8ca1e814a851 1153 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1154
APS_Lab 0:8ca1e814a851 1155 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1156 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1157 return;
APS_Lab 0:8ca1e814a851 1158 }
APS_Lab 0:8ca1e814a851 1159
APS_Lab 0:8ca1e814a851 1160 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1161 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1162 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1163 return;
APS_Lab 0:8ca1e814a851 1164 }
APS_Lab 0:8ca1e814a851 1165
APS_Lab 0:8ca1e814a851 1166 // verify length
APS_Lab 0:8ca1e814a851 1167 if (rc==DN_SERIAL_RC_OK && len<DN_SETPARAMETER_AUTOJOIN_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1168 return;
APS_Lab 0:8ca1e814a851 1169 }
APS_Lab 0:8ca1e814a851 1170
APS_Lab 0:8ca1e814a851 1171 // cast the replyContent
APS_Lab 0:8ca1e814a851 1172 reply = (dn_ipmt_setParameter_autoJoin_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1173
APS_Lab 0:8ca1e814a851 1174 // store RC
APS_Lab 0:8ca1e814a851 1175 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1176
APS_Lab 0:8ca1e814a851 1177 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1178 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1179
APS_Lab 0:8ca1e814a851 1180 }
APS_Lab 0:8ca1e814a851 1181
APS_Lab 0:8ca1e814a851 1182 // call the callback
APS_Lab 0:8ca1e814a851 1183 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1184
APS_Lab 0:8ca1e814a851 1185 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1186 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1187 }
APS_Lab 0:8ca1e814a851 1188
APS_Lab 0:8ca1e814a851 1189 //===== getParameter_macAddress
APS_Lab 0:8ca1e814a851 1190
APS_Lab 0:8ca1e814a851 1191 /**
APS_Lab 0:8ca1e814a851 1192 This command returns the MAC address of the device. By default, the MAC address
APS_Lab 0:8ca1e814a851 1193 returned is the EUI64 address of the device assigned by mote manufacturer, but
APS_Lab 0:8ca1e814a851 1194 it may be overwritten using the setParameter<macAddress> command.
APS_Lab 0:8ca1e814a851 1195 */
APS_Lab 0:8ca1e814a851 1196 dn_err_t dn_ipmt_getParameter_macAddress(dn_ipmt_getParameter_macAddress_rpt* reply) {
APS_Lab 0:8ca1e814a851 1197 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1198 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1199
APS_Lab 0:8ca1e814a851 1200 // lock the module
APS_Lab 0:8ca1e814a851 1201 dn_lock();
APS_Lab 0:8ca1e814a851 1202
APS_Lab 0:8ca1e814a851 1203 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1204 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1205 // unlock the module
APS_Lab 0:8ca1e814a851 1206 dn_unlock();
APS_Lab 0:8ca1e814a851 1207
APS_Lab 0:8ca1e814a851 1208 // return
APS_Lab 0:8ca1e814a851 1209 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1210 }
APS_Lab 0:8ca1e814a851 1211
APS_Lab 0:8ca1e814a851 1212 // store callback information
APS_Lab 0:8ca1e814a851 1213 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1214 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1215 dn_ipmt_vars.paramId = PARAMID_MACADDRESS;
APS_Lab 0:8ca1e814a851 1216
APS_Lab 0:8ca1e814a851 1217 // extraFlags
APS_Lab 0:8ca1e814a851 1218 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1219
APS_Lab 0:8ca1e814a851 1220 // build outputBuf
APS_Lab 0:8ca1e814a851 1221 dn_ipmt_vars.outputBuf[0] = PARAMID_MACADDRESS;
APS_Lab 0:8ca1e814a851 1222
APS_Lab 0:8ca1e814a851 1223 // send outputBuf
APS_Lab 0:8ca1e814a851 1224 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1225 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1226 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1227 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1228 DN_GETPARAMETER_MACADDRESS_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1229 dn_ipmt_getParameter_macAddress_reply // replyCb
APS_Lab 0:8ca1e814a851 1230 );
APS_Lab 0:8ca1e814a851 1231
APS_Lab 0:8ca1e814a851 1232 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1233 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1234 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1235 }
APS_Lab 0:8ca1e814a851 1236
APS_Lab 0:8ca1e814a851 1237 // unlock the module
APS_Lab 0:8ca1e814a851 1238 dn_unlock();
APS_Lab 0:8ca1e814a851 1239
APS_Lab 0:8ca1e814a851 1240 return rc;
APS_Lab 0:8ca1e814a851 1241
APS_Lab 0:8ca1e814a851 1242 }
APS_Lab 0:8ca1e814a851 1243
APS_Lab 0:8ca1e814a851 1244 void dn_ipmt_getParameter_macAddress_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1245 dn_ipmt_getParameter_macAddress_rpt* reply;
APS_Lab 0:8ca1e814a851 1246 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1247
APS_Lab 0:8ca1e814a851 1248 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1249 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1250 return;
APS_Lab 0:8ca1e814a851 1251 }
APS_Lab 0:8ca1e814a851 1252
APS_Lab 0:8ca1e814a851 1253 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1254 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1255 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1256 return;
APS_Lab 0:8ca1e814a851 1257 }
APS_Lab 0:8ca1e814a851 1258
APS_Lab 0:8ca1e814a851 1259 // verify length
APS_Lab 0:8ca1e814a851 1260 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_MACADDRESS_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1261 return;
APS_Lab 0:8ca1e814a851 1262 }
APS_Lab 0:8ca1e814a851 1263
APS_Lab 0:8ca1e814a851 1264 // cast the replyContent
APS_Lab 0:8ca1e814a851 1265 reply = (dn_ipmt_getParameter_macAddress_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1266
APS_Lab 0:8ca1e814a851 1267 // store RC
APS_Lab 0:8ca1e814a851 1268 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1269
APS_Lab 0:8ca1e814a851 1270 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1271 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1272
APS_Lab 0:8ca1e814a851 1273 memcpy(&reply->macAddress[0],&payload[DN_GETPARAMETER_MACADDRESS_REPLY_OFFS_MACADDRESS],8);
APS_Lab 0:8ca1e814a851 1274 }
APS_Lab 0:8ca1e814a851 1275
APS_Lab 0:8ca1e814a851 1276 // call the callback
APS_Lab 0:8ca1e814a851 1277 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1278
APS_Lab 0:8ca1e814a851 1279 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1280 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1281 }
APS_Lab 0:8ca1e814a851 1282
APS_Lab 0:8ca1e814a851 1283 //===== getParameter_networkId
APS_Lab 0:8ca1e814a851 1284
APS_Lab 0:8ca1e814a851 1285 /**
APS_Lab 0:8ca1e814a851 1286 This command returns the network id stored in mote's persistent storage.
APS_Lab 0:8ca1e814a851 1287 */
APS_Lab 0:8ca1e814a851 1288 dn_err_t dn_ipmt_getParameter_networkId(dn_ipmt_getParameter_networkId_rpt* reply) {
APS_Lab 0:8ca1e814a851 1289 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1290 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1291
APS_Lab 0:8ca1e814a851 1292 // lock the module
APS_Lab 0:8ca1e814a851 1293 dn_lock();
APS_Lab 0:8ca1e814a851 1294
APS_Lab 0:8ca1e814a851 1295 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1296 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1297 // unlock the module
APS_Lab 0:8ca1e814a851 1298 dn_unlock();
APS_Lab 0:8ca1e814a851 1299
APS_Lab 0:8ca1e814a851 1300 // return
APS_Lab 0:8ca1e814a851 1301 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1302 }
APS_Lab 0:8ca1e814a851 1303
APS_Lab 0:8ca1e814a851 1304 // store callback information
APS_Lab 0:8ca1e814a851 1305 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1306 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1307 dn_ipmt_vars.paramId = PARAMID_NETWORKID;
APS_Lab 0:8ca1e814a851 1308
APS_Lab 0:8ca1e814a851 1309 // extraFlags
APS_Lab 0:8ca1e814a851 1310 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1311
APS_Lab 0:8ca1e814a851 1312 // build outputBuf
APS_Lab 0:8ca1e814a851 1313 dn_ipmt_vars.outputBuf[0] = PARAMID_NETWORKID;
APS_Lab 0:8ca1e814a851 1314
APS_Lab 0:8ca1e814a851 1315 // send outputBuf
APS_Lab 0:8ca1e814a851 1316 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1317 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1318 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1319 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1320 DN_GETPARAMETER_NETWORKID_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1321 dn_ipmt_getParameter_networkId_reply // replyCb
APS_Lab 0:8ca1e814a851 1322 );
APS_Lab 0:8ca1e814a851 1323
APS_Lab 0:8ca1e814a851 1324 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1325 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1326 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1327 }
APS_Lab 0:8ca1e814a851 1328
APS_Lab 0:8ca1e814a851 1329 // unlock the module
APS_Lab 0:8ca1e814a851 1330 dn_unlock();
APS_Lab 0:8ca1e814a851 1331
APS_Lab 0:8ca1e814a851 1332 return rc;
APS_Lab 0:8ca1e814a851 1333
APS_Lab 0:8ca1e814a851 1334 }
APS_Lab 0:8ca1e814a851 1335
APS_Lab 0:8ca1e814a851 1336 void dn_ipmt_getParameter_networkId_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1337 dn_ipmt_getParameter_networkId_rpt* reply;
APS_Lab 0:8ca1e814a851 1338 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1339
APS_Lab 0:8ca1e814a851 1340 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1341 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1342 return;
APS_Lab 0:8ca1e814a851 1343 }
APS_Lab 0:8ca1e814a851 1344
APS_Lab 0:8ca1e814a851 1345 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1346 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1347 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1348 return;
APS_Lab 0:8ca1e814a851 1349 }
APS_Lab 0:8ca1e814a851 1350
APS_Lab 0:8ca1e814a851 1351 // verify length
APS_Lab 0:8ca1e814a851 1352 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_NETWORKID_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1353 return;
APS_Lab 0:8ca1e814a851 1354 }
APS_Lab 0:8ca1e814a851 1355
APS_Lab 0:8ca1e814a851 1356 // cast the replyContent
APS_Lab 0:8ca1e814a851 1357 reply = (dn_ipmt_getParameter_networkId_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1358
APS_Lab 0:8ca1e814a851 1359 // store RC
APS_Lab 0:8ca1e814a851 1360 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1361
APS_Lab 0:8ca1e814a851 1362 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1363 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1364
APS_Lab 0:8ca1e814a851 1365 dn_read_uint16_t(&reply->networkId,&payload[DN_GETPARAMETER_NETWORKID_REPLY_OFFS_NETWORKID]);
APS_Lab 0:8ca1e814a851 1366 }
APS_Lab 0:8ca1e814a851 1367
APS_Lab 0:8ca1e814a851 1368 // call the callback
APS_Lab 0:8ca1e814a851 1369 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1370
APS_Lab 0:8ca1e814a851 1371 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1372 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1373 }
APS_Lab 0:8ca1e814a851 1374
APS_Lab 0:8ca1e814a851 1375 //===== getParameter_txPower
APS_Lab 0:8ca1e814a851 1376
APS_Lab 0:8ca1e814a851 1377 /**
APS_Lab 0:8ca1e814a851 1378 Get the radio output power in dBm, excluding any antenna gain.
APS_Lab 0:8ca1e814a851 1379 */
APS_Lab 0:8ca1e814a851 1380 dn_err_t dn_ipmt_getParameter_txPower(dn_ipmt_getParameter_txPower_rpt* reply) {
APS_Lab 0:8ca1e814a851 1381 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1382 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1383
APS_Lab 0:8ca1e814a851 1384 // lock the module
APS_Lab 0:8ca1e814a851 1385 dn_lock();
APS_Lab 0:8ca1e814a851 1386
APS_Lab 0:8ca1e814a851 1387 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1388 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1389 // unlock the module
APS_Lab 0:8ca1e814a851 1390 dn_unlock();
APS_Lab 0:8ca1e814a851 1391
APS_Lab 0:8ca1e814a851 1392 // return
APS_Lab 0:8ca1e814a851 1393 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1394 }
APS_Lab 0:8ca1e814a851 1395
APS_Lab 0:8ca1e814a851 1396 // store callback information
APS_Lab 0:8ca1e814a851 1397 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1398 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1399 dn_ipmt_vars.paramId = PARAMID_TXPOWER;
APS_Lab 0:8ca1e814a851 1400
APS_Lab 0:8ca1e814a851 1401 // extraFlags
APS_Lab 0:8ca1e814a851 1402 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1403
APS_Lab 0:8ca1e814a851 1404 // build outputBuf
APS_Lab 0:8ca1e814a851 1405 dn_ipmt_vars.outputBuf[0] = PARAMID_TXPOWER;
APS_Lab 0:8ca1e814a851 1406
APS_Lab 0:8ca1e814a851 1407 // send outputBuf
APS_Lab 0:8ca1e814a851 1408 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1409 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1410 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1411 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1412 DN_GETPARAMETER_TXPOWER_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1413 dn_ipmt_getParameter_txPower_reply // replyCb
APS_Lab 0:8ca1e814a851 1414 );
APS_Lab 0:8ca1e814a851 1415
APS_Lab 0:8ca1e814a851 1416 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1417 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1418 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1419 }
APS_Lab 0:8ca1e814a851 1420
APS_Lab 0:8ca1e814a851 1421 // unlock the module
APS_Lab 0:8ca1e814a851 1422 dn_unlock();
APS_Lab 0:8ca1e814a851 1423
APS_Lab 0:8ca1e814a851 1424 return rc;
APS_Lab 0:8ca1e814a851 1425
APS_Lab 0:8ca1e814a851 1426 }
APS_Lab 0:8ca1e814a851 1427
APS_Lab 0:8ca1e814a851 1428 void dn_ipmt_getParameter_txPower_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1429 dn_ipmt_getParameter_txPower_rpt* reply;
APS_Lab 0:8ca1e814a851 1430 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1431
APS_Lab 0:8ca1e814a851 1432 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1433 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1434 return;
APS_Lab 0:8ca1e814a851 1435 }
APS_Lab 0:8ca1e814a851 1436
APS_Lab 0:8ca1e814a851 1437 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1438 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1439 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1440 return;
APS_Lab 0:8ca1e814a851 1441 }
APS_Lab 0:8ca1e814a851 1442
APS_Lab 0:8ca1e814a851 1443 // verify length
APS_Lab 0:8ca1e814a851 1444 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_TXPOWER_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1445 return;
APS_Lab 0:8ca1e814a851 1446 }
APS_Lab 0:8ca1e814a851 1447
APS_Lab 0:8ca1e814a851 1448 // cast the replyContent
APS_Lab 0:8ca1e814a851 1449 reply = (dn_ipmt_getParameter_txPower_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1450
APS_Lab 0:8ca1e814a851 1451 // store RC
APS_Lab 0:8ca1e814a851 1452 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1453
APS_Lab 0:8ca1e814a851 1454 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1455 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1456
APS_Lab 0:8ca1e814a851 1457 reply->txPower = (int8_t)payload[DN_GETPARAMETER_TXPOWER_REPLY_OFFS_TXPOWER];
APS_Lab 0:8ca1e814a851 1458 }
APS_Lab 0:8ca1e814a851 1459
APS_Lab 0:8ca1e814a851 1460 // call the callback
APS_Lab 0:8ca1e814a851 1461 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1462
APS_Lab 0:8ca1e814a851 1463 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1464 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1465 }
APS_Lab 0:8ca1e814a851 1466
APS_Lab 0:8ca1e814a851 1467 //===== getParameter_joinDutyCycle
APS_Lab 0:8ca1e814a851 1468
APS_Lab 0:8ca1e814a851 1469 /**
APS_Lab 0:8ca1e814a851 1470 This command allows user to retrieve current value of joinDutyCycle parameter.
APS_Lab 0:8ca1e814a851 1471 */
APS_Lab 0:8ca1e814a851 1472 dn_err_t dn_ipmt_getParameter_joinDutyCycle(dn_ipmt_getParameter_joinDutyCycle_rpt* reply) {
APS_Lab 0:8ca1e814a851 1473 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1474 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1475
APS_Lab 0:8ca1e814a851 1476 // lock the module
APS_Lab 0:8ca1e814a851 1477 dn_lock();
APS_Lab 0:8ca1e814a851 1478
APS_Lab 0:8ca1e814a851 1479 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1480 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1481 // unlock the module
APS_Lab 0:8ca1e814a851 1482 dn_unlock();
APS_Lab 0:8ca1e814a851 1483
APS_Lab 0:8ca1e814a851 1484 // return
APS_Lab 0:8ca1e814a851 1485 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1486 }
APS_Lab 0:8ca1e814a851 1487
APS_Lab 0:8ca1e814a851 1488 // store callback information
APS_Lab 0:8ca1e814a851 1489 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1490 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1491 dn_ipmt_vars.paramId = PARAMID_JOINDUTYCYCLE;
APS_Lab 0:8ca1e814a851 1492
APS_Lab 0:8ca1e814a851 1493 // extraFlags
APS_Lab 0:8ca1e814a851 1494 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1495
APS_Lab 0:8ca1e814a851 1496 // build outputBuf
APS_Lab 0:8ca1e814a851 1497 dn_ipmt_vars.outputBuf[0] = PARAMID_JOINDUTYCYCLE;
APS_Lab 0:8ca1e814a851 1498
APS_Lab 0:8ca1e814a851 1499 // send outputBuf
APS_Lab 0:8ca1e814a851 1500 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1501 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1502 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1503 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1504 DN_GETPARAMETER_JOINDUTYCYCLE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1505 dn_ipmt_getParameter_joinDutyCycle_reply // replyCb
APS_Lab 0:8ca1e814a851 1506 );
APS_Lab 0:8ca1e814a851 1507
APS_Lab 0:8ca1e814a851 1508 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1509 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1510 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1511 }
APS_Lab 0:8ca1e814a851 1512
APS_Lab 0:8ca1e814a851 1513 // unlock the module
APS_Lab 0:8ca1e814a851 1514 dn_unlock();
APS_Lab 0:8ca1e814a851 1515
APS_Lab 0:8ca1e814a851 1516 return rc;
APS_Lab 0:8ca1e814a851 1517
APS_Lab 0:8ca1e814a851 1518 }
APS_Lab 0:8ca1e814a851 1519
APS_Lab 0:8ca1e814a851 1520 void dn_ipmt_getParameter_joinDutyCycle_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1521 dn_ipmt_getParameter_joinDutyCycle_rpt* reply;
APS_Lab 0:8ca1e814a851 1522 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1523
APS_Lab 0:8ca1e814a851 1524 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1525 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1526 return;
APS_Lab 0:8ca1e814a851 1527 }
APS_Lab 0:8ca1e814a851 1528
APS_Lab 0:8ca1e814a851 1529 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1530 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1531 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1532 return;
APS_Lab 0:8ca1e814a851 1533 }
APS_Lab 0:8ca1e814a851 1534
APS_Lab 0:8ca1e814a851 1535 // verify length
APS_Lab 0:8ca1e814a851 1536 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_JOINDUTYCYCLE_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1537 return;
APS_Lab 0:8ca1e814a851 1538 }
APS_Lab 0:8ca1e814a851 1539
APS_Lab 0:8ca1e814a851 1540 // cast the replyContent
APS_Lab 0:8ca1e814a851 1541 reply = (dn_ipmt_getParameter_joinDutyCycle_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1542
APS_Lab 0:8ca1e814a851 1543 // store RC
APS_Lab 0:8ca1e814a851 1544 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1545
APS_Lab 0:8ca1e814a851 1546 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1547 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1548
APS_Lab 0:8ca1e814a851 1549 reply->joinDutyCycle = payload[DN_GETPARAMETER_JOINDUTYCYCLE_REPLY_OFFS_JOINDUTYCYCLE];
APS_Lab 0:8ca1e814a851 1550 }
APS_Lab 0:8ca1e814a851 1551
APS_Lab 0:8ca1e814a851 1552 // call the callback
APS_Lab 0:8ca1e814a851 1553 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1554
APS_Lab 0:8ca1e814a851 1555 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1556 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1557 }
APS_Lab 0:8ca1e814a851 1558
APS_Lab 0:8ca1e814a851 1559 //===== getParameter_eventMask
APS_Lab 0:8ca1e814a851 1560
APS_Lab 0:8ca1e814a851 1561 /**
APS_Lab 0:8ca1e814a851 1562 getParameter<eventMask> allows the microprocessor to read the currently
APS_Lab 0:8ca1e814a851 1563 subscribed-to event types.
APS_Lab 0:8ca1e814a851 1564 */
APS_Lab 0:8ca1e814a851 1565 dn_err_t dn_ipmt_getParameter_eventMask(dn_ipmt_getParameter_eventMask_rpt* reply) {
APS_Lab 0:8ca1e814a851 1566 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1567 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1568
APS_Lab 0:8ca1e814a851 1569 // lock the module
APS_Lab 0:8ca1e814a851 1570 dn_lock();
APS_Lab 0:8ca1e814a851 1571
APS_Lab 0:8ca1e814a851 1572 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1573 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1574 // unlock the module
APS_Lab 0:8ca1e814a851 1575 dn_unlock();
APS_Lab 0:8ca1e814a851 1576
APS_Lab 0:8ca1e814a851 1577 // return
APS_Lab 0:8ca1e814a851 1578 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1579 }
APS_Lab 0:8ca1e814a851 1580
APS_Lab 0:8ca1e814a851 1581 // store callback information
APS_Lab 0:8ca1e814a851 1582 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1583 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1584 dn_ipmt_vars.paramId = PARAMID_EVENTMASK;
APS_Lab 0:8ca1e814a851 1585
APS_Lab 0:8ca1e814a851 1586 // extraFlags
APS_Lab 0:8ca1e814a851 1587 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1588
APS_Lab 0:8ca1e814a851 1589 // build outputBuf
APS_Lab 0:8ca1e814a851 1590 dn_ipmt_vars.outputBuf[0] = PARAMID_EVENTMASK;
APS_Lab 0:8ca1e814a851 1591
APS_Lab 0:8ca1e814a851 1592 // send outputBuf
APS_Lab 0:8ca1e814a851 1593 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1594 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1595 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1596 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1597 DN_GETPARAMETER_EVENTMASK_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1598 dn_ipmt_getParameter_eventMask_reply // replyCb
APS_Lab 0:8ca1e814a851 1599 );
APS_Lab 0:8ca1e814a851 1600
APS_Lab 0:8ca1e814a851 1601 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1602 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1603 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1604 }
APS_Lab 0:8ca1e814a851 1605
APS_Lab 0:8ca1e814a851 1606 // unlock the module
APS_Lab 0:8ca1e814a851 1607 dn_unlock();
APS_Lab 0:8ca1e814a851 1608
APS_Lab 0:8ca1e814a851 1609 return rc;
APS_Lab 0:8ca1e814a851 1610
APS_Lab 0:8ca1e814a851 1611 }
APS_Lab 0:8ca1e814a851 1612
APS_Lab 0:8ca1e814a851 1613 void dn_ipmt_getParameter_eventMask_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1614 dn_ipmt_getParameter_eventMask_rpt* reply;
APS_Lab 0:8ca1e814a851 1615 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1616
APS_Lab 0:8ca1e814a851 1617 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1618 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1619 return;
APS_Lab 0:8ca1e814a851 1620 }
APS_Lab 0:8ca1e814a851 1621
APS_Lab 0:8ca1e814a851 1622 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1623 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1624 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1625 return;
APS_Lab 0:8ca1e814a851 1626 }
APS_Lab 0:8ca1e814a851 1627
APS_Lab 0:8ca1e814a851 1628 // verify length
APS_Lab 0:8ca1e814a851 1629 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_EVENTMASK_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1630 return;
APS_Lab 0:8ca1e814a851 1631 }
APS_Lab 0:8ca1e814a851 1632
APS_Lab 0:8ca1e814a851 1633 // cast the replyContent
APS_Lab 0:8ca1e814a851 1634 reply = (dn_ipmt_getParameter_eventMask_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1635
APS_Lab 0:8ca1e814a851 1636 // store RC
APS_Lab 0:8ca1e814a851 1637 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1638
APS_Lab 0:8ca1e814a851 1639 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1640 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1641
APS_Lab 0:8ca1e814a851 1642 dn_read_uint32_t(&reply->eventMask,&payload[DN_GETPARAMETER_EVENTMASK_REPLY_OFFS_EVENTMASK]);
APS_Lab 0:8ca1e814a851 1643 }
APS_Lab 0:8ca1e814a851 1644
APS_Lab 0:8ca1e814a851 1645 // call the callback
APS_Lab 0:8ca1e814a851 1646 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1647
APS_Lab 0:8ca1e814a851 1648 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1649 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1650 }
APS_Lab 0:8ca1e814a851 1651
APS_Lab 0:8ca1e814a851 1652 //===== getParameter_moteInfo
APS_Lab 0:8ca1e814a851 1653
APS_Lab 0:8ca1e814a851 1654 /**
APS_Lab 0:8ca1e814a851 1655 The getParameter<moteInfo> command returns static information about the
APS_Lab 0:8ca1e814a851 1656 moteshardware and network stack software.
APS_Lab 0:8ca1e814a851 1657 */
APS_Lab 0:8ca1e814a851 1658 dn_err_t dn_ipmt_getParameter_moteInfo(dn_ipmt_getParameter_moteInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 1659 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1660 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1661
APS_Lab 0:8ca1e814a851 1662 // lock the module
APS_Lab 0:8ca1e814a851 1663 dn_lock();
APS_Lab 0:8ca1e814a851 1664
APS_Lab 0:8ca1e814a851 1665 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1666 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1667 // unlock the module
APS_Lab 0:8ca1e814a851 1668 dn_unlock();
APS_Lab 0:8ca1e814a851 1669
APS_Lab 0:8ca1e814a851 1670 // return
APS_Lab 0:8ca1e814a851 1671 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1672 }
APS_Lab 0:8ca1e814a851 1673
APS_Lab 0:8ca1e814a851 1674 // store callback information
APS_Lab 0:8ca1e814a851 1675 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1676 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1677 dn_ipmt_vars.paramId = PARAMID_MOTEINFO;
APS_Lab 0:8ca1e814a851 1678
APS_Lab 0:8ca1e814a851 1679 // extraFlags
APS_Lab 0:8ca1e814a851 1680 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1681
APS_Lab 0:8ca1e814a851 1682 // build outputBuf
APS_Lab 0:8ca1e814a851 1683 dn_ipmt_vars.outputBuf[0] = PARAMID_MOTEINFO;
APS_Lab 0:8ca1e814a851 1684
APS_Lab 0:8ca1e814a851 1685 // send outputBuf
APS_Lab 0:8ca1e814a851 1686 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1687 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1688 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1689 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1690 DN_GETPARAMETER_MOTEINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1691 dn_ipmt_getParameter_moteInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 1692 );
APS_Lab 0:8ca1e814a851 1693
APS_Lab 0:8ca1e814a851 1694 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1695 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1696 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1697 }
APS_Lab 0:8ca1e814a851 1698
APS_Lab 0:8ca1e814a851 1699 // unlock the module
APS_Lab 0:8ca1e814a851 1700 dn_unlock();
APS_Lab 0:8ca1e814a851 1701
APS_Lab 0:8ca1e814a851 1702 return rc;
APS_Lab 0:8ca1e814a851 1703
APS_Lab 0:8ca1e814a851 1704 }
APS_Lab 0:8ca1e814a851 1705
APS_Lab 0:8ca1e814a851 1706 void dn_ipmt_getParameter_moteInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1707 dn_ipmt_getParameter_moteInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 1708 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1709
APS_Lab 0:8ca1e814a851 1710 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1711 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1712 return;
APS_Lab 0:8ca1e814a851 1713 }
APS_Lab 0:8ca1e814a851 1714
APS_Lab 0:8ca1e814a851 1715 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1716 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1717 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1718 return;
APS_Lab 0:8ca1e814a851 1719 }
APS_Lab 0:8ca1e814a851 1720
APS_Lab 0:8ca1e814a851 1721 // verify length
APS_Lab 0:8ca1e814a851 1722 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_MOTEINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1723 return;
APS_Lab 0:8ca1e814a851 1724 }
APS_Lab 0:8ca1e814a851 1725
APS_Lab 0:8ca1e814a851 1726 // cast the replyContent
APS_Lab 0:8ca1e814a851 1727 reply = (dn_ipmt_getParameter_moteInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1728
APS_Lab 0:8ca1e814a851 1729 // store RC
APS_Lab 0:8ca1e814a851 1730 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1731
APS_Lab 0:8ca1e814a851 1732 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1733 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1734
APS_Lab 0:8ca1e814a851 1735 reply->apiVersion = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_APIVERSION];
APS_Lab 0:8ca1e814a851 1736 memcpy(&reply->serialNumber[0],&payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_SERIALNUMBER],8);
APS_Lab 0:8ca1e814a851 1737 reply->hwModel = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_HWMODEL];
APS_Lab 0:8ca1e814a851 1738 reply->hwRev = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_HWREV];
APS_Lab 0:8ca1e814a851 1739 reply->swVerMajor = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_SWVERMAJOR];
APS_Lab 0:8ca1e814a851 1740 reply->swVerMinor = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_SWVERMINOR];
APS_Lab 0:8ca1e814a851 1741 reply->swVerPatch = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_SWVERPATCH];
APS_Lab 0:8ca1e814a851 1742 dn_read_uint16_t(&reply->swVerBuild,&payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_SWVERBUILD]);
APS_Lab 0:8ca1e814a851 1743 reply->bootSwVer = payload[DN_GETPARAMETER_MOTEINFO_REPLY_OFFS_BOOTSWVER];
APS_Lab 0:8ca1e814a851 1744 }
APS_Lab 0:8ca1e814a851 1745
APS_Lab 0:8ca1e814a851 1746 // call the callback
APS_Lab 0:8ca1e814a851 1747 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1748
APS_Lab 0:8ca1e814a851 1749 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1750 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1751 }
APS_Lab 0:8ca1e814a851 1752
APS_Lab 0:8ca1e814a851 1753 //===== getParameter_netInfo
APS_Lab 0:8ca1e814a851 1754
APS_Lab 0:8ca1e814a851 1755 /**
APS_Lab 0:8ca1e814a851 1756 The getParameter<networkInfo> command may be used to retrieve the mote's
APS_Lab 0:8ca1e814a851 1757 network-related parameters.
APS_Lab 0:8ca1e814a851 1758 */
APS_Lab 0:8ca1e814a851 1759 dn_err_t dn_ipmt_getParameter_netInfo(dn_ipmt_getParameter_netInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 1760 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1761 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1762
APS_Lab 0:8ca1e814a851 1763 // lock the module
APS_Lab 0:8ca1e814a851 1764 dn_lock();
APS_Lab 0:8ca1e814a851 1765
APS_Lab 0:8ca1e814a851 1766 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1767 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1768 // unlock the module
APS_Lab 0:8ca1e814a851 1769 dn_unlock();
APS_Lab 0:8ca1e814a851 1770
APS_Lab 0:8ca1e814a851 1771 // return
APS_Lab 0:8ca1e814a851 1772 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1773 }
APS_Lab 0:8ca1e814a851 1774
APS_Lab 0:8ca1e814a851 1775 // store callback information
APS_Lab 0:8ca1e814a851 1776 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1777 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1778 dn_ipmt_vars.paramId = PARAMID_NETINFO;
APS_Lab 0:8ca1e814a851 1779
APS_Lab 0:8ca1e814a851 1780 // extraFlags
APS_Lab 0:8ca1e814a851 1781 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1782
APS_Lab 0:8ca1e814a851 1783 // build outputBuf
APS_Lab 0:8ca1e814a851 1784 dn_ipmt_vars.outputBuf[0] = PARAMID_NETINFO;
APS_Lab 0:8ca1e814a851 1785
APS_Lab 0:8ca1e814a851 1786 // send outputBuf
APS_Lab 0:8ca1e814a851 1787 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1788 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1789 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1790 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1791 DN_GETPARAMETER_NETINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1792 dn_ipmt_getParameter_netInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 1793 );
APS_Lab 0:8ca1e814a851 1794
APS_Lab 0:8ca1e814a851 1795 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1796 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1797 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1798 }
APS_Lab 0:8ca1e814a851 1799
APS_Lab 0:8ca1e814a851 1800 // unlock the module
APS_Lab 0:8ca1e814a851 1801 dn_unlock();
APS_Lab 0:8ca1e814a851 1802
APS_Lab 0:8ca1e814a851 1803 return rc;
APS_Lab 0:8ca1e814a851 1804
APS_Lab 0:8ca1e814a851 1805 }
APS_Lab 0:8ca1e814a851 1806
APS_Lab 0:8ca1e814a851 1807 void dn_ipmt_getParameter_netInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1808 dn_ipmt_getParameter_netInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 1809 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1810
APS_Lab 0:8ca1e814a851 1811 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1812 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1813 return;
APS_Lab 0:8ca1e814a851 1814 }
APS_Lab 0:8ca1e814a851 1815
APS_Lab 0:8ca1e814a851 1816 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1817 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1818 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1819 return;
APS_Lab 0:8ca1e814a851 1820 }
APS_Lab 0:8ca1e814a851 1821
APS_Lab 0:8ca1e814a851 1822 // verify length
APS_Lab 0:8ca1e814a851 1823 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_NETINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1824 return;
APS_Lab 0:8ca1e814a851 1825 }
APS_Lab 0:8ca1e814a851 1826
APS_Lab 0:8ca1e814a851 1827 // cast the replyContent
APS_Lab 0:8ca1e814a851 1828 reply = (dn_ipmt_getParameter_netInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1829
APS_Lab 0:8ca1e814a851 1830 // store RC
APS_Lab 0:8ca1e814a851 1831 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1832
APS_Lab 0:8ca1e814a851 1833 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1834 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1835
APS_Lab 0:8ca1e814a851 1836 memcpy(&reply->macAddress[0],&payload[DN_GETPARAMETER_NETINFO_REPLY_OFFS_MACADDRESS],8);
APS_Lab 0:8ca1e814a851 1837 dn_read_uint16_t(&reply->moteId,&payload[DN_GETPARAMETER_NETINFO_REPLY_OFFS_MOTEID]);
APS_Lab 0:8ca1e814a851 1838 dn_read_uint16_t(&reply->networkId,&payload[DN_GETPARAMETER_NETINFO_REPLY_OFFS_NETWORKID]);
APS_Lab 0:8ca1e814a851 1839 dn_read_uint16_t(&reply->slotSize,&payload[DN_GETPARAMETER_NETINFO_REPLY_OFFS_SLOTSIZE]);
APS_Lab 0:8ca1e814a851 1840 }
APS_Lab 0:8ca1e814a851 1841
APS_Lab 0:8ca1e814a851 1842 // call the callback
APS_Lab 0:8ca1e814a851 1843 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1844
APS_Lab 0:8ca1e814a851 1845 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1846 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1847 }
APS_Lab 0:8ca1e814a851 1848
APS_Lab 0:8ca1e814a851 1849 //===== getParameter_moteStatus
APS_Lab 0:8ca1e814a851 1850
APS_Lab 0:8ca1e814a851 1851 /**
APS_Lab 0:8ca1e814a851 1852 The getParameter<moteStatus> command is used to retrieve current mote state
APS_Lab 0:8ca1e814a851 1853 andother dynamic information.
APS_Lab 0:8ca1e814a851 1854 */
APS_Lab 0:8ca1e814a851 1855 dn_err_t dn_ipmt_getParameter_moteStatus(dn_ipmt_getParameter_moteStatus_rpt* reply) {
APS_Lab 0:8ca1e814a851 1856 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1857 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1858
APS_Lab 0:8ca1e814a851 1859 // lock the module
APS_Lab 0:8ca1e814a851 1860 dn_lock();
APS_Lab 0:8ca1e814a851 1861
APS_Lab 0:8ca1e814a851 1862 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1863 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1864 // unlock the module
APS_Lab 0:8ca1e814a851 1865 dn_unlock();
APS_Lab 0:8ca1e814a851 1866
APS_Lab 0:8ca1e814a851 1867 // return
APS_Lab 0:8ca1e814a851 1868 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1869 }
APS_Lab 0:8ca1e814a851 1870
APS_Lab 0:8ca1e814a851 1871 // store callback information
APS_Lab 0:8ca1e814a851 1872 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1873 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1874 dn_ipmt_vars.paramId = PARAMID_MOTESTATUS;
APS_Lab 0:8ca1e814a851 1875
APS_Lab 0:8ca1e814a851 1876 // extraFlags
APS_Lab 0:8ca1e814a851 1877 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1878
APS_Lab 0:8ca1e814a851 1879 // build outputBuf
APS_Lab 0:8ca1e814a851 1880 dn_ipmt_vars.outputBuf[0] = PARAMID_MOTESTATUS;
APS_Lab 0:8ca1e814a851 1881
APS_Lab 0:8ca1e814a851 1882 // send outputBuf
APS_Lab 0:8ca1e814a851 1883 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1884 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1885 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1886 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1887 DN_GETPARAMETER_MOTESTATUS_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1888 dn_ipmt_getParameter_moteStatus_reply // replyCb
APS_Lab 0:8ca1e814a851 1889 );
APS_Lab 0:8ca1e814a851 1890
APS_Lab 0:8ca1e814a851 1891 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1892 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1893 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1894 }
APS_Lab 0:8ca1e814a851 1895
APS_Lab 0:8ca1e814a851 1896 // unlock the module
APS_Lab 0:8ca1e814a851 1897 dn_unlock();
APS_Lab 0:8ca1e814a851 1898
APS_Lab 0:8ca1e814a851 1899 return rc;
APS_Lab 0:8ca1e814a851 1900
APS_Lab 0:8ca1e814a851 1901 }
APS_Lab 0:8ca1e814a851 1902
APS_Lab 0:8ca1e814a851 1903 void dn_ipmt_getParameter_moteStatus_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 1904 dn_ipmt_getParameter_moteStatus_rpt* reply;
APS_Lab 0:8ca1e814a851 1905 uint8_t paramId;
APS_Lab 0:8ca1e814a851 1906
APS_Lab 0:8ca1e814a851 1907 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 1908 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 1909 return;
APS_Lab 0:8ca1e814a851 1910 }
APS_Lab 0:8ca1e814a851 1911
APS_Lab 0:8ca1e814a851 1912 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 1913 paramId = payload[0];
APS_Lab 0:8ca1e814a851 1914 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 1915 return;
APS_Lab 0:8ca1e814a851 1916 }
APS_Lab 0:8ca1e814a851 1917
APS_Lab 0:8ca1e814a851 1918 // verify length
APS_Lab 0:8ca1e814a851 1919 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_MOTESTATUS_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 1920 return;
APS_Lab 0:8ca1e814a851 1921 }
APS_Lab 0:8ca1e814a851 1922
APS_Lab 0:8ca1e814a851 1923 // cast the replyContent
APS_Lab 0:8ca1e814a851 1924 reply = (dn_ipmt_getParameter_moteStatus_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 1925
APS_Lab 0:8ca1e814a851 1926 // store RC
APS_Lab 0:8ca1e814a851 1927 reply->RC = rc;
APS_Lab 0:8ca1e814a851 1928
APS_Lab 0:8ca1e814a851 1929 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 1930 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 1931
APS_Lab 0:8ca1e814a851 1932 reply->state = payload[DN_GETPARAMETER_MOTESTATUS_REPLY_OFFS_STATE];
APS_Lab 0:8ca1e814a851 1933 reply->reserved_0 = payload[DN_GETPARAMETER_MOTESTATUS_REPLY_OFFS_RESERVED_0];
APS_Lab 0:8ca1e814a851 1934 dn_read_uint16_t(&reply->reserved_1,&payload[DN_GETPARAMETER_MOTESTATUS_REPLY_OFFS_RESERVED_1]);
APS_Lab 0:8ca1e814a851 1935 reply->numParents = payload[DN_GETPARAMETER_MOTESTATUS_REPLY_OFFS_NUMPARENTS];
APS_Lab 0:8ca1e814a851 1936 dn_read_uint32_t(&reply->alarms,&payload[DN_GETPARAMETER_MOTESTATUS_REPLY_OFFS_ALARMS]);
APS_Lab 0:8ca1e814a851 1937 reply->reserved_2 = payload[DN_GETPARAMETER_MOTESTATUS_REPLY_OFFS_RESERVED_2];
APS_Lab 0:8ca1e814a851 1938 }
APS_Lab 0:8ca1e814a851 1939
APS_Lab 0:8ca1e814a851 1940 // call the callback
APS_Lab 0:8ca1e814a851 1941 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 1942
APS_Lab 0:8ca1e814a851 1943 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 1944 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 1945 }
APS_Lab 0:8ca1e814a851 1946
APS_Lab 0:8ca1e814a851 1947 //===== getParameter_time
APS_Lab 0:8ca1e814a851 1948
APS_Lab 0:8ca1e814a851 1949 /**
APS_Lab 0:8ca1e814a851 1950 The getParameter<time> command may be used to request the current time on the
APS_Lab 0:8ca1e814a851 1951 mote. The mote reports time at the moment it is processing the command, so the
APS_Lab 0:8ca1e814a851 1952 information includes variable delay. For more precise time information consider
APS_Lab 0:8ca1e814a851 1953 using TIMEn pin (see timeIndication).
APS_Lab 0:8ca1e814a851 1954 */
APS_Lab 0:8ca1e814a851 1955 dn_err_t dn_ipmt_getParameter_time(dn_ipmt_getParameter_time_rpt* reply) {
APS_Lab 0:8ca1e814a851 1956 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 1957 dn_err_t rc;
APS_Lab 0:8ca1e814a851 1958
APS_Lab 0:8ca1e814a851 1959 // lock the module
APS_Lab 0:8ca1e814a851 1960 dn_lock();
APS_Lab 0:8ca1e814a851 1961
APS_Lab 0:8ca1e814a851 1962 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 1963 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 1964 // unlock the module
APS_Lab 0:8ca1e814a851 1965 dn_unlock();
APS_Lab 0:8ca1e814a851 1966
APS_Lab 0:8ca1e814a851 1967 // return
APS_Lab 0:8ca1e814a851 1968 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 1969 }
APS_Lab 0:8ca1e814a851 1970
APS_Lab 0:8ca1e814a851 1971 // store callback information
APS_Lab 0:8ca1e814a851 1972 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 1973 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 1974 dn_ipmt_vars.paramId = PARAMID_TIME;
APS_Lab 0:8ca1e814a851 1975
APS_Lab 0:8ca1e814a851 1976 // extraFlags
APS_Lab 0:8ca1e814a851 1977 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 1978
APS_Lab 0:8ca1e814a851 1979 // build outputBuf
APS_Lab 0:8ca1e814a851 1980 dn_ipmt_vars.outputBuf[0] = PARAMID_TIME;
APS_Lab 0:8ca1e814a851 1981
APS_Lab 0:8ca1e814a851 1982 // send outputBuf
APS_Lab 0:8ca1e814a851 1983 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 1984 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 1985 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 1986 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 1987 DN_GETPARAMETER_TIME_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 1988 dn_ipmt_getParameter_time_reply // replyCb
APS_Lab 0:8ca1e814a851 1989 );
APS_Lab 0:8ca1e814a851 1990
APS_Lab 0:8ca1e814a851 1991 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 1992 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 1993 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 1994 }
APS_Lab 0:8ca1e814a851 1995
APS_Lab 0:8ca1e814a851 1996 // unlock the module
APS_Lab 0:8ca1e814a851 1997 dn_unlock();
APS_Lab 0:8ca1e814a851 1998
APS_Lab 0:8ca1e814a851 1999 return rc;
APS_Lab 0:8ca1e814a851 2000
APS_Lab 0:8ca1e814a851 2001 }
APS_Lab 0:8ca1e814a851 2002
APS_Lab 0:8ca1e814a851 2003 void dn_ipmt_getParameter_time_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2004 dn_ipmt_getParameter_time_rpt* reply;
APS_Lab 0:8ca1e814a851 2005 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2006
APS_Lab 0:8ca1e814a851 2007 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2008 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2009 return;
APS_Lab 0:8ca1e814a851 2010 }
APS_Lab 0:8ca1e814a851 2011
APS_Lab 0:8ca1e814a851 2012 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2013 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2014 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2015 return;
APS_Lab 0:8ca1e814a851 2016 }
APS_Lab 0:8ca1e814a851 2017
APS_Lab 0:8ca1e814a851 2018 // verify length
APS_Lab 0:8ca1e814a851 2019 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_TIME_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2020 return;
APS_Lab 0:8ca1e814a851 2021 }
APS_Lab 0:8ca1e814a851 2022
APS_Lab 0:8ca1e814a851 2023 // cast the replyContent
APS_Lab 0:8ca1e814a851 2024 reply = (dn_ipmt_getParameter_time_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2025
APS_Lab 0:8ca1e814a851 2026 // store RC
APS_Lab 0:8ca1e814a851 2027 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2028
APS_Lab 0:8ca1e814a851 2029 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2030 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2031
APS_Lab 0:8ca1e814a851 2032 dn_read_uint32_t(&reply->upTime,&payload[DN_GETPARAMETER_TIME_REPLY_OFFS_UPTIME]);
APS_Lab 0:8ca1e814a851 2033 memcpy(&reply->utcSecs[0],&payload[DN_GETPARAMETER_TIME_REPLY_OFFS_UTCSECS],8);
APS_Lab 0:8ca1e814a851 2034 dn_read_uint32_t(&reply->utcUsecs,&payload[DN_GETPARAMETER_TIME_REPLY_OFFS_UTCUSECS]);
APS_Lab 0:8ca1e814a851 2035 memcpy(&reply->asn[0],&payload[DN_GETPARAMETER_TIME_REPLY_OFFS_ASN],5);
APS_Lab 0:8ca1e814a851 2036 dn_read_uint16_t(&reply->asnOffset,&payload[DN_GETPARAMETER_TIME_REPLY_OFFS_ASNOFFSET]);
APS_Lab 0:8ca1e814a851 2037 }
APS_Lab 0:8ca1e814a851 2038
APS_Lab 0:8ca1e814a851 2039 // call the callback
APS_Lab 0:8ca1e814a851 2040 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2041
APS_Lab 0:8ca1e814a851 2042 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2043 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2044 }
APS_Lab 0:8ca1e814a851 2045
APS_Lab 0:8ca1e814a851 2046 //===== getParameter_charge
APS_Lab 0:8ca1e814a851 2047
APS_Lab 0:8ca1e814a851 2048 /**
APS_Lab 0:8ca1e814a851 2049 The getParameter<charge> command retrieves the charge consumption of the
APS_Lab 0:8ca1e814a851 2050 motesince the last reset.
APS_Lab 0:8ca1e814a851 2051 */
APS_Lab 0:8ca1e814a851 2052 dn_err_t dn_ipmt_getParameter_charge(dn_ipmt_getParameter_charge_rpt* reply) {
APS_Lab 0:8ca1e814a851 2053 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2054 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2055
APS_Lab 0:8ca1e814a851 2056 // lock the module
APS_Lab 0:8ca1e814a851 2057 dn_lock();
APS_Lab 0:8ca1e814a851 2058
APS_Lab 0:8ca1e814a851 2059 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2060 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2061 // unlock the module
APS_Lab 0:8ca1e814a851 2062 dn_unlock();
APS_Lab 0:8ca1e814a851 2063
APS_Lab 0:8ca1e814a851 2064 // return
APS_Lab 0:8ca1e814a851 2065 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2066 }
APS_Lab 0:8ca1e814a851 2067
APS_Lab 0:8ca1e814a851 2068 // store callback information
APS_Lab 0:8ca1e814a851 2069 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2070 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2071 dn_ipmt_vars.paramId = PARAMID_CHARGE;
APS_Lab 0:8ca1e814a851 2072
APS_Lab 0:8ca1e814a851 2073 // extraFlags
APS_Lab 0:8ca1e814a851 2074 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2075
APS_Lab 0:8ca1e814a851 2076 // build outputBuf
APS_Lab 0:8ca1e814a851 2077 dn_ipmt_vars.outputBuf[0] = PARAMID_CHARGE;
APS_Lab 0:8ca1e814a851 2078
APS_Lab 0:8ca1e814a851 2079 // send outputBuf
APS_Lab 0:8ca1e814a851 2080 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2081 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2082 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2083 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2084 DN_GETPARAMETER_CHARGE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2085 dn_ipmt_getParameter_charge_reply // replyCb
APS_Lab 0:8ca1e814a851 2086 );
APS_Lab 0:8ca1e814a851 2087
APS_Lab 0:8ca1e814a851 2088 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2089 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2090 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2091 }
APS_Lab 0:8ca1e814a851 2092
APS_Lab 0:8ca1e814a851 2093 // unlock the module
APS_Lab 0:8ca1e814a851 2094 dn_unlock();
APS_Lab 0:8ca1e814a851 2095
APS_Lab 0:8ca1e814a851 2096 return rc;
APS_Lab 0:8ca1e814a851 2097
APS_Lab 0:8ca1e814a851 2098 }
APS_Lab 0:8ca1e814a851 2099
APS_Lab 0:8ca1e814a851 2100 void dn_ipmt_getParameter_charge_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2101 dn_ipmt_getParameter_charge_rpt* reply;
APS_Lab 0:8ca1e814a851 2102 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2103
APS_Lab 0:8ca1e814a851 2104 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2105 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2106 return;
APS_Lab 0:8ca1e814a851 2107 }
APS_Lab 0:8ca1e814a851 2108
APS_Lab 0:8ca1e814a851 2109 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2110 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2111 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2112 return;
APS_Lab 0:8ca1e814a851 2113 }
APS_Lab 0:8ca1e814a851 2114
APS_Lab 0:8ca1e814a851 2115 // verify length
APS_Lab 0:8ca1e814a851 2116 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_CHARGE_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2117 return;
APS_Lab 0:8ca1e814a851 2118 }
APS_Lab 0:8ca1e814a851 2119
APS_Lab 0:8ca1e814a851 2120 // cast the replyContent
APS_Lab 0:8ca1e814a851 2121 reply = (dn_ipmt_getParameter_charge_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2122
APS_Lab 0:8ca1e814a851 2123 // store RC
APS_Lab 0:8ca1e814a851 2124 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2125
APS_Lab 0:8ca1e814a851 2126 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2127 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2128
APS_Lab 0:8ca1e814a851 2129 dn_read_uint32_t(&reply->qTotal,&payload[DN_GETPARAMETER_CHARGE_REPLY_OFFS_QTOTAL]);
APS_Lab 0:8ca1e814a851 2130 dn_read_uint32_t(&reply->upTime,&payload[DN_GETPARAMETER_CHARGE_REPLY_OFFS_UPTIME]);
APS_Lab 0:8ca1e814a851 2131 reply->tempInt = (int8_t)payload[DN_GETPARAMETER_CHARGE_REPLY_OFFS_TEMPINT];
APS_Lab 0:8ca1e814a851 2132 reply->tempFrac = payload[DN_GETPARAMETER_CHARGE_REPLY_OFFS_TEMPFRAC];
APS_Lab 0:8ca1e814a851 2133 }
APS_Lab 0:8ca1e814a851 2134
APS_Lab 0:8ca1e814a851 2135 // call the callback
APS_Lab 0:8ca1e814a851 2136 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2137
APS_Lab 0:8ca1e814a851 2138 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2139 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2140 }
APS_Lab 0:8ca1e814a851 2141
APS_Lab 0:8ca1e814a851 2142 //===== getParameter_testRadioRxStats
APS_Lab 0:8ca1e814a851 2143
APS_Lab 0:8ca1e814a851 2144 /**
APS_Lab 0:8ca1e814a851 2145 The getParameter<testRadioRxStats> command retrieves statistics for the latest
APS_Lab 0:8ca1e814a851 2146 radio test performed using the testRadioRx command. The statistics show the
APS_Lab 0:8ca1e814a851 2147 number of good and bad packets (CRC failures) received during the test
APS_Lab 0:8ca1e814a851 2148 */
APS_Lab 0:8ca1e814a851 2149 dn_err_t dn_ipmt_getParameter_testRadioRxStats(dn_ipmt_getParameter_testRadioRxStats_rpt* reply) {
APS_Lab 0:8ca1e814a851 2150 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2151 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2152
APS_Lab 0:8ca1e814a851 2153 // lock the module
APS_Lab 0:8ca1e814a851 2154 dn_lock();
APS_Lab 0:8ca1e814a851 2155
APS_Lab 0:8ca1e814a851 2156 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2157 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2158 // unlock the module
APS_Lab 0:8ca1e814a851 2159 dn_unlock();
APS_Lab 0:8ca1e814a851 2160
APS_Lab 0:8ca1e814a851 2161 // return
APS_Lab 0:8ca1e814a851 2162 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2163 }
APS_Lab 0:8ca1e814a851 2164
APS_Lab 0:8ca1e814a851 2165 // store callback information
APS_Lab 0:8ca1e814a851 2166 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2167 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2168 dn_ipmt_vars.paramId = PARAMID_TESTRADIORXSTATS;
APS_Lab 0:8ca1e814a851 2169
APS_Lab 0:8ca1e814a851 2170 // extraFlags
APS_Lab 0:8ca1e814a851 2171 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2172
APS_Lab 0:8ca1e814a851 2173 // build outputBuf
APS_Lab 0:8ca1e814a851 2174 dn_ipmt_vars.outputBuf[0] = PARAMID_TESTRADIORXSTATS;
APS_Lab 0:8ca1e814a851 2175
APS_Lab 0:8ca1e814a851 2176 // send outputBuf
APS_Lab 0:8ca1e814a851 2177 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2178 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2179 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2180 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2181 DN_GETPARAMETER_TESTRADIORXSTATS_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2182 dn_ipmt_getParameter_testRadioRxStats_reply // replyCb
APS_Lab 0:8ca1e814a851 2183 );
APS_Lab 0:8ca1e814a851 2184
APS_Lab 0:8ca1e814a851 2185 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2186 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2187 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2188 }
APS_Lab 0:8ca1e814a851 2189
APS_Lab 0:8ca1e814a851 2190 // unlock the module
APS_Lab 0:8ca1e814a851 2191 dn_unlock();
APS_Lab 0:8ca1e814a851 2192
APS_Lab 0:8ca1e814a851 2193 return rc;
APS_Lab 0:8ca1e814a851 2194
APS_Lab 0:8ca1e814a851 2195 }
APS_Lab 0:8ca1e814a851 2196
APS_Lab 0:8ca1e814a851 2197 void dn_ipmt_getParameter_testRadioRxStats_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2198 dn_ipmt_getParameter_testRadioRxStats_rpt* reply;
APS_Lab 0:8ca1e814a851 2199 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2200
APS_Lab 0:8ca1e814a851 2201 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2202 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2203 return;
APS_Lab 0:8ca1e814a851 2204 }
APS_Lab 0:8ca1e814a851 2205
APS_Lab 0:8ca1e814a851 2206 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2207 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2208 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2209 return;
APS_Lab 0:8ca1e814a851 2210 }
APS_Lab 0:8ca1e814a851 2211
APS_Lab 0:8ca1e814a851 2212 // verify length
APS_Lab 0:8ca1e814a851 2213 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_TESTRADIORXSTATS_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2214 return;
APS_Lab 0:8ca1e814a851 2215 }
APS_Lab 0:8ca1e814a851 2216
APS_Lab 0:8ca1e814a851 2217 // cast the replyContent
APS_Lab 0:8ca1e814a851 2218 reply = (dn_ipmt_getParameter_testRadioRxStats_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2219
APS_Lab 0:8ca1e814a851 2220 // store RC
APS_Lab 0:8ca1e814a851 2221 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2222
APS_Lab 0:8ca1e814a851 2223 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2224 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2225
APS_Lab 0:8ca1e814a851 2226 dn_read_uint16_t(&reply->rxOk,&payload[DN_GETPARAMETER_TESTRADIORXSTATS_REPLY_OFFS_RXOK]);
APS_Lab 0:8ca1e814a851 2227 dn_read_uint16_t(&reply->rxFailed,&payload[DN_GETPARAMETER_TESTRADIORXSTATS_REPLY_OFFS_RXFAILED]);
APS_Lab 0:8ca1e814a851 2228 }
APS_Lab 0:8ca1e814a851 2229
APS_Lab 0:8ca1e814a851 2230 // call the callback
APS_Lab 0:8ca1e814a851 2231 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2232
APS_Lab 0:8ca1e814a851 2233 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2234 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2235 }
APS_Lab 0:8ca1e814a851 2236
APS_Lab 0:8ca1e814a851 2237 //===== getParameter_OTAPLockout
APS_Lab 0:8ca1e814a851 2238
APS_Lab 0:8ca1e814a851 2239 /**
APS_Lab 0:8ca1e814a851 2240 This command reads the current state of OTAP lockout, i.e. whether over-the-air
APS_Lab 0:8ca1e814a851 2241 upgrades of software are permitted on this mote.
APS_Lab 0:8ca1e814a851 2242 */
APS_Lab 0:8ca1e814a851 2243 dn_err_t dn_ipmt_getParameter_OTAPLockout(dn_ipmt_getParameter_OTAPLockout_rpt* reply) {
APS_Lab 0:8ca1e814a851 2244 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2245 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2246
APS_Lab 0:8ca1e814a851 2247 // lock the module
APS_Lab 0:8ca1e814a851 2248 dn_lock();
APS_Lab 0:8ca1e814a851 2249
APS_Lab 0:8ca1e814a851 2250 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2251 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2252 // unlock the module
APS_Lab 0:8ca1e814a851 2253 dn_unlock();
APS_Lab 0:8ca1e814a851 2254
APS_Lab 0:8ca1e814a851 2255 // return
APS_Lab 0:8ca1e814a851 2256 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2257 }
APS_Lab 0:8ca1e814a851 2258
APS_Lab 0:8ca1e814a851 2259 // store callback information
APS_Lab 0:8ca1e814a851 2260 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2261 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2262 dn_ipmt_vars.paramId = PARAMID_OTAPLOCKOUT;
APS_Lab 0:8ca1e814a851 2263
APS_Lab 0:8ca1e814a851 2264 // extraFlags
APS_Lab 0:8ca1e814a851 2265 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2266
APS_Lab 0:8ca1e814a851 2267 // build outputBuf
APS_Lab 0:8ca1e814a851 2268 dn_ipmt_vars.outputBuf[0] = PARAMID_OTAPLOCKOUT;
APS_Lab 0:8ca1e814a851 2269
APS_Lab 0:8ca1e814a851 2270 // send outputBuf
APS_Lab 0:8ca1e814a851 2271 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2272 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2273 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2274 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2275 DN_GETPARAMETER_OTAPLOCKOUT_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2276 dn_ipmt_getParameter_OTAPLockout_reply // replyCb
APS_Lab 0:8ca1e814a851 2277 );
APS_Lab 0:8ca1e814a851 2278
APS_Lab 0:8ca1e814a851 2279 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2280 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2281 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2282 }
APS_Lab 0:8ca1e814a851 2283
APS_Lab 0:8ca1e814a851 2284 // unlock the module
APS_Lab 0:8ca1e814a851 2285 dn_unlock();
APS_Lab 0:8ca1e814a851 2286
APS_Lab 0:8ca1e814a851 2287 return rc;
APS_Lab 0:8ca1e814a851 2288
APS_Lab 0:8ca1e814a851 2289 }
APS_Lab 0:8ca1e814a851 2290
APS_Lab 0:8ca1e814a851 2291 void dn_ipmt_getParameter_OTAPLockout_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2292 dn_ipmt_getParameter_OTAPLockout_rpt* reply;
APS_Lab 0:8ca1e814a851 2293 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2294
APS_Lab 0:8ca1e814a851 2295 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2296 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2297 return;
APS_Lab 0:8ca1e814a851 2298 }
APS_Lab 0:8ca1e814a851 2299
APS_Lab 0:8ca1e814a851 2300 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2301 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2302 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2303 return;
APS_Lab 0:8ca1e814a851 2304 }
APS_Lab 0:8ca1e814a851 2305
APS_Lab 0:8ca1e814a851 2306 // verify length
APS_Lab 0:8ca1e814a851 2307 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_OTAPLOCKOUT_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2308 return;
APS_Lab 0:8ca1e814a851 2309 }
APS_Lab 0:8ca1e814a851 2310
APS_Lab 0:8ca1e814a851 2311 // cast the replyContent
APS_Lab 0:8ca1e814a851 2312 reply = (dn_ipmt_getParameter_OTAPLockout_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2313
APS_Lab 0:8ca1e814a851 2314 // store RC
APS_Lab 0:8ca1e814a851 2315 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2316
APS_Lab 0:8ca1e814a851 2317 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2318 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2319
APS_Lab 0:8ca1e814a851 2320 reply->mode = payload[DN_GETPARAMETER_OTAPLOCKOUT_REPLY_OFFS_MODE];
APS_Lab 0:8ca1e814a851 2321 }
APS_Lab 0:8ca1e814a851 2322
APS_Lab 0:8ca1e814a851 2323 // call the callback
APS_Lab 0:8ca1e814a851 2324 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2325
APS_Lab 0:8ca1e814a851 2326 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2327 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2328 }
APS_Lab 0:8ca1e814a851 2329
APS_Lab 0:8ca1e814a851 2330 //===== getParameter_moteId
APS_Lab 0:8ca1e814a851 2331
APS_Lab 0:8ca1e814a851 2332 /**
APS_Lab 0:8ca1e814a851 2333 This command retrieves the mote's Mote ID. If the mote is not in the network,
APS_Lab 0:8ca1e814a851 2334 value of 0 is returned.
APS_Lab 0:8ca1e814a851 2335 */
APS_Lab 0:8ca1e814a851 2336 dn_err_t dn_ipmt_getParameter_moteId(dn_ipmt_getParameter_moteId_rpt* reply) {
APS_Lab 0:8ca1e814a851 2337 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2338 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2339
APS_Lab 0:8ca1e814a851 2340 // lock the module
APS_Lab 0:8ca1e814a851 2341 dn_lock();
APS_Lab 0:8ca1e814a851 2342
APS_Lab 0:8ca1e814a851 2343 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2344 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2345 // unlock the module
APS_Lab 0:8ca1e814a851 2346 dn_unlock();
APS_Lab 0:8ca1e814a851 2347
APS_Lab 0:8ca1e814a851 2348 // return
APS_Lab 0:8ca1e814a851 2349 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2350 }
APS_Lab 0:8ca1e814a851 2351
APS_Lab 0:8ca1e814a851 2352 // store callback information
APS_Lab 0:8ca1e814a851 2353 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2354 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2355 dn_ipmt_vars.paramId = PARAMID_MOTEID;
APS_Lab 0:8ca1e814a851 2356
APS_Lab 0:8ca1e814a851 2357 // extraFlags
APS_Lab 0:8ca1e814a851 2358 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2359
APS_Lab 0:8ca1e814a851 2360 // build outputBuf
APS_Lab 0:8ca1e814a851 2361 dn_ipmt_vars.outputBuf[0] = PARAMID_MOTEID;
APS_Lab 0:8ca1e814a851 2362
APS_Lab 0:8ca1e814a851 2363 // send outputBuf
APS_Lab 0:8ca1e814a851 2364 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2365 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2366 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2367 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2368 DN_GETPARAMETER_MOTEID_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2369 dn_ipmt_getParameter_moteId_reply // replyCb
APS_Lab 0:8ca1e814a851 2370 );
APS_Lab 0:8ca1e814a851 2371
APS_Lab 0:8ca1e814a851 2372 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2373 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2374 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2375 }
APS_Lab 0:8ca1e814a851 2376
APS_Lab 0:8ca1e814a851 2377 // unlock the module
APS_Lab 0:8ca1e814a851 2378 dn_unlock();
APS_Lab 0:8ca1e814a851 2379
APS_Lab 0:8ca1e814a851 2380 return rc;
APS_Lab 0:8ca1e814a851 2381
APS_Lab 0:8ca1e814a851 2382 }
APS_Lab 0:8ca1e814a851 2383
APS_Lab 0:8ca1e814a851 2384 void dn_ipmt_getParameter_moteId_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2385 dn_ipmt_getParameter_moteId_rpt* reply;
APS_Lab 0:8ca1e814a851 2386 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2387
APS_Lab 0:8ca1e814a851 2388 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2389 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2390 return;
APS_Lab 0:8ca1e814a851 2391 }
APS_Lab 0:8ca1e814a851 2392
APS_Lab 0:8ca1e814a851 2393 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2394 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2395 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2396 return;
APS_Lab 0:8ca1e814a851 2397 }
APS_Lab 0:8ca1e814a851 2398
APS_Lab 0:8ca1e814a851 2399 // verify length
APS_Lab 0:8ca1e814a851 2400 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_MOTEID_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2401 return;
APS_Lab 0:8ca1e814a851 2402 }
APS_Lab 0:8ca1e814a851 2403
APS_Lab 0:8ca1e814a851 2404 // cast the replyContent
APS_Lab 0:8ca1e814a851 2405 reply = (dn_ipmt_getParameter_moteId_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2406
APS_Lab 0:8ca1e814a851 2407 // store RC
APS_Lab 0:8ca1e814a851 2408 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2409
APS_Lab 0:8ca1e814a851 2410 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2411 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2412
APS_Lab 0:8ca1e814a851 2413 dn_read_uint16_t(&reply->moteId,&payload[DN_GETPARAMETER_MOTEID_REPLY_OFFS_MOTEID]);
APS_Lab 0:8ca1e814a851 2414 }
APS_Lab 0:8ca1e814a851 2415
APS_Lab 0:8ca1e814a851 2416 // call the callback
APS_Lab 0:8ca1e814a851 2417 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2418
APS_Lab 0:8ca1e814a851 2419 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2420 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2421 }
APS_Lab 0:8ca1e814a851 2422
APS_Lab 0:8ca1e814a851 2423 //===== getParameter_ipv6Address
APS_Lab 0:8ca1e814a851 2424
APS_Lab 0:8ca1e814a851 2425 /**
APS_Lab 0:8ca1e814a851 2426 This command allows the microprocessor to read IPV6 address assigned to the
APS_Lab 0:8ca1e814a851 2427 mote. Before the mote has an assigned address it will return all 0s.
APS_Lab 0:8ca1e814a851 2428 */
APS_Lab 0:8ca1e814a851 2429 dn_err_t dn_ipmt_getParameter_ipv6Address(dn_ipmt_getParameter_ipv6Address_rpt* reply) {
APS_Lab 0:8ca1e814a851 2430 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2431 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2432
APS_Lab 0:8ca1e814a851 2433 // lock the module
APS_Lab 0:8ca1e814a851 2434 dn_lock();
APS_Lab 0:8ca1e814a851 2435
APS_Lab 0:8ca1e814a851 2436 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2437 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2438 // unlock the module
APS_Lab 0:8ca1e814a851 2439 dn_unlock();
APS_Lab 0:8ca1e814a851 2440
APS_Lab 0:8ca1e814a851 2441 // return
APS_Lab 0:8ca1e814a851 2442 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2443 }
APS_Lab 0:8ca1e814a851 2444
APS_Lab 0:8ca1e814a851 2445 // store callback information
APS_Lab 0:8ca1e814a851 2446 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2447 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2448 dn_ipmt_vars.paramId = PARAMID_IPV6ADDRESS;
APS_Lab 0:8ca1e814a851 2449
APS_Lab 0:8ca1e814a851 2450 // extraFlags
APS_Lab 0:8ca1e814a851 2451 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2452
APS_Lab 0:8ca1e814a851 2453 // build outputBuf
APS_Lab 0:8ca1e814a851 2454 dn_ipmt_vars.outputBuf[0] = PARAMID_IPV6ADDRESS;
APS_Lab 0:8ca1e814a851 2455
APS_Lab 0:8ca1e814a851 2456 // send outputBuf
APS_Lab 0:8ca1e814a851 2457 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2458 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2459 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2460 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2461 DN_GETPARAMETER_IPV6ADDRESS_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2462 dn_ipmt_getParameter_ipv6Address_reply // replyCb
APS_Lab 0:8ca1e814a851 2463 );
APS_Lab 0:8ca1e814a851 2464
APS_Lab 0:8ca1e814a851 2465 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2466 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2467 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2468 }
APS_Lab 0:8ca1e814a851 2469
APS_Lab 0:8ca1e814a851 2470 // unlock the module
APS_Lab 0:8ca1e814a851 2471 dn_unlock();
APS_Lab 0:8ca1e814a851 2472
APS_Lab 0:8ca1e814a851 2473 return rc;
APS_Lab 0:8ca1e814a851 2474
APS_Lab 0:8ca1e814a851 2475 }
APS_Lab 0:8ca1e814a851 2476
APS_Lab 0:8ca1e814a851 2477 void dn_ipmt_getParameter_ipv6Address_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2478 dn_ipmt_getParameter_ipv6Address_rpt* reply;
APS_Lab 0:8ca1e814a851 2479 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2480
APS_Lab 0:8ca1e814a851 2481 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2482 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2483 return;
APS_Lab 0:8ca1e814a851 2484 }
APS_Lab 0:8ca1e814a851 2485
APS_Lab 0:8ca1e814a851 2486 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2487 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2488 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2489 return;
APS_Lab 0:8ca1e814a851 2490 }
APS_Lab 0:8ca1e814a851 2491
APS_Lab 0:8ca1e814a851 2492 // verify length
APS_Lab 0:8ca1e814a851 2493 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_IPV6ADDRESS_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2494 return;
APS_Lab 0:8ca1e814a851 2495 }
APS_Lab 0:8ca1e814a851 2496
APS_Lab 0:8ca1e814a851 2497 // cast the replyContent
APS_Lab 0:8ca1e814a851 2498 reply = (dn_ipmt_getParameter_ipv6Address_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2499
APS_Lab 0:8ca1e814a851 2500 // store RC
APS_Lab 0:8ca1e814a851 2501 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2502
APS_Lab 0:8ca1e814a851 2503 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2504 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2505
APS_Lab 0:8ca1e814a851 2506 memcpy(&reply->ipv6Address[0],&payload[DN_GETPARAMETER_IPV6ADDRESS_REPLY_OFFS_IPV6ADDRESS],16);
APS_Lab 0:8ca1e814a851 2507 }
APS_Lab 0:8ca1e814a851 2508
APS_Lab 0:8ca1e814a851 2509 // call the callback
APS_Lab 0:8ca1e814a851 2510 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2511
APS_Lab 0:8ca1e814a851 2512 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2513 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2514 }
APS_Lab 0:8ca1e814a851 2515
APS_Lab 0:8ca1e814a851 2516 //===== getParameter_routingMode
APS_Lab 0:8ca1e814a851 2517
APS_Lab 0:8ca1e814a851 2518 /**
APS_Lab 0:8ca1e814a851 2519 This command allows the microprocessor to retrieve the current routing mode of
APS_Lab 0:8ca1e814a851 2520 the mote.
APS_Lab 0:8ca1e814a851 2521 */
APS_Lab 0:8ca1e814a851 2522 dn_err_t dn_ipmt_getParameter_routingMode(dn_ipmt_getParameter_routingMode_rpt* reply) {
APS_Lab 0:8ca1e814a851 2523 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2524 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2525
APS_Lab 0:8ca1e814a851 2526 // lock the module
APS_Lab 0:8ca1e814a851 2527 dn_lock();
APS_Lab 0:8ca1e814a851 2528
APS_Lab 0:8ca1e814a851 2529 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2530 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2531 // unlock the module
APS_Lab 0:8ca1e814a851 2532 dn_unlock();
APS_Lab 0:8ca1e814a851 2533
APS_Lab 0:8ca1e814a851 2534 // return
APS_Lab 0:8ca1e814a851 2535 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2536 }
APS_Lab 0:8ca1e814a851 2537
APS_Lab 0:8ca1e814a851 2538 // store callback information
APS_Lab 0:8ca1e814a851 2539 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2540 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2541 dn_ipmt_vars.paramId = PARAMID_ROUTINGMODE;
APS_Lab 0:8ca1e814a851 2542
APS_Lab 0:8ca1e814a851 2543 // extraFlags
APS_Lab 0:8ca1e814a851 2544 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2545
APS_Lab 0:8ca1e814a851 2546 // build outputBuf
APS_Lab 0:8ca1e814a851 2547 dn_ipmt_vars.outputBuf[0] = PARAMID_ROUTINGMODE;
APS_Lab 0:8ca1e814a851 2548
APS_Lab 0:8ca1e814a851 2549 // send outputBuf
APS_Lab 0:8ca1e814a851 2550 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2551 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2552 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2553 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2554 DN_GETPARAMETER_ROUTINGMODE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2555 dn_ipmt_getParameter_routingMode_reply // replyCb
APS_Lab 0:8ca1e814a851 2556 );
APS_Lab 0:8ca1e814a851 2557
APS_Lab 0:8ca1e814a851 2558 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2559 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2560 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2561 }
APS_Lab 0:8ca1e814a851 2562
APS_Lab 0:8ca1e814a851 2563 // unlock the module
APS_Lab 0:8ca1e814a851 2564 dn_unlock();
APS_Lab 0:8ca1e814a851 2565
APS_Lab 0:8ca1e814a851 2566 return rc;
APS_Lab 0:8ca1e814a851 2567
APS_Lab 0:8ca1e814a851 2568 }
APS_Lab 0:8ca1e814a851 2569
APS_Lab 0:8ca1e814a851 2570 void dn_ipmt_getParameter_routingMode_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2571 dn_ipmt_getParameter_routingMode_rpt* reply;
APS_Lab 0:8ca1e814a851 2572 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2573
APS_Lab 0:8ca1e814a851 2574 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2575 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2576 return;
APS_Lab 0:8ca1e814a851 2577 }
APS_Lab 0:8ca1e814a851 2578
APS_Lab 0:8ca1e814a851 2579 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2580 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2581 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2582 return;
APS_Lab 0:8ca1e814a851 2583 }
APS_Lab 0:8ca1e814a851 2584
APS_Lab 0:8ca1e814a851 2585 // verify length
APS_Lab 0:8ca1e814a851 2586 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_ROUTINGMODE_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2587 return;
APS_Lab 0:8ca1e814a851 2588 }
APS_Lab 0:8ca1e814a851 2589
APS_Lab 0:8ca1e814a851 2590 // cast the replyContent
APS_Lab 0:8ca1e814a851 2591 reply = (dn_ipmt_getParameter_routingMode_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2592
APS_Lab 0:8ca1e814a851 2593 // store RC
APS_Lab 0:8ca1e814a851 2594 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2595
APS_Lab 0:8ca1e814a851 2596 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2597 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2598
APS_Lab 0:8ca1e814a851 2599 reply->routingMode = payload[DN_GETPARAMETER_ROUTINGMODE_REPLY_OFFS_ROUTINGMODE];
APS_Lab 0:8ca1e814a851 2600 }
APS_Lab 0:8ca1e814a851 2601
APS_Lab 0:8ca1e814a851 2602 // call the callback
APS_Lab 0:8ca1e814a851 2603 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2604
APS_Lab 0:8ca1e814a851 2605 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2606 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2607 }
APS_Lab 0:8ca1e814a851 2608
APS_Lab 0:8ca1e814a851 2609 //===== getParameter_appInfo
APS_Lab 0:8ca1e814a851 2610
APS_Lab 0:8ca1e814a851 2611 /**
APS_Lab 0:8ca1e814a851 2612 Get the application (as opposed to the network stack) version information.
APS_Lab 0:8ca1e814a851 2613 */
APS_Lab 0:8ca1e814a851 2614 dn_err_t dn_ipmt_getParameter_appInfo(dn_ipmt_getParameter_appInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 2615 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2616 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2617
APS_Lab 0:8ca1e814a851 2618 // lock the module
APS_Lab 0:8ca1e814a851 2619 dn_lock();
APS_Lab 0:8ca1e814a851 2620
APS_Lab 0:8ca1e814a851 2621 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2622 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2623 // unlock the module
APS_Lab 0:8ca1e814a851 2624 dn_unlock();
APS_Lab 0:8ca1e814a851 2625
APS_Lab 0:8ca1e814a851 2626 // return
APS_Lab 0:8ca1e814a851 2627 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2628 }
APS_Lab 0:8ca1e814a851 2629
APS_Lab 0:8ca1e814a851 2630 // store callback information
APS_Lab 0:8ca1e814a851 2631 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2632 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2633 dn_ipmt_vars.paramId = PARAMID_APPINFO;
APS_Lab 0:8ca1e814a851 2634
APS_Lab 0:8ca1e814a851 2635 // extraFlags
APS_Lab 0:8ca1e814a851 2636 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2637
APS_Lab 0:8ca1e814a851 2638 // build outputBuf
APS_Lab 0:8ca1e814a851 2639 dn_ipmt_vars.outputBuf[0] = PARAMID_APPINFO;
APS_Lab 0:8ca1e814a851 2640
APS_Lab 0:8ca1e814a851 2641 // send outputBuf
APS_Lab 0:8ca1e814a851 2642 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2643 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2644 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2645 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2646 DN_GETPARAMETER_APPINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2647 dn_ipmt_getParameter_appInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 2648 );
APS_Lab 0:8ca1e814a851 2649
APS_Lab 0:8ca1e814a851 2650 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2651 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2652 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2653 }
APS_Lab 0:8ca1e814a851 2654
APS_Lab 0:8ca1e814a851 2655 // unlock the module
APS_Lab 0:8ca1e814a851 2656 dn_unlock();
APS_Lab 0:8ca1e814a851 2657
APS_Lab 0:8ca1e814a851 2658 return rc;
APS_Lab 0:8ca1e814a851 2659
APS_Lab 0:8ca1e814a851 2660 }
APS_Lab 0:8ca1e814a851 2661
APS_Lab 0:8ca1e814a851 2662 void dn_ipmt_getParameter_appInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2663 dn_ipmt_getParameter_appInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 2664 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2665
APS_Lab 0:8ca1e814a851 2666 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2667 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2668 return;
APS_Lab 0:8ca1e814a851 2669 }
APS_Lab 0:8ca1e814a851 2670
APS_Lab 0:8ca1e814a851 2671 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2672 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2673 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2674 return;
APS_Lab 0:8ca1e814a851 2675 }
APS_Lab 0:8ca1e814a851 2676
APS_Lab 0:8ca1e814a851 2677 // verify length
APS_Lab 0:8ca1e814a851 2678 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_APPINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2679 return;
APS_Lab 0:8ca1e814a851 2680 }
APS_Lab 0:8ca1e814a851 2681
APS_Lab 0:8ca1e814a851 2682 // cast the replyContent
APS_Lab 0:8ca1e814a851 2683 reply = (dn_ipmt_getParameter_appInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2684
APS_Lab 0:8ca1e814a851 2685 // store RC
APS_Lab 0:8ca1e814a851 2686 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2687
APS_Lab 0:8ca1e814a851 2688 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2689 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2690
APS_Lab 0:8ca1e814a851 2691 dn_read_uint16_t(&reply->vendorId,&payload[DN_GETPARAMETER_APPINFO_REPLY_OFFS_VENDORID]);
APS_Lab 0:8ca1e814a851 2692 reply->appId = payload[DN_GETPARAMETER_APPINFO_REPLY_OFFS_APPID];
APS_Lab 0:8ca1e814a851 2693 memcpy(&reply->appVer[0],&payload[DN_GETPARAMETER_APPINFO_REPLY_OFFS_APPVER],5);
APS_Lab 0:8ca1e814a851 2694 }
APS_Lab 0:8ca1e814a851 2695
APS_Lab 0:8ca1e814a851 2696 // call the callback
APS_Lab 0:8ca1e814a851 2697 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2698
APS_Lab 0:8ca1e814a851 2699 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2700 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2701 }
APS_Lab 0:8ca1e814a851 2702
APS_Lab 0:8ca1e814a851 2703 //===== getParameter_powerSrcInfo
APS_Lab 0:8ca1e814a851 2704
APS_Lab 0:8ca1e814a851 2705 /**
APS_Lab 0:8ca1e814a851 2706 This command allows the microprocessor to read a mote's power source settings.
APS_Lab 0:8ca1e814a851 2707 */
APS_Lab 0:8ca1e814a851 2708 dn_err_t dn_ipmt_getParameter_powerSrcInfo(dn_ipmt_getParameter_powerSrcInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 2709 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2710 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2711
APS_Lab 0:8ca1e814a851 2712 // lock the module
APS_Lab 0:8ca1e814a851 2713 dn_lock();
APS_Lab 0:8ca1e814a851 2714
APS_Lab 0:8ca1e814a851 2715 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2716 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2717 // unlock the module
APS_Lab 0:8ca1e814a851 2718 dn_unlock();
APS_Lab 0:8ca1e814a851 2719
APS_Lab 0:8ca1e814a851 2720 // return
APS_Lab 0:8ca1e814a851 2721 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2722 }
APS_Lab 0:8ca1e814a851 2723
APS_Lab 0:8ca1e814a851 2724 // store callback information
APS_Lab 0:8ca1e814a851 2725 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2726 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2727 dn_ipmt_vars.paramId = PARAMID_POWERSRCINFO;
APS_Lab 0:8ca1e814a851 2728
APS_Lab 0:8ca1e814a851 2729 // extraFlags
APS_Lab 0:8ca1e814a851 2730 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2731
APS_Lab 0:8ca1e814a851 2732 // build outputBuf
APS_Lab 0:8ca1e814a851 2733 dn_ipmt_vars.outputBuf[0] = PARAMID_POWERSRCINFO;
APS_Lab 0:8ca1e814a851 2734
APS_Lab 0:8ca1e814a851 2735 // send outputBuf
APS_Lab 0:8ca1e814a851 2736 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2737 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2738 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2739 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2740 DN_GETPARAMETER_POWERSRCINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2741 dn_ipmt_getParameter_powerSrcInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 2742 );
APS_Lab 0:8ca1e814a851 2743
APS_Lab 0:8ca1e814a851 2744 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2745 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2746 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2747 }
APS_Lab 0:8ca1e814a851 2748
APS_Lab 0:8ca1e814a851 2749 // unlock the module
APS_Lab 0:8ca1e814a851 2750 dn_unlock();
APS_Lab 0:8ca1e814a851 2751
APS_Lab 0:8ca1e814a851 2752 return rc;
APS_Lab 0:8ca1e814a851 2753
APS_Lab 0:8ca1e814a851 2754 }
APS_Lab 0:8ca1e814a851 2755
APS_Lab 0:8ca1e814a851 2756 void dn_ipmt_getParameter_powerSrcInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2757 dn_ipmt_getParameter_powerSrcInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 2758 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2759
APS_Lab 0:8ca1e814a851 2760 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2761 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2762 return;
APS_Lab 0:8ca1e814a851 2763 }
APS_Lab 0:8ca1e814a851 2764
APS_Lab 0:8ca1e814a851 2765 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2766 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2767 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2768 return;
APS_Lab 0:8ca1e814a851 2769 }
APS_Lab 0:8ca1e814a851 2770
APS_Lab 0:8ca1e814a851 2771 // verify length
APS_Lab 0:8ca1e814a851 2772 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_POWERSRCINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2773 return;
APS_Lab 0:8ca1e814a851 2774 }
APS_Lab 0:8ca1e814a851 2775
APS_Lab 0:8ca1e814a851 2776 // cast the replyContent
APS_Lab 0:8ca1e814a851 2777 reply = (dn_ipmt_getParameter_powerSrcInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2778
APS_Lab 0:8ca1e814a851 2779 // store RC
APS_Lab 0:8ca1e814a851 2780 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2781
APS_Lab 0:8ca1e814a851 2782 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2783 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2784
APS_Lab 0:8ca1e814a851 2785 dn_read_uint16_t(&reply->maxStCurrent,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_MAXSTCURRENT]);
APS_Lab 0:8ca1e814a851 2786 reply->minLifetime = payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_MINLIFETIME];
APS_Lab 0:8ca1e814a851 2787 dn_read_uint16_t(&reply->currentLimit_0,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_CURRENTLIMIT_0]);
APS_Lab 0:8ca1e814a851 2788 dn_read_uint16_t(&reply->dischargePeriod_0,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_DISCHARGEPERIOD_0]);
APS_Lab 0:8ca1e814a851 2789 dn_read_uint16_t(&reply->rechargePeriod_0,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_RECHARGEPERIOD_0]);
APS_Lab 0:8ca1e814a851 2790 dn_read_uint16_t(&reply->currentLimit_1,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_CURRENTLIMIT_1]);
APS_Lab 0:8ca1e814a851 2791 dn_read_uint16_t(&reply->dischargePeriod_1,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_DISCHARGEPERIOD_1]);
APS_Lab 0:8ca1e814a851 2792 dn_read_uint16_t(&reply->rechargePeriod_1,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_RECHARGEPERIOD_1]);
APS_Lab 0:8ca1e814a851 2793 dn_read_uint16_t(&reply->currentLimit_2,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_CURRENTLIMIT_2]);
APS_Lab 0:8ca1e814a851 2794 dn_read_uint16_t(&reply->dischargePeriod_2,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_DISCHARGEPERIOD_2]);
APS_Lab 0:8ca1e814a851 2795 dn_read_uint16_t(&reply->rechargePeriod_2,&payload[DN_GETPARAMETER_POWERSRCINFO_REPLY_OFFS_RECHARGEPERIOD_2]);
APS_Lab 0:8ca1e814a851 2796 }
APS_Lab 0:8ca1e814a851 2797
APS_Lab 0:8ca1e814a851 2798 // call the callback
APS_Lab 0:8ca1e814a851 2799 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2800
APS_Lab 0:8ca1e814a851 2801 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2802 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2803 }
APS_Lab 0:8ca1e814a851 2804
APS_Lab 0:8ca1e814a851 2805 //===== getParameter_autoJoin
APS_Lab 0:8ca1e814a851 2806
APS_Lab 0:8ca1e814a851 2807 /**
APS_Lab 0:8ca1e814a851 2808 This command allows the microprocessor to retrieve the current autoJoin
APS_Lab 0:8ca1e814a851 2809 setting.
APS_Lab 0:8ca1e814a851 2810 */
APS_Lab 0:8ca1e814a851 2811 dn_err_t dn_ipmt_getParameter_autoJoin(dn_ipmt_getParameter_autoJoin_rpt* reply) {
APS_Lab 0:8ca1e814a851 2812 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2813 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2814
APS_Lab 0:8ca1e814a851 2815 // lock the module
APS_Lab 0:8ca1e814a851 2816 dn_lock();
APS_Lab 0:8ca1e814a851 2817
APS_Lab 0:8ca1e814a851 2818 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2819 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2820 // unlock the module
APS_Lab 0:8ca1e814a851 2821 dn_unlock();
APS_Lab 0:8ca1e814a851 2822
APS_Lab 0:8ca1e814a851 2823 // return
APS_Lab 0:8ca1e814a851 2824 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2825 }
APS_Lab 0:8ca1e814a851 2826
APS_Lab 0:8ca1e814a851 2827 // store callback information
APS_Lab 0:8ca1e814a851 2828 dn_ipmt_vars.cmdId = CMDID_GETPARAMETER;
APS_Lab 0:8ca1e814a851 2829 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2830 dn_ipmt_vars.paramId = PARAMID_AUTOJOIN;
APS_Lab 0:8ca1e814a851 2831
APS_Lab 0:8ca1e814a851 2832 // extraFlags
APS_Lab 0:8ca1e814a851 2833 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2834
APS_Lab 0:8ca1e814a851 2835 // build outputBuf
APS_Lab 0:8ca1e814a851 2836 dn_ipmt_vars.outputBuf[0] = PARAMID_AUTOJOIN;
APS_Lab 0:8ca1e814a851 2837
APS_Lab 0:8ca1e814a851 2838 // send outputBuf
APS_Lab 0:8ca1e814a851 2839 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2840 CMDID_GETPARAMETER, // cmdId
APS_Lab 0:8ca1e814a851 2841 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2842 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2843 DN_GETPARAMETER_AUTOJOIN_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2844 dn_ipmt_getParameter_autoJoin_reply // replyCb
APS_Lab 0:8ca1e814a851 2845 );
APS_Lab 0:8ca1e814a851 2846
APS_Lab 0:8ca1e814a851 2847 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2848 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2849 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2850 }
APS_Lab 0:8ca1e814a851 2851
APS_Lab 0:8ca1e814a851 2852 // unlock the module
APS_Lab 0:8ca1e814a851 2853 dn_unlock();
APS_Lab 0:8ca1e814a851 2854
APS_Lab 0:8ca1e814a851 2855 return rc;
APS_Lab 0:8ca1e814a851 2856
APS_Lab 0:8ca1e814a851 2857 }
APS_Lab 0:8ca1e814a851 2858
APS_Lab 0:8ca1e814a851 2859 void dn_ipmt_getParameter_autoJoin_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2860 dn_ipmt_getParameter_autoJoin_rpt* reply;
APS_Lab 0:8ca1e814a851 2861 uint8_t paramId;
APS_Lab 0:8ca1e814a851 2862
APS_Lab 0:8ca1e814a851 2863 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2864 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2865 return;
APS_Lab 0:8ca1e814a851 2866 }
APS_Lab 0:8ca1e814a851 2867
APS_Lab 0:8ca1e814a851 2868 // verify I'm expecting this paramId
APS_Lab 0:8ca1e814a851 2869 paramId = payload[0];
APS_Lab 0:8ca1e814a851 2870 if (paramId!=dn_ipmt_vars.paramId) {
APS_Lab 0:8ca1e814a851 2871 return;
APS_Lab 0:8ca1e814a851 2872 }
APS_Lab 0:8ca1e814a851 2873
APS_Lab 0:8ca1e814a851 2874 // verify length
APS_Lab 0:8ca1e814a851 2875 if (rc==DN_SERIAL_RC_OK && len<DN_GETPARAMETER_AUTOJOIN_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 2876 return;
APS_Lab 0:8ca1e814a851 2877 }
APS_Lab 0:8ca1e814a851 2878
APS_Lab 0:8ca1e814a851 2879 // cast the replyContent
APS_Lab 0:8ca1e814a851 2880 reply = (dn_ipmt_getParameter_autoJoin_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2881
APS_Lab 0:8ca1e814a851 2882 // store RC
APS_Lab 0:8ca1e814a851 2883 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2884
APS_Lab 0:8ca1e814a851 2885 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2886 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2887
APS_Lab 0:8ca1e814a851 2888 reply->autoJoin = payload[DN_GETPARAMETER_AUTOJOIN_REPLY_OFFS_AUTOJOIN];
APS_Lab 0:8ca1e814a851 2889 }
APS_Lab 0:8ca1e814a851 2890
APS_Lab 0:8ca1e814a851 2891 // call the callback
APS_Lab 0:8ca1e814a851 2892 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2893
APS_Lab 0:8ca1e814a851 2894 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2895 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2896 }
APS_Lab 0:8ca1e814a851 2897
APS_Lab 0:8ca1e814a851 2898 //===== join
APS_Lab 0:8ca1e814a851 2899
APS_Lab 0:8ca1e814a851 2900 /**
APS_Lab 0:8ca1e814a851 2901 The join command requests that mote start searching for the network and attempt
APS_Lab 0:8ca1e814a851 2902 to join.The mote must be in the Idle state or the Promiscuous Listen state(see
APS_Lab 0:8ca1e814a851 2903 search) for this command to be valid. Note that the join time will be affected
APS_Lab 0:8ca1e814a851 2904 by the maximum current setting.
APS_Lab 0:8ca1e814a851 2905 */
APS_Lab 0:8ca1e814a851 2906 dn_err_t dn_ipmt_join(dn_ipmt_join_rpt* reply) {
APS_Lab 0:8ca1e814a851 2907 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2908 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2909
APS_Lab 0:8ca1e814a851 2910 // lock the module
APS_Lab 0:8ca1e814a851 2911 dn_lock();
APS_Lab 0:8ca1e814a851 2912
APS_Lab 0:8ca1e814a851 2913 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2914 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2915 // unlock the module
APS_Lab 0:8ca1e814a851 2916 dn_unlock();
APS_Lab 0:8ca1e814a851 2917
APS_Lab 0:8ca1e814a851 2918 // return
APS_Lab 0:8ca1e814a851 2919 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 2920 }
APS_Lab 0:8ca1e814a851 2921
APS_Lab 0:8ca1e814a851 2922 // store callback information
APS_Lab 0:8ca1e814a851 2923 dn_ipmt_vars.cmdId = CMDID_JOIN;
APS_Lab 0:8ca1e814a851 2924 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 2925
APS_Lab 0:8ca1e814a851 2926 // extraFlags
APS_Lab 0:8ca1e814a851 2927 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 2928
APS_Lab 0:8ca1e814a851 2929 // build outputBuf
APS_Lab 0:8ca1e814a851 2930
APS_Lab 0:8ca1e814a851 2931 // send outputBuf
APS_Lab 0:8ca1e814a851 2932 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 2933 CMDID_JOIN, // cmdId
APS_Lab 0:8ca1e814a851 2934 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 2935 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 2936 DN_JOIN_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 2937 dn_ipmt_join_reply // replyCb
APS_Lab 0:8ca1e814a851 2938 );
APS_Lab 0:8ca1e814a851 2939
APS_Lab 0:8ca1e814a851 2940 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 2941 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 2942 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 2943 }
APS_Lab 0:8ca1e814a851 2944
APS_Lab 0:8ca1e814a851 2945 // unlock the module
APS_Lab 0:8ca1e814a851 2946 dn_unlock();
APS_Lab 0:8ca1e814a851 2947
APS_Lab 0:8ca1e814a851 2948 return rc;
APS_Lab 0:8ca1e814a851 2949
APS_Lab 0:8ca1e814a851 2950 }
APS_Lab 0:8ca1e814a851 2951
APS_Lab 0:8ca1e814a851 2952 void dn_ipmt_join_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 2953 dn_ipmt_join_rpt* reply;
APS_Lab 0:8ca1e814a851 2954
APS_Lab 0:8ca1e814a851 2955 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 2956 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 2957 return;
APS_Lab 0:8ca1e814a851 2958 }
APS_Lab 0:8ca1e814a851 2959
APS_Lab 0:8ca1e814a851 2960 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 2961
APS_Lab 0:8ca1e814a851 2962 // cast the replyContent
APS_Lab 0:8ca1e814a851 2963 reply = (dn_ipmt_join_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 2964
APS_Lab 0:8ca1e814a851 2965 // store RC
APS_Lab 0:8ca1e814a851 2966 reply->RC = rc;
APS_Lab 0:8ca1e814a851 2967
APS_Lab 0:8ca1e814a851 2968 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 2969 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 2970
APS_Lab 0:8ca1e814a851 2971 }
APS_Lab 0:8ca1e814a851 2972
APS_Lab 0:8ca1e814a851 2973 // call the callback
APS_Lab 0:8ca1e814a851 2974 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 2975
APS_Lab 0:8ca1e814a851 2976 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 2977 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 2978 }
APS_Lab 0:8ca1e814a851 2979
APS_Lab 0:8ca1e814a851 2980 //===== disconnect
APS_Lab 0:8ca1e814a851 2981
APS_Lab 0:8ca1e814a851 2982 /**
APS_Lab 0:8ca1e814a851 2983 The disconnect command requests that the mote initiate disconnection from the
APS_Lab 0:8ca1e814a851 2984 network. After disconnection completes, the mote will generate a disconnected
APS_Lab 0:8ca1e814a851 2985 event, and proceed to reset. If the mote is not in the network, the
APS_Lab 0:8ca1e814a851 2986 disconnected event will be generated immediately. This command may be issued at
APS_Lab 0:8ca1e814a851 2987 any time.
APS_Lab 0:8ca1e814a851 2988 */
APS_Lab 0:8ca1e814a851 2989 dn_err_t dn_ipmt_disconnect(dn_ipmt_disconnect_rpt* reply) {
APS_Lab 0:8ca1e814a851 2990 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 2991 dn_err_t rc;
APS_Lab 0:8ca1e814a851 2992
APS_Lab 0:8ca1e814a851 2993 // lock the module
APS_Lab 0:8ca1e814a851 2994 dn_lock();
APS_Lab 0:8ca1e814a851 2995
APS_Lab 0:8ca1e814a851 2996 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 2997 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 2998 // unlock the module
APS_Lab 0:8ca1e814a851 2999 dn_unlock();
APS_Lab 0:8ca1e814a851 3000
APS_Lab 0:8ca1e814a851 3001 // return
APS_Lab 0:8ca1e814a851 3002 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3003 }
APS_Lab 0:8ca1e814a851 3004
APS_Lab 0:8ca1e814a851 3005 // store callback information
APS_Lab 0:8ca1e814a851 3006 dn_ipmt_vars.cmdId = CMDID_DISCONNECT;
APS_Lab 0:8ca1e814a851 3007 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3008
APS_Lab 0:8ca1e814a851 3009 // extraFlags
APS_Lab 0:8ca1e814a851 3010 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3011
APS_Lab 0:8ca1e814a851 3012 // build outputBuf
APS_Lab 0:8ca1e814a851 3013
APS_Lab 0:8ca1e814a851 3014 // send outputBuf
APS_Lab 0:8ca1e814a851 3015 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3016 CMDID_DISCONNECT, // cmdId
APS_Lab 0:8ca1e814a851 3017 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3018 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3019 DN_DISCONNECT_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3020 dn_ipmt_disconnect_reply // replyCb
APS_Lab 0:8ca1e814a851 3021 );
APS_Lab 0:8ca1e814a851 3022
APS_Lab 0:8ca1e814a851 3023 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3024 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3025 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3026 }
APS_Lab 0:8ca1e814a851 3027
APS_Lab 0:8ca1e814a851 3028 // unlock the module
APS_Lab 0:8ca1e814a851 3029 dn_unlock();
APS_Lab 0:8ca1e814a851 3030
APS_Lab 0:8ca1e814a851 3031 return rc;
APS_Lab 0:8ca1e814a851 3032
APS_Lab 0:8ca1e814a851 3033 }
APS_Lab 0:8ca1e814a851 3034
APS_Lab 0:8ca1e814a851 3035 void dn_ipmt_disconnect_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3036 dn_ipmt_disconnect_rpt* reply;
APS_Lab 0:8ca1e814a851 3037
APS_Lab 0:8ca1e814a851 3038 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3039 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3040 return;
APS_Lab 0:8ca1e814a851 3041 }
APS_Lab 0:8ca1e814a851 3042
APS_Lab 0:8ca1e814a851 3043 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3044
APS_Lab 0:8ca1e814a851 3045 // cast the replyContent
APS_Lab 0:8ca1e814a851 3046 reply = (dn_ipmt_disconnect_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3047
APS_Lab 0:8ca1e814a851 3048 // store RC
APS_Lab 0:8ca1e814a851 3049 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3050
APS_Lab 0:8ca1e814a851 3051 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3052 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3053
APS_Lab 0:8ca1e814a851 3054 }
APS_Lab 0:8ca1e814a851 3055
APS_Lab 0:8ca1e814a851 3056 // call the callback
APS_Lab 0:8ca1e814a851 3057 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3058
APS_Lab 0:8ca1e814a851 3059 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3060 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3061 }
APS_Lab 0:8ca1e814a851 3062
APS_Lab 0:8ca1e814a851 3063 //===== reset
APS_Lab 0:8ca1e814a851 3064
APS_Lab 0:8ca1e814a851 3065 /**
APS_Lab 0:8ca1e814a851 3066 The reset command initiates a soft-reset of the device. The device will
APS_Lab 0:8ca1e814a851 3067 initiate the reset sequence shortly after sending out the response to this
APS_Lab 0:8ca1e814a851 3068 command. Resetting a mote directly can adversely impact its descendants; to
APS_Lab 0:8ca1e814a851 3069 disconnect gracefully from the network, use the disconnect command
APS_Lab 0:8ca1e814a851 3070 */
APS_Lab 0:8ca1e814a851 3071 dn_err_t dn_ipmt_reset(dn_ipmt_reset_rpt* reply) {
APS_Lab 0:8ca1e814a851 3072 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3073 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3074
APS_Lab 0:8ca1e814a851 3075 // lock the module
APS_Lab 0:8ca1e814a851 3076 dn_lock();
APS_Lab 0:8ca1e814a851 3077
APS_Lab 0:8ca1e814a851 3078 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3079 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3080 // unlock the module
APS_Lab 0:8ca1e814a851 3081 dn_unlock();
APS_Lab 0:8ca1e814a851 3082
APS_Lab 0:8ca1e814a851 3083 // return
APS_Lab 0:8ca1e814a851 3084 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3085 }
APS_Lab 0:8ca1e814a851 3086
APS_Lab 0:8ca1e814a851 3087 // store callback information
APS_Lab 0:8ca1e814a851 3088 dn_ipmt_vars.cmdId = CMDID_RESET;
APS_Lab 0:8ca1e814a851 3089 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3090
APS_Lab 0:8ca1e814a851 3091 // extraFlags
APS_Lab 0:8ca1e814a851 3092 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3093
APS_Lab 0:8ca1e814a851 3094 // build outputBuf
APS_Lab 0:8ca1e814a851 3095
APS_Lab 0:8ca1e814a851 3096 // send outputBuf
APS_Lab 0:8ca1e814a851 3097 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3098 CMDID_RESET, // cmdId
APS_Lab 0:8ca1e814a851 3099 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3100 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3101 DN_RESET_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3102 dn_ipmt_reset_reply // replyCb
APS_Lab 0:8ca1e814a851 3103 );
APS_Lab 0:8ca1e814a851 3104
APS_Lab 0:8ca1e814a851 3105 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3106 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3107 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3108 }
APS_Lab 0:8ca1e814a851 3109
APS_Lab 0:8ca1e814a851 3110 // unlock the module
APS_Lab 0:8ca1e814a851 3111 dn_unlock();
APS_Lab 0:8ca1e814a851 3112
APS_Lab 0:8ca1e814a851 3113 return rc;
APS_Lab 0:8ca1e814a851 3114
APS_Lab 0:8ca1e814a851 3115 }
APS_Lab 0:8ca1e814a851 3116
APS_Lab 0:8ca1e814a851 3117 void dn_ipmt_reset_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3118 dn_ipmt_reset_rpt* reply;
APS_Lab 0:8ca1e814a851 3119
APS_Lab 0:8ca1e814a851 3120 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3121 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3122 return;
APS_Lab 0:8ca1e814a851 3123 }
APS_Lab 0:8ca1e814a851 3124
APS_Lab 0:8ca1e814a851 3125 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3126
APS_Lab 0:8ca1e814a851 3127 // cast the replyContent
APS_Lab 0:8ca1e814a851 3128 reply = (dn_ipmt_reset_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3129
APS_Lab 0:8ca1e814a851 3130 // store RC
APS_Lab 0:8ca1e814a851 3131 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3132
APS_Lab 0:8ca1e814a851 3133 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3134 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3135
APS_Lab 0:8ca1e814a851 3136 }
APS_Lab 0:8ca1e814a851 3137
APS_Lab 0:8ca1e814a851 3138 // call the callback
APS_Lab 0:8ca1e814a851 3139 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3140
APS_Lab 0:8ca1e814a851 3141 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3142 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3143 }
APS_Lab 0:8ca1e814a851 3144
APS_Lab 0:8ca1e814a851 3145 //===== lowPowerSleep
APS_Lab 0:8ca1e814a851 3146
APS_Lab 0:8ca1e814a851 3147 /**
APS_Lab 0:8ca1e814a851 3148 The lowPowerSleep command shuts down all peripherals and places the mote into
APS_Lab 0:8ca1e814a851 3149 deep sleep mode. The command executes after the mote sends its response. The
APS_Lab 0:8ca1e814a851 3150 mote enters deep sleep within two seconds after the command executes. The
APS_Lab 0:8ca1e814a851 3151 command may be issued at any time and will cause the mote to interrupt all
APS_Lab 0:8ca1e814a851 3152 in-progress network operation. To achieve a graceful disconnect, use the
APS_Lab 0:8ca1e814a851 3153 disconnect command before using the lowPowerSleep command. A hardware reset is
APS_Lab 0:8ca1e814a851 3154 required to bring a mote out of deep sleep mode.
APS_Lab 0:8ca1e814a851 3155 */
APS_Lab 0:8ca1e814a851 3156 dn_err_t dn_ipmt_lowPowerSleep(dn_ipmt_lowPowerSleep_rpt* reply) {
APS_Lab 0:8ca1e814a851 3157 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3158 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3159
APS_Lab 0:8ca1e814a851 3160 // lock the module
APS_Lab 0:8ca1e814a851 3161 dn_lock();
APS_Lab 0:8ca1e814a851 3162
APS_Lab 0:8ca1e814a851 3163 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3164 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3165 // unlock the module
APS_Lab 0:8ca1e814a851 3166 dn_unlock();
APS_Lab 0:8ca1e814a851 3167
APS_Lab 0:8ca1e814a851 3168 // return
APS_Lab 0:8ca1e814a851 3169 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3170 }
APS_Lab 0:8ca1e814a851 3171
APS_Lab 0:8ca1e814a851 3172 // store callback information
APS_Lab 0:8ca1e814a851 3173 dn_ipmt_vars.cmdId = CMDID_LOWPOWERSLEEP;
APS_Lab 0:8ca1e814a851 3174 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3175
APS_Lab 0:8ca1e814a851 3176 // extraFlags
APS_Lab 0:8ca1e814a851 3177 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3178
APS_Lab 0:8ca1e814a851 3179 // build outputBuf
APS_Lab 0:8ca1e814a851 3180
APS_Lab 0:8ca1e814a851 3181 // send outputBuf
APS_Lab 0:8ca1e814a851 3182 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3183 CMDID_LOWPOWERSLEEP, // cmdId
APS_Lab 0:8ca1e814a851 3184 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3185 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3186 DN_LOWPOWERSLEEP_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3187 dn_ipmt_lowPowerSleep_reply // replyCb
APS_Lab 0:8ca1e814a851 3188 );
APS_Lab 0:8ca1e814a851 3189
APS_Lab 0:8ca1e814a851 3190 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3191 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3192 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3193 }
APS_Lab 0:8ca1e814a851 3194
APS_Lab 0:8ca1e814a851 3195 // unlock the module
APS_Lab 0:8ca1e814a851 3196 dn_unlock();
APS_Lab 0:8ca1e814a851 3197
APS_Lab 0:8ca1e814a851 3198 return rc;
APS_Lab 0:8ca1e814a851 3199
APS_Lab 0:8ca1e814a851 3200 }
APS_Lab 0:8ca1e814a851 3201
APS_Lab 0:8ca1e814a851 3202 void dn_ipmt_lowPowerSleep_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3203 dn_ipmt_lowPowerSleep_rpt* reply;
APS_Lab 0:8ca1e814a851 3204
APS_Lab 0:8ca1e814a851 3205 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3206 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3207 return;
APS_Lab 0:8ca1e814a851 3208 }
APS_Lab 0:8ca1e814a851 3209
APS_Lab 0:8ca1e814a851 3210 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3211
APS_Lab 0:8ca1e814a851 3212 // cast the replyContent
APS_Lab 0:8ca1e814a851 3213 reply = (dn_ipmt_lowPowerSleep_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3214
APS_Lab 0:8ca1e814a851 3215 // store RC
APS_Lab 0:8ca1e814a851 3216 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3217
APS_Lab 0:8ca1e814a851 3218 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3219 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3220
APS_Lab 0:8ca1e814a851 3221 }
APS_Lab 0:8ca1e814a851 3222
APS_Lab 0:8ca1e814a851 3223 // call the callback
APS_Lab 0:8ca1e814a851 3224 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3225
APS_Lab 0:8ca1e814a851 3226 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3227 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3228 }
APS_Lab 0:8ca1e814a851 3229
APS_Lab 0:8ca1e814a851 3230 //===== testRadioRx
APS_Lab 0:8ca1e814a851 3231
APS_Lab 0:8ca1e814a851 3232 /**
APS_Lab 0:8ca1e814a851 3233 The testRadioRx command clears all previously collected statistics and
APS_Lab 0:8ca1e814a851 3234 initiates a test of radio reception for the specified channel and duration.
APS_Lab 0:8ca1e814a851 3235 During the test, the mote keeps statistics about the number of packets received
APS_Lab 0:8ca1e814a851 3236 (with and without error). The test results may be retrieved using the
APS_Lab 0:8ca1e814a851 3237 getParameter<testRadioRxStats> command. The testRadioRx command may only be
APS_Lab 0:8ca1e814a851 3238 issued in Idle mode. The mote must be reset (either hardware or software reset)
APS_Lab 0:8ca1e814a851 3239 after radio tests are complete and prior to joining.
APS_Lab 0:8ca1e814a851 3240
APS_Lab 0:8ca1e814a851 3241 Station ID is available in IP mote >= 1.4, and WirelessHART mote >= 1.1.2. The
APS_Lab 0:8ca1e814a851 3242 station ID is a user selectable value used to isolate traffic if multiple tests
APS_Lab 0:8ca1e814a851 3243 are running in the same radio space. It must be set to match the station ID
APS_Lab 0:8ca1e814a851 3244 used by the transmitter.
APS_Lab 0:8ca1e814a851 3245
APS_Lab 0:8ca1e814a851 3246
APS_Lab 0:8ca1e814a851 3247
APS_Lab 0:8ca1e814a851 3248 Channel numbering is 0-15, corresponding to IEEE 2.4 GHz channels 11-26.
APS_Lab 0:8ca1e814a851 3249 */
APS_Lab 0:8ca1e814a851 3250 dn_err_t dn_ipmt_testRadioRx(uint16_t channelMask, uint16_t time, uint8_t stationId, dn_ipmt_testRadioRx_rpt* reply) {
APS_Lab 0:8ca1e814a851 3251 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3252 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3253
APS_Lab 0:8ca1e814a851 3254 // lock the module
APS_Lab 0:8ca1e814a851 3255 dn_lock();
APS_Lab 0:8ca1e814a851 3256
APS_Lab 0:8ca1e814a851 3257 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3258 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3259 // unlock the module
APS_Lab 0:8ca1e814a851 3260 dn_unlock();
APS_Lab 0:8ca1e814a851 3261
APS_Lab 0:8ca1e814a851 3262 // return
APS_Lab 0:8ca1e814a851 3263 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3264 }
APS_Lab 0:8ca1e814a851 3265
APS_Lab 0:8ca1e814a851 3266 // store callback information
APS_Lab 0:8ca1e814a851 3267 dn_ipmt_vars.cmdId = CMDID_TESTRADIORX;
APS_Lab 0:8ca1e814a851 3268 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3269
APS_Lab 0:8ca1e814a851 3270 // extraFlags
APS_Lab 0:8ca1e814a851 3271 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3272
APS_Lab 0:8ca1e814a851 3273 // build outputBuf
APS_Lab 0:8ca1e814a851 3274 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIORX_REQ_OFFS_CHANNELMASK],channelMask);
APS_Lab 0:8ca1e814a851 3275 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIORX_REQ_OFFS_TIME],time);
APS_Lab 0:8ca1e814a851 3276 dn_ipmt_vars.outputBuf[DN_TESTRADIORX_REQ_OFFS_STATIONID] = stationId;
APS_Lab 0:8ca1e814a851 3277
APS_Lab 0:8ca1e814a851 3278 // send outputBuf
APS_Lab 0:8ca1e814a851 3279 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3280 CMDID_TESTRADIORX, // cmdId
APS_Lab 0:8ca1e814a851 3281 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3282 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3283 DN_TESTRADIORX_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3284 dn_ipmt_testRadioRx_reply // replyCb
APS_Lab 0:8ca1e814a851 3285 );
APS_Lab 0:8ca1e814a851 3286
APS_Lab 0:8ca1e814a851 3287 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3288 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3289 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3290 }
APS_Lab 0:8ca1e814a851 3291
APS_Lab 0:8ca1e814a851 3292 // unlock the module
APS_Lab 0:8ca1e814a851 3293 dn_unlock();
APS_Lab 0:8ca1e814a851 3294
APS_Lab 0:8ca1e814a851 3295 return rc;
APS_Lab 0:8ca1e814a851 3296
APS_Lab 0:8ca1e814a851 3297 }
APS_Lab 0:8ca1e814a851 3298
APS_Lab 0:8ca1e814a851 3299 void dn_ipmt_testRadioRx_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3300 dn_ipmt_testRadioRx_rpt* reply;
APS_Lab 0:8ca1e814a851 3301
APS_Lab 0:8ca1e814a851 3302 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3303 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3304 return;
APS_Lab 0:8ca1e814a851 3305 }
APS_Lab 0:8ca1e814a851 3306
APS_Lab 0:8ca1e814a851 3307 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3308
APS_Lab 0:8ca1e814a851 3309 // cast the replyContent
APS_Lab 0:8ca1e814a851 3310 reply = (dn_ipmt_testRadioRx_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3311
APS_Lab 0:8ca1e814a851 3312 // store RC
APS_Lab 0:8ca1e814a851 3313 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3314
APS_Lab 0:8ca1e814a851 3315 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3316 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3317
APS_Lab 0:8ca1e814a851 3318 }
APS_Lab 0:8ca1e814a851 3319
APS_Lab 0:8ca1e814a851 3320 // call the callback
APS_Lab 0:8ca1e814a851 3321 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3322
APS_Lab 0:8ca1e814a851 3323 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3324 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3325 }
APS_Lab 0:8ca1e814a851 3326
APS_Lab 0:8ca1e814a851 3327 //===== clearNV
APS_Lab 0:8ca1e814a851 3328
APS_Lab 0:8ca1e814a851 3329 /**
APS_Lab 0:8ca1e814a851 3330 The clearNV command resets the motes non-volatile memory (NV) to its
APS_Lab 0:8ca1e814a851 3331 factory-default state. See User Guide for detailed information about the
APS_Lab 0:8ca1e814a851 3332 default values. Since many parameters are read by the mote only at power-up,
APS_Lab 0:8ca1e814a851 3333 this command should be followed up by mote reset.
APS_Lab 0:8ca1e814a851 3334 */
APS_Lab 0:8ca1e814a851 3335 dn_err_t dn_ipmt_clearNV(dn_ipmt_clearNV_rpt* reply) {
APS_Lab 0:8ca1e814a851 3336 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3337 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3338
APS_Lab 0:8ca1e814a851 3339 // lock the module
APS_Lab 0:8ca1e814a851 3340 dn_lock();
APS_Lab 0:8ca1e814a851 3341
APS_Lab 0:8ca1e814a851 3342 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3343 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3344 // unlock the module
APS_Lab 0:8ca1e814a851 3345 dn_unlock();
APS_Lab 0:8ca1e814a851 3346
APS_Lab 0:8ca1e814a851 3347 // return
APS_Lab 0:8ca1e814a851 3348 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3349 }
APS_Lab 0:8ca1e814a851 3350
APS_Lab 0:8ca1e814a851 3351 // store callback information
APS_Lab 0:8ca1e814a851 3352 dn_ipmt_vars.cmdId = CMDID_CLEARNV;
APS_Lab 0:8ca1e814a851 3353 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3354
APS_Lab 0:8ca1e814a851 3355 // extraFlags
APS_Lab 0:8ca1e814a851 3356 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3357
APS_Lab 0:8ca1e814a851 3358 // build outputBuf
APS_Lab 0:8ca1e814a851 3359
APS_Lab 0:8ca1e814a851 3360 // send outputBuf
APS_Lab 0:8ca1e814a851 3361 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3362 CMDID_CLEARNV, // cmdId
APS_Lab 0:8ca1e814a851 3363 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3364 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3365 DN_CLEARNV_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3366 dn_ipmt_clearNV_reply // replyCb
APS_Lab 0:8ca1e814a851 3367 );
APS_Lab 0:8ca1e814a851 3368
APS_Lab 0:8ca1e814a851 3369 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3370 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3371 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3372 }
APS_Lab 0:8ca1e814a851 3373
APS_Lab 0:8ca1e814a851 3374 // unlock the module
APS_Lab 0:8ca1e814a851 3375 dn_unlock();
APS_Lab 0:8ca1e814a851 3376
APS_Lab 0:8ca1e814a851 3377 return rc;
APS_Lab 0:8ca1e814a851 3378
APS_Lab 0:8ca1e814a851 3379 }
APS_Lab 0:8ca1e814a851 3380
APS_Lab 0:8ca1e814a851 3381 void dn_ipmt_clearNV_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3382 dn_ipmt_clearNV_rpt* reply;
APS_Lab 0:8ca1e814a851 3383
APS_Lab 0:8ca1e814a851 3384 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3385 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3386 return;
APS_Lab 0:8ca1e814a851 3387 }
APS_Lab 0:8ca1e814a851 3388
APS_Lab 0:8ca1e814a851 3389 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3390
APS_Lab 0:8ca1e814a851 3391 // cast the replyContent
APS_Lab 0:8ca1e814a851 3392 reply = (dn_ipmt_clearNV_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3393
APS_Lab 0:8ca1e814a851 3394 // store RC
APS_Lab 0:8ca1e814a851 3395 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3396
APS_Lab 0:8ca1e814a851 3397 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3398 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3399
APS_Lab 0:8ca1e814a851 3400 }
APS_Lab 0:8ca1e814a851 3401
APS_Lab 0:8ca1e814a851 3402 // call the callback
APS_Lab 0:8ca1e814a851 3403 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3404
APS_Lab 0:8ca1e814a851 3405 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3406 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3407 }
APS_Lab 0:8ca1e814a851 3408
APS_Lab 0:8ca1e814a851 3409 //===== requestService
APS_Lab 0:8ca1e814a851 3410
APS_Lab 0:8ca1e814a851 3411 /**
APS_Lab 0:8ca1e814a851 3412 The requestService command may be used to request a new or changed service
APS_Lab 0:8ca1e814a851 3413 level to a destination device in the mesh. This command may only be used to
APS_Lab 0:8ca1e814a851 3414 update the service to a device with an existing connection (session).
APS_Lab 0:8ca1e814a851 3415
APS_Lab 0:8ca1e814a851 3416 Whenever a change in bandwidth assignment occurs, the application receives a
APS_Lab 0:8ca1e814a851 3417 serviceChanged event that it can use as a trigger to read the new service
APS_Lab 0:8ca1e814a851 3418 allocation.
APS_Lab 0:8ca1e814a851 3419 */
APS_Lab 0:8ca1e814a851 3420 dn_err_t dn_ipmt_requestService(uint16_t destAddr, uint8_t serviceType, uint32_t value, dn_ipmt_requestService_rpt* reply) {
APS_Lab 0:8ca1e814a851 3421 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3422 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3423
APS_Lab 0:8ca1e814a851 3424 // lock the module
APS_Lab 0:8ca1e814a851 3425 dn_lock();
APS_Lab 0:8ca1e814a851 3426
APS_Lab 0:8ca1e814a851 3427 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3428 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3429 // unlock the module
APS_Lab 0:8ca1e814a851 3430 dn_unlock();
APS_Lab 0:8ca1e814a851 3431
APS_Lab 0:8ca1e814a851 3432 // return
APS_Lab 0:8ca1e814a851 3433 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3434 }
APS_Lab 0:8ca1e814a851 3435
APS_Lab 0:8ca1e814a851 3436 // store callback information
APS_Lab 0:8ca1e814a851 3437 dn_ipmt_vars.cmdId = CMDID_REQUESTSERVICE;
APS_Lab 0:8ca1e814a851 3438 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3439
APS_Lab 0:8ca1e814a851 3440 // extraFlags
APS_Lab 0:8ca1e814a851 3441 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3442
APS_Lab 0:8ca1e814a851 3443 // build outputBuf
APS_Lab 0:8ca1e814a851 3444 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_REQUESTSERVICE_REQ_OFFS_DESTADDR],destAddr);
APS_Lab 0:8ca1e814a851 3445 dn_ipmt_vars.outputBuf[DN_REQUESTSERVICE_REQ_OFFS_SERVICETYPE] = serviceType;
APS_Lab 0:8ca1e814a851 3446 dn_write_uint32_t(&dn_ipmt_vars.outputBuf[DN_REQUESTSERVICE_REQ_OFFS_VALUE],value);
APS_Lab 0:8ca1e814a851 3447
APS_Lab 0:8ca1e814a851 3448 // send outputBuf
APS_Lab 0:8ca1e814a851 3449 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3450 CMDID_REQUESTSERVICE, // cmdId
APS_Lab 0:8ca1e814a851 3451 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3452 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3453 DN_REQUESTSERVICE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3454 dn_ipmt_requestService_reply // replyCb
APS_Lab 0:8ca1e814a851 3455 );
APS_Lab 0:8ca1e814a851 3456
APS_Lab 0:8ca1e814a851 3457 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3458 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3459 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3460 }
APS_Lab 0:8ca1e814a851 3461
APS_Lab 0:8ca1e814a851 3462 // unlock the module
APS_Lab 0:8ca1e814a851 3463 dn_unlock();
APS_Lab 0:8ca1e814a851 3464
APS_Lab 0:8ca1e814a851 3465 return rc;
APS_Lab 0:8ca1e814a851 3466
APS_Lab 0:8ca1e814a851 3467 }
APS_Lab 0:8ca1e814a851 3468
APS_Lab 0:8ca1e814a851 3469 void dn_ipmt_requestService_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3470 dn_ipmt_requestService_rpt* reply;
APS_Lab 0:8ca1e814a851 3471
APS_Lab 0:8ca1e814a851 3472 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3473 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3474 return;
APS_Lab 0:8ca1e814a851 3475 }
APS_Lab 0:8ca1e814a851 3476
APS_Lab 0:8ca1e814a851 3477 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3478
APS_Lab 0:8ca1e814a851 3479 // cast the replyContent
APS_Lab 0:8ca1e814a851 3480 reply = (dn_ipmt_requestService_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3481
APS_Lab 0:8ca1e814a851 3482 // store RC
APS_Lab 0:8ca1e814a851 3483 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3484
APS_Lab 0:8ca1e814a851 3485 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3486 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3487
APS_Lab 0:8ca1e814a851 3488 }
APS_Lab 0:8ca1e814a851 3489
APS_Lab 0:8ca1e814a851 3490 // call the callback
APS_Lab 0:8ca1e814a851 3491 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3492
APS_Lab 0:8ca1e814a851 3493 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3494 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3495 }
APS_Lab 0:8ca1e814a851 3496
APS_Lab 0:8ca1e814a851 3497 //===== getServiceInfo
APS_Lab 0:8ca1e814a851 3498
APS_Lab 0:8ca1e814a851 3499 /**
APS_Lab 0:8ca1e814a851 3500 The getServiceInfo command returns information about the service currently
APS_Lab 0:8ca1e814a851 3501 allocated to the mote.
APS_Lab 0:8ca1e814a851 3502 */
APS_Lab 0:8ca1e814a851 3503 dn_err_t dn_ipmt_getServiceInfo(uint16_t destAddr, uint8_t type, dn_ipmt_getServiceInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 3504 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3505 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3506
APS_Lab 0:8ca1e814a851 3507 // lock the module
APS_Lab 0:8ca1e814a851 3508 dn_lock();
APS_Lab 0:8ca1e814a851 3509
APS_Lab 0:8ca1e814a851 3510 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3511 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3512 // unlock the module
APS_Lab 0:8ca1e814a851 3513 dn_unlock();
APS_Lab 0:8ca1e814a851 3514
APS_Lab 0:8ca1e814a851 3515 // return
APS_Lab 0:8ca1e814a851 3516 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3517 }
APS_Lab 0:8ca1e814a851 3518
APS_Lab 0:8ca1e814a851 3519 // store callback information
APS_Lab 0:8ca1e814a851 3520 dn_ipmt_vars.cmdId = CMDID_GETSERVICEINFO;
APS_Lab 0:8ca1e814a851 3521 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3522
APS_Lab 0:8ca1e814a851 3523 // extraFlags
APS_Lab 0:8ca1e814a851 3524 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3525
APS_Lab 0:8ca1e814a851 3526 // build outputBuf
APS_Lab 0:8ca1e814a851 3527 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_GETSERVICEINFO_REQ_OFFS_DESTADDR],destAddr);
APS_Lab 0:8ca1e814a851 3528 dn_ipmt_vars.outputBuf[DN_GETSERVICEINFO_REQ_OFFS_TYPE] = type;
APS_Lab 0:8ca1e814a851 3529
APS_Lab 0:8ca1e814a851 3530 // send outputBuf
APS_Lab 0:8ca1e814a851 3531 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3532 CMDID_GETSERVICEINFO, // cmdId
APS_Lab 0:8ca1e814a851 3533 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3534 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3535 DN_GETSERVICEINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3536 dn_ipmt_getServiceInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 3537 );
APS_Lab 0:8ca1e814a851 3538
APS_Lab 0:8ca1e814a851 3539 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3540 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3541 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3542 }
APS_Lab 0:8ca1e814a851 3543
APS_Lab 0:8ca1e814a851 3544 // unlock the module
APS_Lab 0:8ca1e814a851 3545 dn_unlock();
APS_Lab 0:8ca1e814a851 3546
APS_Lab 0:8ca1e814a851 3547 return rc;
APS_Lab 0:8ca1e814a851 3548
APS_Lab 0:8ca1e814a851 3549 }
APS_Lab 0:8ca1e814a851 3550
APS_Lab 0:8ca1e814a851 3551 void dn_ipmt_getServiceInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3552 dn_ipmt_getServiceInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 3553
APS_Lab 0:8ca1e814a851 3554 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3555 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3556 return;
APS_Lab 0:8ca1e814a851 3557 }
APS_Lab 0:8ca1e814a851 3558
APS_Lab 0:8ca1e814a851 3559 // verify length
APS_Lab 0:8ca1e814a851 3560 if (rc==DN_SERIAL_RC_OK && len<DN_GETSERVICEINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 3561 return;
APS_Lab 0:8ca1e814a851 3562 }
APS_Lab 0:8ca1e814a851 3563
APS_Lab 0:8ca1e814a851 3564 // cast the replyContent
APS_Lab 0:8ca1e814a851 3565 reply = (dn_ipmt_getServiceInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3566
APS_Lab 0:8ca1e814a851 3567 // store RC
APS_Lab 0:8ca1e814a851 3568 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3569
APS_Lab 0:8ca1e814a851 3570 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3571 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3572
APS_Lab 0:8ca1e814a851 3573 dn_read_uint16_t(&reply->destAddr,&payload[DN_GETSERVICEINFO_REPLY_OFFS_DESTADDR]);
APS_Lab 0:8ca1e814a851 3574 reply->type = payload[DN_GETSERVICEINFO_REPLY_OFFS_TYPE];
APS_Lab 0:8ca1e814a851 3575 reply->state = payload[DN_GETSERVICEINFO_REPLY_OFFS_STATE];
APS_Lab 0:8ca1e814a851 3576 dn_read_uint32_t(&reply->value,&payload[DN_GETSERVICEINFO_REPLY_OFFS_VALUE]);
APS_Lab 0:8ca1e814a851 3577 }
APS_Lab 0:8ca1e814a851 3578
APS_Lab 0:8ca1e814a851 3579 // call the callback
APS_Lab 0:8ca1e814a851 3580 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3581
APS_Lab 0:8ca1e814a851 3582 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3583 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3584 }
APS_Lab 0:8ca1e814a851 3585
APS_Lab 0:8ca1e814a851 3586 //===== openSocket
APS_Lab 0:8ca1e814a851 3587
APS_Lab 0:8ca1e814a851 3588 /**
APS_Lab 0:8ca1e814a851 3589 The openSocket command creates an endpoint for IP communication and returns an
APS_Lab 0:8ca1e814a851 3590 ID for the socket.
APS_Lab 0:8ca1e814a851 3591 */
APS_Lab 0:8ca1e814a851 3592 dn_err_t dn_ipmt_openSocket(uint8_t protocol, dn_ipmt_openSocket_rpt* reply) {
APS_Lab 0:8ca1e814a851 3593 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3594 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3595
APS_Lab 0:8ca1e814a851 3596 // lock the module
APS_Lab 0:8ca1e814a851 3597 dn_lock();
APS_Lab 0:8ca1e814a851 3598
APS_Lab 0:8ca1e814a851 3599 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3600 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3601 // unlock the module
APS_Lab 0:8ca1e814a851 3602 dn_unlock();
APS_Lab 0:8ca1e814a851 3603
APS_Lab 0:8ca1e814a851 3604 // return
APS_Lab 0:8ca1e814a851 3605 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3606 }
APS_Lab 0:8ca1e814a851 3607
APS_Lab 0:8ca1e814a851 3608 // store callback information
APS_Lab 0:8ca1e814a851 3609 dn_ipmt_vars.cmdId = CMDID_OPENSOCKET;
APS_Lab 0:8ca1e814a851 3610 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3611
APS_Lab 0:8ca1e814a851 3612 // extraFlags
APS_Lab 0:8ca1e814a851 3613 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3614
APS_Lab 0:8ca1e814a851 3615 // build outputBuf
APS_Lab 0:8ca1e814a851 3616 dn_ipmt_vars.outputBuf[DN_OPENSOCKET_REQ_OFFS_PROTOCOL] = protocol;
APS_Lab 0:8ca1e814a851 3617
APS_Lab 0:8ca1e814a851 3618 // send outputBuf
APS_Lab 0:8ca1e814a851 3619 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3620 CMDID_OPENSOCKET, // cmdId
APS_Lab 0:8ca1e814a851 3621 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3622 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3623 DN_OPENSOCKET_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3624 dn_ipmt_openSocket_reply // replyCb
APS_Lab 0:8ca1e814a851 3625 );
APS_Lab 0:8ca1e814a851 3626
APS_Lab 0:8ca1e814a851 3627 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3628 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3629 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3630 }
APS_Lab 0:8ca1e814a851 3631
APS_Lab 0:8ca1e814a851 3632 // unlock the module
APS_Lab 0:8ca1e814a851 3633 dn_unlock();
APS_Lab 0:8ca1e814a851 3634
APS_Lab 0:8ca1e814a851 3635 return rc;
APS_Lab 0:8ca1e814a851 3636
APS_Lab 0:8ca1e814a851 3637 }
APS_Lab 0:8ca1e814a851 3638
APS_Lab 0:8ca1e814a851 3639 void dn_ipmt_openSocket_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3640 dn_ipmt_openSocket_rpt* reply;
APS_Lab 0:8ca1e814a851 3641
APS_Lab 0:8ca1e814a851 3642 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3643 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3644 return;
APS_Lab 0:8ca1e814a851 3645 }
APS_Lab 0:8ca1e814a851 3646
APS_Lab 0:8ca1e814a851 3647 // verify length
APS_Lab 0:8ca1e814a851 3648 if (rc==DN_SERIAL_RC_OK && len<DN_OPENSOCKET_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 3649 return;
APS_Lab 0:8ca1e814a851 3650 }
APS_Lab 0:8ca1e814a851 3651
APS_Lab 0:8ca1e814a851 3652 // cast the replyContent
APS_Lab 0:8ca1e814a851 3653 reply = (dn_ipmt_openSocket_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3654
APS_Lab 0:8ca1e814a851 3655 // store RC
APS_Lab 0:8ca1e814a851 3656 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3657
APS_Lab 0:8ca1e814a851 3658 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3659 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3660
APS_Lab 0:8ca1e814a851 3661 reply->socketId = payload[DN_OPENSOCKET_REPLY_OFFS_SOCKETID];
APS_Lab 0:8ca1e814a851 3662 }
APS_Lab 0:8ca1e814a851 3663
APS_Lab 0:8ca1e814a851 3664 // call the callback
APS_Lab 0:8ca1e814a851 3665 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3666
APS_Lab 0:8ca1e814a851 3667 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3668 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3669 }
APS_Lab 0:8ca1e814a851 3670
APS_Lab 0:8ca1e814a851 3671 //===== closeSocket
APS_Lab 0:8ca1e814a851 3672
APS_Lab 0:8ca1e814a851 3673 /**
APS_Lab 0:8ca1e814a851 3674 Close the previously open socket.
APS_Lab 0:8ca1e814a851 3675 */
APS_Lab 0:8ca1e814a851 3676 dn_err_t dn_ipmt_closeSocket(uint8_t socketId, dn_ipmt_closeSocket_rpt* reply) {
APS_Lab 0:8ca1e814a851 3677 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3678 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3679
APS_Lab 0:8ca1e814a851 3680 // lock the module
APS_Lab 0:8ca1e814a851 3681 dn_lock();
APS_Lab 0:8ca1e814a851 3682
APS_Lab 0:8ca1e814a851 3683 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3684 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3685 // unlock the module
APS_Lab 0:8ca1e814a851 3686 dn_unlock();
APS_Lab 0:8ca1e814a851 3687
APS_Lab 0:8ca1e814a851 3688 // return
APS_Lab 0:8ca1e814a851 3689 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3690 }
APS_Lab 0:8ca1e814a851 3691
APS_Lab 0:8ca1e814a851 3692 // store callback information
APS_Lab 0:8ca1e814a851 3693 dn_ipmt_vars.cmdId = CMDID_CLOSESOCKET;
APS_Lab 0:8ca1e814a851 3694 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3695
APS_Lab 0:8ca1e814a851 3696 // extraFlags
APS_Lab 0:8ca1e814a851 3697 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3698
APS_Lab 0:8ca1e814a851 3699 // build outputBuf
APS_Lab 0:8ca1e814a851 3700 dn_ipmt_vars.outputBuf[DN_CLOSESOCKET_REQ_OFFS_SOCKETID] = socketId;
APS_Lab 0:8ca1e814a851 3701
APS_Lab 0:8ca1e814a851 3702 // send outputBuf
APS_Lab 0:8ca1e814a851 3703 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3704 CMDID_CLOSESOCKET, // cmdId
APS_Lab 0:8ca1e814a851 3705 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3706 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3707 DN_CLOSESOCKET_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3708 dn_ipmt_closeSocket_reply // replyCb
APS_Lab 0:8ca1e814a851 3709 );
APS_Lab 0:8ca1e814a851 3710
APS_Lab 0:8ca1e814a851 3711 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3712 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3713 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3714 }
APS_Lab 0:8ca1e814a851 3715
APS_Lab 0:8ca1e814a851 3716 // unlock the module
APS_Lab 0:8ca1e814a851 3717 dn_unlock();
APS_Lab 0:8ca1e814a851 3718
APS_Lab 0:8ca1e814a851 3719 return rc;
APS_Lab 0:8ca1e814a851 3720
APS_Lab 0:8ca1e814a851 3721 }
APS_Lab 0:8ca1e814a851 3722
APS_Lab 0:8ca1e814a851 3723 void dn_ipmt_closeSocket_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3724 dn_ipmt_closeSocket_rpt* reply;
APS_Lab 0:8ca1e814a851 3725
APS_Lab 0:8ca1e814a851 3726 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3727 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3728 return;
APS_Lab 0:8ca1e814a851 3729 }
APS_Lab 0:8ca1e814a851 3730
APS_Lab 0:8ca1e814a851 3731 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3732
APS_Lab 0:8ca1e814a851 3733 // cast the replyContent
APS_Lab 0:8ca1e814a851 3734 reply = (dn_ipmt_closeSocket_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3735
APS_Lab 0:8ca1e814a851 3736 // store RC
APS_Lab 0:8ca1e814a851 3737 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3738
APS_Lab 0:8ca1e814a851 3739 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3740 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3741
APS_Lab 0:8ca1e814a851 3742 }
APS_Lab 0:8ca1e814a851 3743
APS_Lab 0:8ca1e814a851 3744 // call the callback
APS_Lab 0:8ca1e814a851 3745 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3746
APS_Lab 0:8ca1e814a851 3747 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3748 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3749 }
APS_Lab 0:8ca1e814a851 3750
APS_Lab 0:8ca1e814a851 3751 //===== bindSocket
APS_Lab 0:8ca1e814a851 3752
APS_Lab 0:8ca1e814a851 3753 /**
APS_Lab 0:8ca1e814a851 3754 Bind a previously opened socket to a port. When a socket is created, it is only
APS_Lab 0:8ca1e814a851 3755 given a protocol family, but not assigned a port. This association must be
APS_Lab 0:8ca1e814a851 3756 performed before the socket can accept connections from other hosts.
APS_Lab 0:8ca1e814a851 3757 */
APS_Lab 0:8ca1e814a851 3758 dn_err_t dn_ipmt_bindSocket(uint8_t socketId, uint16_t port, dn_ipmt_bindSocket_rpt* reply) {
APS_Lab 0:8ca1e814a851 3759 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3760 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3761
APS_Lab 0:8ca1e814a851 3762 // lock the module
APS_Lab 0:8ca1e814a851 3763 dn_lock();
APS_Lab 0:8ca1e814a851 3764
APS_Lab 0:8ca1e814a851 3765 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3766 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3767 // unlock the module
APS_Lab 0:8ca1e814a851 3768 dn_unlock();
APS_Lab 0:8ca1e814a851 3769
APS_Lab 0:8ca1e814a851 3770 // return
APS_Lab 0:8ca1e814a851 3771 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3772 }
APS_Lab 0:8ca1e814a851 3773
APS_Lab 0:8ca1e814a851 3774 // store callback information
APS_Lab 0:8ca1e814a851 3775 dn_ipmt_vars.cmdId = CMDID_BINDSOCKET;
APS_Lab 0:8ca1e814a851 3776 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3777
APS_Lab 0:8ca1e814a851 3778 // extraFlags
APS_Lab 0:8ca1e814a851 3779 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3780
APS_Lab 0:8ca1e814a851 3781 // build outputBuf
APS_Lab 0:8ca1e814a851 3782 dn_ipmt_vars.outputBuf[DN_BINDSOCKET_REQ_OFFS_SOCKETID] = socketId;
APS_Lab 0:8ca1e814a851 3783 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_BINDSOCKET_REQ_OFFS_PORT],port);
APS_Lab 0:8ca1e814a851 3784
APS_Lab 0:8ca1e814a851 3785 // send outputBuf
APS_Lab 0:8ca1e814a851 3786 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3787 CMDID_BINDSOCKET, // cmdId
APS_Lab 0:8ca1e814a851 3788 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3789 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3790 DN_BINDSOCKET_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3791 dn_ipmt_bindSocket_reply // replyCb
APS_Lab 0:8ca1e814a851 3792 );
APS_Lab 0:8ca1e814a851 3793
APS_Lab 0:8ca1e814a851 3794 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3795 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3796 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3797 }
APS_Lab 0:8ca1e814a851 3798
APS_Lab 0:8ca1e814a851 3799 // unlock the module
APS_Lab 0:8ca1e814a851 3800 dn_unlock();
APS_Lab 0:8ca1e814a851 3801
APS_Lab 0:8ca1e814a851 3802 return rc;
APS_Lab 0:8ca1e814a851 3803
APS_Lab 0:8ca1e814a851 3804 }
APS_Lab 0:8ca1e814a851 3805
APS_Lab 0:8ca1e814a851 3806 void dn_ipmt_bindSocket_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3807 dn_ipmt_bindSocket_rpt* reply;
APS_Lab 0:8ca1e814a851 3808
APS_Lab 0:8ca1e814a851 3809 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3810 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3811 return;
APS_Lab 0:8ca1e814a851 3812 }
APS_Lab 0:8ca1e814a851 3813
APS_Lab 0:8ca1e814a851 3814 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3815
APS_Lab 0:8ca1e814a851 3816 // cast the replyContent
APS_Lab 0:8ca1e814a851 3817 reply = (dn_ipmt_bindSocket_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3818
APS_Lab 0:8ca1e814a851 3819 // store RC
APS_Lab 0:8ca1e814a851 3820 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3821
APS_Lab 0:8ca1e814a851 3822 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3823 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3824
APS_Lab 0:8ca1e814a851 3825 }
APS_Lab 0:8ca1e814a851 3826
APS_Lab 0:8ca1e814a851 3827 // call the callback
APS_Lab 0:8ca1e814a851 3828 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3829
APS_Lab 0:8ca1e814a851 3830 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3831 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3832 }
APS_Lab 0:8ca1e814a851 3833
APS_Lab 0:8ca1e814a851 3834 //===== sendTo
APS_Lab 0:8ca1e814a851 3835
APS_Lab 0:8ca1e814a851 3836 /**
APS_Lab 0:8ca1e814a851 3837 Send a packet into the network. If the command returns RC_OK, the mote has
APS_Lab 0:8ca1e814a851 3838 accepted the packet and hasqueuedit up for transmission. A txDone notification
APS_Lab 0:8ca1e814a851 3839 will be issued when the packet has been sent, if and only if the packet ID
APS_Lab 0:8ca1e814a851 3840 passed in this command is different from 0xffff. You can set the packet ID to
APS_Lab 0:8ca1e814a851 3841 any value. The notification will contain the packet ID of the packet just sent,
APS_Lab 0:8ca1e814a851 3842 allowing association of the notification with a particular packet. The
APS_Lab 0:8ca1e814a851 3843 destination port should be in the range 0xF0B8-F0BF (61624-61631) to maximize
APS_Lab 0:8ca1e814a851 3844 payload.
APS_Lab 0:8ca1e814a851 3845 */
APS_Lab 0:8ca1e814a851 3846 dn_err_t dn_ipmt_sendTo(uint8_t socketId, uint8_t* destIP, uint16_t destPort, uint8_t serviceType, uint8_t priority, uint16_t packetId, uint8_t* payload, uint8_t payloadLen, dn_ipmt_sendTo_rpt* reply) {
APS_Lab 0:8ca1e814a851 3847 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3848 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3849
APS_Lab 0:8ca1e814a851 3850 // lock the module
APS_Lab 0:8ca1e814a851 3851 dn_lock();
APS_Lab 0:8ca1e814a851 3852
APS_Lab 0:8ca1e814a851 3853 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3854 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3855 // unlock the module
APS_Lab 0:8ca1e814a851 3856 dn_unlock();
APS_Lab 0:8ca1e814a851 3857
APS_Lab 0:8ca1e814a851 3858 // return
APS_Lab 0:8ca1e814a851 3859 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3860 }
APS_Lab 0:8ca1e814a851 3861
APS_Lab 0:8ca1e814a851 3862 // store callback information
APS_Lab 0:8ca1e814a851 3863 dn_ipmt_vars.cmdId = CMDID_SENDTO;
APS_Lab 0:8ca1e814a851 3864 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3865
APS_Lab 0:8ca1e814a851 3866 // extraFlags
APS_Lab 0:8ca1e814a851 3867 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3868
APS_Lab 0:8ca1e814a851 3869 // build outputBuf
APS_Lab 0:8ca1e814a851 3870 dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_SOCKETID] = socketId;
APS_Lab 0:8ca1e814a851 3871 memcpy(&dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_DESTIP],destIP,16);
APS_Lab 0:8ca1e814a851 3872 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_DESTPORT],destPort);
APS_Lab 0:8ca1e814a851 3873 dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_SERVICETYPE] = serviceType;
APS_Lab 0:8ca1e814a851 3874 dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_PRIORITY] = priority;
APS_Lab 0:8ca1e814a851 3875 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_PACKETID],packetId);
APS_Lab 0:8ca1e814a851 3876 memcpy(&dn_ipmt_vars.outputBuf[DN_SENDTO_REQ_OFFS_PAYLOAD],payload,payloadLen);
APS_Lab 0:8ca1e814a851 3877
APS_Lab 0:8ca1e814a851 3878 // send outputBuf
APS_Lab 0:8ca1e814a851 3879 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3880 CMDID_SENDTO, // cmdId
APS_Lab 0:8ca1e814a851 3881 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3882 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3883 DN_SENDTO_REQ_LEN+payloadLen, // length
APS_Lab 0:8ca1e814a851 3884 dn_ipmt_sendTo_reply // replyCb
APS_Lab 0:8ca1e814a851 3885 );
APS_Lab 0:8ca1e814a851 3886
APS_Lab 0:8ca1e814a851 3887 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3888 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3889 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3890 }
APS_Lab 0:8ca1e814a851 3891
APS_Lab 0:8ca1e814a851 3892 // unlock the module
APS_Lab 0:8ca1e814a851 3893 dn_unlock();
APS_Lab 0:8ca1e814a851 3894
APS_Lab 0:8ca1e814a851 3895 return rc;
APS_Lab 0:8ca1e814a851 3896
APS_Lab 0:8ca1e814a851 3897 }
APS_Lab 0:8ca1e814a851 3898
APS_Lab 0:8ca1e814a851 3899 void dn_ipmt_sendTo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3900 dn_ipmt_sendTo_rpt* reply;
APS_Lab 0:8ca1e814a851 3901
APS_Lab 0:8ca1e814a851 3902 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3903 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3904 return;
APS_Lab 0:8ca1e814a851 3905 }
APS_Lab 0:8ca1e814a851 3906
APS_Lab 0:8ca1e814a851 3907 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3908
APS_Lab 0:8ca1e814a851 3909 // cast the replyContent
APS_Lab 0:8ca1e814a851 3910 reply = (dn_ipmt_sendTo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3911
APS_Lab 0:8ca1e814a851 3912 // store RC
APS_Lab 0:8ca1e814a851 3913 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3914
APS_Lab 0:8ca1e814a851 3915 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3916 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 3917
APS_Lab 0:8ca1e814a851 3918 }
APS_Lab 0:8ca1e814a851 3919
APS_Lab 0:8ca1e814a851 3920 // call the callback
APS_Lab 0:8ca1e814a851 3921 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 3922
APS_Lab 0:8ca1e814a851 3923 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 3924 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 3925 }
APS_Lab 0:8ca1e814a851 3926
APS_Lab 0:8ca1e814a851 3927 //===== search
APS_Lab 0:8ca1e814a851 3928
APS_Lab 0:8ca1e814a851 3929 /**
APS_Lab 0:8ca1e814a851 3930 The search command requests that mote start listening for advertisements and
APS_Lab 0:8ca1e814a851 3931 report those heard from any network withoutattempting to join. This is called
APS_Lab 0:8ca1e814a851 3932 the Promiscuous Listen state. The mote must be in the Idle state for this
APS_Lab 0:8ca1e814a851 3933 command to be valid. The search state can be exited by issuing the join command
APS_Lab 0:8ca1e814a851 3934 or the reset command.
APS_Lab 0:8ca1e814a851 3935 */
APS_Lab 0:8ca1e814a851 3936 dn_err_t dn_ipmt_search(dn_ipmt_search_rpt* reply) {
APS_Lab 0:8ca1e814a851 3937 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 3938 dn_err_t rc;
APS_Lab 0:8ca1e814a851 3939
APS_Lab 0:8ca1e814a851 3940 // lock the module
APS_Lab 0:8ca1e814a851 3941 dn_lock();
APS_Lab 0:8ca1e814a851 3942
APS_Lab 0:8ca1e814a851 3943 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 3944 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 3945 // unlock the module
APS_Lab 0:8ca1e814a851 3946 dn_unlock();
APS_Lab 0:8ca1e814a851 3947
APS_Lab 0:8ca1e814a851 3948 // return
APS_Lab 0:8ca1e814a851 3949 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 3950 }
APS_Lab 0:8ca1e814a851 3951
APS_Lab 0:8ca1e814a851 3952 // store callback information
APS_Lab 0:8ca1e814a851 3953 dn_ipmt_vars.cmdId = CMDID_SEARCH;
APS_Lab 0:8ca1e814a851 3954 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 3955
APS_Lab 0:8ca1e814a851 3956 // extraFlags
APS_Lab 0:8ca1e814a851 3957 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 3958
APS_Lab 0:8ca1e814a851 3959 // build outputBuf
APS_Lab 0:8ca1e814a851 3960
APS_Lab 0:8ca1e814a851 3961 // send outputBuf
APS_Lab 0:8ca1e814a851 3962 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 3963 CMDID_SEARCH, // cmdId
APS_Lab 0:8ca1e814a851 3964 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 3965 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 3966 DN_SEARCH_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 3967 dn_ipmt_search_reply // replyCb
APS_Lab 0:8ca1e814a851 3968 );
APS_Lab 0:8ca1e814a851 3969
APS_Lab 0:8ca1e814a851 3970 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 3971 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 3972 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 3973 }
APS_Lab 0:8ca1e814a851 3974
APS_Lab 0:8ca1e814a851 3975 // unlock the module
APS_Lab 0:8ca1e814a851 3976 dn_unlock();
APS_Lab 0:8ca1e814a851 3977
APS_Lab 0:8ca1e814a851 3978 return rc;
APS_Lab 0:8ca1e814a851 3979
APS_Lab 0:8ca1e814a851 3980 }
APS_Lab 0:8ca1e814a851 3981
APS_Lab 0:8ca1e814a851 3982 void dn_ipmt_search_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 3983 dn_ipmt_search_rpt* reply;
APS_Lab 0:8ca1e814a851 3984
APS_Lab 0:8ca1e814a851 3985 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 3986 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 3987 return;
APS_Lab 0:8ca1e814a851 3988 }
APS_Lab 0:8ca1e814a851 3989
APS_Lab 0:8ca1e814a851 3990 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 3991
APS_Lab 0:8ca1e814a851 3992 // cast the replyContent
APS_Lab 0:8ca1e814a851 3993 reply = (dn_ipmt_search_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 3994
APS_Lab 0:8ca1e814a851 3995 // store RC
APS_Lab 0:8ca1e814a851 3996 reply->RC = rc;
APS_Lab 0:8ca1e814a851 3997
APS_Lab 0:8ca1e814a851 3998 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 3999 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 4000
APS_Lab 0:8ca1e814a851 4001 }
APS_Lab 0:8ca1e814a851 4002
APS_Lab 0:8ca1e814a851 4003 // call the callback
APS_Lab 0:8ca1e814a851 4004 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 4005
APS_Lab 0:8ca1e814a851 4006 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 4007 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 4008 }
APS_Lab 0:8ca1e814a851 4009
APS_Lab 0:8ca1e814a851 4010 //===== testRadioTxExt
APS_Lab 0:8ca1e814a851 4011
APS_Lab 0:8ca1e814a851 4012 /**
APS_Lab 0:8ca1e814a851 4013 The testRadioTxExt command allows the microprocessor to initiate a radio
APS_Lab 0:8ca1e814a851 4014 transmission test. This command may only be issued prior to the mote joining
APS_Lab 0:8ca1e814a851 4015 the network. Three types of transmission tests are supported:
APS_Lab 0:8ca1e814a851 4016
APS_Lab 0:8ca1e814a851 4017 - Packet transmission
APS_Lab 0:8ca1e814a851 4018 - Continuous modulation
APS_Lab 0:8ca1e814a851 4019 - Continuous wave (unmodulated signal)
APS_Lab 0:8ca1e814a851 4020
APS_Lab 0:8ca1e814a851 4021 In a packet transmission test, the mote generates a repeatCnt number of packet
APS_Lab 0:8ca1e814a851 4022 sequences. Each sequence consists of up to 10 packets with configurable size
APS_Lab 0:8ca1e814a851 4023 and delays. Each packet starts with a PHY preamble (5 bytes), followed by a PHY
APS_Lab 0:8ca1e814a851 4024 length field (1 byte), followed by data payload of up to 125 bytes, and finally
APS_Lab 0:8ca1e814a851 4025 a 2-byte 802.15.4 CRC at the end. Byte 0 of the payload contains stationId of
APS_Lab 0:8ca1e814a851 4026 the sender. Bytes 1 and 2 contain the packet number (in big-endian format) that
APS_Lab 0:8ca1e814a851 4027 increments with every packet transmitted. Bytes 3..N contain a counter (from
APS_Lab 0:8ca1e814a851 4028 0..N-3) that increments with every byte inside payload. Transmissions occur on
APS_Lab 0:8ca1e814a851 4029 the set of channels defined by chanMask , selected inpseudo-randomorder.
APS_Lab 0:8ca1e814a851 4030
APS_Lab 0:8ca1e814a851 4031 In a continuous modulation test, the mote generates continuous pseudo-random
APS_Lab 0:8ca1e814a851 4032 modulated signal, centered at the specified channel. The test is stopped by
APS_Lab 0:8ca1e814a851 4033 resetting the mote.
APS_Lab 0:8ca1e814a851 4034
APS_Lab 0:8ca1e814a851 4035 In a continuous wave test, the mote generates an unmodulated tone, centered at
APS_Lab 0:8ca1e814a851 4036 the specified channel. The test tone is stopped by resetting the mote.
APS_Lab 0:8ca1e814a851 4037
APS_Lab 0:8ca1e814a851 4038 The testRadioTxExt command may only be issued when the mote is in Idle mode,
APS_Lab 0:8ca1e814a851 4039 prior to its joining the network. The mote must be reset (either hardware or
APS_Lab 0:8ca1e814a851 4040 software reset) after radio tests are complete and prior to joining.
APS_Lab 0:8ca1e814a851 4041
APS_Lab 0:8ca1e814a851 4042 The station ID is a user selectable value. It is used in packet tests so that a
APS_Lab 0:8ca1e814a851 4043 receiver can identify packets from this device in cases where there may be
APS_Lab 0:8ca1e814a851 4044 multiple tests running in the same radio space. This field is not used for CM
APS_Lab 0:8ca1e814a851 4045 or CW tests. See testRadioRX (SmartMesh IP) or testRadioRxExt (SmartMesh WirelessHART).
APS_Lab 0:8ca1e814a851 4046
APS_Lab 0:8ca1e814a851 4047
APS_Lab 0:8ca1e814a851 4048
APS_Lab 0:8ca1e814a851 4049 Channel numbering is 0-15, corresponding to IEEE 2.4 GHz channels 11-26.
APS_Lab 0:8ca1e814a851 4050 */
APS_Lab 0:8ca1e814a851 4051 dn_err_t dn_ipmt_testRadioTxExt(uint8_t testType, uint16_t chanMask, uint16_t repeatCnt, int8_t txPower, uint8_t seqSize, uint8_t pkLen_1, uint16_t delay_1, uint8_t pkLen_2, uint16_t delay_2, uint8_t pkLen_3, uint16_t delay_3, uint8_t pkLen_4, uint16_t delay_4, uint8_t pkLen_5, uint16_t delay_5, uint8_t pkLen_6, uint16_t delay_6, uint8_t pkLen_7, uint16_t delay_7, uint8_t pkLen_8, uint16_t delay_8, uint8_t pkLen_9, uint16_t delay_9, uint8_t pkLen_10, uint16_t delay_10, uint8_t stationId, dn_ipmt_testRadioTxExt_rpt* reply) {
APS_Lab 0:8ca1e814a851 4052 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 4053 dn_err_t rc;
APS_Lab 0:8ca1e814a851 4054
APS_Lab 0:8ca1e814a851 4055 // lock the module
APS_Lab 0:8ca1e814a851 4056 dn_lock();
APS_Lab 0:8ca1e814a851 4057
APS_Lab 0:8ca1e814a851 4058 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 4059 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 4060 // unlock the module
APS_Lab 0:8ca1e814a851 4061 dn_unlock();
APS_Lab 0:8ca1e814a851 4062
APS_Lab 0:8ca1e814a851 4063 // return
APS_Lab 0:8ca1e814a851 4064 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 4065 }
APS_Lab 0:8ca1e814a851 4066
APS_Lab 0:8ca1e814a851 4067 // store callback information
APS_Lab 0:8ca1e814a851 4068 dn_ipmt_vars.cmdId = CMDID_TESTRADIOTXEXT;
APS_Lab 0:8ca1e814a851 4069 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 4070
APS_Lab 0:8ca1e814a851 4071 // extraFlags
APS_Lab 0:8ca1e814a851 4072 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 4073
APS_Lab 0:8ca1e814a851 4074 // build outputBuf
APS_Lab 0:8ca1e814a851 4075 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_TESTTYPE] = testType;
APS_Lab 0:8ca1e814a851 4076 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_CHANMASK],chanMask);
APS_Lab 0:8ca1e814a851 4077 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_REPEATCNT],repeatCnt);
APS_Lab 0:8ca1e814a851 4078 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_TXPOWER] = (int8_t)txPower;
APS_Lab 0:8ca1e814a851 4079 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_SEQSIZE] = seqSize;
APS_Lab 0:8ca1e814a851 4080 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_1] = pkLen_1;
APS_Lab 0:8ca1e814a851 4081 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_1],delay_1);
APS_Lab 0:8ca1e814a851 4082 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_2] = pkLen_2;
APS_Lab 0:8ca1e814a851 4083 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_2],delay_2);
APS_Lab 0:8ca1e814a851 4084 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_3] = pkLen_3;
APS_Lab 0:8ca1e814a851 4085 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_3],delay_3);
APS_Lab 0:8ca1e814a851 4086 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_4] = pkLen_4;
APS_Lab 0:8ca1e814a851 4087 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_4],delay_4);
APS_Lab 0:8ca1e814a851 4088 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_5] = pkLen_5;
APS_Lab 0:8ca1e814a851 4089 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_5],delay_5);
APS_Lab 0:8ca1e814a851 4090 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_6] = pkLen_6;
APS_Lab 0:8ca1e814a851 4091 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_6],delay_6);
APS_Lab 0:8ca1e814a851 4092 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_7] = pkLen_7;
APS_Lab 0:8ca1e814a851 4093 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_7],delay_7);
APS_Lab 0:8ca1e814a851 4094 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_8] = pkLen_8;
APS_Lab 0:8ca1e814a851 4095 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_8],delay_8);
APS_Lab 0:8ca1e814a851 4096 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_9] = pkLen_9;
APS_Lab 0:8ca1e814a851 4097 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_9],delay_9);
APS_Lab 0:8ca1e814a851 4098 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_PKLEN_10] = pkLen_10;
APS_Lab 0:8ca1e814a851 4099 dn_write_uint16_t(&dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_DELAY_10],delay_10);
APS_Lab 0:8ca1e814a851 4100 dn_ipmt_vars.outputBuf[DN_TESTRADIOTXEXT_REQ_OFFS_STATIONID] = stationId;
APS_Lab 0:8ca1e814a851 4101
APS_Lab 0:8ca1e814a851 4102 // send outputBuf
APS_Lab 0:8ca1e814a851 4103 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 4104 CMDID_TESTRADIOTXEXT, // cmdId
APS_Lab 0:8ca1e814a851 4105 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 4106 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 4107 DN_TESTRADIOTXEXT_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 4108 dn_ipmt_testRadioTxExt_reply // replyCb
APS_Lab 0:8ca1e814a851 4109 );
APS_Lab 0:8ca1e814a851 4110
APS_Lab 0:8ca1e814a851 4111 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 4112 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 4113 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 4114 }
APS_Lab 0:8ca1e814a851 4115
APS_Lab 0:8ca1e814a851 4116 // unlock the module
APS_Lab 0:8ca1e814a851 4117 dn_unlock();
APS_Lab 0:8ca1e814a851 4118
APS_Lab 0:8ca1e814a851 4119 return rc;
APS_Lab 0:8ca1e814a851 4120
APS_Lab 0:8ca1e814a851 4121 }
APS_Lab 0:8ca1e814a851 4122
APS_Lab 0:8ca1e814a851 4123 void dn_ipmt_testRadioTxExt_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 4124 dn_ipmt_testRadioTxExt_rpt* reply;
APS_Lab 0:8ca1e814a851 4125
APS_Lab 0:8ca1e814a851 4126 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 4127 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 4128 return;
APS_Lab 0:8ca1e814a851 4129 }
APS_Lab 0:8ca1e814a851 4130
APS_Lab 0:8ca1e814a851 4131 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 4132
APS_Lab 0:8ca1e814a851 4133 // cast the replyContent
APS_Lab 0:8ca1e814a851 4134 reply = (dn_ipmt_testRadioTxExt_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 4135
APS_Lab 0:8ca1e814a851 4136 // store RC
APS_Lab 0:8ca1e814a851 4137 reply->RC = rc;
APS_Lab 0:8ca1e814a851 4138
APS_Lab 0:8ca1e814a851 4139 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 4140 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 4141
APS_Lab 0:8ca1e814a851 4142 }
APS_Lab 0:8ca1e814a851 4143
APS_Lab 0:8ca1e814a851 4144 // call the callback
APS_Lab 0:8ca1e814a851 4145 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 4146
APS_Lab 0:8ca1e814a851 4147 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 4148 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 4149 }
APS_Lab 0:8ca1e814a851 4150
APS_Lab 0:8ca1e814a851 4151 //===== zeroize
APS_Lab 0:8ca1e814a851 4152
APS_Lab 0:8ca1e814a851 4153 /**
APS_Lab 0:8ca1e814a851 4154 Zeroize (zeroise) command erases flash area that is used to store configuration
APS_Lab 0:8ca1e814a851 4155 parameters, such as join keys. This command is intended to satisfy zeroization
APS_Lab 0:8ca1e814a851 4156 requirement of FIPS-140 standard. After the command executes, the mote should
APS_Lab 0:8ca1e814a851 4157 be reset. Available in mote >= 1.4.x
APS_Lab 0:8ca1e814a851 4158
APS_Lab 0:8ca1e814a851 4159 The zeroize command will render the mote inoperable. It must be re-programmed
APS_Lab 0:8ca1e814a851 4160 via SPI or JTAG in order to be useable.
APS_Lab 0:8ca1e814a851 4161 */
APS_Lab 0:8ca1e814a851 4162 dn_err_t dn_ipmt_zeroize(dn_ipmt_zeroize_rpt* reply) {
APS_Lab 0:8ca1e814a851 4163 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 4164 dn_err_t rc;
APS_Lab 0:8ca1e814a851 4165
APS_Lab 0:8ca1e814a851 4166 // lock the module
APS_Lab 0:8ca1e814a851 4167 dn_lock();
APS_Lab 0:8ca1e814a851 4168
APS_Lab 0:8ca1e814a851 4169 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 4170 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 4171 // unlock the module
APS_Lab 0:8ca1e814a851 4172 dn_unlock();
APS_Lab 0:8ca1e814a851 4173
APS_Lab 0:8ca1e814a851 4174 // return
APS_Lab 0:8ca1e814a851 4175 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 4176 }
APS_Lab 0:8ca1e814a851 4177
APS_Lab 0:8ca1e814a851 4178 // store callback information
APS_Lab 0:8ca1e814a851 4179 dn_ipmt_vars.cmdId = CMDID_ZEROIZE;
APS_Lab 0:8ca1e814a851 4180 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 4181
APS_Lab 0:8ca1e814a851 4182 // extraFlags
APS_Lab 0:8ca1e814a851 4183 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 4184
APS_Lab 0:8ca1e814a851 4185 // build outputBuf
APS_Lab 0:8ca1e814a851 4186
APS_Lab 0:8ca1e814a851 4187 // send outputBuf
APS_Lab 0:8ca1e814a851 4188 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 4189 CMDID_ZEROIZE, // cmdId
APS_Lab 0:8ca1e814a851 4190 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 4191 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 4192 DN_ZEROIZE_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 4193 dn_ipmt_zeroize_reply // replyCb
APS_Lab 0:8ca1e814a851 4194 );
APS_Lab 0:8ca1e814a851 4195
APS_Lab 0:8ca1e814a851 4196 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 4197 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 4198 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 4199 }
APS_Lab 0:8ca1e814a851 4200
APS_Lab 0:8ca1e814a851 4201 // unlock the module
APS_Lab 0:8ca1e814a851 4202 dn_unlock();
APS_Lab 0:8ca1e814a851 4203
APS_Lab 0:8ca1e814a851 4204 return rc;
APS_Lab 0:8ca1e814a851 4205
APS_Lab 0:8ca1e814a851 4206 }
APS_Lab 0:8ca1e814a851 4207
APS_Lab 0:8ca1e814a851 4208 void dn_ipmt_zeroize_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 4209 dn_ipmt_zeroize_rpt* reply;
APS_Lab 0:8ca1e814a851 4210
APS_Lab 0:8ca1e814a851 4211 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 4212 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 4213 return;
APS_Lab 0:8ca1e814a851 4214 }
APS_Lab 0:8ca1e814a851 4215
APS_Lab 0:8ca1e814a851 4216 // do NOT verify length (no return fields expected)
APS_Lab 0:8ca1e814a851 4217
APS_Lab 0:8ca1e814a851 4218 // cast the replyContent
APS_Lab 0:8ca1e814a851 4219 reply = (dn_ipmt_zeroize_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 4220
APS_Lab 0:8ca1e814a851 4221 // store RC
APS_Lab 0:8ca1e814a851 4222 reply->RC = rc;
APS_Lab 0:8ca1e814a851 4223
APS_Lab 0:8ca1e814a851 4224 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 4225 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 4226
APS_Lab 0:8ca1e814a851 4227 }
APS_Lab 0:8ca1e814a851 4228
APS_Lab 0:8ca1e814a851 4229 // call the callback
APS_Lab 0:8ca1e814a851 4230 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 4231
APS_Lab 0:8ca1e814a851 4232 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 4233 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 4234 }
APS_Lab 0:8ca1e814a851 4235
APS_Lab 0:8ca1e814a851 4236 //===== socketInfo
APS_Lab 0:8ca1e814a851 4237
APS_Lab 0:8ca1e814a851 4238 /**
APS_Lab 0:8ca1e814a851 4239 Retrieve information about a socket. (Available in IP Mote >= 1.4.0)
APS_Lab 0:8ca1e814a851 4240 */
APS_Lab 0:8ca1e814a851 4241 dn_err_t dn_ipmt_socketInfo(uint8_t index, dn_ipmt_socketInfo_rpt* reply) {
APS_Lab 0:8ca1e814a851 4242 uint8_t extraFlags;
APS_Lab 0:8ca1e814a851 4243 dn_err_t rc;
APS_Lab 0:8ca1e814a851 4244
APS_Lab 0:8ca1e814a851 4245 // lock the module
APS_Lab 0:8ca1e814a851 4246 dn_lock();
APS_Lab 0:8ca1e814a851 4247
APS_Lab 0:8ca1e814a851 4248 // verify no ongoing transmissions
APS_Lab 0:8ca1e814a851 4249 if (dn_ipmt_vars.busyTx) {
APS_Lab 0:8ca1e814a851 4250 // unlock the module
APS_Lab 0:8ca1e814a851 4251 dn_unlock();
APS_Lab 0:8ca1e814a851 4252
APS_Lab 0:8ca1e814a851 4253 // return
APS_Lab 0:8ca1e814a851 4254 return DN_ERR_BUSY;
APS_Lab 0:8ca1e814a851 4255 }
APS_Lab 0:8ca1e814a851 4256
APS_Lab 0:8ca1e814a851 4257 // store callback information
APS_Lab 0:8ca1e814a851 4258 dn_ipmt_vars.cmdId = CMDID_SOCKETINFO;
APS_Lab 0:8ca1e814a851 4259 dn_ipmt_vars.replyContents = (uint8_t*)reply;
APS_Lab 0:8ca1e814a851 4260
APS_Lab 0:8ca1e814a851 4261 // extraFlags
APS_Lab 0:8ca1e814a851 4262 extraFlags = 0x00;
APS_Lab 0:8ca1e814a851 4263
APS_Lab 0:8ca1e814a851 4264 // build outputBuf
APS_Lab 0:8ca1e814a851 4265 dn_ipmt_vars.outputBuf[DN_SOCKETINFO_REQ_OFFS_INDEX] = index;
APS_Lab 0:8ca1e814a851 4266
APS_Lab 0:8ca1e814a851 4267 // send outputBuf
APS_Lab 0:8ca1e814a851 4268 rc = dn_serial_mt_sendRequest(
APS_Lab 0:8ca1e814a851 4269 CMDID_SOCKETINFO, // cmdId
APS_Lab 0:8ca1e814a851 4270 extraFlags, // extraFlags
APS_Lab 0:8ca1e814a851 4271 dn_ipmt_vars.outputBuf, // payload
APS_Lab 0:8ca1e814a851 4272 DN_SOCKETINFO_REQ_LEN, // length
APS_Lab 0:8ca1e814a851 4273 dn_ipmt_socketInfo_reply // replyCb
APS_Lab 0:8ca1e814a851 4274 );
APS_Lab 0:8ca1e814a851 4275
APS_Lab 0:8ca1e814a851 4276 if (rc==DN_ERR_NONE) {
APS_Lab 0:8ca1e814a851 4277 // I'm now busy transmitting
APS_Lab 0:8ca1e814a851 4278 dn_ipmt_vars.busyTx = TRUE;
APS_Lab 0:8ca1e814a851 4279 }
APS_Lab 0:8ca1e814a851 4280
APS_Lab 0:8ca1e814a851 4281 // unlock the module
APS_Lab 0:8ca1e814a851 4282 dn_unlock();
APS_Lab 0:8ca1e814a851 4283
APS_Lab 0:8ca1e814a851 4284 return rc;
APS_Lab 0:8ca1e814a851 4285
APS_Lab 0:8ca1e814a851 4286 }
APS_Lab 0:8ca1e814a851 4287
APS_Lab 0:8ca1e814a851 4288 void dn_ipmt_socketInfo_reply(uint8_t cmdId, uint8_t rc, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 4289 dn_ipmt_socketInfo_rpt* reply;
APS_Lab 0:8ca1e814a851 4290
APS_Lab 0:8ca1e814a851 4291 // verify I'm expecting this answer
APS_Lab 0:8ca1e814a851 4292 if (dn_ipmt_vars.busyTx==FALSE || dn_ipmt_vars.cmdId!=cmdId) {
APS_Lab 0:8ca1e814a851 4293 return;
APS_Lab 0:8ca1e814a851 4294 }
APS_Lab 0:8ca1e814a851 4295
APS_Lab 0:8ca1e814a851 4296 // verify length
APS_Lab 0:8ca1e814a851 4297 if (rc==DN_SERIAL_RC_OK && len<DN_SOCKETINFO_REPLY_LEN) {
APS_Lab 0:8ca1e814a851 4298 return;
APS_Lab 0:8ca1e814a851 4299 }
APS_Lab 0:8ca1e814a851 4300
APS_Lab 0:8ca1e814a851 4301 // cast the replyContent
APS_Lab 0:8ca1e814a851 4302 reply = (dn_ipmt_socketInfo_rpt*)dn_ipmt_vars.replyContents;
APS_Lab 0:8ca1e814a851 4303
APS_Lab 0:8ca1e814a851 4304 // store RC
APS_Lab 0:8ca1e814a851 4305 reply->RC = rc;
APS_Lab 0:8ca1e814a851 4306
APS_Lab 0:8ca1e814a851 4307 // parse returned value (iff RC==0)
APS_Lab 0:8ca1e814a851 4308 if (rc==DN_SERIAL_RC_OK) {
APS_Lab 0:8ca1e814a851 4309
APS_Lab 0:8ca1e814a851 4310 reply->index = payload[DN_SOCKETINFO_REPLY_OFFS_INDEX];
APS_Lab 0:8ca1e814a851 4311 reply->socketId = payload[DN_SOCKETINFO_REPLY_OFFS_SOCKETID];
APS_Lab 0:8ca1e814a851 4312 reply->protocol = payload[DN_SOCKETINFO_REPLY_OFFS_PROTOCOL];
APS_Lab 0:8ca1e814a851 4313 reply->bindState = payload[DN_SOCKETINFO_REPLY_OFFS_BINDSTATE];
APS_Lab 0:8ca1e814a851 4314 dn_read_uint16_t(&reply->port,&payload[DN_SOCKETINFO_REPLY_OFFS_PORT]);
APS_Lab 0:8ca1e814a851 4315 }
APS_Lab 0:8ca1e814a851 4316
APS_Lab 0:8ca1e814a851 4317 // call the callback
APS_Lab 0:8ca1e814a851 4318 dn_ipmt_vars.replyCb(cmdId);
APS_Lab 0:8ca1e814a851 4319
APS_Lab 0:8ca1e814a851 4320 // I'm not busy transmitting anymore
APS_Lab 0:8ca1e814a851 4321 dn_ipmt_vars.busyTx=FALSE;
APS_Lab 0:8ca1e814a851 4322 }
APS_Lab 0:8ca1e814a851 4323
APS_Lab 0:8ca1e814a851 4324 //========== serialRX
APS_Lab 0:8ca1e814a851 4325
APS_Lab 0:8ca1e814a851 4326 void dn_ipmt_rxSerialRequest(uint8_t cmdId, uint8_t flags, uint8_t* payload, uint8_t len) {
APS_Lab 0:8ca1e814a851 4327 dn_ipmt_timeIndication_nt* notif_timeIndication;
APS_Lab 0:8ca1e814a851 4328 dn_ipmt_events_nt* notif_events;
APS_Lab 0:8ca1e814a851 4329 dn_ipmt_receive_nt* notif_receive;
APS_Lab 0:8ca1e814a851 4330 dn_ipmt_macRx_nt* notif_macRx;
APS_Lab 0:8ca1e814a851 4331 dn_ipmt_txDone_nt* notif_txDone;
APS_Lab 0:8ca1e814a851 4332 dn_ipmt_advReceived_nt* notif_advReceived;
APS_Lab 0:8ca1e814a851 4333
APS_Lab 0:8ca1e814a851 4334 // parse notification
APS_Lab 0:8ca1e814a851 4335 switch(cmdId) {
APS_Lab 0:8ca1e814a851 4336 case CMDID_TIMEINDICATION:
APS_Lab 0:8ca1e814a851 4337
APS_Lab 0:8ca1e814a851 4338 // verify length payload received
APS_Lab 0:8ca1e814a851 4339 if (len<23) {
APS_Lab 0:8ca1e814a851 4340 return;
APS_Lab 0:8ca1e814a851 4341 }
APS_Lab 0:8ca1e814a851 4342
APS_Lab 0:8ca1e814a851 4343 // verify length notifBuf
APS_Lab 0:8ca1e814a851 4344 if (len>dn_ipmt_vars.notifBufLen) {
APS_Lab 0:8ca1e814a851 4345 return;
APS_Lab 0:8ca1e814a851 4346 }
APS_Lab 0:8ca1e814a851 4347
APS_Lab 0:8ca1e814a851 4348 // cast notifBuf
APS_Lab 0:8ca1e814a851 4349 notif_timeIndication = (dn_ipmt_timeIndication_nt*)dn_ipmt_vars.notifBuf;
APS_Lab 0:8ca1e814a851 4350
APS_Lab 0:8ca1e814a851 4351 // parse the notification
APS_Lab 0:8ca1e814a851 4352 dn_read_uint32_t(&notif_timeIndication->uptime,&payload[DN_TIMEINDICATION_NOTIF_OFFS_UPTIME]);
APS_Lab 0:8ca1e814a851 4353 memcpy(&notif_timeIndication->utcSecs[0],&payload[DN_TIMEINDICATION_NOTIF_OFFS_UTCSECS],8);
APS_Lab 0:8ca1e814a851 4354 dn_read_uint32_t(&notif_timeIndication->utcUsecs,&payload[DN_TIMEINDICATION_NOTIF_OFFS_UTCUSECS]);
APS_Lab 0:8ca1e814a851 4355 memcpy(&notif_timeIndication->asn[0],&payload[DN_TIMEINDICATION_NOTIF_OFFS_ASN],5);
APS_Lab 0:8ca1e814a851 4356 dn_read_uint16_t(&notif_timeIndication->asnOffset,&payload[DN_TIMEINDICATION_NOTIF_OFFS_ASNOFFSET]);
APS_Lab 0:8ca1e814a851 4357 break;
APS_Lab 0:8ca1e814a851 4358 case CMDID_EVENTS:
APS_Lab 0:8ca1e814a851 4359
APS_Lab 0:8ca1e814a851 4360 // verify length payload received
APS_Lab 0:8ca1e814a851 4361 if (len<9) {
APS_Lab 0:8ca1e814a851 4362 return;
APS_Lab 0:8ca1e814a851 4363 }
APS_Lab 0:8ca1e814a851 4364
APS_Lab 0:8ca1e814a851 4365 // verify length notifBuf
APS_Lab 0:8ca1e814a851 4366 if (len>dn_ipmt_vars.notifBufLen) {
APS_Lab 0:8ca1e814a851 4367 return;
APS_Lab 0:8ca1e814a851 4368 }
APS_Lab 0:8ca1e814a851 4369
APS_Lab 0:8ca1e814a851 4370 // cast notifBuf
APS_Lab 0:8ca1e814a851 4371 notif_events = (dn_ipmt_events_nt*)dn_ipmt_vars.notifBuf;
APS_Lab 0:8ca1e814a851 4372
APS_Lab 0:8ca1e814a851 4373 // parse the notification
APS_Lab 0:8ca1e814a851 4374 dn_read_uint32_t(&notif_events->events,&payload[DN_EVENTS_NOTIF_OFFS_EVENTS]);
APS_Lab 0:8ca1e814a851 4375 notif_events->state = payload[DN_EVENTS_NOTIF_OFFS_STATE];
APS_Lab 0:8ca1e814a851 4376 dn_read_uint32_t(&notif_events->alarmsList,&payload[DN_EVENTS_NOTIF_OFFS_ALARMSLIST]);
APS_Lab 0:8ca1e814a851 4377 break;
APS_Lab 0:8ca1e814a851 4378 case CMDID_RECEIVE:
APS_Lab 0:8ca1e814a851 4379
APS_Lab 0:8ca1e814a851 4380 // verify length payload received
APS_Lab 0:8ca1e814a851 4381 if (len<19) {
APS_Lab 0:8ca1e814a851 4382 return;
APS_Lab 0:8ca1e814a851 4383 }
APS_Lab 0:8ca1e814a851 4384
APS_Lab 0:8ca1e814a851 4385 // verify length notifBuf
APS_Lab 0:8ca1e814a851 4386 if (len>dn_ipmt_vars.notifBufLen) {
APS_Lab 0:8ca1e814a851 4387 return;
APS_Lab 0:8ca1e814a851 4388 }
APS_Lab 0:8ca1e814a851 4389
APS_Lab 0:8ca1e814a851 4390 // cast notifBuf
APS_Lab 0:8ca1e814a851 4391 notif_receive = (dn_ipmt_receive_nt*)dn_ipmt_vars.notifBuf;
APS_Lab 0:8ca1e814a851 4392
APS_Lab 0:8ca1e814a851 4393 // parse the notification
APS_Lab 0:8ca1e814a851 4394 notif_receive->socketId = payload[DN_RECEIVE_NOTIF_OFFS_SOCKETID];
APS_Lab 0:8ca1e814a851 4395 memcpy(&notif_receive->srcAddr[0],&payload[DN_RECEIVE_NOTIF_OFFS_SRCADDR],16);
APS_Lab 0:8ca1e814a851 4396 dn_read_uint16_t(&notif_receive->srcPort,&payload[DN_RECEIVE_NOTIF_OFFS_SRCPORT]);
APS_Lab 0:8ca1e814a851 4397 notif_receive->payloadLen = len-DN_RECEIVE_NOTIF_OFFS_PAYLOAD;
APS_Lab 0:8ca1e814a851 4398 memcpy(&notif_receive->payload[0],&payload[DN_RECEIVE_NOTIF_OFFS_PAYLOAD],len-DN_RECEIVE_NOTIF_OFFS_PAYLOAD);
APS_Lab 0:8ca1e814a851 4399 break;
APS_Lab 0:8ca1e814a851 4400 case CMDID_MACRX:
APS_Lab 0:8ca1e814a851 4401
APS_Lab 0:8ca1e814a851 4402 // verify length notifBuf
APS_Lab 0:8ca1e814a851 4403 if (len>dn_ipmt_vars.notifBufLen) {
APS_Lab 0:8ca1e814a851 4404 return;
APS_Lab 0:8ca1e814a851 4405 }
APS_Lab 0:8ca1e814a851 4406
APS_Lab 0:8ca1e814a851 4407 // cast notifBuf
APS_Lab 0:8ca1e814a851 4408 notif_macRx = (dn_ipmt_macRx_nt*)dn_ipmt_vars.notifBuf;
APS_Lab 0:8ca1e814a851 4409
APS_Lab 0:8ca1e814a851 4410 // parse the notification
APS_Lab 0:8ca1e814a851 4411 memcpy(&notif_macRx->payload[0],&payload[DN_MACRX_NOTIF_OFFS_PAYLOAD],len-DN_MACRX_NOTIF_OFFS_PAYLOAD);
APS_Lab 0:8ca1e814a851 4412 break;
APS_Lab 0:8ca1e814a851 4413 case CMDID_TXDONE:
APS_Lab 0:8ca1e814a851 4414
APS_Lab 0:8ca1e814a851 4415 // verify length payload received
APS_Lab 0:8ca1e814a851 4416 if (len<3) {
APS_Lab 0:8ca1e814a851 4417 return;
APS_Lab 0:8ca1e814a851 4418 }
APS_Lab 0:8ca1e814a851 4419
APS_Lab 0:8ca1e814a851 4420 // verify length notifBuf
APS_Lab 0:8ca1e814a851 4421 if (len>dn_ipmt_vars.notifBufLen) {
APS_Lab 0:8ca1e814a851 4422 return;
APS_Lab 0:8ca1e814a851 4423 }
APS_Lab 0:8ca1e814a851 4424
APS_Lab 0:8ca1e814a851 4425 // cast notifBuf
APS_Lab 0:8ca1e814a851 4426 notif_txDone = (dn_ipmt_txDone_nt*)dn_ipmt_vars.notifBuf;
APS_Lab 0:8ca1e814a851 4427
APS_Lab 0:8ca1e814a851 4428 // parse the notification
APS_Lab 0:8ca1e814a851 4429 dn_read_uint16_t(&notif_txDone->packetId,&payload[DN_TXDONE_NOTIF_OFFS_PACKETID]);
APS_Lab 0:8ca1e814a851 4430 notif_txDone->status = payload[DN_TXDONE_NOTIF_OFFS_STATUS];
APS_Lab 0:8ca1e814a851 4431 break;
APS_Lab 0:8ca1e814a851 4432 case CMDID_ADVRECEIVED:
APS_Lab 0:8ca1e814a851 4433
APS_Lab 0:8ca1e814a851 4434 // verify length payload received
APS_Lab 0:8ca1e814a851 4435 if (len<6) {
APS_Lab 0:8ca1e814a851 4436 return;
APS_Lab 0:8ca1e814a851 4437 }
APS_Lab 0:8ca1e814a851 4438
APS_Lab 0:8ca1e814a851 4439 // verify length notifBuf
APS_Lab 0:8ca1e814a851 4440 if (len>dn_ipmt_vars.notifBufLen) {
APS_Lab 0:8ca1e814a851 4441 return;
APS_Lab 0:8ca1e814a851 4442 }
APS_Lab 0:8ca1e814a851 4443
APS_Lab 0:8ca1e814a851 4444 // cast notifBuf
APS_Lab 0:8ca1e814a851 4445 notif_advReceived = (dn_ipmt_advReceived_nt*)dn_ipmt_vars.notifBuf;
APS_Lab 0:8ca1e814a851 4446
APS_Lab 0:8ca1e814a851 4447 // parse the notification
APS_Lab 0:8ca1e814a851 4448 dn_read_uint16_t(&notif_advReceived->netId,&payload[DN_ADVRECEIVED_NOTIF_OFFS_NETID]);
APS_Lab 0:8ca1e814a851 4449 dn_read_uint16_t(&notif_advReceived->moteId,&payload[DN_ADVRECEIVED_NOTIF_OFFS_MOTEID]);
APS_Lab 0:8ca1e814a851 4450 notif_advReceived->rssi = (int8_t)payload[DN_ADVRECEIVED_NOTIF_OFFS_RSSI];
APS_Lab 0:8ca1e814a851 4451 notif_advReceived->joinPri = payload[DN_ADVRECEIVED_NOTIF_OFFS_JOINPRI];
APS_Lab 0:8ca1e814a851 4452 break;
APS_Lab 0:8ca1e814a851 4453 default:
APS_Lab 0:8ca1e814a851 4454 // unknown cmdID
APS_Lab 0:8ca1e814a851 4455 return;
APS_Lab 0:8ca1e814a851 4456 }
APS_Lab 0:8ca1e814a851 4457
APS_Lab 0:8ca1e814a851 4458 // call the callback
APS_Lab 0:8ca1e814a851 4459 dn_ipmt_vars.notifCb(cmdId,DN_SUBCMDID_NONE);
APS_Lab 0:8ca1e814a851 4460 }
APS_Lab 0:8ca1e814a851 4461
APS_Lab 0:8ca1e814a851 4462 //=========================== helpers =========================================
APS_Lab 0:8ca1e814a851 4463
APS_Lab 0:8ca1e814a851 4464