Mdot control and communication for the exosonde

Dependencies:   libmDot-mbed5 mbed

Committer:
brettsawyers
Date:
Tue Sep 26 09:37:35 2017 +0000
Revision:
5:950cbea63a63
Parent:
4:a241bf8f70bb
commit before a switch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brettsawyers 0:d8d49519a14a 1 #include "mbed.h"
brettsawyers 0:d8d49519a14a 2 #include "mDot.h"
brettsawyers 0:d8d49519a14a 3 #include <string>
brettsawyers 0:d8d49519a14a 4 #include <vector>
brettsawyers 0:d8d49519a14a 5 #include <algorithm>
brettsawyers 3:805c0c2f82d3 6 #include "ChannelPlans.h"
brettsawyers 0:d8d49519a14a 7
brettsawyers 2:e7e272186bf2 8 #define PARAMSNUM 10
brettsawyers 2:e7e272186bf2 9 #define PARAMLENGTH 15
brettsawyers 2:e7e272186bf2 10 #define SONDEBUFFERLEN 256
brettsawyers 2:e7e272186bf2 11 char sonde_buffer[SONDEBUFFERLEN];
brettsawyers 2:e7e272186bf2 12 char parameters[PARAMSNUM][PARAMLENGTH];
brettsawyers 2:e7e272186bf2 13
brettsawyers 3:805c0c2f82d3 14 lora::ChannelPlan* plan = NULL;
brettsawyers 3:805c0c2f82d3 15 mDot* dot = NULL;
brettsawyers 3:805c0c2f82d3 16
brettsawyers 4:a241bf8f70bb 17 //static std::string config_network_name = "UQ_St_Lucia";
brettsawyers 4:a241bf8f70bb 18 //static std::string config_network_pass = "L0raStLucia";
brettsawyers 5:950cbea63a63 19 static uint8_t devAddr[] = { 0x26, 0x04, 0x1E, 0xDB };
brettsawyers 5:950cbea63a63 20 static uint8_t appSKey[] = {0x2B, 0x2A, 0xDC, 0x26, 0xE2, 0x6F, 0x99, 0x75, 0xCF, 0xBC, 0xA6, 0x20, 0x68, 0xFF, 0xCF, 0xCE};
brettsawyers 5:950cbea63a63 21 static uint8_t nwkSKey[] = {0x17, 0x01, 0x0D, 0x95, 0x9C, 0x72, 0x9F, 0x84, 0x5C, 0x03, 0x1A, 0xBB, 0xAC, 0xF1, 0x33, 0x11};
brettsawyers 5:950cbea63a63 22 static uint8_t config_frequency_sub_band = 2;
brettsawyers 2:e7e272186bf2 23
brettsawyers 4:a241bf8f70bb 24
brettsawyers 2:e7e272186bf2 25 int32_t ret;
brettsawyers 2:e7e272186bf2 26
brettsawyers 2:e7e272186bf2 27 Serial device(USBTX, USBRX); //will need to change this to the appropriate pins once connected ot the exosonde
brettsawyers 2:e7e272186bf2 28 Serial debugger(USBTX,USBRX);
brettsawyers 2:e7e272186bf2 29
brettsawyers 2:e7e272186bf2 30 //update this depending on the desired readings' identifier characters
brettsawyers 3:805c0c2f82d3 31 const char identifiers[PARAMSNUM] = {'a','b','c','d','e','f','g','h','i','j'};
brettsawyers 1:3bb9d88c2646 32 void flushRXbuffer(Serial *serial){
brettsawyers 1:3bb9d88c2646 33 while(serial -> readable()) serial -> getc();
brettsawyers 1:3bb9d88c2646 34 }
brettsawyers 1:3bb9d88c2646 35
brettsawyers 1:3bb9d88c2646 36 bool checkforcomma(Serial *debugger){
brettsawyers 1:3bb9d88c2646 37 debugger -> printf("received: %s\r\n",sonde_buffer);
brettsawyers 1:3bb9d88c2646 38 for(int i = 0; i < strlen(sonde_buffer); i++) {
brettsawyers 1:3bb9d88c2646 39 if(sonde_buffer[i] == ','){
brettsawyers 1:3bb9d88c2646 40 return true;
brettsawyers 1:3bb9d88c2646 41 }
brettsawyers 1:3bb9d88c2646 42 }
brettsawyers 1:3bb9d88c2646 43 return false;
brettsawyers 1:3bb9d88c2646 44 }
brettsawyers 1:3bb9d88c2646 45
brettsawyers 1:3bb9d88c2646 46 void getsondedata(Serial *device, Serial *debugger){
brettsawyers 1:3bb9d88c2646 47 char datachar;
brettsawyers 1:3bb9d88c2646 48 device -> printf("data\r\n");
brettsawyers 1:3bb9d88c2646 49 int charcount = 0;
brettsawyers 1:3bb9d88c2646 50 while(datachar = device -> getc(),datachar != '\r' && datachar != '\n'){
brettsawyers 1:3bb9d88c2646 51 sonde_buffer[charcount] = datachar;
brettsawyers 1:3bb9d88c2646 52 charcount++;
brettsawyers 1:3bb9d88c2646 53 }
brettsawyers 1:3bb9d88c2646 54 //flush the remaining '\n' character from the buffer
brettsawyers 1:3bb9d88c2646 55 flushRXbuffer(device);
brettsawyers 1:3bb9d88c2646 56 sonde_buffer[charcount] = '\0';
brettsawyers 1:3bb9d88c2646 57 }
brettsawyers 1:3bb9d88c2646 58
brettsawyers 1:3bb9d88c2646 59 void setcommadelim(Serial *device){
brettsawyers 1:3bb9d88c2646 60 device -> printf("delim 2\r\n");
brettsawyers 1:3bb9d88c2646 61 }
brettsawyers 2:e7e272186bf2 62
brettsawyers 2:e7e272186bf2 63 void parsesondedata(void){
brettsawyers 2:e7e272186bf2 64 int parametercount = 0;
brettsawyers 2:e7e272186bf2 65 int charcount;
brettsawyers 2:e7e272186bf2 66 char currentcheck;
brettsawyers 2:e7e272186bf2 67 for (int i = 0; i < strlen(sonde_buffer); i++){
brettsawyers 2:e7e272186bf2 68 currentcheck = sonde_buffer[i];
brettsawyers 2:e7e272186bf2 69 if(currentcheck == ',') {
brettsawyers 2:e7e272186bf2 70 parameters[parametercount][charcount] = '\0';
brettsawyers 2:e7e272186bf2 71 parametercount++;
brettsawyers 2:e7e272186bf2 72 charcount = 0;
brettsawyers 2:e7e272186bf2 73 continue;
brettsawyers 2:e7e272186bf2 74 }
brettsawyers 2:e7e272186bf2 75 parameters[parametercount][charcount] = sonde_buffer[i];
brettsawyers 2:e7e272186bf2 76 charcount++;
brettsawyers 2:e7e272186bf2 77 }
brettsawyers 2:e7e272186bf2 78 parameters[parametercount][charcount] = '\0'; //end the final string
brettsawyers 2:e7e272186bf2 79 }
brettsawyers 2:e7e272186bf2 80
brettsawyers 4:a241bf8f70bb 81 void joinnetwork(void){
brettsawyers 4:a241bf8f70bb 82 debugger.printf("joining network\r\n");
brettsawyers 4:a241bf8f70bb 83 if ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 84 debugger.printf("\r\n---------\r\nJoin Failed, code: %s\r\n---------\r\n",mDot::getReturnCodeString(ret).c_str());
brettsawyers 4:a241bf8f70bb 85 }
brettsawyers 4:a241bf8f70bb 86 else{
brettsawyers 4:a241bf8f70bb 87 debugger.printf("joined successfully\r\n");
brettsawyers 4:a241bf8f70bb 88 }
brettsawyers 4:a241bf8f70bb 89 }
brettsawyers 4:a241bf8f70bb 90
brettsawyers 2:e7e272186bf2 91 void sendpacket(){
brettsawyers 4:a241bf8f70bb 92 std::vector<uint8_t> payload;
brettsawyers 4:a241bf8f70bb 93 std::vector<uint8_t> dummypayload;
brettsawyers 4:a241bf8f70bb 94 std::string dummystring("hello");
brettsawyers 2:e7e272186bf2 95 for (int i = 0; i < PARAMSNUM; i++){
brettsawyers 2:e7e272186bf2 96 int j = 0;
brettsawyers 2:e7e272186bf2 97 payload.push_back((uint8_t)identifiers[i]);
brettsawyers 2:e7e272186bf2 98 payload.push_back((uint8_t)':');
brettsawyers 2:e7e272186bf2 99 while(parameters[i][j] != '\0'){
brettsawyers 3:805c0c2f82d3 100 payload.push_back(parameters[i][j]);
brettsawyers 3:805c0c2f82d3 101 j++;
brettsawyers 2:e7e272186bf2 102 }
brettsawyers 2:e7e272186bf2 103 if(i != PARAMSNUM-1){
brettsawyers 2:e7e272186bf2 104 payload.push_back((uint8_t)',');
brettsawyers 2:e7e272186bf2 105 }
brettsawyers 2:e7e272186bf2 106 }
brettsawyers 3:805c0c2f82d3 107 payload.push_back((uint8_t)'\0');
brettsawyers 3:805c0c2f82d3 108 debugger.printf("made packet %s\r\n", payload);
brettsawyers 4:a241bf8f70bb 109 std::copy(dummystring.begin(),dummystring.end(),std::back_inserter(dummypayload));
brettsawyers 5:950cbea63a63 110 debugger.printf("%d\r\n", dummypayload.size());
brettsawyers 4:a241bf8f70bb 111 // send the data
brettsawyers 4:a241bf8f70bb 112 if ((ret = dot->send(dummypayload)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 113 debugger.printf("\r\nFailed send, code: %s\r\n",mDot::getReturnCodeString(ret).c_str());
brettsawyers 4:a241bf8f70bb 114 } else {
brettsawyers 4:a241bf8f70bb 115 debugger.printf("\r\ndata sent\r\n");
brettsawyers 2:e7e272186bf2 116 }
brettsawyers 4:a241bf8f70bb 117
brettsawyers 2:e7e272186bf2 118
brettsawyers 2:e7e272186bf2 119 }
brettsawyers 2:e7e272186bf2 120
brettsawyers 2:e7e272186bf2 121 void Loraconfig(void){
brettsawyers 4:a241bf8f70bb 122 debugger.printf("default frequency band %d\n\r",dot -> getDefaultFrequencyBand());
brettsawyers 2:e7e272186bf2 123 if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
brettsawyers 3:805c0c2f82d3 124 debugger.printf("Could not set FSB\r\n");
brettsawyers 2:e7e272186bf2 125 }
brettsawyers 4:a241bf8f70bb 126
brettsawyers 4:a241bf8f70bb 127 std::vector<uint8_t> temp;
brettsawyers 4:a241bf8f70bb 128 for (int i = 0; i < 4; i++) {
brettsawyers 4:a241bf8f70bb 129 temp.push_back(devAddr[i]);
brettsawyers 2:e7e272186bf2 130 }
brettsawyers 4:a241bf8f70bb 131 // set join mode
brettsawyers 4:a241bf8f70bb 132 if ((ret = dot->setJoinMode(mDot::MANUAL)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 133 debugger.printf("Could not set join mode\r\n");
brettsawyers 4:a241bf8f70bb 134 }
brettsawyers 4:a241bf8f70bb 135 //set network address
brettsawyers 4:a241bf8f70bb 136 if ((ret = dot->setNetworkAddress(temp)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 137 debugger.printf("Could not set network address\r\n");
brettsawyers 4:a241bf8f70bb 138 }
brettsawyers 4:a241bf8f70bb 139 //ser public netowkr to true
brettsawyers 4:a241bf8f70bb 140 if ((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 141 debugger.printf("Could not set public network\r\n");
brettsawyers 2:e7e272186bf2 142 }
brettsawyers 4:a241bf8f70bb 143 //make a string to be input later
brettsawyers 4:a241bf8f70bb 144 temp.clear();
brettsawyers 4:a241bf8f70bb 145 for (int i = 0; i < 16; i++) {
brettsawyers 4:a241bf8f70bb 146 temp.push_back(nwkSKey[i]);
brettsawyers 4:a241bf8f70bb 147 }
brettsawyers 4:a241bf8f70bb 148 //set the netowrk session key
brettsawyers 4:a241bf8f70bb 149 if ((ret = dot->setNetworkSessionKey(temp)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 150 debugger.printf("Could not set network session key\r\n");
brettsawyers 2:e7e272186bf2 151 }
brettsawyers 4:a241bf8f70bb 152
brettsawyers 4:a241bf8f70bb 153 //make a string to be input later
brettsawyers 4:a241bf8f70bb 154 temp.clear();
brettsawyers 4:a241bf8f70bb 155 for (int i = 0; i < 16; i++) {
brettsawyers 4:a241bf8f70bb 156 temp.push_back(appSKey[i]);
brettsawyers 2:e7e272186bf2 157 }
brettsawyers 4:a241bf8f70bb 158
brettsawyers 4:a241bf8f70bb 159 if ((ret = dot->setDataSessionKey(temp)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 160 debugger.printf("Could not set data session key (app session key)\n\r");
brettsawyers 4:a241bf8f70bb 161 }
brettsawyers 4:a241bf8f70bb 162
brettsawyers 2:e7e272186bf2 163 // request receive confirmation of packets from the gateway
brettsawyers 4:a241bf8f70bb 164 if ((ret = dot->setAck(0)) != mDot::MDOT_OK) {
brettsawyers 3:805c0c2f82d3 165 debugger.printf("Could not set ACK\r\n");
brettsawyers 2:e7e272186bf2 166 }
brettsawyers 4:a241bf8f70bb 167
brettsawyers 4:a241bf8f70bb 168 //set data rate to dr2, this gives us 126 bytes of payload space
brettsawyers 5:950cbea63a63 169 if ((ret = dot->setTxDataRate(mDot::DR0)) != mDot::MDOT_OK) {
brettsawyers 4:a241bf8f70bb 170 debugger.printf("Could not set data rate\r\n");
brettsawyers 4:a241bf8f70bb 171 }
brettsawyers 4:a241bf8f70bb 172
brettsawyers 2:e7e272186bf2 173 }
brettsawyers 3:805c0c2f82d3 174
brettsawyers 0:d8d49519a14a 175 int main() {
brettsawyers 2:e7e272186bf2 176 // get an mDot handle
brettsawyers 5:950cbea63a63 177 plan = new lora::ChannelPlan_US915();
brettsawyers 3:805c0c2f82d3 178 dot = mDot::getInstance(plan);
brettsawyers 3:805c0c2f82d3 179 assert(dot);
brettsawyers 2:e7e272186bf2 180 Loraconfig();
brettsawyers 4:a241bf8f70bb 181 debugger.printf("data rate= %d\r\n", dot -> getTxDataRate());
brettsawyers 4:a241bf8f70bb 182 debugger.printf("max packet length = %d\r\n", dot -> getMaxPacketLength());
brettsawyers 1:3bb9d88c2646 183 while(1){
brettsawyers 5:950cbea63a63 184 wait(0.05);
brettsawyers 4:a241bf8f70bb 185 /*
brettsawyers 1:3bb9d88c2646 186 getsondedata(&device, &debugger);
brettsawyers 1:3bb9d88c2646 187 if(!checkforcomma(&debugger)){
brettsawyers 1:3bb9d88c2646 188 setcommadelim(&device);
brettsawyers 1:3bb9d88c2646 189 continue;
brettsawyers 0:d8d49519a14a 190 }
brettsawyers 2:e7e272186bf2 191 parsesondedata();
brettsawyers 4:a241bf8f70bb 192 */
brettsawyers 2:e7e272186bf2 193 sendpacket();
brettsawyers 1:3bb9d88c2646 194 }
brettsawyers 1:3bb9d88c2646 195 }
brettsawyers 1:3bb9d88c2646 196