From bca5f50214f103a2c8605778a6311f8e9a5902fe Mon Sep 17 00:00:00 2001 From: Jason Reiss Date: Tue, 19 Jul 2016 10:14:13 -0500 Subject: mts-lora datarate changes --- .gitmodules | 4 +- CommandTerminal/CmdDisplayConfig.cpp | 2 +- CommandTerminal/CmdFactoryDefault.cpp | 2 +- CommandTerminal/CmdFrequencyBand.cpp | 10 +-- CommandTerminal/CmdTxDataRate.cpp | 131 ++++++++++++++++++++++------------ FileName.h | 2 +- Mode/Mode.cpp | 4 +- Mode/ModeDemo.cpp | 6 +- Mode/ModeJoin.cpp | 5 +- Mode/ModeSingle.cpp | 33 ++------- Mode/ModeSweep.cpp | 32 ++++----- main.cpp | 28 +++++--- mdot-library | 2 +- parser_function.txt | 2 +- 14 files changed, 145 insertions(+), 118 deletions(-) diff --git a/.gitmodules b/.gitmodules index d9b13e1..69cfdcd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "mdot-library"] path = mdot-library - url = ssh://sw.multitech.prv/git/mbed/mdot-library.git + url = git@gitlab.multitech.net:lora-mote/mdot-library.git [submodule "libs/MTS-Serial"] path = libs/MTS-Serial - url = ssh://sw.multitech.prv/git/mbed/MTS-Serial.git + url = git@gitlab.multitech.net:mbed/MTS-Serial.git diff --git a/CommandTerminal/CmdDisplayConfig.cpp b/CommandTerminal/CmdDisplayConfig.cpp index 31fc100..58ba86d 100644 --- a/CommandTerminal/CmdDisplayConfig.cpp +++ b/CommandTerminal/CmdDisplayConfig.cpp @@ -38,7 +38,7 @@ uint32_t CmdDisplayConfig::action(std::vector args) { _serial.writef("%s\r\n", mts::Text::bin2hexString(_dot->getDeviceId(), ":").c_str()); _serial.writef("Frequency Band:\t\t%s\r\n", mDot::FrequencyBandStr(_dot->getFrequencyBand()).c_str()); - if (_dot->getFrequencyBand() == mDot::FB_915) + if (_dot->getFrequencyBand() == mDot::FB_US915) _serial.writef("Frequency Sub Band:\t%u\r\n", _dot->getFrequencySubBand()); _serial.writef("Public Network:\t\t%s\r\n", _dot->getPublicNetwork() ? "on" : "off"); diff --git a/CommandTerminal/CmdFactoryDefault.cpp b/CommandTerminal/CmdFactoryDefault.cpp index 955535e..a8554cb 100644 --- a/CommandTerminal/CmdFactoryDefault.cpp +++ b/CommandTerminal/CmdFactoryDefault.cpp @@ -29,7 +29,7 @@ uint32_t CmdFactoryDefault::action(std::vector args) _dot->resetConfig(); //Factory defaults for the DotBox. - _dot->setTxDataRate(mDot::SF_7); + _dot->setTxDataRate(mDot::DR0); _dot->setFrequencySubBand(1); _dot->setWakeDelay(242); //DotBox +MaxSize is stored here. Default is 242. _dot->setWakeInterval(11); //DotBox +MinSize is stored here. Default is 11. diff --git a/CommandTerminal/CmdFrequencyBand.cpp b/CommandTerminal/CmdFrequencyBand.cpp index 4057f7a..26b7831 100644 --- a/CommandTerminal/CmdFrequencyBand.cpp +++ b/CommandTerminal/CmdFrequencyBand.cpp @@ -40,10 +40,10 @@ uint32_t CmdFrequencyBand::action(std::vector args) else if (args.size() == 2) { int32_t code; - uint8_t band = mDot::FB_915; + uint8_t band = mDot::FB_US915; - if (mDot::FrequencyBandStr(mDot::FB_868).find(args[1]) != std::string::npos) { - band = mDot::FB_868; + if (mDot::FrequencyBandStr(mDot::FB_EU868).find(args[1]) != std::string::npos) { + band = mDot::FB_EU868; } if ((code = _dot->setFrequencyBand(band)) != mDot::MDOT_OK) { @@ -65,8 +65,8 @@ bool CmdFrequencyBand::verify(std::vector args) #ifdef DEBUG_MAC if (args.size() == 2) { - if (mDot::FrequencyBandStr(mDot::FB_868).find(args[1]) == std::string::npos && - mDot::FrequencyBandStr(mDot::FB_915).find(args[1]) == std::string::npos) + if (mDot::FrequencyBandStr(mDot::FB_EU868).find(args[1]) == std::string::npos && + mDot::FrequencyBandStr(mDot::FB_US915).find(args[1]) == std::string::npos) { setErrorMessage("Invalid parameter, expects (868,915)"); return false; diff --git a/CommandTerminal/CmdTxDataRate.cpp b/CommandTerminal/CmdTxDataRate.cpp index 846562b..004ee8e 100644 --- a/CommandTerminal/CmdTxDataRate.cpp +++ b/CommandTerminal/CmdTxDataRate.cpp @@ -15,49 +15,59 @@ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #include "CmdTxDataRate.h" +#include "MTSText.h" +#include "MTSLog.h" -CmdTxDataRate::CmdTxDataRate(mDot* dot, mts::MTSSerial& serial) : - Command(dot, "Tx Data Rate", "AT+TXDR", "Set the Tx data rate for LoRa demo mode"), _serial(serial) +CmdTxDataRate::CmdTxDataRate(mDot* dot, mts::MTSSerial& serial) +: + Command(dot, "Tx Data Rate", "AT+TXDR", "Set the Tx data rate for all channels"), + _serial(serial) { _help = std::string(text()) + ": " + std::string(desc()); if (_dot->getFrequencyBand() == mDot::FB_915) - _usage = "(7-10)"; + _usage = "(7-10|DR0-DR4|DR8-DR13)"; else - _usage = "(7-12)"; + _usage = "(7-12|DR0-DR7)"; _queryable = true; } -uint32_t CmdTxDataRate::action(std::vector args) -{ +uint32_t CmdTxDataRate::action(std::vector args) { if (args.size() == 1) - { + { if (_dot->getVerbose()) _serial.writef("Tx Data Rate: "); - _serial.writef("%s\r\n", mDot::DataRateStr(_dot->getTxDataRate()).c_str()); - } - else if (args.size() == 2) - { + _serial.writef("DR%d - %s\r\n", _dot->getTxDataRate(), _dot->getDateRateDetails(_dot->getTxDataRate()).c_str()); + } else if (args.size() == 2) { + std::string dr = mts::Text::toUpper(args[1]); int32_t code; - uint8_t datarate = 0; + int datarate = -1; uint8_t i; - for (i = 0; i < 8; i++) - { - if (mDot::DataRateStr(i).find(args[1].c_str()) != std::string::npos) - { - datarate = i; - break; + int res = sscanf(dr.c_str(), "%d", &datarate); + + if (res == 0) { + for (i = 0; i < 24; i++) { + if (mDot::DataRateStr(i).find(dr) != std::string::npos) { + datarate = i; + break; + } + } + } else { + if (datarate > 6) { + // Convert SF to DR + if (_dot->getFrequencyBand() == mDot::FB_915) { + datarate = 10 - datarate; + } else { + datarate = 12 - datarate; + } } } - if ((code = _dot->setTxDataRate(datarate)) != mDot::MDOT_OK) - { - std::string error = mDot::getReturnCodeString(code) + " - " + _dot->getLastError(); - setErrorMessage(error); + if ((code = _dot->setTxDataRate(datarate)) != mDot::MDOT_OK) { + setErrorMessage(_dot->getLastError()); return 1; } } @@ -65,36 +75,69 @@ uint32_t CmdTxDataRate::action(std::vector args) return 0; } -bool CmdTxDataRate::verify(std::vector args) -{ +bool CmdTxDataRate::verify(std::vector args) { if (args.size() == 1) return true; - if (args.size() == 2) - { + if (args.size() == 2) { + std::string dr = mts::Text::toUpper(args[1]); + uint8_t i; int datarate = -1; - for (i = 0; i < 8; i++) - { - if (mDot::DataRateStr(i).find(args[1].c_str()) != std::string::npos) - { - datarate = i; - break; + + int res = sscanf(dr.c_str(), "%d", &datarate); + + if (res == 0) { + for (i = 0; i < 24; i++) { + + if (mDot::DataRateStr(i).find(dr) != std::string::npos) { + uint8_t _dr = i; + + if (_dr > 15) { + _dr = 12 + (mDot::SF_12 - _dr); + + if (_dot->getFrequencyBand() == mDot::FB_868) { + if (_dr == mDot::SF_7H) { + _dr = mDot::DR6; + } else if (_dr == mDot::SF_FSK) { + _dr = mDot::DR7; + } else { + _dr = 12 - _dr; + } + } else { + + _dr = 10 - _dr; + } + } + + datarate = _dr; + break; + } + } + } else { + if (_dot->getFrequencyBand() == mDot::FB_915 && datarate > 10) { + datarate = -1; + } else if (_dot->getFrequencyBand() == mDot::FB_868 && datarate > 12) { + datarate = -1; + } else if (datarate > 6) { + // Convert SF to DR + if (_dot->getFrequencyBand() == mDot::FB_915) { + datarate = 10 - datarate; + } else { + datarate = 12 - datarate; + } } } - if (datarate < 0) - { - if (_dot->getFrequencyBand() == mDot::FB_915) - setErrorMessage("Invalid data rate, expects (7-10)"); - else - setErrorMessage("Invalid data rate, expects (7-12)"); - return false; - } - if (_dot->getFrequencyBand() == mDot::FB_915) { - if (datarate < 2) { - setErrorMessage("Invalid data rate, expects (7-10)"); + // DR8-13 used for P2P modes + if (datarate < 0 || datarate > 13 || (datarate >= 5 && datarate <= 7)) { + setErrorMessage("Invalid data rate, expects (7-10|DR0-DR4|DR8-DR13)"); + return false; + } + } else { + if (datarate < 0 || datarate > 7) { + setErrorMessage("Invalid data rate, expects (7-12|DR0-DR7)"); return false; } } diff --git a/FileName.h b/FileName.h index 23468e2..2b671a4 100644 --- a/FileName.h +++ b/FileName.h @@ -19,6 +19,6 @@ #ifndef __FILENAME_H__ #define __FILENAME_H__ -extern char* file_name; +extern char file_name[]; #endif diff --git a/Mode/Mode.cpp b/Mode/Mode.cpp index 389bf7f..bed78ec 100644 --- a/Mode/Mode.cpp +++ b/Mode/Mode.cpp @@ -49,7 +49,7 @@ Mode::Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, G _index(0), _band(_dot->getFrequencyBand()), _sub_band(_dot->getFrequencySubBand()), - _data_rate(mDot::SF_7), + _data_rate(mDot::DR0), _power(2), _next_tx(0), _send_data(false), @@ -129,7 +129,7 @@ bool Mode::appendDataFile(const DataItem& data) { (data.gps_lock) ? alt_buf : "", (data.gps_lock) ? time_buf : "", data.status ? stats_buf : ",,,", - _dot->DataRateStr(data.data_rate).substr(3).c_str(), + _dot->DataRateStr(data.data_rate).substr(2).c_str(), data.power); if (size < 0) { diff --git a/Mode/ModeDemo.cpp b/Mode/ModeDemo.cpp index 44732c1..4add135 100644 --- a/Mode/ModeDemo.cpp +++ b/Mode/ModeDemo.cpp @@ -41,9 +41,9 @@ bool ModeDemo::start() { _initial_data_rate = _dot->getTxDataRate(); // use configured data rate and power if possible - if (_band == mDot::FB_915 && _initial_data_rate == mDot::SF_10) { - logInfo("using SF_9 instead of SF_10 - SF_10 max packet size is too small for data"); - _dot->setTxDataRate(mDot::SF_9); + if (_band == mDot::FB_915 && _initial_data_rate == mDot::DR0) { + logInfo("using DR1 instead of DR0 - DR0 max packet size is too small for data"); + _dot->setTxDataRate(mDot::DR1); } _state = show_help; diff --git a/Mode/ModeJoin.cpp b/Mode/ModeJoin.cpp index 5618eca..4bdc6cd 100644 --- a/Mode/ModeJoin.cpp +++ b/Mode/ModeJoin.cpp @@ -42,7 +42,7 @@ bool ModeJoin::start() { _initial_data_rate = _dot->getTxDataRate(); _initial_power = _dot->getTxPower(); - _data_rate = (_band == mDot::FB_915) ? mDot::SF_10 : mDot::SF_12; + _data_rate = mDot::DR0; _power = 20; _joined = false; @@ -123,8 +123,7 @@ void ModeJoin::display() { _sub_band = _dot->getFrequencySubBand(); _join.updateFsb(_sub_band); } - // mDot::DataRateStr returns format SF_XX - we only want to display the XX part - _join.updateRate(_dot->DataRateStr(_data_rate).substr(3)); + _join.updateRate(_dot->DataRateStr(_data_rate).substr(2)); _join.updatePower(_power); _join.updateAttempt(_lora->getJoinAttempts()); } diff --git a/Mode/ModeSingle.cpp b/Mode/ModeSingle.cpp index 347f636..982d8b9 100644 --- a/Mode/ModeSingle.cpp +++ b/Mode/ModeSingle.cpp @@ -176,8 +176,8 @@ bool ModeSingle::start() { _state = failure; _failure.display(); _failure.updateId(_index); - // mDot::DataRateStr returns format SF_XX - we only want to display the XX part - _failure.updateRate(_dot->DataRateStr(_data_rate).substr(3)); + // mDot::DataRateStr returns format DRXX - we only want to display the XX part + _failure.updateRate(_dot->DataRateStr(_data_rate).substr(2)); updateData(_data, single, false); appendDataFile(_data); _failure.updatePower(_power); @@ -291,7 +291,7 @@ void ModeSingle::displaySuccess() { _success.display(); _success.updateId(_index); // mDot::DataRateStr returns format SF_XX - we only want to display the XX part - _success.updateRate(_dot->DataRateStr(_data_rate).substr(3)); + _success.updateRate(_dot->DataRateStr(_data_rate).substr(2)); _success.updatePower(_power); _success.updateStats(_link_check_result); if (_gps_available && _gps->getLockStatus()) { @@ -312,7 +312,7 @@ std::string ModeSingle::formatRatePower() { size_t size; msg += "DR="; - msg += _dot->DataRateStr(_data_rate).substr(3); + msg += _dot->DataRateStr(_data_rate).substr(2); msg += " P="; size = snprintf(buf, sizeof(buf), "%u", _power); msg.append(buf, size); @@ -323,28 +323,9 @@ std::string ModeSingle::formatRatePower() { void ModeSingle::incrementRatePower() { if (_power == 20) { _power = 2; - switch (_data_rate) { - case mDot::SF_7: - _data_rate = mDot::SF_8; - break; - case mDot::SF_8: - _data_rate = mDot::SF_9; - break; - case mDot::SF_9: - _data_rate = mDot::SF_10; - break; - case mDot::SF_10: - if (_band == mDot::FB_915) - _data_rate = mDot::SF_7; - else - _data_rate = mDot::SF_11; - break; - case mDot::SF_11: - _data_rate = mDot::SF_12; - break; - case mDot::SF_12: - _data_rate = mDot::SF_7; - break; + _data_rate++; + if (_band == mDot::FB_915 && _data_rate > mDot::DR4 || _band == mDot::FB_868 && _data_rate > mDot::DR7) { + _data_rate = mDot::DR0; } } else { _power += 3; diff --git a/Mode/ModeSweep.cpp b/Mode/ModeSweep.cpp index 6ff4e34..b6bef24 100644 --- a/Mode/ModeSweep.cpp +++ b/Mode/ModeSweep.cpp @@ -207,8 +207,7 @@ bool ModeSweep::start() { _state = failure; _failure.display(); _failure.updateId(_index); - // mDot::DataRateStr returns format SF_XX - we only want to display the XX part - _failure.updateRate(_dot->DataRateStr(_data_rate).substr(3)); + _failure.updateRate(_dot->DataRateStr(_data_rate).substr(2)); _failure.updatePower(_power); if (_gps_available && _gps->getLockStatus()) { GPSPARSER::latitude lat = _gps->getLatitude(); @@ -343,8 +342,7 @@ void ModeSweep::displayHelp() { void ModeSweep::displaySuccess() { _success.display(); _success.updateId(_index); - // mDot::DataRateStr returns format SF_XX - we only want to display the XX part - _success.updateRate(_dot->DataRateStr(_data_rate).substr(3)); + _success.updateRate(_dot->DataRateStr(_data_rate).substr(2)); _success.updatePower(_power); _success.updateStats(_link_check_result); if (_gps_available && _gps->getLockStatus()) { @@ -383,23 +381,21 @@ std::vector ModeSweep::generatePoints() { uint8_t ModeSweep::payloadToRate(uint8_t payload) { if (_band == mDot::FB_915) { - if (payload <= mDot::MaxLengths_915[mDot::SF_10]) - return mDot::SF_10; - else if (payload <= mDot::MaxLengths_915[mDot::SF_9]) - return mDot::SF_9; - else if (payload <= mDot::MaxLengths_915[mDot::SF_8]) - return mDot::SF_8; + if (payload <= mDot::MaxLengths_915[mDot::DR0]) + return mDot::DR0; + else if (payload <= mDot::MaxLengths_915[mDot::DR1]) + return mDot::DR1; + else if (payload <= mDot::MaxLengths_915[mDot::DR2]) + return mDot::DR2; else - return mDot::SF_7; + return mDot::DR4; } else { - if (payload <= mDot::MaxLengths_868[mDot::SF_12]) - return mDot::SF_12; - else if (payload <= mDot::MaxLengths_868[mDot::SF_9]) - return mDot::SF_9; + if (payload <= mDot::MaxLengths_868[mDot::DR0]) + return mDot::DR0; + else if (payload <= mDot::MaxLengths_868[mDot::DR3]) + return mDot::DR3; else - return mDot::SF_7; + return mDot::DR6; } - - return mDot::SF_7; } diff --git a/main.cpp b/main.cpp index 9166354..464b00a 100644 --- a/main.cpp +++ b/main.cpp @@ -45,6 +45,9 @@ #include "FileName.h" #include +#define DISABLE_DUTY_CYCLE true + + // LCD and LED controllers SPI lcd_spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK); I2C led_i2c(I2C_SDA, I2C_SCL); @@ -60,7 +63,7 @@ osThreadId main_id; ButtonHandler* buttons; // LoRa controller -LoRaHandler* lora; +LoRaHandler* loraHandler; mDot* dot; // GPS @@ -81,14 +84,13 @@ ModeConfig* modeConfig; Serial debug(USBTX, USBRX); // Survey Data File -char* file_name; +char file_name[] = "SurveyData.txt"; // Prototypes void mainMenu(); int main() { debug.baud(115200); - file_name = "SurveyData.txt"; lcd = new DOGS102(lcd_spi, lcd_spi_cs, lcd_cd); // NCP5623B::LEDs 1 & 2 are the screen backlight - not used on default build @@ -98,7 +100,13 @@ int main() { main_id = Thread::gettid(); buttons = new ButtonHandler(main_id); dot = mDot::getInstance(); - lora = new LoRaHandler(main_id); + + dot->setDisableDutyCycle(DISABLE_DUTY_CYCLE); + + // Seed the RNG + srand(dot->getRadioRandom()); + + loraHandler = new LoRaHandler(main_id); gps = new GPSPARSER(&gps_serial, led_cont); sensors = new SensorHandler(); @@ -106,11 +114,11 @@ int main() { MTSLog::setLogLevel(MTSLog::TRACE_LEVEL); - modeJoin = new ModeJoin(lcd, buttons, dot, lora, gps, sensors); - modeSingle = new ModeSingle(lcd, buttons, dot, lora, gps, sensors); - modeSweep = new ModeSweep(lcd, buttons, dot, lora, gps, sensors); - modeDemo = new ModeDemo(lcd, buttons, dot, lora, gps, sensors); - modeConfig = new ModeConfig(lcd, buttons, dot, lora, gps, sensors); + modeJoin = new ModeJoin(lcd, buttons, dot, loraHandler, gps, sensors); + modeSingle = new ModeSingle(lcd, buttons, dot, loraHandler, gps, sensors); + modeSweep = new ModeSweep(lcd, buttons, dot, loraHandler, gps, sensors); + modeDemo = new ModeDemo(lcd, buttons, dot, loraHandler, gps, sensors); + modeConfig = new ModeConfig(lcd, buttons, dot, loraHandler, gps, sensors); osDelay(1000); logInfo("%sGPS detected", gps->gpsDetected() ? "" : "no "); @@ -159,7 +167,7 @@ void mainMenu() { // reset session between modes dot->resetNetworkSession(); - lora->resetActivityLed(); + loraHandler->resetActivityLed(); LayoutScrollSelect menu(lcd, items, product, menu_strings[0]); menu.display(); diff --git a/mdot-library b/mdot-library index f924703..dad8ecc 160000 --- a/mdot-library +++ b/mdot-library @@ -1 +1 @@ -Subproject commit f9247034c1eb0efc07ccf1d77312421fec75ace8 +Subproject commit dad8ecc852ff6cbc3af9836e2931676e6194d25c diff --git a/parser_function.txt b/parser_function.txt index 06a7a60..4bc16f9 100644 --- a/parser_function.txt +++ b/parser_function.txt @@ -182,7 +182,7 @@ while (msg_pntr < msg.payload.length){ } } -pData.sf_val = parseInt(msg.datr.replace("SF"," "),10); +pData.sf_val = parseInt(msg.datr.replace("DR"," "),10); context.global.data_out = pData; -- cgit v1.2.3 From 768951bf1beb7a368b1a94b71a95c832d1f2fcc6 Mon Sep 17 00:00:00 2001 From: Jason Reiss Date: Mon, 8 Aug 2016 08:56:50 -0500 Subject: update mdot-library --- mdot-library | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mdot-library b/mdot-library index dad8ecc..6381399 160000 --- a/mdot-library +++ b/mdot-library @@ -1 +1 @@ -Subproject commit dad8ecc852ff6cbc3af9836e2931676e6194d25c +Subproject commit 638139926b7918f5cf34e7bf9ef7b169a4e929cd -- cgit v1.2.3