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 --- Layout/Layout.cpp | 29 ++++++++++++++++ Layout/Layout.h | 2 ++ Layout/LayoutJoin.cpp | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ Layout/LayoutJoin.h | 43 ++++++++++++++++++++++++ 4 files changed, 167 insertions(+) create mode 100644 Layout/LayoutJoin.cpp create mode 100644 Layout/LayoutJoin.h (limited to 'Layout') diff --git a/Layout/Layout.cpp b/Layout/Layout.cpp index a38cc4f..7b0c375 100644 --- a/Layout/Layout.cpp +++ b/Layout/Layout.cpp @@ -46,6 +46,7 @@ bool Layout::writeField(const Field& field, const std::string& value, bool apply if (apply) startUpdate(); + // fill the whole length with blank space in case the previous value was longer than this one while (v.size() < field._maxSize) v += " "; @@ -57,6 +58,27 @@ bool Layout::writeField(const Field& field, const std::string& value, bool apply return true; } +bool Layout::writeField(const Field& field, const char* value, size_t size, bool apply) { + bool ret; + char buf[32]; + size_t s = (field._maxSize > size) ? size : field._maxSize; + + // fill the whole length with blank space in case the previous value was longer than this one + memset(buf, 0x20, sizeof(buf)); + + if (apply) + startUpdate(); + + snprintf(buf, s, "%s", value); + + ret = writeText(field._col, field._row, value, field._maxSize); + + if (apply) + endUpdate(); + + return true; +} + bool Layout::writeImage(const Image& image, bool apply) { bool ret; @@ -71,6 +93,13 @@ bool Layout::writeImage(const Image& image, bool apply) { return ret; } +void Layout::removeField(const Field& field) { + startUpdate(); + std::string s(' ', field._maxSize); + writeText(field._row, field._col, s.c_str(), s.size()); + endUpdate(); +} + bool Layout::writeText(uint8_t col, uint8_t row, const char* value, size_t size) { _lcd->writeText(col*6, row, font_6x8, value, size); diff --git a/Layout/Layout.h b/Layout/Layout.h index 5e7ece2..29d59ff 100644 --- a/Layout/Layout.h +++ b/Layout/Layout.h @@ -44,7 +44,9 @@ class Layout { void endUpdate(); bool writeLabel(const Label& label); bool writeField(const Field& field, const std::string& value, bool apply = false); + bool writeField(const Field& field, const char* value, size_t size, bool apply = false); bool writeImage(const Image& image, bool apply = false); + void removeField(const Field& field); private: bool writeText(uint8_t col, uint8_t row, const char* value, size_t size); diff --git a/Layout/LayoutJoin.cpp b/Layout/LayoutJoin.cpp new file mode 100644 index 0000000..1b0fb20 --- /dev/null +++ b/Layout/LayoutJoin.cpp @@ -0,0 +1,93 @@ +#include "LayoutJoin.h" + +LayoutJoin::LayoutJoin(DOGS102* lcd, uint8_t band) + : Layout(lcd), + _lId(0, 1, "NI="), + _lKey(0, 2, "NK="), + _lFsb(0, 3, "FSB="), + _lRate(0, 5, "DR="), + _lPower(6, 5, "P="), + _fStatus(0, 0, 17), + _fId(3, 1, 14), + _fKey(3, 2, 14), + _fFsb(4, 3, 2), + _fRate(3, 5, 2), + _fPower(8, 5, 2), + _fCountdown(0, 7, 9), + _fCountdownLabel(0, 6, 17), + _fCancel(11, 7, 6), + _band(band) +{} + +LayoutJoin::~LayoutJoin() {} + +void LayoutJoin::display() { + clear(); + startUpdate(); + + writeLabel(_lId); + writeLabel(_lKey); + if (_band == mDot::FB_915) { + writeLabel(_lFsb); + } + writeLabel(_lRate); + writeLabel(_lPower); + + displayCancel(); + + endUpdate(); +} + +void LayoutJoin::updateId(std::string id) { + writeField(_fId, id, true); +} + +void LayoutJoin::updateKey(std::string key) { + writeField(_fKey, key, true); +} + +void LayoutJoin::updateFsb(uint8_t band) { + char buf[8]; + size_t size; + + size = snprintf(buf, sizeof(buf), "%u", band); + writeField(_fFsb, buf, size, true); +} + +void LayoutJoin::updateRate(std::string rate) { + writeField(_fRate, rate); +} + +void LayoutJoin::updatePower(uint32_t power) { + char buf[16]; + size_t size; + + size = snprintf(buf, sizeof(buf), "%lu", power); + writeField(_fPower, buf, size, true); +} + +void LayoutJoin::updateStatus(std::string status) { + writeField(_fStatus, status, true); +} + +void LayoutJoin::updateCountdown(uint32_t seconds) { + char buf[16]; + size_t size; + + writeField(_fCountdownLabel, "No Free Channel"); + size = snprintf(buf, sizeof(buf), "%lu", seconds); + writeField(_fPower, buf, size, true); +} + +void LayoutJoin::removeCountdown() { + removeField(_fCountdownLabel); + removeField(_fCountdown); +} + +void LayoutJoin::displayCancel(bool display) { + if (display) + writeField(_fCancel, "Cancel", true); + else + removeField(_fCancel); +} + diff --git a/Layout/LayoutJoin.h b/Layout/LayoutJoin.h new file mode 100644 index 0000000..f2b7e41 --- /dev/null +++ b/Layout/LayoutJoin.h @@ -0,0 +1,43 @@ +#ifndef __LAYOUTJOIN_H__ +#define __LAYOUTJOIN_H__ + +#include "Layout.h" +#include "mDot.h" + +class LayoutJoin : public Layout { + public: + LayoutJoin(DOGS102* lcd, uint8_t band); + ~LayoutJoin(); + + void display(); + + void updateId(std::string id); + void updateKey(std::string key); + void updateFsb(uint8_t band); + void updateRate(std::string rate); + void updatePower(uint32_t power); + void updateStatus(std::string status); + void updateCountdown(uint32_t seconds); + void removeCountdown(); + void displayCancel(bool display = true); + + private: + Label _lId; + Label _lKey; + Label _lFsb; + Label _lRate; + Label _lPower; + + Field _fStatus; + Field _fId; + Field _fKey; + Field _fFsb; + Field _fRate; + Field _fPower; + Field _fCountdown; + Field _fCountdownLabel; + Field _fCancel; + uint8_t _band; +}; + +#endif -- cgit v1.2.3