RadioShuttle Lib for the STM32 L4 Heltec Board

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Mon Mar 04 09:41:41 2019 +0100
Revision:
11:91bc7ef20f21
Parent:
0:0c31756924a2
Child:
12:11b2d36e9217
Updated lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut64 0:0c31756924a2 1 /*
Helmut64 0:0c31756924a2 2 * The file is licensed under the Apache License, Version 2.0
Helmut64 0:0c31756924a2 3 * (c) 2019 Helmut Tschemernjak
Helmut64 0:0c31756924a2 4 * 30826 Garbsen (Hannover) Germany
Helmut64 0:0c31756924a2 5 */
Helmut64 0:0c31756924a2 6
Helmut64 0:0c31756924a2 7
Helmut64 0:0c31756924a2 8 #ifdef ARDUINO
Helmut64 0:0c31756924a2 9 #include <Arduino.h>
Helmut64 0:0c31756924a2 10 #include "arduino-mbed.h"
Helmut64 0:0c31756924a2 11 #include <time.h>
Helmut64 0:0c31756924a2 12 #define FEATURE_LORA 1
Helmut64 0:0c31756924a2 13 #endif
Helmut64 0:0c31756924a2 14 #ifdef __MBED__
Helmut64 0:0c31756924a2 15 #include "mbed.h"
Helmut64 0:0c31756924a2 16 #include "PinMap.h"
Helmut64 0:0c31756924a2 17 #endif
Helmut64 0:0c31756924a2 18 #include "RadioStatusInterface.h"
Helmut64 0:0c31756924a2 19 #include "RadioStatus.h"
Helmut64 0:0c31756924a2 20 #ifdef FEATURE_LORA
Helmut64 0:0c31756924a2 21
Helmut64 0:0c31756924a2 22
Helmut64 0:0c31756924a2 23 MyRadioStatus::MyRadioStatus()
Helmut64 0:0c31756924a2 24 {
Helmut64 0:0c31756924a2 25 _totalTX = 0;
Helmut64 0:0c31756924a2 26 _totalRX = 0;
Helmut64 0:0c31756924a2 27 _totalError = 0;
Helmut64 0:0c31756924a2 28 _totalTimeout = 0;
Helmut64 0:0c31756924a2 29
Helmut64 0:0c31756924a2 30 ledTX = NULL;
Helmut64 0:0c31756924a2 31 ledRX = NULL;
Helmut64 0:0c31756924a2 32 ledTimeout = NULL;
Helmut64 0:0c31756924a2 33 inverted = false;
Helmut64 0:0c31756924a2 34
Helmut64 0:0c31756924a2 35 #ifdef TARGET_STM32L0
Helmut64 0:0c31756924a2 36 ledTX = new DigitalOut(LED3); // blue
Helmut64 0:0c31756924a2 37 *ledTX = 0;
Helmut64 0:0c31756924a2 38 ledRX = new DigitalOut(LED4); // red
Helmut64 0:0c31756924a2 39 *ledRX = 0;
Helmut64 0:0c31756924a2 40 ledTimeout = new DigitalOut(LED1); // green
Helmut64 0:0c31756924a2 41 *ledTimeout = 0;
Helmut64 0:0c31756924a2 42 #endif
Helmut64 0:0c31756924a2 43 #ifdef HELTECL432_REV1
Helmut64 0:0c31756924a2 44 ledTX = new DigitalOut(STATUS_LED); // green
Helmut64 0:0c31756924a2 45 *ledTX = 0;
Helmut64 0:0c31756924a2 46 ledRX = new DigitalOut(LED2); // red
Helmut64 0:0c31756924a2 47 *ledRX = 0;
Helmut64 0:0c31756924a2 48 #endif
Helmut64 0:0c31756924a2 49 #ifdef MyHOME_BOARD_REV4
Helmut64 0:0c31756924a2 50 ledTX = new DigitalOut(LED2); // yellow
Helmut64 0:0c31756924a2 51 *ledTX = 0;
Helmut64 0:0c31756924a2 52 ledRX = new DigitalOut(STATUS_LED); // red
Helmut64 0:0c31756924a2 53 *ledRX = 0;
Helmut64 0:0c31756924a2 54 ledTimeout = new DigitalOut(LED3); // green
Helmut64 0:0c31756924a2 55 *ledTimeout = 0;
Helmut64 0:0c31756924a2 56 #endif
Helmut64 0:0c31756924a2 57 #ifdef __SAMD21G18A__
Helmut64 0:0c31756924a2 58 inverted = true;
Helmut64 0:0c31756924a2 59 #ifdef PIN_LED_TXL
Helmut64 0:0c31756924a2 60 ledTX = new DigitalOut(PIN_LED_TXL); // yellow
Helmut64 0:0c31756924a2 61 *ledTX = 1;
Helmut64 0:0c31756924a2 62 #endif
Helmut64 0:0c31756924a2 63 #ifdef PIN_LED_RXL
Helmut64 0:0c31756924a2 64 ledRX = new DigitalOut(25); // red
Helmut64 0:0c31756924a2 65 *ledRX = 1;
Helmut64 0:0c31756924a2 66 #endif
Helmut64 0:0c31756924a2 67 #endif
Helmut64 0:0c31756924a2 68 #ifdef ARDUINO_ESP32_DEV // ESP32_ECO_POWER_REV_1
Helmut64 0:0c31756924a2 69 ledTX = new DigitalOut(2); // green
Helmut64 0:0c31756924a2 70 *ledTX = 0;
Helmut64 0:0c31756924a2 71 ledRX = new DigitalOut(12); // red
Helmut64 0:0c31756924a2 72 *ledRX = 0;
Helmut64 0:0c31756924a2 73 #endif
Helmut64 0:0c31756924a2 74 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 75 invertedDisplay = false;
Helmut64 0:0c31756924a2 76 _line1[0] = 0;
Helmut64 0:0c31756924a2 77 _line2[0] = 0;
Helmut64 0:0c31756924a2 78 _line3[0] = 0;
Helmut64 0:0c31756924a2 79 _line4[0] = 0;
Helmut64 0:0c31756924a2 80 _line5[0] = 0;
Helmut64 0:0c31756924a2 81
Helmut64 0:0c31756924a2 82 #define DISPLAY_ADDRESS 0x3c
Helmut64 0:0c31756924a2 83 #define DISPLAY_SDA 4
Helmut64 0:0c31756924a2 84 #define DISPLAY_SCL 15
Helmut64 0:0c31756924a2 85 #define DISPLAY_RESET 16
Helmut64 0:0c31756924a2 86 displayReset = new DigitalOut(DISPLAY_RESET);
Helmut64 0:0c31756924a2 87 display = new SSD1306(DISPLAY_ADDRESS, DISPLAY_SDA, DISPLAY_SCL);
Helmut64 0:0c31756924a2 88 *displayReset = 0;
Helmut64 0:0c31756924a2 89 wait_ms(50);
Helmut64 0:0c31756924a2 90 *displayReset = 1;
Helmut64 0:0c31756924a2 91 display->init();
Helmut64 0:0c31756924a2 92 // display->flipScreenVertically();
Helmut64 0:0c31756924a2 93 display->setFont(ArialMT_Plain_16); // ArialMT_Plain_10);
Helmut64 0:0c31756924a2 94 display->clear();
Helmut64 0:0c31756924a2 95 display->drawString(0, 0, "RadioShuttle 1.4");
Helmut64 0:0c31756924a2 96 display->setFont(ArialMT_Plain_10);
Helmut64 0:0c31756924a2 97 int yoff = 17;
Helmut64 0:0c31756924a2 98 display->drawString(0, yoff, "Peer-to-Peer LoRa Protcol");
Helmut64 0:0c31756924a2 99 yoff += 12;
Helmut64 0:0c31756924a2 100 display->drawString(0, yoff, "Efficient, Fast, Secure");
Helmut64 0:0c31756924a2 101 yoff += 12;
Helmut64 0:0c31756924a2 102 display->drawString(0, yoff, "www.radioshuttle.de");
Helmut64 0:0c31756924a2 103 display->display();
Helmut64 0:0c31756924a2 104 #endif
Helmut64 0:0c31756924a2 105 }
Helmut64 0:0c31756924a2 106
Helmut64 0:0c31756924a2 107 MyRadioStatus::~MyRadioStatus()
Helmut64 0:0c31756924a2 108 {
Helmut64 0:0c31756924a2 109 if (ledTX) {
Helmut64 0:0c31756924a2 110 if (inverted)
Helmut64 0:0c31756924a2 111 *ledTX = 1;
Helmut64 0:0c31756924a2 112 else
Helmut64 0:0c31756924a2 113 *ledTX = 0;
Helmut64 0:0c31756924a2 114 delete ledTX;
Helmut64 0:0c31756924a2 115 }
Helmut64 0:0c31756924a2 116 if (ledRX) {
Helmut64 0:0c31756924a2 117 if (inverted)
Helmut64 0:0c31756924a2 118 *ledRX = 1;
Helmut64 0:0c31756924a2 119 else
Helmut64 0:0c31756924a2 120 *ledRX = 0;
Helmut64 0:0c31756924a2 121 delete ledRX;
Helmut64 0:0c31756924a2 122 }
Helmut64 0:0c31756924a2 123 if (ledTimeout) {
Helmut64 0:0c31756924a2 124 if (inverted)
Helmut64 0:0c31756924a2 125 *ledTimeout = 1;
Helmut64 0:0c31756924a2 126 else
Helmut64 0:0c31756924a2 127 *ledTimeout = 0;
Helmut64 0:0c31756924a2 128 delete ledTimeout;
Helmut64 0:0c31756924a2 129 }
Helmut64 0:0c31756924a2 130 }
Helmut64 0:0c31756924a2 131
Helmut64 0:0c31756924a2 132 void
Helmut64 0:0c31756924a2 133 MyRadioStatus::TXStart(int AppID, int toStation, int length, int dBm)
Helmut64 0:0c31756924a2 134 {
Helmut64 0:0c31756924a2 135 UNUSED(AppID);
Helmut64 0:0c31756924a2 136 UNUSED(toStation);
Helmut64 0:0c31756924a2 137 UNUSED(length);
Helmut64 0:0c31756924a2 138 UNUSED(dBm);
Helmut64 0:0c31756924a2 139 if (ledTX) {
Helmut64 0:0c31756924a2 140 if (inverted)
Helmut64 0:0c31756924a2 141 *ledTX = 0;
Helmut64 0:0c31756924a2 142 else
Helmut64 0:0c31756924a2 143 *ledTX = 1;
Helmut64 0:0c31756924a2 144 }
Helmut64 0:0c31756924a2 145 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 146 snprintf(_line2, sizeof(_line2), "TX(%d) ID(%d) %d dBm", length, toStation, dBm);
Helmut64 0:0c31756924a2 147 UpdateDisplay(true);
Helmut64 0:0c31756924a2 148 #endif
Helmut64 0:0c31756924a2 149 _totalTX++;
Helmut64 0:0c31756924a2 150 }
Helmut64 0:0c31756924a2 151
Helmut64 0:0c31756924a2 152 void
Helmut64 0:0c31756924a2 153 MyRadioStatus::TXComplete(void)
Helmut64 0:0c31756924a2 154 {
Helmut64 0:0c31756924a2 155 if (ledTX) {
Helmut64 0:0c31756924a2 156 if (inverted)
Helmut64 0:0c31756924a2 157 *ledTX = 1;
Helmut64 0:0c31756924a2 158 else
Helmut64 0:0c31756924a2 159 *ledTX = 0;
Helmut64 0:0c31756924a2 160 }
Helmut64 0:0c31756924a2 161 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 162 UpdateDisplay(false);
Helmut64 0:0c31756924a2 163 #endif
Helmut64 0:0c31756924a2 164 }
Helmut64 0:0c31756924a2 165
Helmut64 0:0c31756924a2 166 void
Helmut64 0:0c31756924a2 167 MyRadioStatus::RxDone(int size, int rssi, int snr)
Helmut64 0:0c31756924a2 168 {
Helmut64 0:0c31756924a2 169 UNUSED(size);
Helmut64 0:0c31756924a2 170 UNUSED(rssi);
Helmut64 0:0c31756924a2 171 UNUSED(snr);
Helmut64 0:0c31756924a2 172 if (ledRX) {
Helmut64 0:0c31756924a2 173 if (inverted)
Helmut64 0:0c31756924a2 174 *ledRX = 0;
Helmut64 0:0c31756924a2 175 else
Helmut64 0:0c31756924a2 176 *ledRX = 1;
Helmut64 0:0c31756924a2 177 }
Helmut64 0:0c31756924a2 178 _totalRX++;
Helmut64 0:0c31756924a2 179 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 180 snprintf(_line3, sizeof(_line3), "RX(%d) RSSI(%d) SNR(%d)", size, rssi, snr);
Helmut64 0:0c31756924a2 181 UpdateDisplay(true);
Helmut64 0:0c31756924a2 182 #endif
Helmut64 0:0c31756924a2 183 }
Helmut64 0:0c31756924a2 184
Helmut64 0:0c31756924a2 185 void
Helmut64 0:0c31756924a2 186 MyRadioStatus::RxCompleted(void)
Helmut64 0:0c31756924a2 187 {
Helmut64 0:0c31756924a2 188 if (ledRX) {
Helmut64 0:0c31756924a2 189 if (inverted)
Helmut64 0:0c31756924a2 190 *ledRX = 1;
Helmut64 0:0c31756924a2 191 else
Helmut64 0:0c31756924a2 192 *ledRX = 0;
Helmut64 0:0c31756924a2 193 }
Helmut64 0:0c31756924a2 194 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 195 UpdateDisplay(false);
Helmut64 0:0c31756924a2 196 #endif
Helmut64 0:0c31756924a2 197 }
Helmut64 0:0c31756924a2 198
Helmut64 0:0c31756924a2 199 void
Helmut64 0:0c31756924a2 200 MyRadioStatus::MessageTimeout(int App, int toStation)
Helmut64 0:0c31756924a2 201 {
Helmut64 0:0c31756924a2 202 UNUSED(App);
Helmut64 0:0c31756924a2 203 UNUSED(toStation);
Helmut64 0:0c31756924a2 204 if (ledTimeout)
Helmut64 0:0c31756924a2 205 *ledTimeout = 1;
Helmut64 0:0c31756924a2 206 _totalTimeout++;
Helmut64 0:0c31756924a2 207 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 208 UpdateDisplay(false);
Helmut64 0:0c31756924a2 209 #endif
Helmut64 0:0c31756924a2 210 }
Helmut64 0:0c31756924a2 211
Helmut64 0:0c31756924a2 212
Helmut64 0:0c31756924a2 213 void
Helmut64 0:0c31756924a2 214 MyRadioStatus::UpdateDisplay(bool invertDisplay)
Helmut64 0:0c31756924a2 215 {
Helmut64 0:0c31756924a2 216 UNUSED(invertDisplay);
Helmut64 0:0c31756924a2 217 #ifdef ARDUINO_Heltec_WIFI_LoRa_32
Helmut64 0:0c31756924a2 218 int yoff = 0;
Helmut64 0:0c31756924a2 219 int hight = 12;
Helmut64 0:0c31756924a2 220 time_t t = time(NULL);
Helmut64 0:0c31756924a2 221 struct tm mytm;
Helmut64 0:0c31756924a2 222 localtime_r(&t, &mytm);
Helmut64 0:0c31756924a2 223
Helmut64 0:0c31756924a2 224 snprintf(_line1, sizeof(_line1), "%s (%d) %02d:%02d:%02d", _radioType, _stationID,
Helmut64 0:0c31756924a2 225 mytm.tm_hour, mytm.tm_min, mytm.tm_sec);
Helmut64 0:0c31756924a2 226 snprintf(_line4, sizeof(_line4), "Packets RX(%d) TX(%d)", _totalRX, _totalTX);
Helmut64 0:0c31756924a2 227 snprintf(_line5, sizeof(_line5), "RXErr(%d) TOut(%d) %.2f %d", _totalError, _totalTimeout, (double)_frequency/1000000.0, _spreadingFactor);
Helmut64 0:0c31756924a2 228
Helmut64 0:0c31756924a2 229 if (invertDisplay)
Helmut64 0:0c31756924a2 230 display->invertDisplay();
Helmut64 0:0c31756924a2 231 else
Helmut64 0:0c31756924a2 232 display->normalDisplay();
Helmut64 0:0c31756924a2 233
Helmut64 0:0c31756924a2 234 display->setFont(ArialMT_Plain_10);
Helmut64 0:0c31756924a2 235 display->clear();
Helmut64 0:0c31756924a2 236
Helmut64 0:0c31756924a2 237 display->drawString(0, yoff, String(_line1));
Helmut64 0:0c31756924a2 238 yoff += hight;
Helmut64 0:0c31756924a2 239 display->drawString(0, yoff, String(_line2));
Helmut64 0:0c31756924a2 240 yoff += hight;
Helmut64 0:0c31756924a2 241 display->drawString(0, yoff, String(_line3));
Helmut64 0:0c31756924a2 242 yoff += hight;
Helmut64 0:0c31756924a2 243 display->drawString(0, yoff, String(_line4));
Helmut64 0:0c31756924a2 244 yoff += hight;
Helmut64 0:0c31756924a2 245
Helmut64 0:0c31756924a2 246 display->display();
Helmut64 0:0c31756924a2 247 #endif
Helmut64 0:0c31756924a2 248 }
Helmut64 0:0c31756924a2 249
Helmut64 0:0c31756924a2 250 #endif // FEATURE_LORA