lora sensnode
Dependencies: libmDot mbed-rtos mbed
Fork of mDot_LoRa_Sensornode by
app/LoRa.cpp@0:f2815503561f, 2016-07-06 (annotated)
- Committer:
- mitea1
- Date:
- Wed Jul 06 20:40:36 2016 +0000
- Revision:
- 0:f2815503561f
initial commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mitea1 | 0:f2815503561f | 1 | /* |
mitea1 | 0:f2815503561f | 2 | * LoRa.cpp |
mitea1 | 0:f2815503561f | 3 | * |
mitea1 | 0:f2815503561f | 4 | * Created on: May 31, 2016 |
mitea1 | 0:f2815503561f | 5 | * Author: Adrian |
mitea1 | 0:f2815503561f | 6 | */ |
mitea1 | 0:f2815503561f | 7 | |
mitea1 | 0:f2815503561f | 8 | #include "LoRa.h" |
mitea1 | 0:f2815503561f | 9 | |
mitea1 | 0:f2815503561f | 10 | LoRa::LoRa(mDot* dot,RawSerial* debugSerial) { |
mitea1 | 0:f2815503561f | 11 | this->dot = dot; |
mitea1 | 0:f2815503561f | 12 | this->debugSerial = debugSerial; |
mitea1 | 0:f2815503561f | 13 | this->config = new LoRaConfig(); |
mitea1 | 0:f2815503561f | 14 | this->dot->setActivityLedPin(PA_0); |
mitea1 | 0:f2815503561f | 15 | this->dot->setActivityLedEnable(true); |
mitea1 | 0:f2815503561f | 16 | } |
mitea1 | 0:f2815503561f | 17 | |
mitea1 | 0:f2815503561f | 18 | LoRa::~LoRa() { |
mitea1 | 0:f2815503561f | 19 | // TODO Auto-generated destructor stub |
mitea1 | 0:f2815503561f | 20 | } |
mitea1 | 0:f2815503561f | 21 | |
mitea1 | 0:f2815503561f | 22 | void LoRa::init(LORA_MODE desiredMode){ |
mitea1 | 0:f2815503561f | 23 | config->build(desiredMode); |
mitea1 | 0:f2815503561f | 24 | |
mitea1 | 0:f2815503561f | 25 | resetConfig(); |
mitea1 | 0:f2815503561f | 26 | setPublicNetwork(); |
mitea1 | 0:f2815503561f | 27 | setFrequencySubBand(); |
mitea1 | 0:f2815503561f | 28 | setNetworkName(); |
mitea1 | 0:f2815503561f | 29 | setNetworkPassphrase(); |
mitea1 | 0:f2815503561f | 30 | setSpreadingFactor(); |
mitea1 | 0:f2815503561f | 31 | setAckRetries(); |
mitea1 | 0:f2815503561f | 32 | setTxPower(); |
mitea1 | 0:f2815503561f | 33 | |
mitea1 | 0:f2815503561f | 34 | saveConfig(); |
mitea1 | 0:f2815503561f | 35 | |
mitea1 | 0:f2815503561f | 36 | if(config->isActiv()){ |
mitea1 | 0:f2815503561f | 37 | joinNetwork(); |
mitea1 | 0:f2815503561f | 38 | } |
mitea1 | 0:f2815503561f | 39 | |
mitea1 | 0:f2815503561f | 40 | } |
mitea1 | 0:f2815503561f | 41 | |
mitea1 | 0:f2815503561f | 42 | int32_t LoRa::setPublicNetwork(){ |
mitea1 | 0:f2815503561f | 43 | int32_t ret; |
mitea1 | 0:f2815503561f | 44 | bool publicity = config->isPublic(); |
mitea1 | 0:f2815503561f | 45 | |
mitea1 | 0:f2815503561f | 46 | if ((ret = dot->setPublicNetwork(publicity)) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 47 | debugSerial->printf("failed to set public network %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 48 | } |
mitea1 | 0:f2815503561f | 49 | |
mitea1 | 0:f2815503561f | 50 | return ret; |
mitea1 | 0:f2815503561f | 51 | } |
mitea1 | 0:f2815503561f | 52 | |
mitea1 | 0:f2815503561f | 53 | int32_t LoRa::setFrequencySubBand(){ |
mitea1 | 0:f2815503561f | 54 | int32_t ret; |
mitea1 | 0:f2815503561f | 55 | uint8_t subBand = config->getFrequencySubBand(); |
mitea1 | 0:f2815503561f | 56 | |
mitea1 | 0:f2815503561f | 57 | debugSerial->printf("setting frequency sub band\n"); |
mitea1 | 0:f2815503561f | 58 | |
mitea1 | 0:f2815503561f | 59 | if ((ret = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 60 | debugSerial->printf("failed to set frequency sub band %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 61 | } |
mitea1 | 0:f2815503561f | 62 | |
mitea1 | 0:f2815503561f | 63 | return ret; |
mitea1 | 0:f2815503561f | 64 | } |
mitea1 | 0:f2815503561f | 65 | |
mitea1 | 0:f2815503561f | 66 | int32_t LoRa::setNetworkName(){ |
mitea1 | 0:f2815503561f | 67 | int32_t ret; |
mitea1 | 0:f2815503561f | 68 | std::string networkName = config->getNetworkName(); |
mitea1 | 0:f2815503561f | 69 | |
mitea1 | 0:f2815503561f | 70 | debugSerial->printf("setting network name\n"); |
mitea1 | 0:f2815503561f | 71 | |
mitea1 | 0:f2815503561f | 72 | if ((ret = dot->setNetworkName(networkName)) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 73 | debugSerial->printf("failed to set network name %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 74 | } |
mitea1 | 0:f2815503561f | 75 | |
mitea1 | 0:f2815503561f | 76 | return ret; |
mitea1 | 0:f2815503561f | 77 | } |
mitea1 | 0:f2815503561f | 78 | |
mitea1 | 0:f2815503561f | 79 | int32_t LoRa::setNetworkPassphrase(){ |
mitea1 | 0:f2815503561f | 80 | int32_t ret; |
mitea1 | 0:f2815503561f | 81 | std::string networkPassphrase = config->getNetworkPassphrase(); |
mitea1 | 0:f2815503561f | 82 | debugSerial->printf("setting network password\n"); |
mitea1 | 0:f2815503561f | 83 | |
mitea1 | 0:f2815503561f | 84 | if ((ret = dot->setNetworkPassphrase(networkPassphrase)) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 85 | debugSerial->printf("failed to set network password %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 86 | } |
mitea1 | 0:f2815503561f | 87 | |
mitea1 | 0:f2815503561f | 88 | return ret; |
mitea1 | 0:f2815503561f | 89 | } |
mitea1 | 0:f2815503561f | 90 | |
mitea1 | 0:f2815503561f | 91 | int32_t LoRa::setSpreadingFactor(){ |
mitea1 | 0:f2815503561f | 92 | int32_t ret; |
mitea1 | 0:f2815503561f | 93 | |
mitea1 | 0:f2815503561f | 94 | spreadingFactor = config->getSpreadingFactor(); |
mitea1 | 0:f2815503561f | 95 | mDot::DataRates spreadingFactorMdot; |
mitea1 | 0:f2815503561f | 96 | |
mitea1 | 0:f2815503561f | 97 | switch(spreadingFactor){ |
mitea1 | 0:f2815503561f | 98 | case LORA_SPREADING_FACTOR_7: |
mitea1 | 0:f2815503561f | 99 | spreadingFactorMdot = mDot::SF_7; |
mitea1 | 0:f2815503561f | 100 | break; |
mitea1 | 0:f2815503561f | 101 | |
mitea1 | 0:f2815503561f | 102 | case LORA_SPREADING_FACTOR_8: |
mitea1 | 0:f2815503561f | 103 | spreadingFactorMdot = mDot::SF_8; |
mitea1 | 0:f2815503561f | 104 | break; |
mitea1 | 0:f2815503561f | 105 | |
mitea1 | 0:f2815503561f | 106 | case LORA_SPREADING_FACTOR_9: |
mitea1 | 0:f2815503561f | 107 | spreadingFactorMdot = mDot::SF_9; |
mitea1 | 0:f2815503561f | 108 | break; |
mitea1 | 0:f2815503561f | 109 | |
mitea1 | 0:f2815503561f | 110 | case LORA_SPREADING_FACTOR_10: |
mitea1 | 0:f2815503561f | 111 | spreadingFactorMdot = mDot::SF_10; |
mitea1 | 0:f2815503561f | 112 | break; |
mitea1 | 0:f2815503561f | 113 | |
mitea1 | 0:f2815503561f | 114 | case LORA_SPREADING_FACTOR_11: |
mitea1 | 0:f2815503561f | 115 | spreadingFactorMdot = mDot::SF_11; |
mitea1 | 0:f2815503561f | 116 | break; |
mitea1 | 0:f2815503561f | 117 | |
mitea1 | 0:f2815503561f | 118 | case LORA_SPREADING_FACTOR_12: |
mitea1 | 0:f2815503561f | 119 | spreadingFactorMdot = mDot::SF_12; |
mitea1 | 0:f2815503561f | 120 | break; |
mitea1 | 0:f2815503561f | 121 | |
mitea1 | 0:f2815503561f | 122 | default: |
mitea1 | 0:f2815503561f | 123 | spreadingFactorMdot = mDot::SF_12; |
mitea1 | 0:f2815503561f | 124 | break; |
mitea1 | 0:f2815503561f | 125 | } |
mitea1 | 0:f2815503561f | 126 | |
mitea1 | 0:f2815503561f | 127 | debugSerial->printf("setting TX spreading factor\n"); |
mitea1 | 0:f2815503561f | 128 | if ((ret = dot->setTxDataRate(spreadingFactorMdot)) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 129 | debugSerial->printf("failed to set TX datarate %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 130 | } |
mitea1 | 0:f2815503561f | 131 | |
mitea1 | 0:f2815503561f | 132 | return ret; |
mitea1 | 0:f2815503561f | 133 | } |
mitea1 | 0:f2815503561f | 134 | |
mitea1 | 0:f2815503561f | 135 | int32_t LoRa::setTxPower(){ |
mitea1 | 0:f2815503561f | 136 | txPowerdBm = config->getTxPowerdBm(); |
mitea1 | 0:f2815503561f | 137 | dot->setTxPower(txPowerdBm); |
mitea1 | 0:f2815503561f | 138 | } |
mitea1 | 0:f2815503561f | 139 | |
mitea1 | 0:f2815503561f | 140 | int32_t LoRa::setAckRetries(){ |
mitea1 | 0:f2815503561f | 141 | int32_t ret; |
mitea1 | 0:f2815503561f | 142 | uint8_t retries = config->getAcknowledgeRetries(); |
mitea1 | 0:f2815503561f | 143 | |
mitea1 | 0:f2815503561f | 144 | debugSerial->printf("enabling ACKs\n"); |
mitea1 | 0:f2815503561f | 145 | if ((ret = dot->setAck(retries)) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 146 | debugSerial->printf("failed to enable ACKs %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 147 | } |
mitea1 | 0:f2815503561f | 148 | |
mitea1 | 0:f2815503561f | 149 | return ret; |
mitea1 | 0:f2815503561f | 150 | } |
mitea1 | 0:f2815503561f | 151 | |
mitea1 | 0:f2815503561f | 152 | void LoRa::resetConfig(){ |
mitea1 | 0:f2815503561f | 153 | dot->resetConfig(); |
mitea1 | 0:f2815503561f | 154 | } |
mitea1 | 0:f2815503561f | 155 | |
mitea1 | 0:f2815503561f | 156 | void LoRa::saveConfig(){ |
mitea1 | 0:f2815503561f | 157 | debugSerial->printf("saving config\n"); |
mitea1 | 0:f2815503561f | 158 | if (! dot->saveConfig()) { |
mitea1 | 0:f2815503561f | 159 | debugSerial->printf("failed to save configuration\n"); |
mitea1 | 0:f2815503561f | 160 | } |
mitea1 | 0:f2815503561f | 161 | } |
mitea1 | 0:f2815503561f | 162 | |
mitea1 | 0:f2815503561f | 163 | |
mitea1 | 0:f2815503561f | 164 | int32_t LoRa::send(std::vector<uint8_t>& data){ |
mitea1 | 0:f2815503561f | 165 | int32_t ret = mDot::MDOT_NOT_JOINED; |
mitea1 | 0:f2815503561f | 166 | |
mitea1 | 0:f2815503561f | 167 | if(config->isActiv()){ |
mitea1 | 0:f2815503561f | 168 | ret=dot->send(data); |
mitea1 | 0:f2815503561f | 169 | if (ret != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 170 | debugSerial->printf("failed to send\n"); |
mitea1 | 0:f2815503561f | 171 | debugSerial->printf(mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 172 | debugSerial->printf("\n"); |
mitea1 | 0:f2815503561f | 173 | } else { |
mitea1 | 0:f2815503561f | 174 | debugSerial->printf("successfully sent data to gateway\n"); |
mitea1 | 0:f2815503561f | 175 | } |
mitea1 | 0:f2815503561f | 176 | } |
mitea1 | 0:f2815503561f | 177 | |
mitea1 | 0:f2815503561f | 178 | return ret; |
mitea1 | 0:f2815503561f | 179 | } |
mitea1 | 0:f2815503561f | 180 | |
mitea1 | 0:f2815503561f | 181 | int32_t LoRa::recv(std::vector<uint8_t>& data){ |
mitea1 | 0:f2815503561f | 182 | int32_t ret = mDot::MDOT_NOT_JOINED; |
mitea1 | 0:f2815503561f | 183 | if(config->isActiv()){ |
mitea1 | 0:f2815503561f | 184 | ret = dot->recv(data); |
mitea1 | 0:f2815503561f | 185 | } |
mitea1 | 0:f2815503561f | 186 | return ret; |
mitea1 | 0:f2815503561f | 187 | } |
mitea1 | 0:f2815503561f | 188 | |
mitea1 | 0:f2815503561f | 189 | int16_t LoRa::getLastRssi(){ |
mitea1 | 0:f2815503561f | 190 | return dot->getRssiStats().last; |
mitea1 | 0:f2815503561f | 191 | } |
mitea1 | 0:f2815503561f | 192 | |
mitea1 | 0:f2815503561f | 193 | int16_t LoRa::getLastSnr(){ |
mitea1 | 0:f2815503561f | 194 | return snr; |
mitea1 | 0:f2815503561f | 195 | } |
mitea1 | 0:f2815503561f | 196 | |
mitea1 | 0:f2815503561f | 197 | uint8_t LoRa::getSpreadingFactor(){ |
mitea1 | 0:f2815503561f | 198 | return spreadingFactor; |
mitea1 | 0:f2815503561f | 199 | } |
mitea1 | 0:f2815503561f | 200 | |
mitea1 | 0:f2815503561f | 201 | uint8_t LoRa::getTxPowerdBm(){ |
mitea1 | 0:f2815503561f | 202 | return txPowerdBm; |
mitea1 | 0:f2815503561f | 203 | } |
mitea1 | 0:f2815503561f | 204 | |
mitea1 | 0:f2815503561f | 205 | void LoRa::ping(){ |
mitea1 | 0:f2815503561f | 206 | mDot::ping_response response = dot->ping(); |
mitea1 | 0:f2815503561f | 207 | } |
mitea1 | 0:f2815503561f | 208 | |
mitea1 | 0:f2815503561f | 209 | |
mitea1 | 0:f2815503561f | 210 | void LoRa::joinNetwork(){ |
mitea1 | 0:f2815503561f | 211 | int32_t ret; |
mitea1 | 0:f2815503561f | 212 | // attempt to join the network |
mitea1 | 0:f2815503561f | 213 | debugSerial->printf("joining network\n"); |
mitea1 | 0:f2815503561f | 214 | while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) { |
mitea1 | 0:f2815503561f | 215 | debugSerial->printf("failed to join network %d:%s\n", ret, mDot::getReturnCodeString(ret).c_str()); |
mitea1 | 0:f2815503561f | 216 | // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again |
mitea1 | 0:f2815503561f | 217 | osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs())); |
mitea1 | 0:f2815503561f | 218 | } |
mitea1 | 0:f2815503561f | 219 | debugSerial->printf("Network joined\n"); |
mitea1 | 0:f2815503561f | 220 | } |
mitea1 | 0:f2815503561f | 221 |