lora sensnode

Dependencies:   libmDot mbed-rtos mbed

Fork of mDot_LoRa_Sensornode by Adrian Mitevski

Committer:
socie123
Date:
Wed Aug 10 12:54:10 2016 +0000
Revision:
1:e67174cc4953
Parent:
0:f2815503561f
lora sensnode

Who changed what in which revision?

UserRevisionLine numberNew 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