From 11ac166f3476116b08eeaffc25d80b163573089b Mon Sep 17 00:00:00 2001 From: Mike Fiore Date: Tue, 17 Nov 2015 13:04:00 -0600 Subject: join works, but only once - added object for running LoRa operations in a thread, lots of misc updates --- LoRaHandler/LoRaHandler.cpp | 166 ++++++++++++++++++++++++++++++++++++++++++++ LoRaHandler/LoRaHandler.h | 50 +++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 LoRaHandler/LoRaHandler.cpp create mode 100644 LoRaHandler/LoRaHandler.h (limited to 'LoRaHandler') 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 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 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 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 + -- cgit v1.2.3