diff options
Diffstat (limited to 'Mode')
-rw-r--r-- | Mode/Mode.cpp | 56 | ||||
-rw-r--r-- | Mode/Mode.h | 9 | ||||
-rw-r--r-- | Mode/ModeConfig.cpp | 4 | ||||
-rw-r--r-- | Mode/ModeConfig.h | 2 | ||||
-rw-r--r-- | Mode/ModeDemo.cpp | 151 | ||||
-rw-r--r-- | Mode/ModeDemo.h | 39 | ||||
-rw-r--r-- | Mode/ModeJoin.cpp | 12 | ||||
-rw-r--r-- | Mode/ModeJoin.h | 2 | ||||
-rw-r--r-- | Mode/ModeSingle.cpp | 147 | ||||
-rw-r--r-- | Mode/ModeSingle.h | 4 | ||||
-rw-r--r-- | Mode/ModeSweep.cpp | 136 | ||||
-rw-r--r-- | Mode/ModeSweep.h | 2 |
12 files changed, 341 insertions, 223 deletions
diff --git a/Mode/Mode.cpp b/Mode/Mode.cpp index 8268a4a..a97b226 100644 --- a/Mode/Mode.cpp +++ b/Mode/Mode.cpp @@ -1,8 +1,6 @@ #include "Mode.h" #include "MTSLog.h" -const char* Mode::_file_name = "SurveyData.txt"; - /* * union for converting from 32-bit to 4 8-bit values */ @@ -22,11 +20,12 @@ union convert16 { } convertS; -Mode::Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora) +Mode::Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps) : _lcd(lcd), _buttons(buttons), _dot(dot), _lora(lora), + _gps(gps), _main_id(Thread::gettid()), _index(0), _band(_dot->getFrequencyBand()), @@ -35,6 +34,7 @@ Mode::Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora) _power(2), _next_tx(0), _send_data(false), + _gps_available(_gps->gpsDetected()), _gpsUART(PA_2, PA_3), _mdot_gps(&_gpsUART), _mdot_sensors() @@ -48,8 +48,8 @@ bool Mode::deleteDataFile() { // if survey data file exists, attempt to delete it std::vector<mDot::mdot_file> files = _dot->listUserFiles(); for (std::vector<mDot::mdot_file>::iterator it = files.begin(); it != files.end(); it++) - if (it->name == _file_name) { - if (! _dot->deleteUserFile(_file_name)) + if (it->name == file_name) { + if (! _dot->deleteUserFile(file_name)) ret = false; break; } @@ -79,18 +79,18 @@ bool Mode::appendDataFile(const DataItem& data) { snprintf(id_buf, sizeof(id_buf), "%c%ld", (data.type == single) ? 'P' : 'S', data.index); // if we had GPS lock, format GPS data - if (data.lock > 0) { - snprintf(lat_buf, sizeof(lat_buf), "%3d %2d %2d.%03d %c", + if (data.gps_lock) { + snprintf(lat_buf, sizeof(lat_buf), "%d %d %d.%03d %c", abs(data.gps_latitude.degrees), data.gps_latitude.minutes, (data.gps_latitude.seconds * 6) / 1000, - (data.gps_latitude.seconds % 6) / 1000, + (data.gps_latitude.seconds * 6) % 1000, (data.gps_latitude.degrees > 0) ? 'N' : 'S'); - snprintf(lon_buf, sizeof(lon_buf), "%3d %2d %2d.%03d %c", + snprintf(lon_buf, sizeof(lon_buf), "%d %d %d.%03d %c", abs(data.gps_longitude.degrees), data.gps_longitude.minutes, (data.gps_longitude.seconds * 6) / 1000, - (data.gps_longitude.seconds % 6) / 1000, + (data.gps_longitude.seconds * 6) % 1000, (data.gps_longitude.degrees > 0) ? 'E' : 'W'); snprintf(alt_buf, sizeof(alt_buf), "%d", data.gps_altitude); @@ -106,7 +106,7 @@ bool Mode::appendDataFile(const DataItem& data) { if (data.status) { float up_snr = (float)data.ping.up.snr / 10.0; float down_snr = (float)data.ping.down.snr / 4.0; - snprintf(stats_buf, sizeof(stats_buf), "%3d,%2.1f,%3d,%2.1f", + snprintf(stats_buf, sizeof(stats_buf), "%d,%2.1f,%d,%2.1f", abs(data.ping.up.rssi), up_snr, abs(data.ping.down.rssi), @@ -116,11 +116,11 @@ bool Mode::appendDataFile(const DataItem& data) { size = snprintf(main_buf, sizeof(main_buf), "%s,%c,%ld,%s,%s,%s,%s,%s,%s,%lu\n", id_buf, data.status ? 'S' : 'F', - data.lock, - (data.lock > 0) ? lat_buf : "", - (data.lock > 0) ? lon_buf : "", - (data.lock > 0) ? alt_buf : "", - (data.lock > 0) ? time_buf : "", + data.gps_lock ? data.gps_sats : 0, + (data.gps_lock) ? lat_buf : "", + (data.gps_lock) ? lon_buf : "", + (data.gps_lock) ? alt_buf : "", + (data.gps_lock) ? time_buf : "", data.status ? stats_buf : ",,,", _dot->DataRateStr(data.data_rate).substr(3).c_str(), data.power); @@ -130,7 +130,7 @@ bool Mode::appendDataFile(const DataItem& data) { return false; } - if (! _dot->appendUserFile(_file_name, (void*)main_buf, size)) { + if (! _dot->appendUserFile(file_name, (void*)main_buf, size)) { logError("failed to write survey data to file"); return false; } else { @@ -144,10 +144,12 @@ void Mode::updateData(DataItem& data, DataType type, bool status) { data.type = type; data.index = _index; data.status = status; - data.lock = 0; - data.gps_longitude = _mdot_gps.getLongitude(); - data.gps_latitude = _mdot_gps.getLatitude(); - data.gps_altitude = _mdot_gps.getAltitude(); + data.gps_lock = _gps->getLockStatus(); + data.gps_sats = _gps->getNumSatellites(); + data.gps_longitude = _gps->getLongitude(); + data.gps_latitude = _gps->getLatitude(); + data.gps_altitude = _gps->getAltitude(); + data.gps_time = _gps->getTimestamp(); data.ping = _ping_result; data.data_rate = _data_rate; data.power = _power; @@ -183,7 +185,7 @@ uint32_t Mode::getIndex(DataType type) { else search = 'S'; - file = _dot->openUserFile(_file_name, mDot::FM_RDONLY); + file = _dot->openUserFile(file_name, mDot::FM_RDONLY); if (file.fd < 0) { logError("failed to open survey data file"); } else { @@ -213,10 +215,12 @@ uint32_t Mode::getIndex(DataType type) { return 0; } logInfo("read %d bytes [%s]", ret, buf); + bytes_read = file.size - read_offset - 1; + logInfo("read %d total bytes", bytes_read); // read_size - 1 is the last byte in the buffer for (current = read_size - 1; current >= 0; current--) { - if ((buf[current] == '\n' && current != read_size - 1) || current == 0) { + if ((buf[current] == '\n' && current != read_size - 1) || (current == 0 && bytes_read >= file.size)) { int test = current; logInfo("found potential %d, %c", read_offset + current, buf[test + 1]); if (buf[test + 1] == search) { @@ -258,12 +262,12 @@ std::vector<uint8_t> Mode::formatSurveyData(DataItem& data) { send_data.push_back(data.ping.down.snr); // collect GPS data if GPS device detected - if (_mdot_gps.gpsDetected() && ((_data_rate != mDot::SF_10) || (_band == mDot::FB_868))){ + if (_gps->gpsDetected() && ((_data_rate != mDot::SF_10) || (_band == mDot::FB_868))){ send_data.push_back(0x19); // key for GPS Lock Status - satfix = (_mdot_gps.getNumSatellites() << 4 ) | (_mdot_gps.getFixStatus() & 0x0F ); + satfix = (_gps->getNumSatellites() << 4 ) | (_gps->getFixStatus() & 0x0F ); send_data.push_back(satfix); - if (_mdot_gps.getLockStatus()){ // if gps has a lock + if (_gps->getLockStatus()){ // if gps has a lock // Send GPS data if GPS device locked send_data.push_back(0x15); // key for GPS Latitude send_data.push_back(data.gps_latitude.degrees); diff --git a/Mode/Mode.h b/Mode/Mode.h index ff9ba6c..ca8433a 100644 --- a/Mode/Mode.h +++ b/Mode/Mode.h @@ -9,6 +9,7 @@ #include "ISL29011.h" #include "MMA845x.h" #include "MPL3115A2.h" +#include "FileName.h" #include "SensorHandler.h" class Mode { @@ -22,7 +23,8 @@ class Mode { DataType type; int32_t index; bool status; - int32_t lock; + bool gps_lock; + int32_t gps_sats; GPSPARSER::longitude gps_longitude; GPSPARSER::latitude gps_latitude; int16_t gps_altitude; @@ -42,7 +44,7 @@ class Mode { float altitude; } SensorItem; - Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora); + Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps); ~Mode(); virtual bool start() = 0; @@ -61,8 +63,8 @@ class Mode { ButtonHandler* _buttons; mDot* _dot; LoRaHandler* _lora; + GPSPARSER* _gps; osThreadId _main_id; - static const char* _file_name; uint32_t _index; uint8_t _band; uint8_t _sub_band; @@ -74,6 +76,7 @@ class Mode { LoRaHandler::LoRaPing _ping_result; uint8_t _state; bool _send_data; + bool _gps_available; mts::MTSSerial _gpsUART; GPSPARSER _mdot_gps; SensorHandler _mdot_sensors; diff --git a/Mode/ModeConfig.cpp b/Mode/ModeConfig.cpp index 35a81bd..babd898 100644 --- a/Mode/ModeConfig.cpp +++ b/Mode/ModeConfig.cpp @@ -19,8 +19,8 @@ void ModeConfig::addCommand(Command* cmd) { _commands.push_back(cmd); } -ModeConfig::ModeConfig(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora) -: Mode(lcd, buttons, dot, lora), +ModeConfig::ModeConfig(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps) +: Mode(lcd, buttons, dot, lora, gps), _lc(lcd), _serial(USBTX, USBRX, 512, 512) { diff --git a/Mode/ModeConfig.h b/Mode/ModeConfig.h index 1192a8c..6c0ac73 100644 --- a/Mode/ModeConfig.h +++ b/Mode/ModeConfig.h @@ -13,7 +13,7 @@ class ModeConfig : public Mode { public: - ModeConfig(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora); + ModeConfig(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps); // Command error text... static const char command_error[]; diff --git a/Mode/ModeDemo.cpp b/Mode/ModeDemo.cpp new file mode 100644 index 0000000..e70ccbd --- /dev/null +++ b/Mode/ModeDemo.cpp @@ -0,0 +1,151 @@ +#include "ModeDemo.h" +#include "MTSLog.h" + +// 10 s, 30 s, 1 min, 5 min, 10 min, 15 min, 30 min 1 hour +const uint32_t ModeDemo::_intervals[] = { 10, 30, 60, 5 * 60, 10 * 60, 15 * 60, 30 * 60, 60 * 60 }; + +ModeDemo::ModeDemo(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps) + : Mode(lcd, buttons, dot, lora, gps), + _help(lcd), + _sam(lcd), + _interval(0) +{} + +ModeDemo::~ModeDemo() {} + +bool ModeDemo::start() { + bool send = false; + bool no_channel = false; + + // clear any stale signals + osSignalClear(_main_id, buttonSignal | loraSignal); + + _state = show_help; + displayHelp(); + + while (true) { + osEvent e = Thread::signal_wait(0, 250); + if (e.status == osEventSignal) { + if (e.value.signals & buttonSignal) { + _be = _buttons->getButtonEvent(); + + switch (_be) { + case ButtonHandler::sw1_press: + switch (_state) { + case show_help: + _state = sampling; + _mode = trigger; + _sam.display(); + _sam.updateSw2("Send"); + break; + case sampling: + if (_mode == interval) { + _interval = (_interval + 1) % (sizeof(_intervals) / sizeof(uint32_t)); + _sam.updateInterval(_intervals[_interval]); + } + break; + } + break; + + case ButtonHandler::sw2_press: + switch (_state) { + case show_help: + _state = sampling; + _mode = interval; + _send_timer.start(); + _sam.display(); + _sam.updateSw1("Interval"); + _sam.updateInterval(_intervals[_interval]); + break; + case sampling: + if (_mode == trigger) { + if (_dot->getNextTxMs() > 0) + no_channel = true; + else + send = true; + } + break; + } + break; + case ButtonHandler::sw1_hold: + _send_timer.stop(); + _send_timer.reset(); + return true; + } + } + if (e.value.signals & loraSignal) { + _ls = _lora->getStatus(); + switch (_ls) { + case LoRaHandler::send_success: + switch (_state) { + case sampling: + if (_mode == trigger) { + _sam.updateSw2("Send"); + _sam.updateInfo(" "); + } else { + _sam.updateSw1("Interval"); + _sam.updateInterval(_intervals[_interval]); + } + break; + } + break; + + case LoRaHandler::send_failure: + switch (_state) { + case sampling: + if (_mode == trigger) { + _sam.updateSw2("Send"); + _sam.updateInfo(" "); + } else { + _sam.updateSw1("Interval"); + _sam.updateInterval(_intervals[_interval]); + } + break; + } + break; + } + } + } + + if (_send_timer.read_ms() > _intervals[_interval] * 1000) { + _send_timer.reset(); + if (_dot->getNextTxMs() > 0) + no_channel = true; + else + send = true; + } + if (no_channel) { + uint32_t t = _dot->getNextTxMs(); + if (t > 0) { + logInfo("next tx %lu ms", t); + _sam.updateCountdown(t / 1000); + } else { + no_channel = false; + send = true; + } + } + if (send) { + std::vector<uint8_t> s_data = formatSensorData(_data); + logInfo("sending data %s %d", _dot->DataRateStr(_dot->getTxDataRate()).c_str(), _dot->getTxPower()); + _sam.updateInfo("Sending..."); + _sam.updateSw1(" "); + _sam.updateSw2(" "); + send = false; + // we don't care if the server actually gets this packet or not + // we won't retry anyway + _dot->setAck(0); + _dot->setTxWait(false); + _lora->send(s_data); + osDelay(500); + } + } +} + +void ModeDemo::displayHelp() { + _help.display(); + _help.updateMode("LoRa Demo"); + _help.updateDescription("Select TX Method"); + _help.updateSw1(" Trigger"); + _help.updateSw2("Interval"); +} + diff --git a/Mode/ModeDemo.h b/Mode/ModeDemo.h new file mode 100644 index 0000000..b2aaf21 --- /dev/null +++ b/Mode/ModeDemo.h @@ -0,0 +1,39 @@ +#ifndef __MODEDEMO_H__ +#define __MODEDEMO_H__ + +#include "Mode.h" +#include "LayoutHelp.h" +#include "LayoutDemoSampling.h" + +class ModeDemo : public Mode { + public: + ModeDemo(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps); + ~ModeDemo(); + + bool start(); + + private: + void displayHelp(); + + typedef enum { + show_help = 0, + sampling, + success, + failure + } state; + + typedef enum { + trigger = 0, + interval + } mode; + + LayoutHelp _help; + LayoutDemoSampling _sam; + SensorItem _data; + mode _mode; + Timer _send_timer; + uint8_t _interval; + static const uint32_t _intervals[]; +}; + +#endif diff --git a/Mode/ModeJoin.cpp b/Mode/ModeJoin.cpp index d1e69ea..5b0a7ed 100644 --- a/Mode/ModeJoin.cpp +++ b/Mode/ModeJoin.cpp @@ -2,8 +2,8 @@ #include "MTSLog.h" #include "MTSText.h" -ModeJoin::ModeJoin(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora) - : Mode(lcd, buttons, dot, lora), +ModeJoin::ModeJoin(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps) + : Mode(lcd, buttons, dot, lora, gps), _join(lcd, _band), _joined(false) {} @@ -22,13 +22,13 @@ bool ModeJoin::start() { display(); - _lora->setDataRate(_data_rate); - _lora->setPower(_power); + _dot->setTxDataRate(_data_rate); + _dot->setTxPower(_power); _lora->resetJoinAttempts(); while (! _joined) { - _next_tx = _lora->getNextTx(); - if (_next_tx) { + _next_tx = _dot->getNextTxMs(); + if (! joining && _next_tx > 0) { logInfo("next tx %lu ms", _next_tx); _join.updateStatus("Waiting..."); _join.updateCountdown(_next_tx / 1000); diff --git a/Mode/ModeJoin.h b/Mode/ModeJoin.h index af48d94..cad3f61 100644 --- a/Mode/ModeJoin.h +++ b/Mode/ModeJoin.h @@ -6,7 +6,7 @@ class ModeJoin : public Mode { public: - ModeJoin(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora); + ModeJoin(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps); ~ModeJoin(); bool start(); diff --git a/Mode/ModeSingle.cpp b/Mode/ModeSingle.cpp index 083b72d..737301f 100644 --- a/Mode/ModeSingle.cpp +++ b/Mode/ModeSingle.cpp @@ -1,8 +1,8 @@ #include "ModeSingle.h" #include "MTSLog.h" -ModeSingle::ModeSingle(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora) - : Mode(lcd, buttons, dot, lora), +ModeSingle::ModeSingle(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps) + : Mode(lcd, buttons, dot, lora, gps), _help(lcd), _file(lcd), _confirm(lcd), @@ -30,7 +30,7 @@ bool ModeSingle::start() { // see if survey data file exists std::vector<mDot::mdot_file> files = _dot->listUserFiles(); for (std::vector<mDot::mdot_file>::iterator it = files.begin(); it != files.end(); it++) { - if (strcmp(it->name, _file_name) == 0) { + if (strcmp(it->name, file_name) == 0) { logInfo("found survey data file"); data_file = true; break; @@ -65,23 +65,15 @@ bool ModeSingle::start() { break; case show_help: incrementRatePower(); - _help.updateMsg(formatNewRatePower()); - logInfo("new data rate %u, power %lu", _data_rate, _power); - break; - case in_progress: - // do nothing + _help.updateMsg(formatRatePower()); break; case success: incrementRatePower(); - _success.updateInfo(formatNewRatePower()); - logInfo("new data rate %u, power %lu", _data_rate, _power); - break; - case data: + _success.updateInfo(formatRatePower()); break; case failure: incrementRatePower(); - _failure.updateInfo2(formatNewRatePower()); - logInfo("new data rate %u, power %lu", _data_rate, _power); + _failure.updateInfo(formatRatePower()); break; } break; @@ -95,35 +87,30 @@ bool ModeSingle::start() { case confirm: _state = show_help; logInfo("deleting survey data file"); - _dot->deleteUserFile(_file_name); + _dot->deleteUserFile(file_name); _index = 0; displayHelp(); break; case show_help: _state = in_progress; _progress.display(); - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_ping = true; else send_ping = true; break; - case in_progress: - // do nothing - break; case success: _state = in_progress; _progress.display(); - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_ping = true; else send_ping = true; break; - case data: - break; case failure: _state = in_progress; _progress.display(); - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_ping = true; else send_ping = true; @@ -139,12 +126,6 @@ bool ModeSingle::start() { switch (_ls) { case LoRaHandler::ping_success: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; case in_progress: _ping_result = _lora->getPingResults(); displaySuccess(); @@ -153,7 +134,7 @@ bool ModeSingle::start() { appendDataFile(_data); if (_send_data) { _state = data; - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_data = true; else send_data = true; @@ -163,23 +144,11 @@ bool ModeSingle::start() { _success.updateSw2("Survey"); } break; - case success: - break; - case data: - break; - case failure: - break; } break; case LoRaHandler::ping_failure: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; case in_progress: _state = failure; _failure.display(); @@ -189,64 +158,50 @@ bool ModeSingle::start() { updateData(_data, single, false); appendDataFile(_data); _failure.updatePower(_power); + if (_gps_available && _gps->getLockStatus()) { + GPSPARSER::latitude lat = _gps->getLatitude(); + GPSPARSER::longitude lon = _gps->getLongitude(); + struct tm time = _gps->getTimestamp(); + _failure.updateGpsLatitude(lat); + _failure.updateGpsLongitude(lon); + _failure.updateGpsTime(time); + } else { + _failure.updateGpsLatitude("No GPS Lock"); + } _failure.updateSw1(" Power"); _failure.updateSw2("Survey"); logInfo("ping failed"); break; - case success: - break; - case data: - break; - case failure: - break; } break; case LoRaHandler::send_success: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; - case in_progress: - break; - case success: - break; case data: _state = success; - _success.updateInfo("Data Send Success"); + _success.updateInfo(" "); _success.updateSw1(" Power"); _success.updateSw2("Survey"); + // turn acks and receive windows back on + _dot->setAck(1); + _dot->setTxWait(true); logInfo("data send success"); break; - case failure: - break; } break; case LoRaHandler::send_failure: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; - case in_progress: - break; - case success: - break; case data: _state = success; - _success.updateInfo("Data Send Failure"); + _success.updateInfo(" "); _success.updateSw1(" Power"); _success.updateSw2("Survey"); + // turn acks and receive windows back on + _dot->setAck(1); + _dot->setTxWait(true); logInfo("data send failed"); break; - case failure: - break; } break; } @@ -254,7 +209,7 @@ bool ModeSingle::start() { } if (no_channel_ping) { - uint32_t t = _lora->getNextTx(); + uint32_t t = _dot->getNextTxMs(); if (t > 0) { logInfo("next tx %lu ms", t); _progress.updateCountdown(t / 1000); @@ -265,7 +220,7 @@ bool ModeSingle::start() { } } if (no_channel_data) { - uint32_t t = _lora->getNextTx(); + uint32_t t = _dot->getNextTxMs(); if (t > 0) { logInfo("next tx %lu ms", t); _success.updateCountdown(t / 1000); @@ -278,19 +233,24 @@ bool ModeSingle::start() { if (send_ping) { logInfo("sending ping %s %d", _dot->DataRateStr(_data_rate).c_str(), _power); send_ping = false; - _lora->setDataRate(_data_rate); - _lora->setPower(_power); + _dot->setTxDataRate(_data_rate); + _dot->setTxPower(_power); _lora->ping(); _index++; } if (send_data) { - std::vector<uint8_t> s_data; + std::vector<uint8_t> s_data = formatSurveyData(_data); logInfo("sending data %s %d", _dot->DataRateStr(_data_rate).c_str(), _power); send_data = false; _success.updateInfo("Data Sending..."); - _lora->setDataRate(_data_rate); - _lora->setPower(_power); + _dot->setTxDataRate(_data_rate); + _dot->setTxPower(_power); + // we don't care if the server actually gets this packet or not + // we won't retry anyway + _dot->setAck(0); + _dot->setTxWait(false); _lora->send(s_data); + osDelay(500); } } } @@ -300,29 +260,38 @@ void ModeSingle::displayHelp() { _help.updateMode("Survey Single"); _help.updateSw1(" DR/PWR"); _help.updateSw2("Survey"); + _help.updateMsg(formatRatePower()); } void ModeSingle::displaySuccess() { + logInfo("gps lock: %s", _gps->getLockStatus() ? "true" : "false"); + uint8_t fix = _gps->getFixStatus(); + logInfo("gps fix: %s", fix == 3 ? "3D" : fix == 2 ? "2D" : "none"); _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.updatePower(_power); _success.updateStats(_ping_result); - // if GPS lock - // display GPS latitude, longitude, and time - // else - // display "no lock" - _success.updateGpsLatitude("No GPS Lock"); + if (_gps_available && _gps->getLockStatus()) { + GPSPARSER::latitude lat = _gps->getLatitude(); + GPSPARSER::longitude lon = _gps->getLongitude(); + struct tm time = _gps->getTimestamp(); + _success.updateGpsLatitude(lat); + _success.updateGpsLongitude(lon); + _success.updateGpsTime(time); + } else { + _success.updateGpsLatitude("No GPS Lock"); + } } -std::string ModeSingle::formatNewRatePower() { +std::string ModeSingle::formatRatePower() { std::string msg; char buf[8]; size_t size; memset(buf, 0, sizeof(buf)); - msg += "New DR="; + msg += "DR="; msg += _dot->DataRateStr(_data_rate).substr(3); msg += " P="; size = snprintf(buf, sizeof(buf), "%u", _power); @@ -360,5 +329,7 @@ void ModeSingle::incrementRatePower() { } else { _power += 3; } + + logInfo("new data rate %u, power %lu", _data_rate, _power); } diff --git a/Mode/ModeSingle.h b/Mode/ModeSingle.h index df656ba..1ddfc33 100644 --- a/Mode/ModeSingle.h +++ b/Mode/ModeSingle.h @@ -11,7 +11,7 @@ class ModeSingle : public Mode { public: - ModeSingle(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora); + ModeSingle(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps); ~ModeSingle(); bool start(); @@ -19,7 +19,7 @@ class ModeSingle : public Mode { private: void displayHelp(); void displaySuccess(); - std::string formatNewRatePower(); + std::string formatRatePower(); void incrementRatePower(); typedef enum { diff --git a/Mode/ModeSweep.cpp b/Mode/ModeSweep.cpp index 938ec83..17047b3 100644 --- a/Mode/ModeSweep.cpp +++ b/Mode/ModeSweep.cpp @@ -1,8 +1,8 @@ #include "ModeSweep.h" #include "MTSLog.h" -ModeSweep::ModeSweep(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora) - : Mode(lcd, buttons, dot, lora), +ModeSweep::ModeSweep(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps) + : Mode(lcd, buttons, dot, lora, gps), _help(lcd), _file(lcd), _confirm(lcd), @@ -54,7 +54,7 @@ bool ModeSweep::start() { // see if survey data file exists std::vector<mDot::mdot_file> files = _dot->listUserFiles(); for (std::vector<mDot::mdot_file>::iterator it = files.begin(); it != files.end(); it++) { - if (strcmp(it->name, _file_name) == 0) { + if (strcmp(it->name, file_name) == 0) { logInfo("found survey data file"); data_file = true; break; @@ -89,10 +89,6 @@ bool ModeSweep::start() { _state = check_file; _file.display(); break; - case show_help: - break; - case in_progress: - break; case success: _state = complete; _display_timer.stop(); @@ -105,8 +101,6 @@ bool ModeSweep::start() { _survey_success = 0; _survey_failure = 0; break; - case data: - break; case failure: _state = complete; _display_timer.stop(); @@ -119,8 +113,6 @@ bool ModeSweep::start() { _survey_success = 0; _survey_failure = 0; break; - case complete: - break; } break; @@ -133,7 +125,7 @@ bool ModeSweep::start() { case confirm: _state = show_help; logInfo("deleting survey data file"); - _dot->deleteUserFile(_file_name); + _dot->deleteUserFile(file_name); _index = 1; displayHelp(); break; @@ -141,25 +133,17 @@ bool ModeSweep::start() { _state = in_progress; _progress.display(); _progress.updateProgress(_survey_current, _survey_total); - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_ping = true; else send_ping = true; break; - case in_progress: - break; - case success: - break; - case data: - break; - case failure: - break; case complete: _state = in_progress; _survey_current = 1; _progress.display(); _progress.updateProgress(_survey_current, _survey_total); - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_ping = true; else send_ping = true; @@ -175,12 +159,6 @@ bool ModeSweep::start() { switch (_ls) { case LoRaHandler::ping_success: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; case in_progress: _survey_success++; _ping_result = _lora->getPingResults(); @@ -190,7 +168,7 @@ bool ModeSweep::start() { appendDataFile(_data); if (_send_data) { _state = data; - if (_lora->getNextTx() > 0) + if (_dot->getNextTxMs() > 0) no_channel_data = true; else send_data = true; @@ -200,25 +178,11 @@ bool ModeSweep::start() { _display_timer.start(); } break; - case success: - break; - case data: - break; - case failure: - break; - case complete: - break; } break; case LoRaHandler::ping_failure: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; case in_progress: _survey_failure++; _state = failure; @@ -227,6 +191,14 @@ bool ModeSweep::start() { // mDot::DataRateStr returns format SF_XX - we only want to display the XX part _failure.updateRate(_dot->DataRateStr(_data_rate).substr(3)); _failure.updatePower(_power); + if (_gps_available && _gps->getLockStatus()) { + GPSPARSER::latitude lat = _gps->getLatitude(); + GPSPARSER::longitude lon = _gps->getLongitude(); + _failure.updateGpsLatitude(lat); + _failure.updateGpsLongitude(lon); + } else { + _failure.updateGpsLatitude("No GPS Lock"); + } _failure.updatePassFail(_survey_success, _survey_failure); _failure.updateSw1(" Cancel"); updateData(_data, sweep, false); @@ -234,66 +206,36 @@ bool ModeSweep::start() { logInfo("ping failed"); _display_timer.start(); break; - case success: - break; - case data: - break; - case failure: - break; - case complete: - break; } break; case LoRaHandler::send_success: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; - case in_progress: - break; - case success: - break; case data: _state = success; - _success.updateInfo("Data Send Success"); + _success.updateInfo(" "); _success.updateSw1(" Cancel"); logInfo("data send success"); + // turn acks and receive windows back on + _dot->setAck(1); + _dot->setTxWait(true); _display_timer.start(); break; - case failure: - break; - case complete: - break; } break; case LoRaHandler::send_failure: switch (_state) { - case check_file: - break; - case confirm: - break; - case show_help: - break; - case in_progress: - break; - case success: - break; case data: _state = success; - _success.updateInfo("Data Send Failure"); + _success.updateInfo(" "); _success.updateSw1(" Cancel"); logInfo("data send failed"); + // turn acks and receive windows back on + _dot->setAck(1); + _dot->setTxWait(true); _display_timer.start(); break; - case failure: - break; - case complete: - break; } break; } @@ -323,7 +265,7 @@ bool ModeSweep::start() { } if (no_channel_ping) { - uint32_t t = _lora->getNextTx(); + uint32_t t = _dot->getNextTxMs(); if (t > 0) { logInfo("next tx %lu ms", t); _progress.updateCountdown(t / 1000); @@ -335,7 +277,7 @@ bool ModeSweep::start() { } } if (no_channel_data) { - uint32_t t = _lora->getNextTx(); + uint32_t t = _dot->getNextTxMs(); if (t > 0) { logInfo("next tx %lu ms", t); _success.updateCountdown(t / 1000); @@ -351,18 +293,23 @@ bool ModeSweep::start() { _power = p.second; logInfo("sending ping %s %d", _dot->DataRateStr(_data_rate).c_str(), _power); send_ping = false; - _lora->setDataRate(_data_rate); - _lora->setPower(_power); + _dot->setTxDataRate(_data_rate); + _dot->setTxPower(_power); _lora->ping(); } if (send_data) { - std::vector<uint8_t> s_data; + std::vector<uint8_t> s_data = formatSurveyData(_data); logInfo("sending data %s %d", _dot->DataRateStr(_data_rate).c_str(), _power); send_data = false; _success.updateInfo("Data Sending..."); - _lora->setDataRate(_data_rate); - _lora->setPower(_power); + _dot->setTxDataRate(_data_rate); + _dot->setTxPower(_power); + // we don't care if the server actually gets this packet or not + // we won't retry anyway + _dot->setAck(0); + _dot->setTxWait(false); _lora->send(s_data); + osDelay(500); } } } @@ -381,11 +328,14 @@ void ModeSweep::displaySuccess() { _success.updateRate(_dot->DataRateStr(_data_rate).substr(3)); _success.updatePower(_power); _success.updateStats(_ping_result); - // if GPS lock - // display GPS latitude, longitude, and time - // else - // display "no lock" - _success.updateGpsLatitude("No GPS Lock"); + if (_gps_available && _gps->getLockStatus()) { + GPSPARSER::latitude lat = _gps->getLatitude(); + GPSPARSER::longitude lon = _gps->getLongitude(); + _success.updateGpsLatitude(lat); + _success.updateGpsLongitude(lon); + } else { + _success.updateGpsLatitude("No GPS Lock"); + } _success.updatePassFail(_survey_success, _survey_failure); } diff --git a/Mode/ModeSweep.h b/Mode/ModeSweep.h index 5eebda1..f7522aa 100644 --- a/Mode/ModeSweep.h +++ b/Mode/ModeSweep.h @@ -14,7 +14,7 @@ typedef std::pair<uint8_t, uint32_t> point; class ModeSweep : public Mode { public: - ModeSweep(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora); + ModeSweep(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps); ~ModeSweep(); bool start(); |