RadioShuttle Lib for the STM32 L4 Heltec Board
Dependents: Turtle_RadioShuttle
RadioStatus.cpp
- Committer:
- Helmut Tschemernjak
- Date:
- 2019-04-14
- Revision:
- 13:591254bed18b
- Parent:
- 12:11b2d36e9217
File content as of revision 13:591254bed18b:
/*
* The file is licensed under the Apache License, Version 2.0
* (c) 2019 Helmut Tschemernjak
* 30826 Garbsen (Hannover) Germany
*/
#ifdef ARDUINO
#include <Arduino.h>
#include "arduino-mbed.h"
#include <time.h>
#define FEATURE_LORA 1
#endif
#ifdef __MBED__
#include "mbed.h"
#include "PinMap.h"
#endif
#include "RadioStatusInterface.h"
#include "RadioStatus.h"
#ifdef FEATURE_LORA
MyRadioStatus::MyRadioStatus()
{
_totalTX = 0;
_totalRX = 0;
_totalError = 0;
_totalTimeout = 0;
ledTX = NULL;
ledRX = NULL;
ledTimeout = NULL;
inverted = false;
#ifdef TARGET_STM32L0
ledTX = new DigitalOut(LED3); // blue
*ledTX = 0;
ledRX = new DigitalOut(LED4); // red
*ledRX = 0;
ledTimeout = new DigitalOut(LED1); // green
*ledTimeout = 0;
#endif
#ifdef HELTECL432_REV1
ledTX = new DigitalOut(STATUS_LED); // green
*ledTX = 0;
ledRX = new DigitalOut(LED2); // red
*ledRX = 0;
#endif
#ifdef MyHOME_BOARD_REV4
ledTX = new DigitalOut(LED2); // yellow
*ledTX = 0;
ledRX = new DigitalOut(STATUS_LED); // red
*ledRX = 0;
ledTimeout = new DigitalOut(LED3); // green
*ledTimeout = 0;
#endif
#ifdef __SAMD21G18A__
inverted = true;
#ifdef PIN_LED_TXL
ledTX = new DigitalOut(PIN_LED_TXL); // yellow
*ledTX = 1;
#endif
#ifdef PIN_LED_RXL
ledRX = new DigitalOut(25); // red
*ledRX = 1;
#endif
#endif
#ifdef ARDUINO_ESP32_DEV // ESP32_ECO_POWER_REV_1
ledTX = new DigitalOut(2); // green
*ledTX = 0;
ledRX = new DigitalOut(12); // red
*ledRX = 0;
#endif
#if defined(ARDUINO_Heltec_WIFI_LoRa_32) || defined(ARDUINO_WIFI_LORA_32) \
|| defined(ARDUINO_WIFI_LORA_32_V2) || defined(ARDUINO_WIRELESS_STICK) \
|| defined(ARDUINO_WIRELESS_STICK_LITE) // the Heltec boards
ledTX = new DigitalOut(25); // white
*ledTX = 0;
#endif
#ifdef HAS_OLED_DISPLAY
invertedDisplay = false;
_line1[0] = 0;
_line2[0] = 0;
_line3[0] = 0;
_line4[0] = 0;
_line5[0] = 0;
displayReset = NULL;
#if defined(ARDUINO_Heltec_WIFI_LoRa_32) || defined(ARDUINO_WIFI_LORA_32) \
|| defined(ARDUINO_WIFI_LORA_32_V2) || defined(ARDUINO_WIRELESS_STICK)
#define DISPLAY_ADDRESS 0x3c
#define DISPLAY_SDA 4
#define DISPLAY_SCL 15
#define DISPLAY_RESET 16
displayReset = new DigitalOut(DISPLAY_RESET);
#endif
#ifdef ARDUINO_ESP32_DEV // ESP32_ECO_POWER_REV_1
#define DISPLAY_ADDRESS 0x3c
#define DISPLAY_SDA 21
#define DISPLAY_SCL 22
#endif
if (displayReset) {
*displayReset = 0;
wait_ms(50);
*displayReset = 1;
}
display = new SSD1306(DISPLAY_ADDRESS, DISPLAY_SDA, DISPLAY_SCL);
display->init();
// display->flipScreenVertically();
display->setFont(ArialMT_Plain_16); // ArialMT_Plain_10);
display->clear();
display->drawString(0, 0, "RadioShuttle 1.4");
display->setFont(ArialMT_Plain_10);
int yoff = 17;
display->drawString(0, yoff, "Peer-to-Peer LoRa Protcol");
yoff += 12;
display->drawString(0, yoff, "Efficient, Fast, Secure");
yoff += 12;
display->drawString(0, yoff, "www.radioshuttle.de");
display->display();
#endif
}
MyRadioStatus::~MyRadioStatus()
{
if (ledTX) {
if (inverted)
*ledTX = 1;
else
*ledTX = 0;
delete ledTX;
}
if (ledRX) {
if (inverted)
*ledRX = 1;
else
*ledRX = 0;
delete ledRX;
}
if (ledTimeout) {
if (inverted)
*ledTimeout = 1;
else
*ledTimeout = 0;
delete ledTimeout;
}
}
void
MyRadioStatus::TXStart(int AppID, int toStation, int length, int dBm)
{
UNUSED(AppID);
UNUSED(toStation);
UNUSED(length);
UNUSED(dBm);
if (ledTX) {
if (inverted)
*ledTX = 0;
else
*ledTX = 1;
}
#ifdef HAS_OLED_DISPLAY
snprintf(_line2, sizeof(_line2), "TX(%d) ID(%d) %d dBm", length, toStation, dBm);
UpdateDisplay(true);
#endif
_totalTX++;
}
void
MyRadioStatus::TXComplete(void)
{
if (ledTX) {
if (inverted)
*ledTX = 1;
else
*ledTX = 0;
}
#ifdef HAS_OLED_DISPLAY
UpdateDisplay(false);
#endif
}
void
MyRadioStatus::RxDone(int size, int rssi, int snr)
{
UNUSED(size);
UNUSED(rssi);
UNUSED(snr);
if (ledRX) {
if (inverted)
*ledRX = 0;
else
*ledRX = 1;
}
_totalRX++;
#ifdef HAS_OLED_DISPLAY
snprintf(_line3, sizeof(_line3), "RX(%d) RSSI(%d) SNR(%d)", size, rssi, snr);
UpdateDisplay(true);
#endif
}
void
MyRadioStatus::RxCompleted(void)
{
if (ledRX) {
if (inverted)
*ledRX = 1;
else
*ledRX = 0;
}
#ifdef HAS_OLED_DISPLAY
UpdateDisplay(false);
#endif
}
void
MyRadioStatus::MessageTimeout(int App, int toStation)
{
UNUSED(App);
UNUSED(toStation);
if (ledTimeout)
*ledTimeout = 1;
_totalTimeout++;
#ifdef HAS_OLED_DISPLAY
UpdateDisplay(false);
#endif
}
void
MyRadioStatus::UpdateDisplay(bool invertDisplay)
{
UNUSED(invertDisplay);
#ifdef HAS_OLED_DISPLAY
int yoff = 0;
int hight = 12;
time_t t = time(NULL);
struct tm mytm;
localtime_r(&t, &mytm);
snprintf(_line1, sizeof(_line1), "%s (%d) %02d:%02d:%02d", _radioType, _stationID,
mytm.tm_hour, mytm.tm_min, mytm.tm_sec);
snprintf(_line4, sizeof(_line4), "Packets RX(%d) TX(%d)", _totalRX, _totalTX);
snprintf(_line5, sizeof(_line5), "RXErr(%d) TOut(%d) %.2f %d", _totalError, _totalTimeout, (double)_frequency/1000000.0, _spreadingFactor);
if (invertDisplay)
display->invertDisplay();
else
display->normalDisplay();
display->setFont(ArialMT_Plain_10);
display->clear();
display->drawString(0, yoff, String(_line1));
yoff += hight;
display->drawString(0, yoff, String(_line2));
yoff += hight;
display->drawString(0, yoff, String(_line3));
yoff += hight;
display->drawString(0, yoff, String(_line4));
yoff += hight;
display->display();
#endif
}
#endif // FEATURE_LORA
Helmut Tschemernjak