RadioShuttle Lib for the STM32 L4 Heltec Board

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Wed Apr 10 16:05:31 2019 +0200
Revision:
12:11b2d36e9217
Parent:
0:0c31756924a2
Child:
13:591254bed18b
Merged update RadioStatus

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
Helmut Tschemernjak 12:11b2d36e9217 74 #ifdef HAS_HELTEC_LoRa_DISPLAY
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;
Helmut Tschemernjak 12:11b2d36e9217 81 #ifndef DISPLAY_ADDRESS
Helmut Tschemernjak 12:11b2d36e9217 82 #define DISPLAY_ADDRESS 0x3c
Helmut Tschemernjak 12:11b2d36e9217 83 #define DISPLAY_SDA 4
Helmut Tschemernjak 12:11b2d36e9217 84 #define DISPLAY_SCL 15
Helmut Tschemernjak 12:11b2d36e9217 85 #endif
Helmut Tschemernjak 12:11b2d36e9217 86 #ifdef DISPLAY_RESET
Helmut64 0:0c31756924a2 87 #define DISPLAY_RESET 16
Helmut64 0:0c31756924a2 88 displayReset = new DigitalOut(DISPLAY_RESET);
Helmut Tschemernjak 12:11b2d36e9217 89 #endif
Helmut64 0:0c31756924a2 90 *displayReset = 0;
Helmut64 0:0c31756924a2 91 wait_ms(50);
Helmut64 0:0c31756924a2 92 *displayReset = 1;
Helmut Tschemernjak 12:11b2d36e9217 93 display = new SSD1306(DISPLAY_ADDRESS, DISPLAY_SDA, DISPLAY_SCL);
Helmut64 0:0c31756924a2 94 display->init();
Helmut64 0:0c31756924a2 95 // display->flipScreenVertically();
Helmut64 0:0c31756924a2 96 display->setFont(ArialMT_Plain_16); // ArialMT_Plain_10);
Helmut64 0:0c31756924a2 97 display->clear();
Helmut64 0:0c31756924a2 98 display->drawString(0, 0, "RadioShuttle 1.4");
Helmut64 0:0c31756924a2 99 display->setFont(ArialMT_Plain_10);
Helmut64 0:0c31756924a2 100 int yoff = 17;
Helmut64 0:0c31756924a2 101 display->drawString(0, yoff, "Peer-to-Peer LoRa Protcol");
Helmut64 0:0c31756924a2 102 yoff += 12;
Helmut64 0:0c31756924a2 103 display->drawString(0, yoff, "Efficient, Fast, Secure");
Helmut64 0:0c31756924a2 104 yoff += 12;
Helmut64 0:0c31756924a2 105 display->drawString(0, yoff, "www.radioshuttle.de");
Helmut64 0:0c31756924a2 106 display->display();
Helmut64 0:0c31756924a2 107 #endif
Helmut64 0:0c31756924a2 108 }
Helmut64 0:0c31756924a2 109
Helmut64 0:0c31756924a2 110 MyRadioStatus::~MyRadioStatus()
Helmut64 0:0c31756924a2 111 {
Helmut64 0:0c31756924a2 112 if (ledTX) {
Helmut64 0:0c31756924a2 113 if (inverted)
Helmut64 0:0c31756924a2 114 *ledTX = 1;
Helmut64 0:0c31756924a2 115 else
Helmut64 0:0c31756924a2 116 *ledTX = 0;
Helmut64 0:0c31756924a2 117 delete ledTX;
Helmut64 0:0c31756924a2 118 }
Helmut64 0:0c31756924a2 119 if (ledRX) {
Helmut64 0:0c31756924a2 120 if (inverted)
Helmut64 0:0c31756924a2 121 *ledRX = 1;
Helmut64 0:0c31756924a2 122 else
Helmut64 0:0c31756924a2 123 *ledRX = 0;
Helmut64 0:0c31756924a2 124 delete ledRX;
Helmut64 0:0c31756924a2 125 }
Helmut64 0:0c31756924a2 126 if (ledTimeout) {
Helmut64 0:0c31756924a2 127 if (inverted)
Helmut64 0:0c31756924a2 128 *ledTimeout = 1;
Helmut64 0:0c31756924a2 129 else
Helmut64 0:0c31756924a2 130 *ledTimeout = 0;
Helmut64 0:0c31756924a2 131 delete ledTimeout;
Helmut64 0:0c31756924a2 132 }
Helmut64 0:0c31756924a2 133 }
Helmut64 0:0c31756924a2 134
Helmut64 0:0c31756924a2 135 void
Helmut64 0:0c31756924a2 136 MyRadioStatus::TXStart(int AppID, int toStation, int length, int dBm)
Helmut64 0:0c31756924a2 137 {
Helmut64 0:0c31756924a2 138 UNUSED(AppID);
Helmut64 0:0c31756924a2 139 UNUSED(toStation);
Helmut64 0:0c31756924a2 140 UNUSED(length);
Helmut64 0:0c31756924a2 141 UNUSED(dBm);
Helmut64 0:0c31756924a2 142 if (ledTX) {
Helmut64 0:0c31756924a2 143 if (inverted)
Helmut64 0:0c31756924a2 144 *ledTX = 0;
Helmut64 0:0c31756924a2 145 else
Helmut64 0:0c31756924a2 146 *ledTX = 1;
Helmut64 0:0c31756924a2 147 }
Helmut Tschemernjak 12:11b2d36e9217 148 #ifdef HAS_HELTEC_LoRa_DISPLAY
Helmut64 0:0c31756924a2 149 snprintf(_line2, sizeof(_line2), "TX(%d) ID(%d) %d dBm", length, toStation, dBm);
Helmut64 0:0c31756924a2 150 UpdateDisplay(true);
Helmut64 0:0c31756924a2 151 #endif
Helmut64 0:0c31756924a2 152 _totalTX++;
Helmut64 0:0c31756924a2 153 }
Helmut64 0:0c31756924a2 154
Helmut64 0:0c31756924a2 155 void
Helmut64 0:0c31756924a2 156 MyRadioStatus::TXComplete(void)
Helmut64 0:0c31756924a2 157 {
Helmut64 0:0c31756924a2 158 if (ledTX) {
Helmut64 0:0c31756924a2 159 if (inverted)
Helmut64 0:0c31756924a2 160 *ledTX = 1;
Helmut64 0:0c31756924a2 161 else
Helmut64 0:0c31756924a2 162 *ledTX = 0;
Helmut64 0:0c31756924a2 163 }
Helmut Tschemernjak 12:11b2d36e9217 164 #ifdef HAS_HELTEC_LoRa_DISPLAY
Helmut64 0:0c31756924a2 165 UpdateDisplay(false);
Helmut64 0:0c31756924a2 166 #endif
Helmut64 0:0c31756924a2 167 }
Helmut64 0:0c31756924a2 168
Helmut64 0:0c31756924a2 169 void
Helmut64 0:0c31756924a2 170 MyRadioStatus::RxDone(int size, int rssi, int snr)
Helmut64 0:0c31756924a2 171 {
Helmut64 0:0c31756924a2 172 UNUSED(size);
Helmut64 0:0c31756924a2 173 UNUSED(rssi);
Helmut64 0:0c31756924a2 174 UNUSED(snr);
Helmut64 0:0c31756924a2 175 if (ledRX) {
Helmut64 0:0c31756924a2 176 if (inverted)
Helmut64 0:0c31756924a2 177 *ledRX = 0;
Helmut64 0:0c31756924a2 178 else
Helmut64 0:0c31756924a2 179 *ledRX = 1;
Helmut64 0:0c31756924a2 180 }
Helmut64 0:0c31756924a2 181 _totalRX++;
Helmut Tschemernjak 12:11b2d36e9217 182 #ifdef HAS_HELTEC_LoRa_DISPLAY
Helmut64 0:0c31756924a2 183 snprintf(_line3, sizeof(_line3), "RX(%d) RSSI(%d) SNR(%d)", size, rssi, snr);
Helmut64 0:0c31756924a2 184 UpdateDisplay(true);
Helmut64 0:0c31756924a2 185 #endif
Helmut64 0:0c31756924a2 186 }
Helmut64 0:0c31756924a2 187
Helmut64 0:0c31756924a2 188 void
Helmut64 0:0c31756924a2 189 MyRadioStatus::RxCompleted(void)
Helmut64 0:0c31756924a2 190 {
Helmut64 0:0c31756924a2 191 if (ledRX) {
Helmut64 0:0c31756924a2 192 if (inverted)
Helmut64 0:0c31756924a2 193 *ledRX = 1;
Helmut64 0:0c31756924a2 194 else
Helmut64 0:0c31756924a2 195 *ledRX = 0;
Helmut64 0:0c31756924a2 196 }
Helmut Tschemernjak 12:11b2d36e9217 197 #ifdef HAS_HELTEC_LoRa_DISPLAY
Helmut64 0:0c31756924a2 198 UpdateDisplay(false);
Helmut64 0:0c31756924a2 199 #endif
Helmut64 0:0c31756924a2 200 }
Helmut64 0:0c31756924a2 201
Helmut64 0:0c31756924a2 202 void
Helmut64 0:0c31756924a2 203 MyRadioStatus::MessageTimeout(int App, int toStation)
Helmut64 0:0c31756924a2 204 {
Helmut64 0:0c31756924a2 205 UNUSED(App);
Helmut64 0:0c31756924a2 206 UNUSED(toStation);
Helmut64 0:0c31756924a2 207 if (ledTimeout)
Helmut64 0:0c31756924a2 208 *ledTimeout = 1;
Helmut64 0:0c31756924a2 209 _totalTimeout++;
Helmut Tschemernjak 12:11b2d36e9217 210 #ifdef HAS_HELTEC_LoRa_DISPLAY
Helmut64 0:0c31756924a2 211 UpdateDisplay(false);
Helmut64 0:0c31756924a2 212 #endif
Helmut64 0:0c31756924a2 213 }
Helmut64 0:0c31756924a2 214
Helmut64 0:0c31756924a2 215
Helmut64 0:0c31756924a2 216 void
Helmut64 0:0c31756924a2 217 MyRadioStatus::UpdateDisplay(bool invertDisplay)
Helmut64 0:0c31756924a2 218 {
Helmut64 0:0c31756924a2 219 UNUSED(invertDisplay);
Helmut Tschemernjak 12:11b2d36e9217 220 #ifdef HAS_HELTEC_LoRa_DISPLAY
Helmut64 0:0c31756924a2 221 int yoff = 0;
Helmut64 0:0c31756924a2 222 int hight = 12;
Helmut64 0:0c31756924a2 223 time_t t = time(NULL);
Helmut64 0:0c31756924a2 224 struct tm mytm;
Helmut64 0:0c31756924a2 225 localtime_r(&t, &mytm);
Helmut64 0:0c31756924a2 226
Helmut64 0:0c31756924a2 227 snprintf(_line1, sizeof(_line1), "%s (%d) %02d:%02d:%02d", _radioType, _stationID,
Helmut64 0:0c31756924a2 228 mytm.tm_hour, mytm.tm_min, mytm.tm_sec);
Helmut64 0:0c31756924a2 229 snprintf(_line4, sizeof(_line4), "Packets RX(%d) TX(%d)", _totalRX, _totalTX);
Helmut64 0:0c31756924a2 230 snprintf(_line5, sizeof(_line5), "RXErr(%d) TOut(%d) %.2f %d", _totalError, _totalTimeout, (double)_frequency/1000000.0, _spreadingFactor);
Helmut64 0:0c31756924a2 231
Helmut64 0:0c31756924a2 232 if (invertDisplay)
Helmut64 0:0c31756924a2 233 display->invertDisplay();
Helmut64 0:0c31756924a2 234 else
Helmut64 0:0c31756924a2 235 display->normalDisplay();
Helmut64 0:0c31756924a2 236
Helmut64 0:0c31756924a2 237 display->setFont(ArialMT_Plain_10);
Helmut64 0:0c31756924a2 238 display->clear();
Helmut64 0:0c31756924a2 239
Helmut64 0:0c31756924a2 240 display->drawString(0, yoff, String(_line1));
Helmut64 0:0c31756924a2 241 yoff += hight;
Helmut64 0:0c31756924a2 242 display->drawString(0, yoff, String(_line2));
Helmut64 0:0c31756924a2 243 yoff += hight;
Helmut64 0:0c31756924a2 244 display->drawString(0, yoff, String(_line3));
Helmut64 0:0c31756924a2 245 yoff += hight;
Helmut64 0:0c31756924a2 246 display->drawString(0, yoff, String(_line4));
Helmut64 0:0c31756924a2 247 yoff += hight;
Helmut64 0:0c31756924a2 248
Helmut64 0:0c31756924a2 249 display->display();
Helmut64 0:0c31756924a2 250 #endif
Helmut64 0:0c31756924a2 251 }
Helmut64 0:0c31756924a2 252
Helmut64 0:0c31756924a2 253 #endif // FEATURE_LORA