summaryrefslogtreecommitdiff
path: root/LoRaHandler
diff options
context:
space:
mode:
authorMike Fiore <mfiore@multitech.com>2015-11-17 13:04:00 -0600
committerMike Fiore <mfiore@multitech.com>2015-11-17 13:04:00 -0600
commit11ac166f3476116b08eeaffc25d80b163573089b (patch)
tree0675e50c2377dbffc37ce3906967b17478f225c0 /LoRaHandler
parentb86c62d46385ff454a939f23277761b8ee6b8a0d (diff)
downloadmtdot-box-evb-factory-firmware-11ac166f3476116b08eeaffc25d80b163573089b.tar.gz
mtdot-box-evb-factory-firmware-11ac166f3476116b08eeaffc25d80b163573089b.tar.bz2
mtdot-box-evb-factory-firmware-11ac166f3476116b08eeaffc25d80b163573089b.zip
join works, but only once - added object for running LoRa operations in a thread, lots of misc updates
Diffstat (limited to 'LoRaHandler')
-rw-r--r--LoRaHandler/LoRaHandler.cpp166
-rw-r--r--LoRaHandler/LoRaHandler.h50
2 files changed, 216 insertions, 0 deletions
diff --git a/LoRaHandler/LoRaHandler.cpp b/LoRaHandler/LoRaHandler.cpp
new file mode 100644
index 0000000..3e28782
--- /dev/null
+++ b/LoRaHandler/LoRaHandler.cpp
@@ -0,0 +1,166 @@
+#include "LoRaHandler.h"
+#include "MTSLog.h"
+
+#define signal (int32_t)0xA0
+
+typedef enum {
+ l_none = 0,
+ l_ping,
+ l_send,
+ l_join
+} InternalLoRa;
+
+uint8_t cmd = l_none;
+std::vector<uint8_t> send_data;
+
+void l_worker(void const* argument) {
+ LoRaHandler* l = (LoRaHandler*)argument;
+ osEvent e;
+
+ l->_dot = mDot::getInstance();
+ int32_t ret;
+ mDot::ping_response pr;
+ mDot::rssi_stats rs;
+ mDot::snr_stats ss;
+
+ while (true) {
+ e = Thread::signal_wait(signal);
+ if (e.status == osEventSignal) {
+ logInfo("LoRa worker received signal");
+ switch (cmd) {
+ case l_ping:
+ l->_mutex.lock();
+ pr = l->_dot->ping();
+ l->_mutex.unlock();
+ if (pr.status == mDot::MDOT_OK) {
+ l->_ping.up = pr;
+ l->_mutex.lock();
+ rs = l->_dot->getRssiStats();
+ ss = l->_dot->getSnrStats();
+ l->_mutex.unlock();
+ l->_ping.down.rssi = rs.last;
+ l->_ping.down.snr = ss.last;
+ l->_status = LoRaHandler::ping_success;
+ } else {
+ l->_status = LoRaHandler::ping_failure;
+ }
+ logInfo("LoRa worker signaling main");
+ osSignalSet(l->_main, loraSignal);
+ break;
+
+ case l_send:
+ l->_mutex.lock();
+ ret = l->_dot->send(send_data);
+ l->_mutex.unlock();
+ if (ret == mDot::MDOT_OK)
+ l->_status = LoRaHandler::send_success;
+ else
+ l->_status = LoRaHandler::send_failure;
+ logInfo("LoRa worker signaling main");
+ osSignalSet(l->_main, loraSignal);
+ break;
+
+ case l_join:
+ logInfo("LoRa worker joining");
+ l->_mutex.lock();
+ ret = l->_dot->joinNetworkOnce();
+ l->_mutex.unlock();
+ if (ret == mDot::MDOT_OK) {
+ logInfo("LoRa worker signaling main - success");
+ l->_status = LoRaHandler::join_success;
+ } else {
+ logInfo("LoRa worker signaling main - failure");
+ l->_status = LoRaHandler::join_failure;
+ }
+ osSignalSet(l->_main, loraSignal);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
+
+LoRaHandler::LoRaHandler(osThreadId main)
+ : _main(main),
+ _thread(l_worker, (void*)this),
+ _status(none)
+{
+ logInfo("starting");
+ _ping.status = false;
+}
+
+bool LoRaHandler::setDataRate(uint8_t rate) {
+ int32_t res;
+ _mutex.lock();
+ res = _dot->setTxDataRate(rate);
+ _mutex.unlock();
+ if (res == mDot::MDOT_OK)
+ return true;
+
+ return false;
+}
+
+bool LoRaHandler::setPower(uint32_t power) {
+ int32_t res;
+ _mutex.lock();
+ res = _dot->setTxPower(power);
+ _mutex.unlock();
+ if (res == mDot::MDOT_OK)
+ return true;
+
+ return false;
+}
+
+bool LoRaHandler::ping() {
+ return action(l_ping);
+}
+
+bool LoRaHandler::send(std::vector<uint8_t> data) {
+ send_data = data;
+ return action(l_send);
+}
+
+bool LoRaHandler::join() {
+ return action(l_join);
+}
+
+bool LoRaHandler::action(uint8_t c) {
+ if (_status != busy) {
+ cmd = c;
+ _thread.signal_set(signal);
+ _thread.signal_clr(signal);
+ return true;
+ }
+
+ return false;
+}
+
+LoRaHandler::LoRaStatus LoRaHandler::getStatus() {
+ LoRaStatus status;
+ _mutex.lock();
+ status = _status;
+ _mutex.unlock();
+
+ return status;
+}
+
+LoRaHandler::LoRaPing LoRaHandler::getPingResults() {
+ LoRaPing ping;
+ _mutex.lock();
+ ping = _ping;
+ _mutex.unlock();
+
+ return ping;
+}
+
+uint32_t LoRaHandler::getNextTx() {
+ uint32_t ms;
+ _mutex.lock();
+ ms = _dot->getNextTxMs();
+ _mutex.unlock();
+
+ return ms;
+}
+
diff --git a/LoRaHandler/LoRaHandler.h b/LoRaHandler/LoRaHandler.h
new file mode 100644
index 0000000..20f9d6f
--- /dev/null
+++ b/LoRaHandler/LoRaHandler.h
@@ -0,0 +1,50 @@
+#ifndef __LORAHANDLER_H__
+#define __LORAHANDLER_H__
+
+#include "mDot.h"
+
+#define loraSignal (int32_t)0x02
+
+class LoRaHandler {
+ public:
+ typedef enum {
+ none = 0,
+ busy,
+ ping_success,
+ send_success,
+ join_success,
+ ping_failure,
+ send_failure,
+ join_failure
+ } LoRaStatus;
+
+ typedef struct {
+ bool status;
+ mDot::ping_response up;
+ mDot::ping_response down;
+ } LoRaPing;
+
+ LoRaHandler(osThreadId main);
+ ~LoRaHandler();
+
+ bool setDataRate(uint8_t rate);
+ bool setPower(uint32_t power);
+ bool ping();
+ bool send(std::vector<uint8_t> data);
+ bool join();
+ bool action(uint8_t cmd);
+ LoRaStatus getStatus();
+ LoRaPing getPingResults();
+ uint32_t getNextTx();
+
+
+ osThreadId _main;
+ Thread _thread;
+ LoRaStatus _status;
+ LoRaPing _ping;
+ mDot* _dot;
+ Mutex _mutex;
+};
+
+#endif
+