alan broad
/
carbon_v5_arm_studio
arm studio build
src/main.cpp@26:f51ff4ad7a93, 2020-02-22 (annotated)
- Committer:
- alan1974
- Date:
- Sat Feb 22 18:14:25 2020 +0000
- Revision:
- 26:f51ff4ad7a93
- Parent:
- 24:e5ff476cd04e
- Child:
- 27:ee9c063a535b
fixed log printout; removed wake.mode(OpenDrain); no change in rev lvl
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alan1974 | 12:7944e4dbe853 | 1 | #include "mbed.h" |
alan1974 | 1:0d25d9ddbe9f | 2 | #include "global.h" |
alan1974 | 0:a91cd1b08360 | 3 | #include "commI2C.h" |
alan1974 | 0:a91cd1b08360 | 4 | #include "dot_util.h" |
alan1974 | 0:a91cd1b08360 | 5 | #include "wbit_util.h" |
alan1974 | 14:fc836a5a5d2f | 6 | #include "multicast.h" |
alan1974 | 0:a91cd1b08360 | 7 | #include "mDot.h" |
alan1974 | 0:a91cd1b08360 | 8 | #include "RadioEvent.h" |
alan1974 | 15:ed77b752eaa9 | 9 | #include "ChannelPlans.h" |
alan1974 | 0:a91cd1b08360 | 10 | #include "Lora.h" |
alan1974 | 0:a91cd1b08360 | 11 | |
alan1974 | 17:74d60177c6b6 | 12 | bool verbose = true; |
alan1974 | 17:74d60177c6b6 | 13 | bool bRxDone = false; //true if callback function RxDone() triggered |
alan1974 | 17:74d60177c6b6 | 14 | bool bDownLinkCntrFail = false; //true if callback function RxDone() triggered and bad downlink frame count |
alan1974 | 19:cff66b2c15b5 | 15 | bool bListen4Multicast = false; |
alan1974 | 17:74d60177c6b6 | 16 | uint16_t maxMulticastSessionTime = 0; |
alan1974 | 1:0d25d9ddbe9f | 17 | //nvm storage params |
alan1974 | 17:74d60177c6b6 | 18 | nvm nvmData; |
alan1974 | 17:74d60177c6b6 | 19 | nvm *pNvmData = &nvmData; |
alan1974 | 1:0d25d9ddbe9f | 20 | |
alan1974 | 15:ed77b752eaa9 | 21 | |
alan1974 | 15:ed77b752eaa9 | 22 | |
alan1974 | 0:a91cd1b08360 | 23 | //======================================================================================================= |
alan1974 | 10:061fab1195e7 | 24 | // enable GPIO for scope trigger |
alan1974 | 0:a91cd1b08360 | 25 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 26 | //#define GPIO_ENABLE |
alan1974 | 0:a91cd1b08360 | 27 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 28 | // configure for either private (test only) or public network (standard) |
alan1974 | 0:a91cd1b08360 | 29 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 30 | //#define MT_PRIVATE_NETWORK //ENABLE THIS FOR PRIVATE NETWORK |
alan1974 | 0:a91cd1b08360 | 31 | |
alan1974 | 0:a91cd1b08360 | 32 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 33 | //code api level and version |
alan1974 | 0:a91cd1b08360 | 34 | //api_level: proc code will not run if api level (last two bytess) greater than what it expects |
alan1974 | 0:a91cd1b08360 | 35 | //======================================================================================================= |
alan1974 | 21:60e5b6becdb0 | 36 | uint8_t api_level[4] = { 0x00, 0x00, 0x00, 0x04 }; //api-level, determines if xdot code works with proc code |
alan1974 | 24:e5ff476cd04e | 37 | uint8_t ver_level[4] = { 0x00, 0x00, 0x00, 0x0B }; //updated for every code check-in |
alan1974 | 0:a91cd1b08360 | 38 | |
alan1974 | 0:a91cd1b08360 | 39 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 40 | //configuring mbed pinsa; https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/io/DigitalInOut/ |
alan1974 | 0:a91cd1b08360 | 41 | // * these options must match the settings on your gateway // |
alan1974 | 0:a91cd1b08360 | 42 | // * edit their values to match your configuration // |
alan1974 | 0:a91cd1b08360 | 43 | // * frequency sub band is only relevant for the 915 bands // |
alan1974 | 0:a91cd1b08360 | 44 | // * either the network name and passphrase can be used or // |
alan1974 | 0:a91cd1b08360 | 45 | // the network ID (8 bytes) and KEY (16 bytes) // |
alan1974 | 0:a91cd1b08360 | 46 | //======================================================================================================= |
alan1974 | 1:0d25d9ddbe9f | 47 | static std::string network_name = "asdfqwer"; //not used |
alan1974 | 1:0d25d9ddbe9f | 48 | static std::string network_passphrase = "zxcvasdf"; //not used |
alan1974 | 12:7944e4dbe853 | 49 | |
alan1974 | 0:a91cd1b08360 | 50 | |
alan1974 | 0:a91cd1b08360 | 51 | #ifdef MT_PRIVATE_NETWORK |
alan1974 | 0:a91cd1b08360 | 52 | static uint8_t frequency_sub_band = 4; |
alan1974 | 0:a91cd1b08360 | 53 | static bool public_network = false; |
alan1974 | 0:a91cd1b08360 | 54 | static uint8_t ack = 1; //0; |
alan1974 | 0:a91cd1b08360 | 55 | #else |
alan1974 | 1:0d25d9ddbe9f | 56 | uint8_t frequency_sub_band = 1; |
alan1974 | 1:0d25d9ddbe9f | 57 | bool public_network = true; //false |
alan1974 | 1:0d25d9ddbe9f | 58 | uint8_t ack = 1; //0; |
alan1974 | 1:0d25d9ddbe9f | 59 | uint8_t link_check_treshold = 100; //5; |
alan1974 | 0:a91cd1b08360 | 60 | #endif |
alan1974 | 0:a91cd1b08360 | 61 | |
alan1974 | 1:0d25d9ddbe9f | 62 | bool adr = false; //set adaptive data rate |
alan1974 | 10:061fab1195e7 | 63 | //======================================================================================================= |
alan1974 | 10:061fab1195e7 | 64 | // -need to add a delay between exiting i2c read->proc and before putting xdot to sleep to allow for final |
alan1974 | 10:061fab1195e7 | 65 | // xfr of bytes in i2c buffer to be xfrd to proc. If log output enabled then it causes enough delay when |
alan1974 | 10:061fab1195e7 | 66 | // it prints status info to make the delay ok. For now add this delay when both log enabled and disabled. |
alan1974 | 10:061fab1195e7 | 67 | int16_t wait_before_sleep_usec = 10000; |
alan1974 | 0:a91cd1b08360 | 68 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 69 | // deepsleep consumes slightly less current than sleep |
alan1974 | 15:ed77b752eaa9 | 70 | // sleep mode: IO state is maintained, RAM is retained, and application will resume after waking up |
alan1974 | 15:ed77b752eaa9 | 71 | // deepsleep mode: IOs float, RAM is lost, and application will start from beginning after waking up |
alan1974 | 0:a91cd1b08360 | 72 | // if deep_sleep == true, device will enter deepsleep mode |
alan1974 | 8:a5316708e51d | 73 | // asb: |
alan1974 | 8:a5316708e51d | 74 | // no longer use deepsleep since we want to retain state |
alan1974 | 8:a5316708e51d | 75 | // sleep uses only 1uA more current than deepsleep |
alan1974 | 0:a91cd1b08360 | 76 | //======================================================================================================= |
alan1974 | 0:a91cd1b08360 | 77 | static bool deep_sleep = false; //false; |
alan1974 | 0:a91cd1b08360 | 78 | |
alan1974 | 0:a91cd1b08360 | 79 | uint32_t packets_sent = 0; |
alan1974 | 0:a91cd1b08360 | 80 | uint32_t acks_rcvd = 0; |
alan1974 | 0:a91cd1b08360 | 81 | int8_t rssi =0; //rssi of last rcvd rx1/rx2 |
alan1974 | 0:a91cd1b08360 | 82 | std::string eui = " "; |
alan1974 | 0:a91cd1b08360 | 83 | static bool led_enabled = false; //true; //false; |
alan1974 | 0:a91cd1b08360 | 84 | mDot* dot = NULL; |
alan1974 | 0:a91cd1b08360 | 85 | lora::ChannelPlan* plan = NULL; |
alan1974 | 0:a91cd1b08360 | 86 | uint8_t buf_xmt[BUFFER_SIZE_I2C]; //outgoing data |
alan1974 | 0:a91cd1b08360 | 87 | uint8_t buf_rcv[BUFFER_SIZE_I2C]; //incoming data |
alan1974 | 0:a91cd1b08360 | 88 | std::vector<uint8_t> upstream_packet; |
alan1974 | 0:a91cd1b08360 | 89 | |
alan1974 | 0:a91cd1b08360 | 90 | #ifdef GPIO_ENABLE |
alan1974 | 0:a91cd1b08360 | 91 | DigitalInOut gpio1(PA_5); //scope debug PA-5 is connected to SW1 pads on Loren v04 and can be used for scope debug |
alan1974 | 0:a91cd1b08360 | 92 | #endif |
alan1974 | 0:a91cd1b08360 | 93 | |
alan1974 | 0:a91cd1b08360 | 94 | Serial pc(USBTX, USBRX); //serial port output |
alan1974 | 0:a91cd1b08360 | 95 | |
alan1974 | 0:a91cd1b08360 | 96 | //================================================================================== |
alan1974 | 0:a91cd1b08360 | 97 | //chksum |
alan1974 | 0:a91cd1b08360 | 98 | //compute checksum over i2c buffer except for last byte (chksum byte) |
alan1974 | 0:a91cd1b08360 | 99 | //================================================================================== |
alan1974 | 0:a91cd1b08360 | 100 | uint8_t chksum_proc(uint8_t *bfr_xdot){ |
alan1974 | 0:a91cd1b08360 | 101 | uint8_t i; |
alan1974 | 0:a91cd1b08360 | 102 | uint8_t chksum = 0; |
alan1974 | 0:a91cd1b08360 | 103 | for (i=0; i < BUFFER_SIZE_I2C-1;i++)chksum += bfr_xdot[i];//good code |
alan1974 | 0:a91cd1b08360 | 104 | return chksum; |
alan1974 | 0:a91cd1b08360 | 105 | } |
alan1974 | 0:a91cd1b08360 | 106 | //================================================================================================= |
alan1974 | 0:a91cd1b08360 | 107 | //cfg_network: |
alan1974 | 0:a91cd1b08360 | 108 | // configure the network public/private and sub-band |
alan1974 | 0:a91cd1b08360 | 109 | // bForceCfg : true => force a network cfg |
alan1974 | 0:a91cd1b08360 | 110 | // false => only change if bPublic or sub_band have changed |
alan1974 | 0:a91cd1b08360 | 111 | // bPublic : true if network is public, else private |
alan1974 | 0:a91cd1b08360 | 112 | // sub_band: sub band number (1..8) |
alan1974 | 0:a91cd1b08360 | 113 | |
alan1974 | 0:a91cd1b08360 | 114 | // NOTE: THIS ONLY WORKS WHEN THE XDOT BOOTS UP. IT DOES NOT WORK WHEN TRYING TO CHANGE AFTER. |
alan1974 | 0:a91cd1b08360 | 115 | // NOT SURE WHY...WHEN THE XDOT REJOINS IT SHOULD USE NEW SESSION SETTINGS... asb |
alan1974 | 0:a91cd1b08360 | 116 | // |
alan1974 | 0:a91cd1b08360 | 117 | //asb:dec 2017: try this later and see if it works:mdot.h: |
alan1974 | 0:a91cd1b08360 | 118 | // int32_t setPublicNetwork(const bool& on); |
alan1974 | 0:a91cd1b08360 | 119 | // bool getPublicNetwork(); |
alan1974 | 0:a91cd1b08360 | 120 | // int32_t setFrequencySubBand(const uint8_t& band); |
alan1974 | 0:a91cd1b08360 | 121 | //================================================================================================= |
alan1974 | 0:a91cd1b08360 | 122 | bool cfg_network(bool bForceCfg,bool bPublic,uint8_t sub_band){ |
alan1974 | 0:a91cd1b08360 | 123 | // if bForceCfg false and network parameters haven't changed then just exit |
alan1974 | 0:a91cd1b08360 | 124 | if (!bForceCfg){ |
alan1974 | 5:abfe25f0de33 | 125 | if(verbose)pc.printf("no configuration change needed subband the same"); |
alan1974 | 0:a91cd1b08360 | 126 | if ((public_network ==bPublic) && (frequency_sub_band ==sub_band))return true; |
alan1974 | 0:a91cd1b08360 | 127 | } |
alan1974 | 5:abfe25f0de33 | 128 | if(verbose)pc.printf("changing to subband: %d\r\n",sub_band); |
alan1974 | 0:a91cd1b08360 | 129 | // update network settings |
alan1974 | 0:a91cd1b08360 | 130 | public_network = bPublic; |
alan1974 | 0:a91cd1b08360 | 131 | frequency_sub_band =sub_band; |
alan1974 | 0:a91cd1b08360 | 132 | // start from a well-known state |
alan1974 | 11:77fe4f18a81b | 133 | logInfo("defaulting Dot configuration"); |
alan1974 | 0:a91cd1b08360 | 134 | if (dot->getJoinMode() != mDot::OTA) { // update configuration if necessary |
alan1974 | 0:a91cd1b08360 | 135 | logInfo("changing network join mode to OTA"); |
alan1974 | 0:a91cd1b08360 | 136 | if (dot->setJoinMode(mDot::OTA) != mDot::MDOT_OK) { |
alan1974 | 0:a91cd1b08360 | 137 | logError("failed to set network join mode to OTA"); |
alan1974 | 0:a91cd1b08360 | 138 | return false; |
alan1974 | 0:a91cd1b08360 | 139 | } |
alan1974 | 0:a91cd1b08360 | 140 | } |
alan1974 | 0:a91cd1b08360 | 141 | // in OTA and AUTO_OTA join modes, the credentials can be passed to the library as a name and passphrase or an ID and KEY |
alan1974 | 0:a91cd1b08360 | 142 | // only one method or the other should be used! |
alan1974 | 0:a91cd1b08360 | 143 | if (public_network){ |
alan1974 | 12:7944e4dbe853 | 144 | update_ota_config_id_key(nvmData.key_AppEUI,nvmData.key_AppKey, frequency_sub_band, public_network, ack); |
alan1974 | 0:a91cd1b08360 | 145 | logInfo("-------------- network configured for public access -----------------------------"); |
alan1974 | 0:a91cd1b08360 | 146 | } |
alan1974 | 0:a91cd1b08360 | 147 | else{ |
alan1974 | 0:a91cd1b08360 | 148 | update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack); |
alan1974 | 0:a91cd1b08360 | 149 | logInfo("-------------- network configured for private access -------------------------------"); |
alan1974 | 1:0d25d9ddbe9f | 150 | } |
alan1974 | 1:0d25d9ddbe9f | 151 | // configure network link check count |
alan1974 | 1:0d25d9ddbe9f | 152 | // declares the Dot disconnected if no acks received within link_check_treshold transmits |
alan1974 | 1:0d25d9ddbe9f | 153 | //update_network_link_check_config(3, 5); |
alan1974 | 1:0d25d9ddbe9f | 154 | dot->setLinkCheckThreshold(link_check_treshold); |
alan1974 | 11:77fe4f18a81b | 155 | return true; |
alan1974 | 0:a91cd1b08360 | 156 | } |
alan1974 | 0:a91cd1b08360 | 157 | //================================================================================================= |
alan1974 | 0:a91cd1b08360 | 158 | //main() |
alan1974 | 0:a91cd1b08360 | 159 | // main() runs in its own thread in the OS |
alan1974 | 0:a91cd1b08360 | 160 | // (note the calls to wait below for delays) |
alan1974 | 0:a91cd1b08360 | 161 | //================================================================================================= |
alan1974 | 0:a91cd1b08360 | 162 | int main() { |
alan1974 | 1:0d25d9ddbe9f | 163 | uint8_t i; |
alan1974 | 12:7944e4dbe853 | 164 | RadioEvent events; //class to return info on rx pkts |
alan1974 | 0:a91cd1b08360 | 165 | mDotEvent mdotevent; //used to get ping info???? |
alan1974 | 15:ed77b752eaa9 | 166 | //plan = new lora::ChannelPlan_US915(); |
alan1974 | 15:ed77b752eaa9 | 167 | static lora::ChannelPlan_US915 plan; |
alan1974 | 0:a91cd1b08360 | 168 | #ifdef GPIO_ENABLE |
alan1974 | 0:a91cd1b08360 | 169 | gpio1.output(); |
alan1974 | 0:a91cd1b08360 | 170 | gpio1 =0; |
alan1974 | 0:a91cd1b08360 | 171 | #endif |
alan1974 | 0:a91cd1b08360 | 172 | pc.baud(115200); |
alan1974 | 11:77fe4f18a81b | 173 | |
alan1974 | 0:a91cd1b08360 | 174 | pc.printf("\r\n**********************************************************\r\n"); |
alan1974 | 0:a91cd1b08360 | 175 | pc.printf("\r\n XDOT BOOT\r\n"); |
alan1974 | 0:a91cd1b08360 | 176 | pc.printf("COMM api_level = <HEX> %x.%x.%x.%x\r\n",api_level[0],api_level[1],api_level[2],api_level[3]); |
alan1974 | 0:a91cd1b08360 | 177 | pc.printf("COMM version = %x.%x.%x.%x\r\n",ver_level[0],ver_level[1],ver_level[2],ver_level[3]); |
alan1974 | 1:0d25d9ddbe9f | 178 | pc.printf("**********************************************************\r\n"); |
alan1974 | 15:ed77b752eaa9 | 179 | //assert(plan); |
alan1974 | 15:ed77b752eaa9 | 180 | //dot = mDot::getInstance(plan); |
alan1974 | 15:ed77b752eaa9 | 181 | dot = mDot::getInstance(&plan); |
alan1974 | 15:ed77b752eaa9 | 182 | //assert(dot); |
alan1974 | 1:0d25d9ddbe9f | 183 | |
alan1974 | 16:5cc10d804d49 | 184 | dot->setEvents(&events); |
alan1974 | 15:ed77b752eaa9 | 185 | |
alan1974 | 15:ed77b752eaa9 | 186 | |
alan1974 | 15:ed77b752eaa9 | 187 | |
alan1974 | 1:0d25d9ddbe9f | 188 | nvmRead(pNvmData); |
alan1974 | 8:a5316708e51d | 189 | |
alan1974 | 5:abfe25f0de33 | 190 | if (pNvmData->bLogOutputOn == 0){ |
alan1974 | 5:abfe25f0de33 | 191 | pc.printf("\r\nDISABLING TERMINAL OUTPUT\r\n"); |
alan1974 | 10:061fab1195e7 | 192 | dot->setLogLevel(mts::MTSLog::NONE_LEVEL); //doesn't work |
alan1974 | 8:a5316708e51d | 193 | verbose = false; |
alan1974 | 5:abfe25f0de33 | 194 | } |
alan1974 | 5:abfe25f0de33 | 195 | else{ |
alan1974 | 5:abfe25f0de33 | 196 | printNmvData(pNvmData); |
alan1974 | 17:74d60177c6b6 | 197 | //dot->setLogLevel((verbose) ? mts::MTSLog::TRACE_LEVEL : mts::MTSLog::TRACE_LEVEL); // TRACE_LEVEL , INFO_LEVEL |
alan1974 | 1:0d25d9ddbe9f | 198 | } |
alan1974 | 7:fba1e8fc7693 | 199 | |
alan1974 | 0:a91cd1b08360 | 200 | // getStandbyFlag() should return the state of the standby flag directly from the processor |
alan1974 | 0:a91cd1b08360 | 201 | // Standby flag: This bit is set by hardware and cleared only by a POR/PDR (power on reset/power down reset) or by setting the CSBF bit in the PWR power control register (PWR_CR) |
alan1974 | 0:a91cd1b08360 | 202 | // 0: Device has not been in Standby mode |
alan1974 | 0:a91cd1b08360 | 203 | // 1: Device has been in Standby mode |
alan1974 | 0:a91cd1b08360 | 204 | // The xDot should enter standby mode when deep sleep in invoked. So you should see the standby flag set if it came out of deep sleep. |
alan1974 | 1:0d25d9ddbe9f | 205 | if (!dot->getStandbyFlag()) { //if 0 => power-up/reset which should always be the case at this point |
alan1974 | 22:034c134f17c7 | 206 | // logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION); // MBED_LIBRARY_VERSION no longer declared? |
alan1974 | 5:abfe25f0de33 | 207 | frequency_sub_band = dot->getFrequencySubBand(); |
alan1974 | 5:abfe25f0de33 | 208 | printRadioCfg(); |
alan1974 | 5:abfe25f0de33 | 209 | cfg_network(true,public_network,frequency_sub_band); //force network cfg, |
alan1974 | 0:a91cd1b08360 | 210 | } else { |
alan1974 | 0:a91cd1b08360 | 211 | // restore the saved session (join OTAA info) if the dot woke from deepsleep mode |
alan1974 | 0:a91cd1b08360 | 212 | // useful to use with deepsleep because session info is otherwise lost when the dot enters deepsleep |
alan1974 | 0:a91cd1b08360 | 213 | logInfo("restoring network session from NVM"); |
alan1974 | 0:a91cd1b08360 | 214 | dot->restoreNetworkSession(); |
alan1974 | 0:a91cd1b08360 | 215 | } |
alan1974 | 0:a91cd1b08360 | 216 | //-------------------------------------------------------------------------------------------------------------------------------------------- |
alan1974 | 1:0d25d9ddbe9f | 217 | // configure network link check count |
alan1974 | 1:0d25d9ddbe9f | 218 | // declares the Dot disconnected if no acks received within link_check_treshold transmits |
alan1974 | 1:0d25d9ddbe9f | 219 | //update_network_link_check_config(3, 5); |
alan1974 | 1:0d25d9ddbe9f | 220 | dot->setLinkCheckThreshold(link_check_treshold); |
alan1974 | 22:034c134f17c7 | 221 | //---------------------------------------------------------------------------------------------------------------------------------------------- |
alan1974 | 1:0d25d9ddbe9f | 222 | eui = mts::Text::bin2hexString(dot->getDeviceId()).c_str(); |
alan1974 | 5:abfe25f0de33 | 223 | if(verbose)pc.printf("\r\nEUI: %s\r\n",eui); |
alan1974 | 1:0d25d9ddbe9f | 224 | bool joined = false; |
alan1974 | 8:a5316708e51d | 225 | |
alan1974 | 1:0d25d9ddbe9f | 226 | i2c_proc_init(); //init i2c comm |
alan1974 | 8:a5316708e51d | 227 | sleep_wake_interrupt_only(deep_sleep); //wake on rising edge of wake signal from proc |
alan1974 | 0:a91cd1b08360 | 228 | //scope test |
alan1974 | 10:061fab1195e7 | 229 | #ifdef GPIO_ENABLE |
alan1974 | 10:061fab1195e7 | 230 | gpio1 =1; |
alan1974 | 10:061fab1195e7 | 231 | #endif |
alan1974 | 0:a91cd1b08360 | 232 | //============================================================================== |
alan1974 | 0:a91cd1b08360 | 233 | // -loop here forever |
alan1974 | 0:a91cd1b08360 | 234 | // -sleep until LORA_WAKE goes hi => proc ready to send i2c cmd |
alan1974 | 0:a91cd1b08360 | 235 | // -start polling incoming i2c bus for proc cmd |
alan1974 | 0:a91cd1b08360 | 236 | // -execute cmd |
alan1974 | 0:a91cd1b08360 | 237 | // -take control of LORA_WAKE and toggle it hi to signal proc that xdot |
alan1974 | 0:a91cd1b08360 | 238 | // ready to send i2c ack message |
alan1974 | 0:a91cd1b08360 | 239 | // -go back to sleep |
alan1974 | 0:a91cd1b08360 | 240 | //============================================================================== |
alan1974 | 0:a91cd1b08360 | 241 | bool bPulseLoraWake = false; |
alan1974 | 0:a91cd1b08360 | 242 | while(1) |
alan1974 | 0:a91cd1b08360 | 243 | { |
alan1974 | 13:1f3a8d0be511 | 244 | if(verbose)pc.printf("\n\r***************************** "); |
alan1974 | 0:a91cd1b08360 | 245 | |
alan1974 | 18:d95e1a2c4303 | 246 | switch (i2c_proc_comm(buf_xmt,buf_rcv,BUFFER_SIZE_I2C)){ |
alan1974 | 7:fba1e8fc7693 | 247 | case I2C_WRITE: //xdot ack ->proc |
alan1974 | 5:abfe25f0de33 | 248 | if(verbose)pc.printf("\n\r xdot ack -> proc done,going to sleep\n\r "); |
alan1974 | 0:a91cd1b08360 | 249 | bPulseLoraWake = false; |
alan1974 | 10:061fab1195e7 | 250 | #ifdef GPIO_ENABLE |
alan1974 | 10:061fab1195e7 | 251 | gpio1 =0; |
alan1974 | 10:061fab1195e7 | 252 | #endif |
alan1974 | 15:ed77b752eaa9 | 253 | wait_us(wait_before_sleep_usec); //wait for i2c to complete data transfer before sleeping |
alan1974 | 17:74d60177c6b6 | 254 | |
alan1974 | 18:d95e1a2c4303 | 255 | if (bListen4Multicast){ //in ClassC and receiving multicst pkt, stay here until timeout or bListen4Multicast false |
alan1974 | 19:cff66b2c15b5 | 256 | if(verbose)pc.printf("\n\r changed to class C\r\n"); |
alan1974 | 19:cff66b2c15b5 | 257 | while(bListen4Multicast){ //stay in mcast bListen4Mutlicast =0, xdot exits -> classA when terminating mcast frag# received else psoc resets xdot |
alan1974 | 17:74d60177c6b6 | 258 | wait(1); |
alan1974 | 17:74d60177c6b6 | 259 | } |
alan1974 | 17:74d60177c6b6 | 260 | } |
alan1974 | 17:74d60177c6b6 | 261 | sleep_wake_interrupt_only(deep_sleep); //sleep until rising edge of wake signal from proc |
alan1974 | 17:74d60177c6b6 | 262 | |
alan1974 | 15:ed77b752eaa9 | 263 | |
alan1974 | 10:061fab1195e7 | 264 | #ifdef GPIO_ENABLE |
alan1974 | 10:061fab1195e7 | 265 | gpio1 =1; |
alan1974 | 10:061fab1195e7 | 266 | #endif |
alan1974 | 8:a5316708e51d | 267 | if(verbose)pc.printf("\n\r lora wake detected -> monitoring i2c bus\n\r "); |
alan1974 | 0:a91cd1b08360 | 268 | break; |
alan1974 | 22:034c134f17c7 | 269 | case I2C_READ: //psoc -> xdot i2c write |
alan1974 | 0:a91cd1b08360 | 270 | bPulseLoraWake = true; |
alan1974 | 0:a91cd1b08360 | 271 | switch (buf_rcv[0]) |
alan1974 | 0:a91cd1b08360 | 272 | { |
alan1974 | 1:0d25d9ddbe9f | 273 | case XDOT_CMD_XMIT_PKT: |
alan1974 | 22:034c134f17c7 | 274 | bool bOk2XmitFullPayload = true; //if false we only transmit the mac data |
alan1974 | 7:fba1e8fc7693 | 275 | pkt_upstrm *pUp= (pkt_upstrm*)&buf_rcv[0]; |
alan1974 | 7:fba1e8fc7693 | 276 | for (i=0; i < sizeof(buf_xmt);i++)buf_xmt[i] = 0xff; //bfr fill |
alan1974 | 7:fba1e8fc7693 | 277 | pkt_ack *pAck = (pkt_ack*)&buf_xmt[0]; |
alan1974 | 0:a91cd1b08360 | 278 | pAck->ack = I2C_ACK_PROC; |
alan1974 | 5:abfe25f0de33 | 279 | pAck->cmd = XDOT_CMD_XMIT_PKT; |
alan1974 | 22:034c134f17c7 | 280 | pAck->dataLen = pUp->dataLen; //data len of xmitted pkt |
alan1974 | 22:034c134f17c7 | 281 | //rev 040A change: if next tx pkt includes mac data => only xmit mac data and abort psoc payload |
alan1974 | 22:034c134f17c7 | 282 | if(verbose)pc.printf("\r\ndatalen of pkt to xmit: %d",pAck->dataLen); |
alan1974 | 22:034c134f17c7 | 283 | uint8_t maxPayLoad = dot->getMaxPacketLength(); |
alan1974 | 22:034c134f17c7 | 284 | uint8_t maxSizeNxtTxPkt = dot->getNextTxMaxSize(); //max payload available to transmit in next pkt |
alan1974 | 22:034c134f17c7 | 285 | if(verbose)pc.printf("\r\nmax datalen of next pkt: %d",maxSizeNxtTxPkt); |
alan1974 | 22:034c134f17c7 | 286 | if (maxSizeNxtTxPkt < maxPayLoad){ |
alan1974 | 22:034c134f17c7 | 287 | if(verbose)pc.printf("\r\n can't fit payload in next pkt,xmit only mac data\r\n"); |
alan1974 | 22:034c134f17c7 | 288 | bOk2XmitFullPayload = false; |
alan1974 | 22:034c134f17c7 | 289 | } |
alan1974 | 22:034c134f17c7 | 290 | else{ |
alan1974 | 22:034c134f17c7 | 291 | if(verbose)pc.printf("\r\nok to xmit full payload"); |
alan1974 | 22:034c134f17c7 | 292 | } |
alan1974 | 22:034c134f17c7 | 293 | //i2c pkt chksum from psoc ok? |
alan1974 | 5:abfe25f0de33 | 294 | uint8_t chksum = chksum_proc(buf_rcv); |
alan1974 | 22:034c134f17c7 | 295 | if(verbose)pc.printf("\r\nI2C chksum rcvd/computed: %d/%d ",pUp->chksum,chksum); |
alan1974 | 0:a91cd1b08360 | 296 | pAck->bXmitAttempted = 1; |
alan1974 | 0:a91cd1b08360 | 297 | pAck->chksum_err = 0; |
alan1974 | 0:a91cd1b08360 | 298 | if(pUp->chksum != chksum){ |
alan1974 | 7:fba1e8fc7693 | 299 | if(verbose)pc.printf(" chksum err, aborting xmit"); |
alan1974 | 0:a91cd1b08360 | 300 | pAck->bXmitAttempted = 0; |
alan1974 | 11:77fe4f18a81b | 301 | pAck->mdot_ret = XDOT_ERR_I2C_CHKSUM; |
alan1974 | 11:77fe4f18a81b | 302 | pAck->chksum_err = 1; |
alan1974 | 11:77fe4f18a81b | 303 | break; |
alan1974 | 0:a91cd1b08360 | 304 | } |
alan1974 | 1:0d25d9ddbe9f | 305 | //rev 0307 parameters |
alan1974 | 22:034c134f17c7 | 306 | if(verbose)pc.printf("\r\nsetting application port %d ",pUp->appPort); //appPort not used in rev < 0307 |
alan1974 | 1:0d25d9ddbe9f | 307 | dot->setAppPort(pUp->appPort); |
alan1974 | 6:b2039a285d7f | 308 | uint8_t linkThresholdCnt = pUp->linkThreshCnt; |
alan1974 | 22:034c134f17c7 | 309 | if(verbose)pc.printf("\r\nlinkThreshCnt %d\r\n",linkThresholdCnt); |
alan1974 | 6:b2039a285d7f | 310 | dot->setLinkCheckThreshold(linkThresholdCnt); |
alan1974 | 11:77fe4f18a81b | 311 | |
alan1974 | 0:a91cd1b08360 | 312 | if (pUp->dataLen == 0){ //datalen non zero? |
alan1974 | 0:a91cd1b08360 | 313 | pAck->bXmitAttempted = 0; |
alan1974 | 0:a91cd1b08360 | 314 | break; |
alan1974 | 22:034c134f17c7 | 315 | } |
alan1974 | 22:034c134f17c7 | 316 | //rev 040A change |
alan1974 | 22:034c134f17c7 | 317 | upstream_packet.clear(); //clear the xmit payload array |
alan1974 | 26:f51ff4ad7a93 | 318 | if(bOk2XmitFullPayload) //if no mac data to xmit, xfr data from incoming bfr to xmit bfr |
alan1974 | 22:034c134f17c7 | 319 | for (i=0; i< pUp->dataLen;i++) upstream_packet.push_back(pUp->txData[i]); |
alan1974 | 5:abfe25f0de33 | 320 | if(verbose){ |
alan1974 | 7:fba1e8fc7693 | 321 | pc.printf("\r\n[TEST],Upstream Packet Received"); |
alan1974 | 5:abfe25f0de33 | 322 | for(std::vector<uint8_t>::iterator it = upstream_packet.begin(); it != upstream_packet.end(); ++it) |
alan1974 | 5:abfe25f0de33 | 323 | pc.printf(",0x%x", *it); |
alan1974 | 5:abfe25f0de33 | 324 | pc.printf("\r\n"); // see i told you. |
alan1974 | 5:abfe25f0de33 | 325 | } |
alan1974 | 22:034c134f17c7 | 326 | |
alan1974 | 0:a91cd1b08360 | 327 | joined = dot->getNetworkJoinStatus(); //are we joined to Lorawan? |
alan1974 | 26:f51ff4ad7a93 | 328 | if(verbose)pc.printf("\r\njoin status on entry: %d\r\n",joined); |
alan1974 | 0:a91cd1b08360 | 329 | pAck->joinAttempts = 0; //no attempts made yet to join |
alan1974 | 1:0d25d9ddbe9f | 330 | pAck->bAck = 0; //won't know if we receive a lorawan ack until after xmit |
alan1974 | 1:0d25d9ddbe9f | 331 | pAck->bAckdata = 0; //won't know if we receive a lorawan ack downstream data until after xmit |
alan1974 | 20:62a1a264fa1e | 332 | pAck->rssi = 0; //if not rx1/rx2 then no RSSI value -- 8 bit rssi, deprecated, keep for compatbility |
alan1974 | 20:62a1a264fa1e | 333 | pAck->rssi2 = 0; //16 bit rssi |
alan1974 | 7:fba1e8fc7693 | 334 | pAck->snr = 0; //if not rx1/rx2 then no SNR value |
alan1974 | 26:f51ff4ad7a93 | 335 | pAck->snr2 = 0; //16 bit snr |
alan1974 | 26:f51ff4ad7a93 | 336 | if(!joined) //if not previously joined, then need to join now |
alan1974 | 26:f51ff4ad7a93 | 337 | { |
alan1974 | 0:a91cd1b08360 | 338 | pAck->bJoined = 0; |
alan1974 | 5:abfe25f0de33 | 339 | if(verbose)pc.printf("\r\n----------- NETWORK NOT JOINED YET, WILL TRY TO JOIN %d TIMES\r\n",pUp->joinAttemps); |
alan1974 | 14:fc836a5a5d2f | 340 | joined = join_network_wbit(pUp->joinAttemps); //try joinAttemps times to join network |
alan1974 | 14:fc836a5a5d2f | 341 | pAck->joinAttempts = join_network_attempts_wbit(); //# of join attemps made |
alan1974 | 26:f51ff4ad7a93 | 342 | if(verbose)pc.printf("\r\njoin status after join attempt: %d\r\n",joined); |
alan1974 | 26:f51ff4ad7a93 | 343 | if (joined){ //are we now joined? rev 040A executed 'joined' as true regardless of state |
alan1974 | 24:e5ff476cd04e | 344 | dot->saveNetworkSession(); //save OTAA keys and session info on new join success |
alan1974 | 24:e5ff476cd04e | 345 | save_OTAA_session_keys(); //used for multicast |
alan1974 | 24:e5ff476cd04e | 346 | } |
alan1974 | 26:f51ff4ad7a93 | 347 | else |
alan1974 | 26:f51ff4ad7a93 | 348 | if(verbose)pc.printf("\r\n----------- FAILED TO JOIN...GIVING UP\r\n"); // join network if not joined } |
alan1974 | 22:034c134f17c7 | 349 | } |
alan1974 | 22:034c134f17c7 | 350 | if (joined) //we are joined to the network |
alan1974 | 11:77fe4f18a81b | 351 | { |
alan1974 | 22:034c134f17c7 | 352 | pAck->bJoined = 1; |
alan1974 | 0:a91cd1b08360 | 353 | packets_sent++; |
alan1974 | 11:77fe4f18a81b | 354 | bRxDone = false; //true if callback function RxDone() triggered |
alan1974 | 11:77fe4f18a81b | 355 | bDownLinkCntrFail = false; //true if callback function RxDone() triggered and bad downlink frame count |
alan1974 | 11:77fe4f18a81b | 356 | |
alan1974 | 12:7944e4dbe853 | 357 | //send packet -> return code indicates results, send return code back to proc Dec14,2017 |
alan1974 | 22:034c134f17c7 | 358 | plan.SetRx2DatarateIndex(8); //LORIOT FIX FOR RX2 & OT --- work here????? |
alan1974 | 22:034c134f17c7 | 359 | |
alan1974 | 22:034c134f17c7 | 360 | //rev 040A change |
alan1974 | 22:034c134f17c7 | 361 | if(bOk2XmitFullPayload){ //send normal payload, no mac data to send |
alan1974 | 22:034c134f17c7 | 362 | pAck->mdot_ret = dot->send(upstream_packet); //xmit the pkt |
alan1974 | 22:034c134f17c7 | 363 | if (verbose)printf("\n\rdata->send() return code: %d\r\n",pAck->mdot_ret); |
alan1974 | 22:034c134f17c7 | 364 | } |
alan1974 | 22:034c134f17c7 | 365 | else{ //just xmit mac payload without psoc payload, return errcode for max payload exceeded |
alan1974 | 22:034c134f17c7 | 366 | dot->send(upstream_packet); //xmit the pkt in blocking mode, return false if no ack |
alan1974 | 22:034c134f17c7 | 367 | pAck->mdot_ret = XDOT_ERR_MAX_PAYLOAD; |
alan1974 | 22:034c134f17c7 | 368 | pAck->bXmitAttempted = 0; |
alan1974 | 22:034c134f17c7 | 369 | } |
alan1974 | 22:034c134f17c7 | 370 | |
alan1974 | 11:77fe4f18a81b | 371 | if (pAck->mdot_ret == mDot::MDOT_OK) |
alan1974 | 11:77fe4f18a81b | 372 | { |
alan1974 | 0:a91cd1b08360 | 373 | acks_rcvd++; |
alan1974 | 0:a91cd1b08360 | 374 | pAck->bAck = 1; //we got a Rx1 or Rx2 ack |
alan1974 | 7:fba1e8fc7693 | 375 | mDot::rssi_stats rssiStats = dot->getRssiStats(); //rssi stat |
alan1974 | 20:62a1a264fa1e | 376 | pAck->rssi = (int8_t)rssiStats.last; //deprecated later! |
alan1974 | 20:62a1a264fa1e | 377 | pAck->rssi2 = (int16_t)rssiStats.last; |
alan1974 | 7:fba1e8fc7693 | 378 | mDot::snr_stats snrStats = dot->getSnrStats(); //snr stat |
alan1974 | 20:62a1a264fa1e | 379 | pAck->snr = (int8_t)snrStats.last; //deprecate later |
alan1974 | 20:62a1a264fa1e | 380 | pAck->snr2 = (int16_t)snrStats.last; |
alan1974 | 7:fba1e8fc7693 | 381 | if (verbose)printf("\n\rdata->send()=true; ack:%d, rssi:%d snr:%d\r\n",pAck->bAck,pAck->rssi,pAck->snr); |
alan1974 | 7:fba1e8fc7693 | 382 | if (events.is_packet_received()){ //downstream data from the Rx1/Rx2 pkt? |
alan1974 | 5:abfe25f0de33 | 383 | if (verbose)printf("\n\revents.is_packet_received = true\r\n"); |
alan1974 | 0:a91cd1b08360 | 384 | pAck->bAckdata = 1; |
alan1974 | 0:a91cd1b08360 | 385 | upstream_packet.clear(); |
alan1974 | 0:a91cd1b08360 | 386 | upstream_packet = events.get_downstream_packet(); |
alan1974 | 12:7944e4dbe853 | 387 | pAck->rxLen = upstream_packet.size(); |
alan1974 | 12:7944e4dbe853 | 388 | pAck->appPort = events.port; |
alan1974 | 0:a91cd1b08360 | 389 | if (pAck->rxLen > I2C_MAX_ACK_DATA){ |
alan1974 | 5:abfe25f0de33 | 390 | if(verbose)pc.printf("\r\n got ack with pkt data too large.. rejected\r\n"); |
alan1974 | 0:a91cd1b08360 | 391 | break; |
alan1974 | 5:abfe25f0de33 | 392 | } |
alan1974 | 5:abfe25f0de33 | 393 | if(verbose){ |
alan1974 | 5:abfe25f0de33 | 394 | pc.printf("\r\n pkt data: "); |
alan1974 | 5:abfe25f0de33 | 395 | for (i=0; i< pAck->rxLen;i++) { |
alan1974 | 5:abfe25f0de33 | 396 | pAck->rxData[i]= upstream_packet[i]; |
alan1974 | 5:abfe25f0de33 | 397 | pc.printf(" %x",pAck->rxData[i]); |
alan1974 | 5:abfe25f0de33 | 398 | } |
alan1974 | 0:a91cd1b08360 | 399 | } |
alan1974 | 0:a91cd1b08360 | 400 | } //if downstream data rcvd |
alan1974 | 0:a91cd1b08360 | 401 | else{ |
alan1974 | 11:77fe4f18a81b | 402 | if (verbose)printf("\n\r ack rcvd without data\r\n"); |
alan1974 | 11:77fe4f18a81b | 403 | } //else |
alan1974 | 7:fba1e8fc7693 | 404 | } //send() |
alan1974 | 11:77fe4f18a81b | 405 | //rev 0308 parameters |
alan1974 | 11:77fe4f18a81b | 406 | else |
alan1974 | 11:77fe4f18a81b | 407 | { |
alan1974 | 11:77fe4f18a81b | 408 | if (verbose)printf("\n\r no ack rcvd \r\n"); //could be some other error |
alan1974 | 11:77fe4f18a81b | 409 | if ((pAck->mdot_ret != 0) && bRxDone) //chk if callback function triggered |
alan1974 | 11:77fe4f18a81b | 410 | { |
alan1974 | 11:77fe4f18a81b | 411 | if (bDownLinkCntrFail)pAck->mdot_ret = XDOT_ERR_FRAME_CNT; //bad downlink frame count return err code |
alan1974 | 11:77fe4f18a81b | 412 | } |
alan1974 | 0:a91cd1b08360 | 413 | } |
alan1974 | 0:a91cd1b08360 | 414 | }//if joined |
alan1974 | 0:a91cd1b08360 | 415 | break; |
alan1974 | 0:a91cd1b08360 | 416 | case XDOT_CMD_SET_RADIO: |
alan1974 | 5:abfe25f0de33 | 417 | if(verbose)pc.printf("\n\r proc cmd: CMD_SET_RADIO"); |
alan1974 | 0:a91cd1b08360 | 418 | pkt_setradiodwn *pDwnRadio= (pkt_setradiodwn*)&buf_xmt[0]; |
alan1974 | 0:a91cd1b08360 | 419 | pkt_setradioup *pUpRadio = (pkt_setradioup*)&buf_rcv[0]; |
alan1974 | 0:a91cd1b08360 | 420 | pDwnRadio->ack = I2C_ACK_PROC; |
alan1974 | 0:a91cd1b08360 | 421 | pDwnRadio->cmd = XDOT_CMD_SET_RADIO; |
alan1974 | 0:a91cd1b08360 | 422 | |
alan1974 | 0:a91cd1b08360 | 423 | if (pUpRadio->bSetParams){ |
alan1974 | 7:fba1e8fc7693 | 424 | if(verbose)pc.printf("\n\r setting radio params"); |
alan1974 | 7:fba1e8fc7693 | 425 | if(verbose)pc.printf("\n\r setting adr to %d ",pUpRadio->params.aDR); |
alan1974 | 7:fba1e8fc7693 | 426 | if (pUpRadio->params.aDR == 1) dot->setAdr(true); //test for adr problem |
alan1974 | 7:fba1e8fc7693 | 427 | else dot->setAdr(false); |
alan1974 | 7:fba1e8fc7693 | 428 | dot->setAdr((uint8_t)pUpRadio->params.aDR); // enable or disable Adaptive Data Rate |
alan1974 | 5:abfe25f0de33 | 429 | if(verbose)pc.printf("\n\r setting subband to %d ",pUpRadio->params.sub_band); |
alan1974 | 2:0af50f386eb2 | 430 | cfg_network(false,true,(uint8_t)pUpRadio->params.sub_band); |
alan1974 | 7:fba1e8fc7693 | 431 | |
alan1974 | 7:fba1e8fc7693 | 432 | if(verbose)pc.printf("\n\r setting public/private network to %d ",pUpRadio->params.public_network); |
alan1974 | 7:fba1e8fc7693 | 433 | //public_network = (bool)pUpRadio->params.public_network; |
alan1974 | 7:fba1e8fc7693 | 434 | dot->setPublicNetwork((bool)pUpRadio->params.public_network); |
alan1974 | 7:fba1e8fc7693 | 435 | |
alan1974 | 5:abfe25f0de33 | 436 | if(verbose)pc.printf("\n\r setting antenna gain to %d ",pUpRadio->params.antennaGaindBi); |
alan1974 | 2:0af50f386eb2 | 437 | dot->setAntennaGain(pUpRadio->params.antennaGaindBi); |
alan1974 | 10:061fab1195e7 | 438 | if(verbose)pc.printf("\n\r setting radio tx power to %d ",pUpRadio->params.txPower); |
alan1974 | 10:061fab1195e7 | 439 | dot->setTxPower(pUpRadio->params.txPower); |
alan1974 | 5:abfe25f0de33 | 440 | if(verbose)pc.printf("\n\r setting tx datarate to %d ",pUpRadio->params.dataRate); |
alan1974 | 2:0af50f386eb2 | 441 | dot->setTxDataRate(pUpRadio->params.dataRate); |
alan1974 | 22:034c134f17c7 | 442 | //deprecated if(verbose)pc.printf("\n\r setting tx inverted to %d ",(bool)pUpRadio->params.txInverted); |
alan1974 | 22:034c134f17c7 | 443 | //deprecated dot->setTxInverted((bool)pUpRadio->params.txInverted); |
alan1974 | 22:034c134f17c7 | 444 | //deprecated if(verbose)pc.printf("\n\r setting rx inverted to %d ",(bool)pUpRadio->params.rxInverted); |
alan1974 | 22:034c134f17c7 | 445 | //deprecated dot->setRxInverted((bool)pUpRadio->params.rxInverted); |
alan1974 | 5:abfe25f0de33 | 446 | if(verbose)pc.printf("\n\r setting rx delay to %d ",pUpRadio->params.rxDelay); |
alan1974 | 5:abfe25f0de33 | 447 | dot->setRxDelay(pUpRadio->params.rxDelay); |
alan1974 | 5:abfe25f0de33 | 448 | if(verbose)pc.printf("\n\r setting join delay to %d ",pUpRadio->params.join_delay); |
alan1974 | 7:fba1e8fc7693 | 449 | dot->setJoinDelay(pUpRadio->params.join_delay); |
alan1974 | 5:abfe25f0de33 | 450 | if(verbose)pc.printf("\n\r saving configuration"); |
alan1974 | 0:a91cd1b08360 | 451 | if (!dot->saveConfig())logError("failed to save configuration"); |
alan1974 | 7:fba1e8fc7693 | 452 | |
alan1974 | 0:a91cd1b08360 | 453 | display_config(); |
alan1974 | 0:a91cd1b08360 | 454 | } |
alan1974 | 7:fba1e8fc7693 | 455 | if(verbose)pc.printf("\n\r reading radio params"); |
alan1974 | 2:0af50f386eb2 | 456 | pDwnRadio->params.public_network = public_network; |
alan1974 | 2:0af50f386eb2 | 457 | pDwnRadio->params.sub_band = dot->getFrequencySubBand(); |
alan1974 | 5:abfe25f0de33 | 458 | pDwnRadio->params.join_delay = dot->getJoinDelay(); |
alan1974 | 22:034c134f17c7 | 459 | //deprecated pDwnRadio->params.txInverted = dot->getTxInverted(); |
alan1974 | 22:034c134f17c7 | 460 | //deprecated pDwnRadio->params.rxInverted = dot->getRxInverted(); |
alan1974 | 22:034c134f17c7 | 461 | pDwnRadio->params.txInverted = false; //not used anymorer |
alan1974 | 22:034c134f17c7 | 462 | pDwnRadio->params.rxInverted = false; //not used anymorer |
alan1974 | 5:abfe25f0de33 | 463 | pDwnRadio->params.rxDelay = dot->getRxDelay(); |
alan1974 | 2:0af50f386eb2 | 464 | pDwnRadio->params.maxDataLen = dot->getMaxPacketLength(); |
alan1974 | 2:0af50f386eb2 | 465 | pDwnRadio->params.maxTxPowerdBm = dot->getMaxTxPower(); |
alan1974 | 2:0af50f386eb2 | 466 | pDwnRadio->params.minTxPowerdBm = dot->getMinTxPower(); |
alan1974 | 2:0af50f386eb2 | 467 | pDwnRadio->params.aDR = dot->getAdr(); |
alan1974 | 2:0af50f386eb2 | 468 | pDwnRadio->params.antennaGaindBi = dot->getAntennaGain(); |
alan1974 | 10:061fab1195e7 | 469 | pDwnRadio->params.txPower = dot->getTxPower(); //programmed tx power (non-adr) |
alan1974 | 10:061fab1195e7 | 470 | pDwnRadio->params.dataRate = dot->getTxDataRate(); //programmed data rate (non-adr) |
alan1974 | 10:061fab1195e7 | 471 | pDwnRadio->params.dataRateCurrent = dot->getSettings()->Session.TxDatarate; //presently used data rate (adr can change this);see Lora.h |
alan1974 | 10:061fab1195e7 | 472 | pDwnRadio->params.txPowerCurrent = dot->getSettings()->Session.TxPower;//presently used tx power (adr can change this);see Lora.h |
alan1974 | 10:061fab1195e7 | 473 | pDwnRadio->params.rx1DelayCurrent = dot->getSettings()->Session.RxDelay;//presently used rx1_delay;see Lora.h |
alan1974 | 10:061fab1195e7 | 474 | |
alan1974 | 10:061fab1195e7 | 475 | |
alan1974 | 0:a91cd1b08360 | 476 | break; |
alan1974 | 0:a91cd1b08360 | 477 | case XDOT_CMD_GET_EUI: //0307: modified to include radio parameter settings |
alan1974 | 5:abfe25f0de33 | 478 | if(verbose)pc.printf("\n\r proc cmd: get EUI"); |
alan1974 | 0:a91cd1b08360 | 479 | pkt_eui *peui = (pkt_eui*)&buf_xmt[0]; |
alan1974 | 0:a91cd1b08360 | 480 | peui->ack = I2C_ACK_PROC; |
alan1974 | 0:a91cd1b08360 | 481 | peui->cmd = XDOT_CMD_GET_EUI; |
alan1974 | 0:a91cd1b08360 | 482 | upstream_packet.clear(); |
alan1974 | 0:a91cd1b08360 | 483 | upstream_packet = dot->getDeviceId(); |
alan1974 | 0:a91cd1b08360 | 484 | peui->dataLen = upstream_packet.size(); |
alan1974 | 0:a91cd1b08360 | 485 | for (i=0; i< peui->dataLen;i++) peui->euiData[i] = upstream_packet[i]; |
alan1974 | 0:a91cd1b08360 | 486 | for (i=0; i< 4;i++) peui->apiLvlData[i] = api_level[i]; |
alan1974 | 0:a91cd1b08360 | 487 | for (i=0; i< 4;i++) peui->verLvlData[i] = ver_level[i]; |
alan1974 | 0:a91cd1b08360 | 488 | peui->dataLen = sizeof(pkt_eui)-3; //size of struc minus first 3 bytes |
alan1974 | 9:cc23b2049639 | 489 | if(verbose)pc.printf("\n\r eui data length: %d",peui->dataLen); |
alan1974 | 17:74d60177c6b6 | 490 | break; |
alan1974 | 9:cc23b2049639 | 491 | case XDOT_CMD_NVM: |
alan1974 | 12:7944e4dbe853 | 492 | if(verbose)pc.printf("\n\r proc cmd: NVM OTAA"); |
alan1974 | 9:cc23b2049639 | 493 | pkt_setnvmup *pUpNvm = (pkt_setnvmup*)&buf_rcv[0]; |
alan1974 | 9:cc23b2049639 | 494 | pkt_setnvmdwn *pDwnNvm= (pkt_setnvmdwn*)&buf_xmt[0]; |
alan1974 | 9:cc23b2049639 | 495 | pDwnNvm->ack = I2C_ACK_PROC; |
alan1974 | 9:cc23b2049639 | 496 | pDwnNvm->cmd = XDOT_CMD_NVM; |
alan1974 | 9:cc23b2049639 | 497 | pDwnNvm->dataLen = sizeof(nvm)-2; |
alan1974 | 9:cc23b2049639 | 498 | if (pUpNvm->nvm_option == XDOT_NVM_SET) nvmWrite(&pUpNvm->nvmData); |
alan1974 | 9:cc23b2049639 | 499 | if (pUpNvm->nvm_option == XDOT_NVM_RESTORE) nvmRestore(&pUpNvm->nvmData); |
alan1974 | 9:cc23b2049639 | 500 | |
alan1974 | 9:cc23b2049639 | 501 | pDwnNvm->bChkSumOK = 0; |
alan1974 | 9:cc23b2049639 | 502 | if (nvmRead(&pDwnNvm->nvmData)) |
alan1974 | 9:cc23b2049639 | 503 | pDwnNvm->bChkSumOK = 1; |
alan1974 | 9:cc23b2049639 | 504 | printNmvData(&pDwnNvm->nvmData); |
alan1974 | 17:74d60177c6b6 | 505 | break; |
alan1974 | 24:e5ff476cd04e | 506 | case XDOT_CMD_RESTORE_SESSION: //restore OTAA session |
alan1974 | 24:e5ff476cd04e | 507 | dot->restoreNetworkSession(); |
alan1974 | 24:e5ff476cd04e | 508 | dot->setDownLinkCounter(0); //reset frame counters |
alan1974 | 24:e5ff476cd04e | 509 | dot->setUpLinkCounter(0); |
alan1974 | 24:e5ff476cd04e | 510 | pkt_ntwrk *pDwnRstSession = (pkt_ntwrk*)&buf_xmt[0]; |
alan1974 | 24:e5ff476cd04e | 511 | pDwnRstSession->ack = I2C_ACK_PROC; |
alan1974 | 24:e5ff476cd04e | 512 | pDwnRstSession->cmd = XDOT_CMD_RESTORE_SESSION; |
alan1974 | 24:e5ff476cd04e | 513 | pDwnRstSession->bSetNetwrk = 1; |
alan1974 | 24:e5ff476cd04e | 514 | pDwnRstSession->dataLen = sizeof(pkt_ntwrk)-2; |
alan1974 | 24:e5ff476cd04e | 515 | if(verbose)pc.printf("\n\r OTAA network session restored\r\n"); |
alan1974 | 24:e5ff476cd04e | 516 | wait_ms(I2C_MIN_WAIT_DELAY); |
alan1974 | 24:e5ff476cd04e | 517 | break; |
alan1974 | 14:fc836a5a5d2f | 518 | case XDOT_CMD_SET_RADIO_CLASS: //multicast_change_class A or C (change only after a join!) |
alan1974 | 14:fc836a5a5d2f | 519 | if(verbose)pc.printf("\n\r proc cmd: change radio class\r\n"); |
alan1974 | 14:fc836a5a5d2f | 520 | pkt_setClassUp *pUpSetClass = (pkt_setClassUp*)&buf_rcv[0]; |
alan1974 | 14:fc836a5a5d2f | 521 | pkt_setClassDwn *pDwnSetClass = (pkt_setClassDwn*)&buf_xmt[0]; |
alan1974 | 14:fc836a5a5d2f | 522 | pDwnSetClass->ack = I2C_ACK_PROC; |
alan1974 | 14:fc836a5a5d2f | 523 | pDwnSetClass->cmd = XDOT_CMD_SET_RADIO_CLASS; |
alan1974 | 17:74d60177c6b6 | 524 | pDwnSetClass->dataLen = sizeof(class_switch)-2; |
alan1974 | 17:74d60177c6b6 | 525 | bool bOk = multicast_change_class(&pUpSetClass->classData); |
alan1974 | 17:74d60177c6b6 | 526 | if (bOk && pUpSetClass->classData.bListen4Multicast){ //go into listen only mode for multicast pkts? |
alan1974 | 17:74d60177c6b6 | 527 | bListen4Multicast = true;; |
alan1974 | 17:74d60177c6b6 | 528 | maxMulticastSessionTime = pUpSetClass->classData.maxMulticastSessionTime; |
alan1974 | 17:74d60177c6b6 | 529 | } |
alan1974 | 15:ed77b752eaa9 | 530 | pDwnSetClass->bSwitched = bOk; |
alan1974 | 14:fc836a5a5d2f | 531 | break; |
alan1974 | 14:fc836a5a5d2f | 532 | |
alan1974 | 12:7944e4dbe853 | 533 | |
alan1974 | 17:74d60177c6b6 | 534 | case XDOT_CMD_SET_NTWKSESS: //read or write network session to xdot flash |
alan1974 | 1:0d25d9ddbe9f | 535 | bool bWriteSession = (bool)buf_rcv[1]; |
alan1974 | 1:0d25d9ddbe9f | 536 | if (bWriteSession){ |
alan1974 | 5:abfe25f0de33 | 537 | if(verbose)pc.printf("\n\r proc cmd writing network sesion to flash"); |
alan1974 | 1:0d25d9ddbe9f | 538 | dot->saveNetworkSession(); |
alan1974 | 1:0d25d9ddbe9f | 539 | } |
alan1974 | 1:0d25d9ddbe9f | 540 | else{ |
alan1974 | 5:abfe25f0de33 | 541 | if(verbose)pc.printf("\n\r reading network session from flash"); |
alan1974 | 1:0d25d9ddbe9f | 542 | dot->restoreNetworkSession(); |
alan1974 | 1:0d25d9ddbe9f | 543 | } |
alan1974 | 1:0d25d9ddbe9f | 544 | pkt_ntwrk *pktwrk = (pkt_ntwrk*)&buf_xmt[0]; |
alan1974 | 1:0d25d9ddbe9f | 545 | pktwrk->ack = I2C_ACK_PROC; |
alan1974 | 1:0d25d9ddbe9f | 546 | pktwrk->cmd = XDOT_CMD_SET_NTWKSESS; |
alan1974 | 1:0d25d9ddbe9f | 547 | pktwrk->bSetNetwrk = (uint8_t)bWriteSession; |
alan1974 | 9:cc23b2049639 | 548 | break; |
alan1974 | 17:74d60177c6b6 | 549 | /* |
alan1974 | 0:a91cd1b08360 | 550 | case XDOT_CMD_SET_KEY_X: |
alan1974 | 7:fba1e8fc7693 | 551 | if(verbose)pc.printf("\n\r proc cmd: this command not used\r\n"); |
alan1974 | 0:a91cd1b08360 | 552 | wait_ms(I2C_MIN_WAIT_DELAY); |
alan1974 | 0:a91cd1b08360 | 553 | buf_xmt[0] = I2C_ACK_PROC; |
alan1974 | 0:a91cd1b08360 | 554 | buf_xmt[1] = XDOT_CMD_SET_KEY_X; |
alan1974 | 0:a91cd1b08360 | 555 | break; |
alan1974 | 17:74d60177c6b6 | 556 | */ |
alan1974 | 0:a91cd1b08360 | 557 | case XDOT_CMD_GATEWAY_PING: |
alan1974 | 5:abfe25f0de33 | 558 | if(verbose)pc.printf("\n\r proc cmd: xmit gateway ping\r\n"); |
alan1974 | 0:a91cd1b08360 | 559 | pkt_ping *pPing = (pkt_ping*)&buf_xmt[0]; |
alan1974 | 0:a91cd1b08360 | 560 | pPing->ack = I2C_ACK_PROC; |
alan1974 | 0:a91cd1b08360 | 561 | pPing->cmd = XDOT_CMD_GATEWAY_PING; |
alan1974 | 0:a91cd1b08360 | 562 | pPing->dataLen = 3; //only 3 bytes returned |
alan1974 | 5:abfe25f0de33 | 563 | if(verbose)pc.printf("\r\n----------- SENDING GATEWAY PING \r\n"); |
alan1974 | 0:a91cd1b08360 | 564 | mDot::ping_response ping_res; |
alan1974 | 0:a91cd1b08360 | 565 | ping_res = dot->ping(); |
alan1974 | 0:a91cd1b08360 | 566 | pPing->status = (int8_t)ping_res.status; |
alan1974 | 0:a91cd1b08360 | 567 | pPing->rssi = (int8_t)ping_res.rssi; |
alan1974 | 0:a91cd1b08360 | 568 | pPing->snr = (int8_t)ping_res.snr; |
alan1974 | 0:a91cd1b08360 | 569 | if (ping_res.status == 0) |
alan1974 | 5:abfe25f0de33 | 570 | if(verbose)pc.printf("\r\n----------- GATEWAY PING SUCCEEDED \r\n"); |
alan1974 | 0:a91cd1b08360 | 571 | else |
alan1974 | 5:abfe25f0de33 | 572 | if(verbose)pc.printf("\r\n----------- GATEWAY PING FAIL \r\n"); |
alan1974 | 0:a91cd1b08360 | 573 | break; |
alan1974 | 0:a91cd1b08360 | 574 | default: |
alan1974 | 5:abfe25f0de33 | 575 | if(verbose)pc.printf("\n\r proc cmd not recognized:%x",buf_rcv[0]); |
alan1974 | 0:a91cd1b08360 | 576 | wait_ms(I2C_MIN_WAIT_DELAY); |
alan1974 | 0:a91cd1b08360 | 577 | buf_xmt[0] = I2C_ACK_PROC; |
alan1974 | 0:a91cd1b08360 | 578 | buf_xmt[1] = XDOT_CMD_UNDEFINED; |
alan1974 | 0:a91cd1b08360 | 579 | } //switch buf_rcv[0] |
alan1974 | 0:a91cd1b08360 | 580 | //gpio1 =1; //test |
alan1974 | 0:a91cd1b08360 | 581 | if (bPulseLoraWake) i2c_pulse_wake(); //pulse wake-up lo->hi->lo to signal proc that xdot ready to send ack |
alan1974 | 0:a91cd1b08360 | 582 | |
alan1974 | 0:a91cd1b08360 | 583 | } //switch i2c_proc_comm |
alan1974 | 0:a91cd1b08360 | 584 | } //while |
alan1974 | 0:a91cd1b08360 | 585 | |
alan1974 | 0:a91cd1b08360 | 586 | } //main |
alan1974 | 0:a91cd1b08360 | 587 |