wireless sensor / Mbed 2 deprecated dakaxitong_Enhanced

Dependencies:   libmDot mbed-rtos mbed

Fork of power_meter by wireless sensor

Committer:
wang1tao
Date:
Wed Feb 15 10:10:11 2017 +0000
Revision:
5:cd2d6ed47421
Parent:
4:0341c0004919
Send data through LoRa added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terrytamyh 0:87fb6735eb09 1 #include "mbed.h"
terrytamyh 0:87fb6735eb09 2 #include "DataLoggerRS232.h"
wang1tao 4:0341c0004919 3 #include "mbed.h"
wang1tao 4:0341c0004919 4 #include "mDot.h"
wang1tao 4:0341c0004919 5 #include "MTSLog.h"
wang1tao 4:0341c0004919 6 #include <string>
wang1tao 4:0341c0004919 7 #include <vector>
wang1tao 4:0341c0004919 8 #include <algorithm>
wang1tao 4:0341c0004919 9 #include <math.h>
wang1tao 4:0341c0004919 10
wang1tao 5:cd2d6ed47421 11 #define RETURN_OK 0
wang1tao 5:cd2d6ed47421 12 #define RETURN_ERR -1
wang1tao 4:0341c0004919 13 //define baudrate
wang1tao 4:0341c0004919 14 #define PC_BAUDRATE 115200
wang1tao 4:0341c0004919 15 #define CARD_MACHINE_BAUDRATE 19200
wang1tao 4:0341c0004919 16
wang1tao 4:0341c0004919 17 #define COMMAND_LENGTH 7
wang1tao 4:0341c0004919 18 #define RESPONSE_LENGTH 16
wang1tao 4:0341c0004919 19 #define RINGBUFFER_SIZE 100
wang1tao 4:0341c0004919 20
wang1tao 4:0341c0004919 21 #define READ_PERIOD 2
wang1tao 4:0341c0004919 22 #define SEND_PERIOD 5
terrytamyh 0:87fb6735eb09 23
wang1tao 4:0341c0004919 24 const char readCmd[COMMAND_LENGTH] = {0x09,0x41,0x31,0x46,0x33,0x46,0x0d};
wang1tao 4:0341c0004919 25
wang1tao 4:0341c0004919 26 char readBuf[RESPONSE_LENGTH] = {0};
wang1tao 4:0341c0004919 27 char ringBuffer[RINGBUFFER_SIZE][RESPONSE_LENGTH] = {0};
wang1tao 4:0341c0004919 28
wang1tao 4:0341c0004919 29 unsigned int inIndex = 0;
wang1tao 4:0341c0004919 30 unsigned int outIndex = 0;
wang1tao 4:0341c0004919 31
wang1tao 4:0341c0004919 32 /* functions prototype */
wang1tao 4:0341c0004919 33 void readCardID(void);
wang1tao 4:0341c0004919 34 void sendCardID(void);
wang1tao 4:0341c0004919 35
wang1tao 4:0341c0004919 36 void my_strcpy(char *dst, char *src);
wang1tao 4:0341c0004919 37 void my_strclear(char *str, unsigned int len);
wang1tao 4:0341c0004919 38
wang1tao 5:cd2d6ed47421 39 int configNetwork(void);
wang1tao 5:cd2d6ed47421 40 int joinNetwork(void);
wang1tao 5:cd2d6ed47421 41 int send_data(char *str);
wang1tao 5:cd2d6ed47421 42
wang1tao 4:0341c0004919 43 /* Global variables */
wang1tao 4:0341c0004919 44 Serial pc (USBTX, USBRX); // tx, rx
wang1tao 4:0341c0004919 45 Serial cm_rs485 (PA_2,PA_3); // tx, rx
wang1tao 4:0341c0004919 46
wang1tao 4:0341c0004919 47 mDot* dot;
Dengjj 2:6ebf09171de9 48
wang1tao 4:0341c0004919 49 Ticker readTick;
wang1tao 4:0341c0004919 50 Ticker sendTick;
wang1tao 4:0341c0004919 51
wang1tao 4:0341c0004919 52 int main()
wang1tao 4:0341c0004919 53 {
wang1tao 5:cd2d6ed47421 54 int32_t ret;
wang1tao 4:0341c0004919 55
wang1tao 4:0341c0004919 56 // get a mDot handle
wang1tao 5:cd2d6ed47421 57 dot = mDot::getInstance();
wang1tao 4:0341c0004919 58
wang1tao 4:0341c0004919 59 pc.baud(PC_BAUDRATE);
wang1tao 4:0341c0004919 60 pc.printf("PC COM RS232 baudrate: %d \n\r", PC_BAUDRATE);
wang1tao 4:0341c0004919 61 cm_rs485.baud(CARD_MACHINE_BAUDRATE);
wang1tao 4:0341c0004919 62 cm_rs485.format(9,SerialBase::Even,1);
wang1tao 4:0341c0004919 63 pc.printf("Card Machine RS485 baudrate: %d!\n\r", CARD_MACHINE_BAUDRATE);
wang1tao 4:0341c0004919 64
wang1tao 5:cd2d6ed47421 65 //*******************************************
wang1tao 5:cd2d6ed47421 66 // Configurate Network
wang1tao 5:cd2d6ed47421 67 //*******************************************
wang1tao 5:cd2d6ed47421 68 ret = configNetwork();
wang1tao 5:cd2d6ed47421 69 if(ret != RETURN_OK)
wang1tao 5:cd2d6ed47421 70 dot->sleep(5, mDot::RTC_ALARM); //sleep a while and restart
wang1tao 5:cd2d6ed47421 71
wang1tao 5:cd2d6ed47421 72 //*******************************************
wang1tao 5:cd2d6ed47421 73 // Join Network
wang1tao 5:cd2d6ed47421 74 //*******************************************
wang1tao 5:cd2d6ed47421 75 ret = joinNetwork();
wang1tao 5:cd2d6ed47421 76 if(ret != RETURN_OK)
wang1tao 5:cd2d6ed47421 77 dot->sleep(5, mDot::RTC_ALARM); //sleep a while and restart
wang1tao 5:cd2d6ed47421 78
wang1tao 4:0341c0004919 79 //Start readTick
wang1tao 4:0341c0004919 80 readTick.attach(&readCardID, READ_PERIOD);
wang1tao 4:0341c0004919 81 sendTick.attach(&sendCardID, SEND_PERIOD);
wang1tao 4:0341c0004919 82
terrytamyh 0:87fb6735eb09 83 while(1) {
wang1tao 4:0341c0004919 84 /* Nothing to be done here */
wang1tao 4:0341c0004919 85 wait(2);
wang1tao 4:0341c0004919 86 }
wang1tao 4:0341c0004919 87 }
wang1tao 4:0341c0004919 88
wang1tao 5:cd2d6ed47421 89 static std::string config_network_name = "chinaiot";
wang1tao 5:cd2d6ed47421 90 static std::string config_network_pass = "password";
wang1tao 5:cd2d6ed47421 91 static uint8_t config_frequency_sub_band = 2;
wang1tao 5:cd2d6ed47421 92
wang1tao 5:cd2d6ed47421 93
wang1tao 5:cd2d6ed47421 94 int configNetwork(void)
wang1tao 5:cd2d6ed47421 95 {
wang1tao 5:cd2d6ed47421 96 int32_t ret;
wang1tao 5:cd2d6ed47421 97
wang1tao 5:cd2d6ed47421 98 // print library version information
wang1tao 5:cd2d6ed47421 99 pc.printf("version: %s\n\r", dot->getId().c_str());
wang1tao 5:cd2d6ed47421 100
wang1tao 5:cd2d6ed47421 101 //*******************************************
wang1tao 5:cd2d6ed47421 102 // configuration
wang1tao 5:cd2d6ed47421 103 //*******************************************
wang1tao 5:cd2d6ed47421 104 // reset to default config so we know what state we're in
wang1tao 5:cd2d6ed47421 105 dot->resetConfig();
wang1tao 5:cd2d6ed47421 106
wang1tao 5:cd2d6ed47421 107 //dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
wang1tao 5:cd2d6ed47421 108
wang1tao 5:cd2d6ed47421 109 // set up the mDot with our network information: frequency sub band, network name, and network password
wang1tao 5:cd2d6ed47421 110 // these can all be saved in NVM so they don't need to be set every time - see mDot::saveConfig()
wang1tao 5:cd2d6ed47421 111
wang1tao 5:cd2d6ed47421 112 // frequency sub band is only applicable in the 915 (US) frequency band
wang1tao 5:cd2d6ed47421 113 // if using a MultiTech Conduit gateway, use the same sub band as your Conduit (1-8) - the mDot will use the 8 channels in that sub band
wang1tao 5:cd2d6ed47421 114 // if using a gateway that supports all 64 channels, use sub band 0 - the mDot will use all 64 channels
wang1tao 5:cd2d6ed47421 115 pc.printf("Setting frequency sub band\n\r");
wang1tao 5:cd2d6ed47421 116 if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 117 pc.printf("Error:failed to set frequency sub band %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 118 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 119 }
wang1tao 5:cd2d6ed47421 120
wang1tao 5:cd2d6ed47421 121 pc.printf("Setting network name\n\r");
wang1tao 5:cd2d6ed47421 122 if ((ret = dot->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 123 pc.printf("Error:failed to set network name %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 124 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 125 }
wang1tao 5:cd2d6ed47421 126
wang1tao 5:cd2d6ed47421 127 pc.printf("Setting network password\n\r");
wang1tao 5:cd2d6ed47421 128 if ((ret = dot->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 129 pc.printf("Error:failed to set network password %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 130 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 131 }
wang1tao 5:cd2d6ed47421 132
wang1tao 5:cd2d6ed47421 133 // a higher spreading factor allows for longer range but lower throughput
wang1tao 5:cd2d6ed47421 134 // in the 915 (US) frequency band, spreading factors 7 - 10 are available
wang1tao 5:cd2d6ed47421 135 // in the 868 (EU) frequency band, spreading factors 7 - 12 are available
wang1tao 5:cd2d6ed47421 136 pc.printf("Setting TX spreading factor\n\r");
wang1tao 5:cd2d6ed47421 137 if ((ret = dot->setTxDataRate(mDot::SF_10)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 138 pc.printf("Error:failed to set TX datarate %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 139 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 140 }
wang1tao 5:cd2d6ed47421 141
wang1tao 5:cd2d6ed47421 142 // request receive confirmation of packets from the gateway
wang1tao 5:cd2d6ed47421 143 pc.printf("Enabling ACKs");
wang1tao 5:cd2d6ed47421 144 if ((ret = dot->setAck(1)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 145 pc.printf("Error:failed to enable ACKs %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 146 return RETURN_OK;
wang1tao 5:cd2d6ed47421 147 }
wang1tao 5:cd2d6ed47421 148
wang1tao 5:cd2d6ed47421 149 // save this configuration to the mDot's NVM
wang1tao 5:cd2d6ed47421 150 pc.printf("Saving config");
wang1tao 5:cd2d6ed47421 151 if (! dot->saveConfig()) {
wang1tao 5:cd2d6ed47421 152 pc.printf("Error:failed to save configuration\n\r");
wang1tao 5:cd2d6ed47421 153 }
wang1tao 5:cd2d6ed47421 154
wang1tao 5:cd2d6ed47421 155 return RETURN_OK;
wang1tao 5:cd2d6ed47421 156 } // end of configuration
wang1tao 5:cd2d6ed47421 157
wang1tao 5:cd2d6ed47421 158
wang1tao 5:cd2d6ed47421 159 int joinNetwork(void)
wang1tao 5:cd2d6ed47421 160 {
wang1tao 5:cd2d6ed47421 161 int32_t ret,i;
wang1tao 5:cd2d6ed47421 162 std::vector<uint8_t> sendData;
wang1tao 5:cd2d6ed47421 163 char _header[] = "Card Reader";
wang1tao 5:cd2d6ed47421 164
wang1tao 5:cd2d6ed47421 165 // attempt to join the network
wang1tao 5:cd2d6ed47421 166 pc.printf("Joining network...\n\r");
wang1tao 5:cd2d6ed47421 167
wang1tao 5:cd2d6ed47421 168 while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 169 pc.printf("Error: failed to join network %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 170 // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
wang1tao 5:cd2d6ed47421 171 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 172 }
wang1tao 5:cd2d6ed47421 173
wang1tao 5:cd2d6ed47421 174 sendData.clear();
wang1tao 5:cd2d6ed47421 175 // format data for sending to the gateway
wang1tao 5:cd2d6ed47421 176 for( i=0; i< strlen(_header); i++ )
wang1tao 5:cd2d6ed47421 177 sendData.push_back( _header[i] );
wang1tao 5:cd2d6ed47421 178
wang1tao 5:cd2d6ed47421 179 // send the data to the gateway
wang1tao 5:cd2d6ed47421 180 pc.printf("Send header to the gateway\n\r");
wang1tao 5:cd2d6ed47421 181
wang1tao 5:cd2d6ed47421 182 if ((ret = dot->send(sendData)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 183 pc.printf("Error: failed to send %d:%s\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 184 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 185 } else {
wang1tao 5:cd2d6ed47421 186 pc.printf("Successfully sent data to gateway\n\r");
wang1tao 5:cd2d6ed47421 187 }
wang1tao 5:cd2d6ed47421 188
wang1tao 5:cd2d6ed47421 189 return RETURN_OK;
wang1tao 5:cd2d6ed47421 190 }
wang1tao 5:cd2d6ed47421 191
wang1tao 5:cd2d6ed47421 192 int send_data(char *str)
wang1tao 5:cd2d6ed47421 193 {
wang1tao 5:cd2d6ed47421 194 int32_t i, ret;
wang1tao 5:cd2d6ed47421 195 std::vector<uint8_t> sendData;
wang1tao 5:cd2d6ed47421 196
wang1tao 5:cd2d6ed47421 197 //Send the data to Gateway
wang1tao 5:cd2d6ed47421 198 sendData.clear();
wang1tao 5:cd2d6ed47421 199 // probably not the most efficent way to do this
wang1tao 5:cd2d6ed47421 200 for(i=0; i< strlen(str); i++ )
wang1tao 5:cd2d6ed47421 201 sendData.push_back(str[i] );
wang1tao 5:cd2d6ed47421 202
wang1tao 5:cd2d6ed47421 203 // send the data to the gateway
wang1tao 5:cd2d6ed47421 204 pc.printf("Send %s to Gateway \n\r", str);
wang1tao 5:cd2d6ed47421 205
wang1tao 5:cd2d6ed47421 206 if ((ret = dot->send(sendData)) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 207 pc.printf("Error:failed to send\n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 208 return RETURN_ERR;
wang1tao 5:cd2d6ed47421 209 } else {
wang1tao 5:cd2d6ed47421 210 pc.printf("Sent data to gateway successfully!\n\r");
wang1tao 5:cd2d6ed47421 211 }
wang1tao 5:cd2d6ed47421 212 return RETURN_OK;
wang1tao 5:cd2d6ed47421 213 }
wang1tao 5:cd2d6ed47421 214
wang1tao 4:0341c0004919 215
wang1tao 4:0341c0004919 216 void my_strcpy(char *dst, char *src)
wang1tao 4:0341c0004919 217 {
wang1tao 4:0341c0004919 218 int j;
wang1tao 4:0341c0004919 219 while(src[j] != 0)
wang1tao 4:0341c0004919 220 {
wang1tao 4:0341c0004919 221 dst[j] = src[j];
wang1tao 4:0341c0004919 222 j++;
wang1tao 4:0341c0004919 223 }
wang1tao 4:0341c0004919 224 }
wang1tao 4:0341c0004919 225
wang1tao 4:0341c0004919 226
wang1tao 4:0341c0004919 227 void my_strclear(char *str, unsigned int len)
wang1tao 4:0341c0004919 228 {
wang1tao 4:0341c0004919 229 unsigned int j;
wang1tao 4:0341c0004919 230 for(j=0; j<len; j++)str[j]=0;
wang1tao 4:0341c0004919 231 }
wang1tao 4:0341c0004919 232
wang1tao 4:0341c0004919 233
wang1tao 4:0341c0004919 234 void readCardID(void)
wang1tao 4:0341c0004919 235 {
wang1tao 4:0341c0004919 236 unsigned int i;
wang1tao 4:0341c0004919 237 char chr;
wang1tao 4:0341c0004919 238
wang1tao 4:0341c0004919 239 pc.printf("Read Tick!\n\r");
wang1tao 4:0341c0004919 240
wang1tao 4:0341c0004919 241 /* clear the read buffer */
wang1tao 4:0341c0004919 242 my_strclear(readBuf, RESPONSE_LENGTH);
wang1tao 4:0341c0004919 243
wang1tao 4:0341c0004919 244 pc.printf("Send the READ command:%s\n\r", &readCmd[1]);
wang1tao 4:0341c0004919 245 if(cm_rs485.writeable()){
wang1tao 4:0341c0004919 246 for(i=0; i<COMMAND_LENGTH; i++){
wang1tao 4:0341c0004919 247 cm_rs485.putc(readCmd[i]);
wang1tao 4:0341c0004919 248 }
wang1tao 4:0341c0004919 249 }
wang1tao 4:0341c0004919 250
wang1tao 4:0341c0004919 251 /* read the response */
wang1tao 4:0341c0004919 252 chr = cm_rs485.getc();
wang1tao 4:0341c0004919 253 i = 0;
wang1tao 4:0341c0004919 254 while(chr != 0x0d)
wang1tao 4:0341c0004919 255 {
wang1tao 4:0341c0004919 256 readBuf[i] = chr;
wang1tao 4:0341c0004919 257 i++;
wang1tao 4:0341c0004919 258 chr = cm_rs485.getc();
wang1tao 4:0341c0004919 259 }
wang1tao 4:0341c0004919 260
wang1tao 4:0341c0004919 261 /* print the response for debug */
wang1tao 4:0341c0004919 262 pc.printf("Response[ASCII]:");
wang1tao 4:0341c0004919 263
wang1tao 4:0341c0004919 264 for(i=0; i< RESPONSE_LENGTH; i++){
wang1tao 4:0341c0004919 265 pc.printf("%0X ", readBuf[i]);
wang1tao 4:0341c0004919 266 if (readBuf[i] == 0) break;
wang1tao 4:0341c0004919 267 }
wang1tao 4:0341c0004919 268 pc.printf("Response[Text]:%s", readBuf);
wang1tao 4:0341c0004919 269
wang1tao 4:0341c0004919 270 /* add to ringBuffer if valid */
wang1tao 4:0341c0004919 271 if((readBuf[3]!= '3') && (readBuf[4] !='C')) //valid response
wang1tao 4:0341c0004919 272 {
wang1tao 4:0341c0004919 273 my_strcpy(ringBuffer[inIndex], &readBuf[3]); //strim the 3 bytes prehead
wang1tao 4:0341c0004919 274 inIndex++;
wang1tao 4:0341c0004919 275 if(inIndex >= RINGBUFFER_SIZE) inIndex = 0;
wang1tao 4:0341c0004919 276 if(ringBuffer[inIndex][0] != 0) //is not empty
wang1tao 4:0341c0004919 277 {
wang1tao 4:0341c0004919 278 pc.printf("Warning! Ringbuffer overflow!\n\r");
wang1tao 4:0341c0004919 279 pc.printf("Please have a check of the network!\n\r");
wang1tao 4:0341c0004919 280 wait(30); //in seconds
wang1tao 4:0341c0004919 281 }
wang1tao 4:0341c0004919 282 }
wang1tao 4:0341c0004919 283 }
wang1tao 4:0341c0004919 284
wang1tao 4:0341c0004919 285 void sendCardID(void)
wang1tao 4:0341c0004919 286 {
wang1tao 5:cd2d6ed47421 287 int32_t ret;
wang1tao 5:cd2d6ed47421 288
wang1tao 4:0341c0004919 289 pc.printf("Send Tick!\n\r");
wang1tao 4:0341c0004919 290 /*send the data */
wang1tao 4:0341c0004919 291 if(ringBuffer[outIndex] != 0) //not empty
wang1tao 4:0341c0004919 292 {
wang1tao 4:0341c0004919 293 pc.printf("Send dada[%s] to Gateway!\n\r", ringBuffer[outIndex]);
wang1tao 4:0341c0004919 294
wang1tao 4:0341c0004919 295 /* t.b.d : send data though LoRA */
wang1tao 5:cd2d6ed47421 296 if(send_data(ringBuffer[outIndex]) != RETURN_OK)
wang1tao 5:cd2d6ed47421 297 {
wang1tao 5:cd2d6ed47421 298 pc.printf("Failed to send data to netwotk!\n\r");
wang1tao 5:cd2d6ed47421 299 pc.printf("Rejoin network and try one more time!\n\r");
wang1tao 5:cd2d6ed47421 300 // attempt to rejoin the network
wang1tao 5:cd2d6ed47421 301 pc.printf("Attemp to rejoin network....\n\r");
wang1tao 5:cd2d6ed47421 302 if ((ret = dot->joinNetworkOnce()) != mDot::MDOT_OK) {
wang1tao 5:cd2d6ed47421 303 pc.printf("Failed to rejoin network! %d:%s \n\r", ret, mDot::getReturnCodeString(ret).c_str());
wang1tao 5:cd2d6ed47421 304 return;
wang1tao 5:cd2d6ed47421 305 }else{
wang1tao 5:cd2d6ed47421 306 pc.printf("Rejoin network successfully!");
wang1tao 5:cd2d6ed47421 307 if(send_data(ringBuffer[outIndex]) != RETURN_OK) return; //abort to send
wang1tao 5:cd2d6ed47421 308 }
wang1tao 5:cd2d6ed47421 309 }
wang1tao 4:0341c0004919 310
wang1tao 4:0341c0004919 311 //clear the buffer
wang1tao 4:0341c0004919 312 my_strclear(ringBuffer[outIndex], RESPONSE_LENGTH);
wang1tao 4:0341c0004919 313 outIndex++;
wang1tao 4:0341c0004919 314 if(outIndex >= RINGBUFFER_SIZE)outIndex = 0;
wang1tao 4:0341c0004919 315 }else{ //empty
wang1tao 4:0341c0004919 316 pc.printf("Nothing to send!\n\r");
wang1tao 4:0341c0004919 317 wait(10);
wang1tao 4:0341c0004919 318 }
Dengjj 2:6ebf09171de9 319
wang1tao 4:0341c0004919 320 }