An example project for the Heltec Turtle LoRa board (STM32L4 and SX1276 chips). The projects is only supported for the Nucleo-L432KC board platform in the mbed online and offline compiler environment. Visit www.radioshuttle.de (choose Turtle board) for instructions. Note that most source files and libraries are open source, however some files especially the RadioShuttle core protocol is copyrighted work. Check header for details.

Dependencies:   mbed BufferedSerial SX1276GenericLib OLED_SSD1306 HELIOS_Si7021 NVProperty RadioShuttle-STM32L4 USBDeviceHT

Committer:
Helmut Tschemernjak
Date:
Sun Feb 24 14:57:36 2019 +0100
Revision:
45:22bb680cad5a
Parent:
43:ec1b7aa823a6
Child:
47:59a9923a9f77
Added support that InitSerial gets the intr pointer to allow
to about 30 seconds USB waiting when a user clicks the user
button
The main loop does not need to avoid sleeps on active USB
connections because USB CDC will use the sleep manager to
indicate active CDC sessions to avoid deespsleep().
Updated USBDeviceHT.lib with sleep manager support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut64 0:3b6c2ce051a6 1 /*
Helmut Tschemernjak 1:56fdc660a26a 2 * Copyright (c) 2019 Helmut Tschemernjak
Helmut64 0:3b6c2ce051a6 3 * 30826 Garbsen (Hannover) Germany
Helmut64 0:3b6c2ce051a6 4 */
Helmut Tschemernjak 1:56fdc660a26a 5 #include "main.h"
Helmut Tschemernjak 37:77fa81e4ad79 6 #include "GenericPingPong.h"
Helmut Tschemernjak 41:ace9b25f571b 7 #include "RadioTest.h"
Helmut Tschemernjak 37:77fa81e4ad79 8 #ifdef TOOLCHAIN_GCC
Helmut Tschemernjak 37:77fa81e4ad79 9 #include <malloc.h>
Helmut Tschemernjak 37:77fa81e4ad79 10 #endif
Helmut Tschemernjak 5:c6a960febe80 11
Helmut Tschemernjak 5:c6a960febe80 12 volatile uint32_t PendingInterrupts; // global interrupt mask of received interrupts
Helmut Tschemernjak 5:c6a960febe80 13
Helmut64 0:3b6c2ce051a6 14 time_t cvt_date(char const *date, char const *time);
Helmut64 0:3b6c2ce051a6 15
Helmut Tschemernjak 37:77fa81e4ad79 16 static float GetBrownOutVolt(void);
Helmut Tschemernjak 37:77fa81e4ad79 17
Helmut64 0:3b6c2ce051a6 18 BufferedSerial *ser;
Helmut64 0:3b6c2ce051a6 19 #ifdef FEATURE_USBSERIAL
Helmut64 0:3b6c2ce051a6 20 USBSerialBuffered *usb;
Helmut64 0:3b6c2ce051a6 21 #endif
Helmut64 0:3b6c2ce051a6 22 bool _useDprintf;
Helmut64 0:3b6c2ce051a6 23
Helmut Tschemernjak 45:22bb680cad5a 24 void InitSerial(int timeout, DigitalOut *led, InterruptIn *intr)
Helmut64 0:3b6c2ce051a6 25 {
Helmut64 0:3b6c2ce051a6 26 _useDprintf = true;
Helmut Tschemernjak 33:617765dcce6c 27 bool uartActive = true;
Helmut Tschemernjak 33:617765dcce6c 28
Helmut64 0:3b6c2ce051a6 29 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 33:617765dcce6c 30 DigitalOut rx(USBRX); // need to turn rx low to avoid floating signal
Helmut Tschemernjak 33:617765dcce6c 31 rx = 0;
Helmut Tschemernjak 33:617765dcce6c 32 DigitalIn uartRX(USBRX);
Helmut Tschemernjak 33:617765dcce6c 33 uartActive = uartRX.read();
Helmut64 0:3b6c2ce051a6 34 if (!uartActive) {
Helmut64 0:3b6c2ce051a6 35 usb = new USBSerialBuffered();
Helmut64 0:3b6c2ce051a6 36 Timer t;
Helmut64 0:3b6c2ce051a6 37 t.start();
Helmut64 0:3b6c2ce051a6 38 while(!usb->connected()) {
Helmut64 0:3b6c2ce051a6 39 if (led)
Helmut64 0:3b6c2ce051a6 40 *led = !*led;
Helmut64 0:3b6c2ce051a6 41 wait_ms(100);
Helmut64 0:3b6c2ce051a6 42 if (timeout) {
Helmut Tschemernjak 45:22bb680cad5a 43 if (t.read_ms() >= timeout || (intr && intr->read())) {
Helmut Tschemernjak 5:c6a960febe80 44 delete usb;
Helmut Tschemernjak 5:c6a960febe80 45 usb = NULL;
Helmut Tschemernjak 5:c6a960febe80 46 DigitalOut rx(USBRX);
Helmut Tschemernjak 5:c6a960febe80 47 rx = 0; // need to turn tx low to avoid floating signal
Helmut Tschemernjak 39:ee20fe5c9253 48 break;
Helmut Tschemernjak 5:c6a960febe80 49 }
Helmut Tschemernjak 33:617765dcce6c 50 }
Helmut Tschemernjak 33:617765dcce6c 51 }
Helmut Tschemernjak 33:617765dcce6c 52 }
Helmut64 0:3b6c2ce051a6 53 #endif
Helmut Tschemernjak 33:617765dcce6c 54 if (uartActive) {
Helmut64 0:3b6c2ce051a6 55 ser = new BufferedSerial(USBTX, USBRX);
Helmut64 0:3b6c2ce051a6 56 ser->baud(230400);
Helmut64 0:3b6c2ce051a6 57 ser->format(8);
Helmut64 0:3b6c2ce051a6 58 }
Helmut Tschemernjak 33:617765dcce6c 59
Helmut64 0:3b6c2ce051a6 60 time_t t = cvt_date(__DATE__, __TIME__);
Helmut64 0:3b6c2ce051a6 61 if (t > time(NULL)) {
Helmut64 0:3b6c2ce051a6 62 set_time(t);
Helmut64 0:3b6c2ce051a6 63 }
Helmut64 0:3b6c2ce051a6 64 }
Helmut64 0:3b6c2ce051a6 65
Helmut Tschemernjak 37:77fa81e4ad79 66 void RunStartup(void)
Helmut Tschemernjak 37:77fa81e4ad79 67 {
Helmut Tschemernjak 37:77fa81e4ad79 68 rprintf("\r\n");
Helmut Tschemernjak 37:77fa81e4ad79 69 int mbedversion = 9999;
Helmut Tschemernjak 37:77fa81e4ad79 70 #ifdef MBED_LIBRARY_VERSION // not available in mbed head compiles
Helmut Tschemernjak 37:77fa81e4ad79 71 mbedversion = MBED_LIBRARY_VERSION;
Helmut Tschemernjak 37:77fa81e4ad79 72 #endif
Helmut Tschemernjak 37:77fa81e4ad79 73 dprintf("Turtle: %d.%d (%s %s mbed: v%d)", MAJOR_VERSION, MINOR_VERSION, __DATE__, __TIME__, mbedversion);
Helmut Tschemernjak 37:77fa81e4ad79 74
Helmut Tschemernjak 37:77fa81e4ad79 75 dprintf("SysClock: %u Hz.", (unsigned int)SystemCoreClock);
Helmut Tschemernjak 37:77fa81e4ad79 76 #ifdef __ARMCC_VERSION
Helmut Tschemernjak 37:77fa81e4ad79 77 dprintf("ARM Compiler Version: 0x%x", __ARMCC_VERSION);
Helmut Tschemernjak 37:77fa81e4ad79 78 #elif __GNUC__
Helmut Tschemernjak 37:77fa81e4ad79 79 dprintf("GCC Compiler Version: %d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
Helmut Tschemernjak 37:77fa81e4ad79 80 #endif
Helmut Tschemernjak 37:77fa81e4ad79 81
Helmut Tschemernjak 37:77fa81e4ad79 82 const char *errstr;
Helmut Tschemernjak 37:77fa81e4ad79 83 if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET)
Helmut Tschemernjak 37:77fa81e4ad79 84 errstr = "RESET OCCURRED";
Helmut Tschemernjak 37:77fa81e4ad79 85 else
Helmut Tschemernjak 37:77fa81e4ad79 86 errstr = "initalized";
Helmut Tschemernjak 37:77fa81e4ad79 87
Helmut Tschemernjak 37:77fa81e4ad79 88 dprintf("Brown Out Reset %s (%1.1f V)", errstr, GetBrownOutVolt());
Helmut Tschemernjak 37:77fa81e4ad79 89 dprintf("Voltage: %.2f (%s powered)", BatteryVoltage(), BatterySource());
Helmut Tschemernjak 37:77fa81e4ad79 90
Helmut Tschemernjak 37:77fa81e4ad79 91 dprintf("InitDefaults Done");
Helmut Tschemernjak 37:77fa81e4ad79 92 MemoryAvailable(true);
Helmut Tschemernjak 37:77fa81e4ad79 93
Helmut Tschemernjak 37:77fa81e4ad79 94 __HAL_RCC_CLEAR_RESET_FLAGS();
Helmut Tschemernjak 37:77fa81e4ad79 95 }
Helmut64 0:3b6c2ce051a6 96 void printTimeStamp()
Helmut64 0:3b6c2ce051a6 97 {
Helmut64 0:3b6c2ce051a6 98 static LowPowerTimer *timer;
Helmut64 0:3b6c2ce051a6 99 if (!timer) {
Helmut64 0:3b6c2ce051a6 100 timer = new LowPowerTimer();
Helmut64 0:3b6c2ce051a6 101 timer->start();
Helmut64 0:3b6c2ce051a6 102 }
Helmut64 0:3b6c2ce051a6 103 time_t seconds = time(NULL);
Helmut64 0:3b6c2ce051a6 104 struct tm *tm = localtime(&seconds);
Helmut64 0:3b6c2ce051a6 105 int usecs = timer->read_us();
Helmut64 0:3b6c2ce051a6 106 if (usecs < 0) {
Helmut64 0:3b6c2ce051a6 107 usecs = 0;
Helmut64 0:3b6c2ce051a6 108 timer->stop();
Helmut64 0:3b6c2ce051a6 109 timer->reset();
Helmut64 0:3b6c2ce051a6 110 timer->start();
Helmut64 0:3b6c2ce051a6 111 }
Helmut64 0:3b6c2ce051a6 112 int msecs = usecs % 1000000;
Helmut64 0:3b6c2ce051a6 113
Helmut64 0:3b6c2ce051a6 114 rprintf("%02d:%02d:%02d.%06d ", tm->tm_hour, tm->tm_min, tm->tm_sec, msecs);
Helmut64 0:3b6c2ce051a6 115 }
Helmut64 0:3b6c2ce051a6 116
Helmut64 0:3b6c2ce051a6 117 void dprintf(const char *format, ...)
Helmut64 0:3b6c2ce051a6 118 {
Helmut64 0:3b6c2ce051a6 119 std::va_list arg;
Helmut64 0:3b6c2ce051a6 120
Helmut64 0:3b6c2ce051a6 121 va_start(arg, format);
Helmut64 0:3b6c2ce051a6 122 VAprintf(true, true, _useDprintf, format, arg);
Helmut64 0:3b6c2ce051a6 123 va_end(arg);
Helmut64 0:3b6c2ce051a6 124 }
Helmut64 0:3b6c2ce051a6 125
Helmut64 0:3b6c2ce051a6 126 void rprintf(const char *format, ...)
Helmut64 0:3b6c2ce051a6 127 {
Helmut64 0:3b6c2ce051a6 128 std::va_list arg;
Helmut64 0:3b6c2ce051a6 129
Helmut64 0:3b6c2ce051a6 130 va_start(arg, format);
Helmut64 0:3b6c2ce051a6 131 VAprintf(false, false, _useDprintf, format, arg);
Helmut64 0:3b6c2ce051a6 132 va_end(arg);
Helmut64 0:3b6c2ce051a6 133 }
Helmut64 0:3b6c2ce051a6 134
Helmut64 0:3b6c2ce051a6 135 void VAprintf(bool timstamp, bool newline, bool printEnabled, const char *format, va_list arg)
Helmut64 0:3b6c2ce051a6 136 {
Helmut64 0:3b6c2ce051a6 137 if (!printEnabled)
Helmut64 0:3b6c2ce051a6 138 return;
Helmut64 0:3b6c2ce051a6 139
Helmut64 0:3b6c2ce051a6 140 if (timstamp)
Helmut64 0:3b6c2ce051a6 141 printTimeStamp();
Helmut64 0:3b6c2ce051a6 142 #ifdef FEATURE_USBSERIAL
Helmut64 0:3b6c2ce051a6 143 if (usb) {
Helmut64 0:3b6c2ce051a6 144 usb->vprintf_irqsafe(format, arg);
Helmut64 0:3b6c2ce051a6 145 if (newline)
Helmut64 0:3b6c2ce051a6 146 usb->printf_irqsafe("\r\n");
Helmut Tschemernjak 33:617765dcce6c 147 }
Helmut64 0:3b6c2ce051a6 148 #endif
Helmut Tschemernjak 33:617765dcce6c 149 if (ser) {
Helmut64 0:3b6c2ce051a6 150 // serial jas
Helmut64 0:3b6c2ce051a6 151 int r = 0;
Helmut64 0:3b6c2ce051a6 152 r = vsnprintf(NULL, 0, format, arg);
Helmut64 0:3b6c2ce051a6 153 if (r < 82) {
Helmut64 0:3b6c2ce051a6 154 char buffer[82+1];
Helmut64 0:3b6c2ce051a6 155
Helmut64 0:3b6c2ce051a6 156 vsnprintf(buffer, sizeof(buffer), format, arg);
Helmut64 0:3b6c2ce051a6 157 r = ser->write(buffer, r);
Helmut64 0:3b6c2ce051a6 158 } else {
Helmut64 0:3b6c2ce051a6 159 char *buffer = new char[r+1];
Helmut64 0:3b6c2ce051a6 160 if (buffer) {
Helmut64 0:3b6c2ce051a6 161 vsnprintf(buffer, r+1, format, arg);
Helmut64 0:3b6c2ce051a6 162 r = ser->write(buffer, r);
Helmut64 0:3b6c2ce051a6 163 delete[] buffer;
Helmut64 0:3b6c2ce051a6 164 } else {
Helmut64 0:3b6c2ce051a6 165 error("%s %d cannot alloc memory (%d bytes)!\r\n", __FILE__, __LINE__, r+1);
Helmut64 0:3b6c2ce051a6 166 r = 0;
Helmut64 0:3b6c2ce051a6 167 }
Helmut64 0:3b6c2ce051a6 168 }
Helmut64 0:3b6c2ce051a6 169 if (newline)
Helmut64 0:3b6c2ce051a6 170 ser->write("\r\n", 2);
Helmut64 0:3b6c2ce051a6 171 }
Helmut64 0:3b6c2ce051a6 172 }
Helmut64 0:3b6c2ce051a6 173
Helmut Tschemernjak 22:9cca40fcb25e 174 char *ConsoleReadline(char *buf, int buflen, bool echo, int timeout_ms)
Helmut Tschemernjak 14:d9340be18c3d 175 {
Helmut Tschemernjak 14:d9340be18c3d 176 int count = 0;
Helmut Tschemernjak 14:d9340be18c3d 177 memset(buf, 0, buflen);
Helmut Tschemernjak 14:d9340be18c3d 178
Helmut Tschemernjak 33:617765dcce6c 179 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 22:9cca40fcb25e 180 if (usb == NULL && ser == NULL)
Helmut Tschemernjak 22:9cca40fcb25e 181 return NULL;
Helmut Tschemernjak 33:617765dcce6c 182 #else
Helmut Tschemernjak 33:617765dcce6c 183 if (ser == NULL)
Helmut Tschemernjak 33:617765dcce6c 184 return NULL;
Helmut Tschemernjak 33:617765dcce6c 185 #endif
Helmut Tschemernjak 22:9cca40fcb25e 186
Helmut Tschemernjak 22:9cca40fcb25e 187 Timer t;
Helmut Tschemernjak 22:9cca40fcb25e 188 int start = 0;
Helmut Tschemernjak 22:9cca40fcb25e 189 if (timeout_ms) {
Helmut Tschemernjak 22:9cca40fcb25e 190 t.start();
Helmut Tschemernjak 22:9cca40fcb25e 191 start = t.read_ms();
Helmut Tschemernjak 22:9cca40fcb25e 192 }
Helmut Tschemernjak 22:9cca40fcb25e 193
Helmut Tschemernjak 33:617765dcce6c 194 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 22:9cca40fcb25e 195 if (usb) {
Helmut Tschemernjak 14:d9340be18c3d 196 usb->flush();
Helmut Tschemernjak 14:d9340be18c3d 197 while(usb->readable())
Helmut Tschemernjak 14:d9340be18c3d 198 usb->getc(); // flush old chars
Helmut Tschemernjak 14:d9340be18c3d 199 }
Helmut Tschemernjak 33:617765dcce6c 200 #endif
Helmut Tschemernjak 14:d9340be18c3d 201 if (ser) {
Helmut Tschemernjak 14:d9340be18c3d 202 while(ser->readable())
Helmut Tschemernjak 14:d9340be18c3d 203 ser->getc(); // flush old chars
Helmut Tschemernjak 22:9cca40fcb25e 204 }
Helmut Tschemernjak 14:d9340be18c3d 205
Helmut Tschemernjak 22:9cca40fcb25e 206 while(true) {
Helmut Tschemernjak 22:9cca40fcb25e 207 if (timeout_ms && t.read_ms() - start > timeout_ms)
Helmut Tschemernjak 22:9cca40fcb25e 208 return NULL;
Helmut Tschemernjak 22:9cca40fcb25e 209 int c = -2;
Helmut Tschemernjak 33:617765dcce6c 210 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 22:9cca40fcb25e 211 if (usb && usb->readable())
Helmut Tschemernjak 22:9cca40fcb25e 212 c = usb->getc();
Helmut Tschemernjak 33:617765dcce6c 213 #endif
Helmut Tschemernjak 22:9cca40fcb25e 214 if (ser && ser->readable())
Helmut Tschemernjak 22:9cca40fcb25e 215 c = ser->getc();
Helmut Tschemernjak 22:9cca40fcb25e 216 if (c == -2)
Helmut Tschemernjak 22:9cca40fcb25e 217 continue;
Helmut Tschemernjak 22:9cca40fcb25e 218
Helmut Tschemernjak 22:9cca40fcb25e 219 if (c == 0 || c == -1 || c == '\r' || c == '\n' || c == 3 || c == 4)
Helmut Tschemernjak 22:9cca40fcb25e 220 break;
Helmut Tschemernjak 22:9cca40fcb25e 221 if (c == '\b' || c == 0x7f) { // backspace
Helmut Tschemernjak 22:9cca40fcb25e 222 if (count < 1)
Helmut Tschemernjak 22:9cca40fcb25e 223 continue;
Helmut Tschemernjak 22:9cca40fcb25e 224 buf[--count] = 0;
Helmut Tschemernjak 22:9cca40fcb25e 225 if (echo)
Helmut Tschemernjak 22:9cca40fcb25e 226 rprintf("\b \b");
Helmut Tschemernjak 33:617765dcce6c 227 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 22:9cca40fcb25e 228 if (usb)
Helmut Tschemernjak 22:9cca40fcb25e 229 usb->flush();
Helmut Tschemernjak 33:617765dcce6c 230 #endif
Helmut Tschemernjak 22:9cca40fcb25e 231 continue;
Helmut Tschemernjak 14:d9340be18c3d 232 }
Helmut Tschemernjak 22:9cca40fcb25e 233 if (echo) {
Helmut Tschemernjak 22:9cca40fcb25e 234 rprintf("%c", c);
Helmut Tschemernjak 33:617765dcce6c 235 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 22:9cca40fcb25e 236 if (usb)
Helmut Tschemernjak 22:9cca40fcb25e 237 usb->flush();
Helmut Tschemernjak 33:617765dcce6c 238 #endif
Helmut Tschemernjak 22:9cca40fcb25e 239 }
Helmut Tschemernjak 22:9cca40fcb25e 240
Helmut Tschemernjak 33:617765dcce6c 241 start = t.read_ms();
Helmut Tschemernjak 22:9cca40fcb25e 242 buf[count] = c;
Helmut Tschemernjak 22:9cca40fcb25e 243 if (count++ >= buflen-2)
Helmut Tschemernjak 22:9cca40fcb25e 244 break;
Helmut Tschemernjak 22:9cca40fcb25e 245 // dprintf("Got char: '%c'(%d)", c, c);
Helmut Tschemernjak 14:d9340be18c3d 246 }
Helmut Tschemernjak 22:9cca40fcb25e 247
Helmut Tschemernjak 14:d9340be18c3d 248 if (echo)
Helmut Tschemernjak 14:d9340be18c3d 249 rprintf("\r\n");
Helmut Tschemernjak 14:d9340be18c3d 250 if (count)
Helmut Tschemernjak 14:d9340be18c3d 251 return buf;
Helmut Tschemernjak 14:d9340be18c3d 252 return NULL;
Helmut Tschemernjak 14:d9340be18c3d 253 }
Helmut Tschemernjak 14:d9340be18c3d 254
Helmut64 0:3b6c2ce051a6 255
Helmut64 30:8bc655c9b224 256 void dump(const char *title, void *data, int len)
Helmut64 30:8bc655c9b224 257 {
Helmut64 30:8bc655c9b224 258 dump(title, data, len, false);
Helmut64 30:8bc655c9b224 259 }
Helmut64 30:8bc655c9b224 260
Helmut64 0:3b6c2ce051a6 261 void dump(const char *title, const void *data, int len, bool dwords)
Helmut64 0:3b6c2ce051a6 262 {
Helmut Tschemernjak 14:d9340be18c3d 263 dprintf("dump(\"%s\", 0x%x, %d bytes)", title, (unsigned int)data, len);
Helmut64 0:3b6c2ce051a6 264
Helmut64 0:3b6c2ce051a6 265 int i, j, cnt;
Helmut64 0:3b6c2ce051a6 266 unsigned char *u;
Helmut64 0:3b6c2ce051a6 267 const int width = 16;
Helmut64 0:3b6c2ce051a6 268 const int seppos = 7;
Helmut64 0:3b6c2ce051a6 269
Helmut64 0:3b6c2ce051a6 270 cnt = 0;
Helmut64 0:3b6c2ce051a6 271 u = (unsigned char *)data;
Helmut64 0:3b6c2ce051a6 272 while (len > 0) {
Helmut64 0:3b6c2ce051a6 273 rprintf("%08x: ", (unsigned int)data + cnt);
Helmut64 0:3b6c2ce051a6 274 if (dwords) {
Helmut64 0:3b6c2ce051a6 275 unsigned int *ip = ( unsigned int *)u;
Helmut64 0:3b6c2ce051a6 276 rprintf(" 0x%08x\r\n", *ip);
Helmut64 0:3b6c2ce051a6 277 u+= 4;
Helmut64 0:3b6c2ce051a6 278 len -= 4;
Helmut64 0:3b6c2ce051a6 279 cnt += 4;
Helmut64 0:3b6c2ce051a6 280 continue;
Helmut64 0:3b6c2ce051a6 281 }
Helmut64 0:3b6c2ce051a6 282 cnt += width;
Helmut64 0:3b6c2ce051a6 283 j = len < width ? len : width;
Helmut64 0:3b6c2ce051a6 284 for (i = 0; i < j; i++) {
Helmut64 0:3b6c2ce051a6 285 rprintf("%2.2x ", *(u + i));
Helmut64 0:3b6c2ce051a6 286 if (i == seppos)
Helmut64 0:3b6c2ce051a6 287 rprintf(" ");
Helmut64 0:3b6c2ce051a6 288 }
Helmut64 0:3b6c2ce051a6 289 rprintf(" ");
Helmut64 0:3b6c2ce051a6 290 if (j < width) {
Helmut64 0:3b6c2ce051a6 291 i = width - j;
Helmut64 0:3b6c2ce051a6 292 if (i > seppos + 1)
Helmut64 0:3b6c2ce051a6 293 rprintf(" ");
Helmut64 0:3b6c2ce051a6 294 while (i--) {
Helmut64 0:3b6c2ce051a6 295 rprintf("%s", " ");
Helmut64 0:3b6c2ce051a6 296 }
Helmut64 0:3b6c2ce051a6 297 }
Helmut64 0:3b6c2ce051a6 298 for (i = 0; i < j; i++) {
Helmut64 0:3b6c2ce051a6 299 int c = *(u + i);
Helmut64 0:3b6c2ce051a6 300 if (c >= ' ' && c <= '~')
Helmut64 0:3b6c2ce051a6 301 rprintf("%c", c);
Helmut64 0:3b6c2ce051a6 302 else
Helmut64 0:3b6c2ce051a6 303 rprintf(".");
Helmut64 0:3b6c2ce051a6 304 if (i == seppos)
Helmut64 0:3b6c2ce051a6 305 rprintf(" ");
Helmut64 0:3b6c2ce051a6 306 }
Helmut64 0:3b6c2ce051a6 307 len -= width;
Helmut64 0:3b6c2ce051a6 308 u += width;
Helmut64 0:3b6c2ce051a6 309 rprintf("\r\n");
Helmut Tschemernjak 22:9cca40fcb25e 310 if (ser)
Helmut Tschemernjak 22:9cca40fcb25e 311 wait_ms(5); // give the serial some time.
Helmut64 0:3b6c2ce051a6 312 }
Helmut64 0:3b6c2ce051a6 313 rprintf("--\r\n");
Helmut64 0:3b6c2ce051a6 314 }
Helmut64 0:3b6c2ce051a6 315
Helmut64 0:3b6c2ce051a6 316 /*
Helmut64 0:3b6c2ce051a6 317 * Convert compile time to system time
Helmut64 0:3b6c2ce051a6 318 */
Helmut64 0:3b6c2ce051a6 319 time_t
Helmut64 0:3b6c2ce051a6 320 cvt_date(char const *date, char const *time)
Helmut64 0:3b6c2ce051a6 321 {
Helmut64 0:3b6c2ce051a6 322 char s_month[5];
Helmut64 0:3b6c2ce051a6 323 int year;
Helmut64 0:3b6c2ce051a6 324 struct tm t;
Helmut64 0:3b6c2ce051a6 325 static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
Helmut64 0:3b6c2ce051a6 326 sscanf(date, "%s %d %d", s_month, &t.tm_mday, &year);
Helmut64 0:3b6c2ce051a6 327 sscanf(time, "%2d %*c %2d %*c %2d", &t.tm_hour, &t.tm_min, &t.tm_sec);
Helmut64 0:3b6c2ce051a6 328 // Find where is s_month in month_names. Deduce month value.
Helmut64 0:3b6c2ce051a6 329 t.tm_mon = (strstr(month_names, s_month) - month_names) / 3;
Helmut64 0:3b6c2ce051a6 330 t.tm_year = year - 1900;
Helmut64 0:3b6c2ce051a6 331 return (int)mktime(&t);
Helmut64 0:3b6c2ce051a6 332 }
Helmut Tschemernjak 1:56fdc660a26a 333
Helmut Tschemernjak 1:56fdc660a26a 334
Helmut Tschemernjak 1:56fdc660a26a 335
Helmut Tschemernjak 1:56fdc660a26a 336 void InterrruptMSG(enum InterrruptDevice irqid) {
Helmut Tschemernjak 1:56fdc660a26a 337 help_atomic_or_relaxed(&PendingInterrupts, irqid);
Helmut Tschemernjak 1:56fdc660a26a 338 }
Helmut Tschemernjak 1:56fdc660a26a 339
Helmut Tschemernjak 1:56fdc660a26a 340
Helmut Tschemernjak 1:56fdc660a26a 341 uint32_t readclrPendingInterrupts() {
Helmut Tschemernjak 1:56fdc660a26a 342 return help_atomic_readclr_relaxed(&PendingInterrupts);
Helmut Tschemernjak 1:56fdc660a26a 343 }
Helmut Tschemernjak 1:56fdc660a26a 344
Helmut Tschemernjak 1:56fdc660a26a 345 uint32_t readPendingInterrupts() {
Helmut Tschemernjak 1:56fdc660a26a 346 return help_atomic_load_relaxed(&PendingInterrupts);
Helmut Tschemernjak 1:56fdc660a26a 347 }
Helmut Tschemernjak 1:56fdc660a26a 348
Helmut Tschemernjak 1:56fdc660a26a 349 const char *
Helmut Tschemernjak 1:56fdc660a26a 350 BatterySource(void)
Helmut Tschemernjak 1:56fdc660a26a 351 {
Helmut Tschemernjak 1:56fdc660a26a 352 const char *pwrSource = "Battery";
Helmut Tschemernjak 1:56fdc660a26a 353 #ifdef BATPOWER_EN
Helmut Tschemernjak 1:56fdc660a26a 354 {
Helmut Tschemernjak 1:56fdc660a26a 355 DigitalIn pwr(BATPOWER_EN);
Helmut Tschemernjak 1:56fdc660a26a 356 if (pwr == BATPOWER_EXT)
Helmut Tschemernjak 1:56fdc660a26a 357 pwrSource = "USB";
Helmut Tschemernjak 1:56fdc660a26a 358 }
Helmut Tschemernjak 1:56fdc660a26a 359 #endif
Helmut Tschemernjak 1:56fdc660a26a 360 return pwrSource;
Helmut Tschemernjak 1:56fdc660a26a 361 }
Helmut Tschemernjak 1:56fdc660a26a 362
Helmut Tschemernjak 22:9cca40fcb25e 363
Helmut Tschemernjak 37:77fa81e4ad79 364 float
Helmut Tschemernjak 37:77fa81e4ad79 365 GetBrownOutVolt(void)
Helmut Tschemernjak 37:77fa81e4ad79 366 {
Helmut Tschemernjak 37:77fa81e4ad79 367 unsigned int *FlashOptionRegister = (unsigned int *)0x1FFF7800;
Helmut Tschemernjak 37:77fa81e4ad79 368
Helmut Tschemernjak 37:77fa81e4ad79 369 int val = *FlashOptionRegister >> 8 & 0x7; // masking out the BOR bits 9-11
Helmut Tschemernjak 37:77fa81e4ad79 370 switch(val) {
Helmut Tschemernjak 37:77fa81e4ad79 371 case 0:
Helmut Tschemernjak 38:1f3792d6f9ec 372 return 1.7;
Helmut Tschemernjak 37:77fa81e4ad79 373 case 1:
Helmut Tschemernjak 38:1f3792d6f9ec 374 return 2.0;
Helmut Tschemernjak 37:77fa81e4ad79 375 case 2:
Helmut Tschemernjak 38:1f3792d6f9ec 376 return 2.2;
Helmut Tschemernjak 37:77fa81e4ad79 377 case 3:
Helmut Tschemernjak 38:1f3792d6f9ec 378 return 2.5;
Helmut Tschemernjak 37:77fa81e4ad79 379 case 4:
Helmut Tschemernjak 38:1f3792d6f9ec 380 return 2.8;
Helmut Tschemernjak 37:77fa81e4ad79 381 default:
Helmut Tschemernjak 38:1f3792d6f9ec 382 return 999;
Helmut Tschemernjak 37:77fa81e4ad79 383 }
Helmut Tschemernjak 37:77fa81e4ad79 384 }
Helmut Tschemernjak 37:77fa81e4ad79 385
Helmut Tschemernjak 22:9cca40fcb25e 386 void MCUReset(void)
Helmut Tschemernjak 22:9cca40fcb25e 387 {
Helmut Tschemernjak 22:9cca40fcb25e 388 #define AIRCR_VECTKEY_MASK 0x05FA0000
Helmut Tschemernjak 22:9cca40fcb25e 389 SCB->AIRCR = AIRCR_VECTKEY_MASK | 0x04; // NVIC_GenerateSystemReset();
Helmut Tschemernjak 22:9cca40fcb25e 390 }
Helmut Tschemernjak 22:9cca40fcb25e 391
Helmut Tschemernjak 38:1f3792d6f9ec 392
Helmut Tschemernjak 38:1f3792d6f9ec 393 #define FREEMEM_CELL 100
Helmut Tschemernjak 38:1f3792d6f9ec 394
Helmut Tschemernjak 38:1f3792d6f9ec 395 struct elem { /* Definition of a structure that is FREEMEM_CELL bytes in size.) */
Helmut Tschemernjak 38:1f3792d6f9ec 396 struct elem *next;
Helmut Tschemernjak 38:1f3792d6f9ec 397 char dummy[FREEMEM_CELL-2];
Helmut Tschemernjak 38:1f3792d6f9ec 398 };
Helmut Tschemernjak 38:1f3792d6f9ec 399
Helmut Tschemernjak 37:77fa81e4ad79 400 size_t
Helmut Tschemernjak 37:77fa81e4ad79 401 MemoryAvailable(bool print)
Helmut Tschemernjak 37:77fa81e4ad79 402 {
Helmut Tschemernjak 37:77fa81e4ad79 403 size_t counter;
Helmut Tschemernjak 37:77fa81e4ad79 404 #ifdef TOOLCHAIN_GCC
Helmut Tschemernjak 37:77fa81e4ad79 405 struct mallinfo mi = mallinfo();
Helmut Tschemernjak 37:77fa81e4ad79 406 extern char end[];
Helmut Tschemernjak 37:77fa81e4ad79 407 extern char _estack[];
Helmut Tschemernjak 37:77fa81e4ad79 408 counter = (_estack - end) - mi.uordblks;
Helmut Tschemernjak 37:77fa81e4ad79 409 if (print)
Helmut Tschemernjak 37:77fa81e4ad79 410 dprintf("MemoryAvailable: %d kB (%d bytes)", counter/1024, counter);
Helmut Tschemernjak 37:77fa81e4ad79 411 return counter;
Helmut Tschemernjak 37:77fa81e4ad79 412 #else
Helmut Tschemernjak 37:77fa81e4ad79 413 struct elem *head, *current, *nextone;
Helmut Tschemernjak 37:77fa81e4ad79 414 current = head = (struct elem*) malloc(sizeof(struct elem));
Helmut Tschemernjak 37:77fa81e4ad79 415 if (head == NULL)
Helmut Tschemernjak 37:77fa81e4ad79 416 return 0; /*No memory available.*/
Helmut Tschemernjak 37:77fa81e4ad79 417 counter = 0;
Helmut Tschemernjak 37:77fa81e4ad79 418 // __disable_irq();
Helmut Tschemernjak 37:77fa81e4ad79 419 do {
Helmut Tschemernjak 37:77fa81e4ad79 420 counter++;
Helmut Tschemernjak 37:77fa81e4ad79 421 current->next = (struct elem*) malloc(sizeof(struct elem));
Helmut Tschemernjak 37:77fa81e4ad79 422 current = current->next;
Helmut Tschemernjak 37:77fa81e4ad79 423 } while (current != NULL);
Helmut Tschemernjak 37:77fa81e4ad79 424 /* Now counter holds the number of type elem
Helmut Tschemernjak 37:77fa81e4ad79 425 structures we were able to allocate. We
Helmut Tschemernjak 37:77fa81e4ad79 426 must free them all before returning. */
Helmut Tschemernjak 37:77fa81e4ad79 427 current = head;
Helmut Tschemernjak 37:77fa81e4ad79 428 do {
Helmut Tschemernjak 37:77fa81e4ad79 429 nextone = current->next;
Helmut Tschemernjak 37:77fa81e4ad79 430 free(current);
Helmut Tschemernjak 37:77fa81e4ad79 431 current = nextone;
Helmut Tschemernjak 37:77fa81e4ad79 432 } while (nextone != NULL);
Helmut Tschemernjak 37:77fa81e4ad79 433 // __enable_irq();
Helmut Tschemernjak 37:77fa81e4ad79 434
Helmut Tschemernjak 37:77fa81e4ad79 435 if (print)
Helmut Tschemernjak 37:77fa81e4ad79 436 dprintf("MemoryAvailable: %d kB (%d bytes)", (counter*FREEMEM_CELL)/1024, counter*FREEMEM_CELL);
Helmut Tschemernjak 37:77fa81e4ad79 437 return counter*FREEMEM_CELL;
Helmut Tschemernjak 37:77fa81e4ad79 438 #endif
Helmut Tschemernjak 37:77fa81e4ad79 439 }
Helmut Tschemernjak 37:77fa81e4ad79 440
Helmut Tschemernjak 37:77fa81e4ad79 441
Helmut Tschemernjak 37:77fa81e4ad79 442 static const char *cmds = \
Helmut Tschemernjak 37:77fa81e4ad79 443 "\r\nThe following commands are available:\r\n\r\n" \
Helmut Tschemernjak 37:77fa81e4ad79 444 " p -- Property Editor\r\n" \
Helmut Tschemernjak 37:77fa81e4ad79 445 " t -- LoRa PingPong Test\r\n" \
Helmut Tschemernjak 39:ee20fe5c9253 446 " x -- LoRa TX Continuous Wave Test\r\n" \
Helmut Tschemernjak 37:77fa81e4ad79 447 " d -- Hexdump of memory address [offset count]\r\n"
Helmut Tschemernjak 37:77fa81e4ad79 448 " r -- Reset\r\n" \
Helmut Tschemernjak 45:22bb680cad5a 449 " c -- Continue with RadioShuttle RadioTest\r\n" \
Helmut Tschemernjak 37:77fa81e4ad79 450 "\r\n" \
Helmut Tschemernjak 37:77fa81e4ad79 451 "waiting 10 secs ...\r\n" \
Helmut Tschemernjak 37:77fa81e4ad79 452 "\r\n";
Helmut Tschemernjak 37:77fa81e4ad79 453
Helmut Tschemernjak 37:77fa81e4ad79 454 void RunCommands(int timeout_ms) {
Helmut Tschemernjak 37:77fa81e4ad79 455 bool cmdLoop = true;
Helmut Tschemernjak 37:77fa81e4ad79 456 while(cmdLoop) {
Helmut Tschemernjak 37:77fa81e4ad79 457 char buf[32];
Helmut Tschemernjak 37:77fa81e4ad79 458
Helmut Tschemernjak 37:77fa81e4ad79 459 rprintf(cmds);
Helmut Tschemernjak 37:77fa81e4ad79 460 rprintf("Turtle$ ");
Helmut Tschemernjak 37:77fa81e4ad79 461 if (ConsoleReadline(buf, sizeof(buf), true, timeout_ms) == NULL) {
Helmut Tschemernjak 37:77fa81e4ad79 462 cmdLoop = false;
Helmut Tschemernjak 37:77fa81e4ad79 463 break;
Helmut Tschemernjak 37:77fa81e4ad79 464 }
Helmut Tschemernjak 37:77fa81e4ad79 465 switch(buf[0]) {
Helmut Tschemernjak 37:77fa81e4ad79 466 case 'p':
Helmut Tschemernjak 37:77fa81e4ad79 467 case 'P':
Helmut Tschemernjak 37:77fa81e4ad79 468 #ifdef FEATURE_NVPROPERTYEDITOR
Helmut Tschemernjak 37:77fa81e4ad79 469 NVPropertyEditor();
Helmut Tschemernjak 37:77fa81e4ad79 470 #endif
Helmut Tschemernjak 37:77fa81e4ad79 471 break;
Helmut Tschemernjak 37:77fa81e4ad79 472 case 't':
Helmut Tschemernjak 37:77fa81e4ad79 473 case 'T':
Helmut Tschemernjak 37:77fa81e4ad79 474 #ifdef FEATURE_LORA_PING_PONG
Helmut Tschemernjak 37:77fa81e4ad79 475 SX1276PingPong(); // basic LoRa raw ping/pong without RadioShuttle
Helmut Tschemernjak 37:77fa81e4ad79 476 #endif
Helmut Tschemernjak 37:77fa81e4ad79 477 break;
Helmut Tschemernjak 39:ee20fe5c9253 478 #ifdef FEATURE_RADIOTESTSAMPLE
Helmut Tschemernjak 39:ee20fe5c9253 479 case 'x':
Helmut Tschemernjak 39:ee20fe5c9253 480 case 'X':
Helmut Tschemernjak 39:ee20fe5c9253 481 RadioContinuesTX();
Helmut Tschemernjak 39:ee20fe5c9253 482 #endif
Helmut Tschemernjak 39:ee20fe5c9253 483 break;
Helmut Tschemernjak 37:77fa81e4ad79 484 case 'r':
Helmut Tschemernjak 37:77fa81e4ad79 485 case 'R':
Helmut Tschemernjak 37:77fa81e4ad79 486 MCUReset();
Helmut Tschemernjak 37:77fa81e4ad79 487 break;
Helmut Tschemernjak 37:77fa81e4ad79 488 case 'd':
Helmut Tschemernjak 37:77fa81e4ad79 489 case 'D':
Helmut Tschemernjak 37:77fa81e4ad79 490 {
Helmut Tschemernjak 37:77fa81e4ad79 491 char *addr = strchr(buf, ' ');
Helmut Tschemernjak 37:77fa81e4ad79 492 if (addr) {
Helmut Tschemernjak 37:77fa81e4ad79 493 *addr++ = 0;
Helmut Tschemernjak 37:77fa81e4ad79 494 char *length = strchr(addr, ' ');
Helmut Tschemernjak 37:77fa81e4ad79 495 if (length) {
Helmut Tschemernjak 37:77fa81e4ad79 496 *length++ = 0;
Helmut Tschemernjak 37:77fa81e4ad79 497 }
Helmut Tschemernjak 37:77fa81e4ad79 498 unsigned long address = strtoll(addr, NULL, 0);
Helmut Tschemernjak 37:77fa81e4ad79 499 unsigned long cnt = 32;
Helmut Tschemernjak 37:77fa81e4ad79 500 if (length)
Helmut Tschemernjak 37:77fa81e4ad79 501 cnt = strtoll(length, NULL, 0);
Helmut Tschemernjak 37:77fa81e4ad79 502 dump("Hexdump", (void *)address, cnt);
Helmut Tschemernjak 37:77fa81e4ad79 503 }
Helmut Tschemernjak 37:77fa81e4ad79 504 }
Helmut Tschemernjak 37:77fa81e4ad79 505 break;
Helmut Tschemernjak 37:77fa81e4ad79 506 case 'c':
Helmut Tschemernjak 37:77fa81e4ad79 507 case 'C':
Helmut Tschemernjak 37:77fa81e4ad79 508 cmdLoop = false;
Helmut Tschemernjak 37:77fa81e4ad79 509 break;
Helmut Tschemernjak 37:77fa81e4ad79 510 default:
Helmut Tschemernjak 37:77fa81e4ad79 511 break;
Helmut Tschemernjak 37:77fa81e4ad79 512 }
Helmut Tschemernjak 37:77fa81e4ad79 513 }
Helmut Tschemernjak 37:77fa81e4ad79 514 rprintf("\r\n");
Helmut Tschemernjak 37:77fa81e4ad79 515
Helmut Tschemernjak 37:77fa81e4ad79 516 }