arm studio build

Dependencies:   libxDot-mbed5

Committer:
alan1974
Date:
Thu Jan 17 14:21:33 2019 +0000
Revision:
12:7944e4dbe853
Parent:
9:cc23b2049639
Child:
13:1f3a8d0be511
added i2c cmd to set ABP multicast credentials but not tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alan1974 1:0d25d9ddbe9f 1 #include "global.h"
alan1974 0:a91cd1b08360 2 #include "wbit_util.h"
alan1974 0:a91cd1b08360 3 #include "dot_util.h"
alan1974 1:0d25d9ddbe9f 4 #include "commI2C.h"
alan1974 0:a91cd1b08360 5 #include "mbed.h"
alan1974 0:a91cd1b08360 6 #include "mDot.h"
alan1974 2:0af50f386eb2 7 extern Serial pc;
alan1974 5:abfe25f0de33 8 extern bool verbose;
alan1974 1:0d25d9ddbe9f 9 uint8_t j_attempts = 0; //return number of attempts it took to join the network
alan1974 1:0d25d9ddbe9f 10
alan1974 1:0d25d9ddbe9f 11
alan1974 1:0d25d9ddbe9f 12 //network keys
alan1974 1:0d25d9ddbe9f 13 //these are used as backup keys in case nvm memory is corrupted and we can't read the keys correctly
alan1974 12:7944e4dbe853 14 uint8_t key_AppEUI[] = { 0x90, 0xF1, 0x47, 0x90, 0x6C, 0x48, 0x1D, 0x29 }; //AppEui
alan1974 12:7944e4dbe853 15 uint8_t key_AppKey[] = { 0x0F, 0xF9, 0xA2, 0x90, 0x2E, 0xAA, 0x6B, 0x8C, 0x6A, 0x4E, 0xFD, 0x67, 0xF9, 0xA6, 0xF3, 0xD3 }; ////OTAA appkey => loriot "Appkey" -> common to all nodes
alan1974 12:7944e4dbe853 16
alan1974 12:7944e4dbe853 17
alan1974 12:7944e4dbe853 18 //ADP keys: for xdot spoofer eui ---> need to be uploaded from proc, using EUI:
alan1974 12:7944e4dbe853 19 static uint8_t network_address[] = { 0x01,0x48,0xF8,0x9A}; //0148F89A
alan1974 12:7944e4dbe853 20 static uint8_t network_session_key[] = { 0x67, 0x9B, 0x67, 0x1F, 0x4B, 0xF4, 0x04, 0xD9, 0xD7, 0x1F, 0x9E, 0x00, 0xB3, 0x5D, 0x02, 0x48 };
alan1974 12:7944e4dbe853 21 static uint8_t data_session_key[] = { 0xB5, 0xB4, 0x2A, 0xB0, 0x2C, 0xC7, 0x8F, 0x5D, 0x83, 0x99, 0x73, 0xB7, 0x24, 0x63, 0x6B, 0xBC };
alan1974 12:7944e4dbe853 22
alan1974 12:7944e4dbe853 23
alan1974 5:abfe25f0de33 24
alan1974 5:abfe25f0de33 25 //============================================================================
alan1974 5:abfe25f0de33 26 // printRadioCfg
alan1974 5:abfe25f0de33 27
alan1974 5:abfe25f0de33 28 //============================================================================
alan1974 5:abfe25f0de33 29 void printRadioCfg(){
alan1974 5:abfe25f0de33 30 if(verbose){
alan1974 5:abfe25f0de33 31 pc.printf("\r\n************************************************************");
alan1974 5:abfe25f0de33 32 pc.printf("\r\n saved radio configuration: ");
alan1974 5:abfe25f0de33 33 pc.printf("\r\n public network: %d ",dot->getPublicNetwork());
alan1974 5:abfe25f0de33 34 pc.printf("\r\n subband: %d ",dot->getFrequencySubBand());
alan1974 5:abfe25f0de33 35 pc.printf("\n\r join delay %d ",dot->getJoinDelay());
alan1974 5:abfe25f0de33 36 pc.printf("\r\n ADR: %d ",dot->getAdr());
alan1974 5:abfe25f0de33 37 pc.printf("\r\n antenna gain: %d ",dot->getAntennaGain());
alan1974 5:abfe25f0de33 38 pc.printf("\r\n transmit max pwr: %d ",dot->getMaxTxPower()); //not saved in cfg
alan1974 5:abfe25f0de33 39 pc.printf("\r\n transmit min pwr: %d ",dot->getMinTxPower()); //not saved in cfg
alan1974 5:abfe25f0de33 40 pc.printf("\r\n transmit pwr: %d ",dot->getTxPower());
alan1974 5:abfe25f0de33 41 pc.printf("\n\r tx inverted %d ",dot->getTxInverted());
alan1974 5:abfe25f0de33 42 pc.printf("\n\r rx inverted %d ",dot->getRxInverted());
alan1974 5:abfe25f0de33 43 pc.printf("\n\r rx delay %d ",dot->getRxDelay());
alan1974 5:abfe25f0de33 44 pc.printf("\r\n TxDataRate: %d ",dot->getTxDataRate());
alan1974 5:abfe25f0de33 45 pc.printf("\r\n maxPktLen: %d ",dot->getMaxPacketLength()); //not saved in cfg
alan1974 5:abfe25f0de33 46 pc.printf("\r\n************************************************************\r\n");
alan1974 5:abfe25f0de33 47 }
alan1974 5:abfe25f0de33 48 }
alan1974 2:0af50f386eb2 49 //==============================================================================
alan1974 2:0af50f386eb2 50 //printNmvData
alan1974 1:0d25d9ddbe9f 51 //==============================================================================
alan1974 2:0af50f386eb2 52 void printNmvData(nvm *pNvm){
alan1974 4:d87f8dcf40ef 53 uint8_t i;
alan1974 7:fba1e8fc7693 54 if(verbose){
alan1974 7:fba1e8fc7693 55 pc.printf("\r\n************************************************************");
alan1974 7:fba1e8fc7693 56 pc.printf("\r\nnon-volatile memory (nvm):");
alan1974 12:7944e4dbe853 57 pc.printf("\r\nkey_AppEUI:");
alan1974 12:7944e4dbe853 58 for (i = 0; i < sizeof(key_AppEUI);i++)
alan1974 12:7944e4dbe853 59 pc.printf(" %x",pNvm->key_AppEUI[i]);
alan1974 12:7944e4dbe853 60 pc.printf("\r\nkey_AppKey:");
alan1974 12:7944e4dbe853 61 for (i = 0 ; i < sizeof(key_AppKey);i++)
alan1974 12:7944e4dbe853 62 pc.printf(" %x",pNvm->key_AppKey[i]);
alan1974 7:fba1e8fc7693 63 pc.printf("\r\nbLogOutputOn: %d ",pNvm->bLogOutputOn);
alan1974 7:fba1e8fc7693 64
alan1974 7:fba1e8fc7693 65 pc.printf("\r\n static backup keys:");
alan1974 12:7944e4dbe853 66 pc.printf("\r\nkey_AppEUI:");
alan1974 12:7944e4dbe853 67 for (i = 0; i < sizeof(key_AppEUI);i++)
alan1974 12:7944e4dbe853 68 pc.printf(" %x",key_AppEUI[i]);
alan1974 12:7944e4dbe853 69 pc.printf("\r\nkey_AppKey:");
alan1974 12:7944e4dbe853 70 for (i = 0 ; i < sizeof(key_AppKey);i++)
alan1974 12:7944e4dbe853 71 pc.printf(" %x",key_AppKey[i]);
alan1974 7:fba1e8fc7693 72 }
alan1974 5:abfe25f0de33 73 if(verbose)pc.printf("\r\n************************************************************\r\n");
alan1974 12:7944e4dbe853 74 }
alan1974 12:7944e4dbe853 75 //==============================================================================
alan1974 12:7944e4dbe853 76 //printNvmABPData
alan1974 12:7944e4dbe853 77 //==============================================================================
alan1974 12:7944e4dbe853 78 void printNvmABPData(nvmABP *pNvmABP){
alan1974 12:7944e4dbe853 79 uint8_t i;
alan1974 12:7944e4dbe853 80 if(verbose){
alan1974 12:7944e4dbe853 81 pc.printf("\r\n************************************************************");
alan1974 12:7944e4dbe853 82 pc.printf("\r\nnon-volatile memory (nvm) for ABP credendtials:");
alan1974 12:7944e4dbe853 83 pc.printf("\r\nnetworkSessionKey:");
alan1974 12:7944e4dbe853 84 for (i = 0; i < 16;i++)
alan1974 12:7944e4dbe853 85 pc.printf(" %x",pNvmABP->key_nsk[i]);
alan1974 12:7944e4dbe853 86 pc.printf("\r\n:appicationSessonKey");
alan1974 12:7944e4dbe853 87 for (i = 0; i < 16; i++)
alan1974 12:7944e4dbe853 88 pc.printf(" %x",pNvmABP->key_aps[i]);
alan1974 12:7944e4dbe853 89 pc.printf("\r\n:DevAddr");
alan1974 12:7944e4dbe853 90 for (i = 0 ; i < 8; i++)
alan1974 12:7944e4dbe853 91 pc.printf(" %x",pNvmABP->devAdr[i]);
alan1974 12:7944e4dbe853 92 }
alan1974 12:7944e4dbe853 93 if(verbose)pc.printf("\r\n************************************************************\r\n");
alan1974 2:0af50f386eb2 94 }
alan1974 2:0af50f386eb2 95 //==============================================================================
alan1974 2:0af50f386eb2 96 //getNvmChkSum
alan1974 1:0d25d9ddbe9f 97 //compute chksum for nvm data; don't include chksum byte in nvm struc
alan1974 1:0d25d9ddbe9f 98 //==============================================================================
alan1974 2:0af50f386eb2 99 uint8_t getNvmChkSum(nvm *pNvm){
alan1974 2:0af50f386eb2 100 uint8_t i;
alan1974 1:0d25d9ddbe9f 101 uint8_t chksum= 0;
alan1974 1:0d25d9ddbe9f 102 uint8_t *pData = (uint8_t *)pNvm;
alan1974 1:0d25d9ddbe9f 103
alan1974 1:0d25d9ddbe9f 104 for (i = 0 ; i < sizeof(nvm)-1;i++)chksum += pData[i];
alan1974 1:0d25d9ddbe9f 105 return chksum;
alan1974 1:0d25d9ddbe9f 106 }
alan1974 1:0d25d9ddbe9f 107 //==============================================================================
alan1974 12:7944e4dbe853 108 //getNvmADPChkSum
alan1974 12:7944e4dbe853 109 //compute chksum for nvm data; don't include chksum byte in nvm struc
alan1974 12:7944e4dbe853 110 // TODO: COMBINE TWO CHKSUM PROCEDURES
alan1974 12:7944e4dbe853 111 //==============================================================================
alan1974 12:7944e4dbe853 112 uint8_t getNvmABPChkSum(nvmABP *pNvmABP){
alan1974 12:7944e4dbe853 113
alan1974 12:7944e4dbe853 114 uint8_t i;
alan1974 12:7944e4dbe853 115 uint8_t chksum= 0;
alan1974 12:7944e4dbe853 116 uint8_t *pData = (uint8_t *)pNvmABP;
alan1974 12:7944e4dbe853 117
alan1974 12:7944e4dbe853 118 for (i = 0 ; i < sizeof(nvmABP)-1;i++)chksum += pData[i];
alan1974 12:7944e4dbe853 119 return chksum;
alan1974 12:7944e4dbe853 120 }
alan1974 12:7944e4dbe853 121 //==============================================================================
alan1974 1:0d25d9ddbe9f 122 //nvmWrite
alan1974 1:0d25d9ddbe9f 123 //write nvmData struc to nvm memory
alan1974 1:0d25d9ddbe9f 124 //==============================================================================
alan1974 1:0d25d9ddbe9f 125 bool nvmWrite(nvm *pNvm){
alan1974 2:0af50f386eb2 126 pNvm->chksum = getNvmChkSum(pNvm);
alan1974 4:d87f8dcf40ef 127 printNmvData(pNvm);
alan1974 12:7944e4dbe853 128 return dot->nvmWrite(NVM_ADDR_OTAA,pNvm,sizeof(nvm));
alan1974 12:7944e4dbe853 129 }
alan1974 12:7944e4dbe853 130 //==============================================================================
alan1974 12:7944e4dbe853 131 //nvmWriteABP
alan1974 12:7944e4dbe853 132 //write nvmABPData struc to nvm memory TODO: WRITE PROCEDUREES
alan1974 12:7944e4dbe853 133 //==============================================================================
alan1974 12:7944e4dbe853 134 bool nvmWriteABP(nvmABP *pNvmABP){
alan1974 12:7944e4dbe853 135 pNvmABP->chksum = getNvmABPChkSum(pNvmABP);
alan1974 12:7944e4dbe853 136 printNvmABPData(pNvmABP);
alan1974 12:7944e4dbe853 137 return dot->nvmWrite(NVM_ADDR_OTAA,pNvmABP,sizeof(nvmABP));
alan1974 1:0d25d9ddbe9f 138 }
alan1974 1:0d25d9ddbe9f 139 //==============================================================================
alan1974 8:a5316708e51d 140 //nvmRestorekeys
alan1974 9:cc23b2049639 141 //restore hard coded keys to nvm and also logdisplay enable/disable
alan1974 8:a5316708e51d 142 //==============================================================================
alan1974 9:cc23b2049639 143 bool nvmRestore(nvm *pNvm){
alan1974 8:a5316708e51d 144 uint8_t i;
alan1974 12:7944e4dbe853 145 for (i = 0; i < sizeof(key_AppEUI);i++){
alan1974 12:7944e4dbe853 146 pNvm->key_AppEUI[i] = key_AppEUI[i];
alan1974 8:a5316708e51d 147 }
alan1974 12:7944e4dbe853 148 for (i = 0; i < sizeof(key_AppKey);i++){
alan1974 12:7944e4dbe853 149 pNvm->key_AppKey[i] = key_AppKey[i];
alan1974 8:a5316708e51d 150 }
alan1974 8:a5316708e51d 151 pNvm->chksum = getNvmChkSum(pNvm);
alan1974 9:cc23b2049639 152 if(verbose)pc.printf("\r\n restoring backup keys:");
alan1974 8:a5316708e51d 153 printNmvData(pNvm);
alan1974 12:7944e4dbe853 154 return dot->nvmWrite(NVM_ADDR_OTAA,pNvm,sizeof(nvm));
alan1974 8:a5316708e51d 155 }
alan1974 8:a5316708e51d 156 //==============================================================================
alan1974 1:0d25d9ddbe9f 157 //nvmRead
alan1974 1:0d25d9ddbe9f 158 //- read nvmData struc from nvm memory
alan1974 1:0d25d9ddbe9f 159 //- if bad chksum then default to hard code network keys
alan1974 1:0d25d9ddbe9f 160 //==============================================================================
alan1974 1:0d25d9ddbe9f 161 bool nvmRead(nvm *pNvm){
alan1974 1:0d25d9ddbe9f 162 uint8_t i;
alan1974 12:7944e4dbe853 163 dot->nvmRead(NVM_ADDR_OTAA,pNvm,sizeof(nvm));
alan1974 2:0af50f386eb2 164 uint8_t chksum = getNvmChkSum(pNvm);
alan1974 7:fba1e8fc7693 165
alan1974 1:0d25d9ddbe9f 166 if (chksum == pNvm->chksum){
alan1974 7:fba1e8fc7693 167 logInfo("nvmRead: chksum ok");
alan1974 1:0d25d9ddbe9f 168 return true;
alan1974 1:0d25d9ddbe9f 169 }
alan1974 8:a5316708e51d 170 return false;
alan1974 1:0d25d9ddbe9f 171 }
alan1974 12:7944e4dbe853 172
alan1974 12:7944e4dbe853 173 //==============================================================================
alan1974 12:7944e4dbe853 174 //nvmReadABP
alan1974 12:7944e4dbe853 175 //- read nvmDataABP struc from nvm memory
alan1974 12:7944e4dbe853 176 //- if bad chksum then default to hard code network keys
alan1974 12:7944e4dbe853 177 //==============================================================================
alan1974 12:7944e4dbe853 178 bool nvmReadABP(nvmABP *pNvmABP){
alan1974 12:7944e4dbe853 179 uint8_t i;
alan1974 12:7944e4dbe853 180 dot->nvmRead(NVM_ADDR_OTAA,pNvmABP,sizeof(nvmABP));
alan1974 12:7944e4dbe853 181 uint8_t chksum = getNvmABPChkSum(pNvmABP);
alan1974 12:7944e4dbe853 182
alan1974 12:7944e4dbe853 183 if (chksum == pNvmABP->chksum){
alan1974 12:7944e4dbe853 184 logInfo("nvmRead: chksum ok");
alan1974 12:7944e4dbe853 185 return true;
alan1974 12:7944e4dbe853 186 }
alan1974 12:7944e4dbe853 187 return false;
alan1974 12:7944e4dbe853 188 }
alan1974 1:0d25d9ddbe9f 189 //============================================================================
alan1974 1:0d25d9ddbe9f 190
alan1974 0:a91cd1b08360 191 uint8_t join_network_attempts_wbit() {
alan1974 0:a91cd1b08360 192 return j_attempts;
alan1974 0:a91cd1b08360 193 }
alan1974 0:a91cd1b08360 194
alan1974 0:a91cd1b08360 195 bool join_network_wbit(uint8_t nmbAttempts) {
alan1974 0:a91cd1b08360 196 //int32_t j_attempts = 0;
alan1974 0:a91cd1b08360 197 j_attempts = 0;
alan1974 0:a91cd1b08360 198 int32_t ret = mDot::MDOT_ERROR;
alan1974 0:a91cd1b08360 199
alan1974 0:a91cd1b08360 200 // attempt to join the network
alan1974 0:a91cd1b08360 201 while (ret != mDot::MDOT_OK) {
alan1974 0:a91cd1b08360 202 j_attempts++;
alan1974 0:a91cd1b08360 203 logInfo("attempt %d to join network",j_attempts);
alan1974 0:a91cd1b08360 204 ret = dot->joinNetwork();
alan1974 0:a91cd1b08360 205 if (ret == mDot::MDOT_OK) return true;
alan1974 0:a91cd1b08360 206
alan1974 0:a91cd1b08360 207 logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
alan1974 0:a91cd1b08360 208 if (j_attempts >= nmbAttempts)
alan1974 0:a91cd1b08360 209 {
alan1974 0:a91cd1b08360 210 logInfo("attempts %d to join network exceeds specified attempts $d ",j_attempts,nmbAttempts);
alan1974 0:a91cd1b08360 211 return false;
alan1974 0:a91cd1b08360 212 }
alan1974 0:a91cd1b08360 213 // in some frequency bands we need to wait until another channel is available before transmitting again
alan1974 0:a91cd1b08360 214 uint32_t delay_s = (dot->getNextTxMs() / 1000) + 1;
alan1974 0:a91cd1b08360 215 if (delay_s < 2) {
alan1974 0:a91cd1b08360 216 logInfo("waiting %lu s until next free channel", delay_s);
alan1974 0:a91cd1b08360 217 wait(delay_s);
alan1974 0:a91cd1b08360 218 } else {
alan1974 0:a91cd1b08360 219 logInfo("sleeping %lu s until next free channel", delay_s);
alan1974 0:a91cd1b08360 220 dot->sleep(delay_s, mDot::RTC_ALARM, false);
alan1974 0:a91cd1b08360 221 }
alan1974 0:a91cd1b08360 222 }//while
alan1974 0:a91cd1b08360 223 return false;
alan1974 0:a91cd1b08360 224 }