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:
Tue Feb 12 17:07:02 2019 +0100
Revision:
34:d3d60dbb84ea
Parent:
30:8bc655c9b224
Child:
35:9e799d093b7f
Moved commands into RunCommands()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut64 0:3b6c2ce051a6 1 /*
Helmut Tschemernjak 3:b5052f3fa638 2 * Copyright (c) 2019 Helmut Tschemernjak
Helmut64 0:3b6c2ce051a6 3 * 30826 Garbsen (Hannover) Germany
Helmut64 0:3b6c2ce051a6 4 * Licensed under the Apache License, Version 2.0);
Helmut64 0:3b6c2ce051a6 5 */
Helmut Tschemernjak 3:b5052f3fa638 6
Helmut Tschemernjak 3:b5052f3fa638 7 /*
Helmut Tschemernjak 3:b5052f3fa638 8 * TODO:
Helmut Tschemernjak 3:b5052f3fa638 9 * Compiler Date/Time is not set correctly on startup
Helmut Tschemernjak 3:b5052f3fa638 10 */
Helmut Tschemernjak 3:b5052f3fa638 11 #include "main.h"
Helmut Tschemernjak 3:b5052f3fa638 12 #include "RadioShuttle.h"
Helmut Tschemernjak 3:b5052f3fa638 13 #include "RadioTest.h"
Helmut Tschemernjak 3:b5052f3fa638 14 #include "GenericPingPong.h"
Helmut Tschemernjak 9:a988aa7a4652 15 #ifdef FEATURE_NVPROPERTY
Helmut Tschemernjak 9:a988aa7a4652 16 #include <NVPropertyProviderInterface.h>
Helmut Tschemernjak 9:a988aa7a4652 17 #include "NVProperty.h"
Helmut Tschemernjak 9:a988aa7a4652 18 #endif
Helmut64 0:3b6c2ce051a6 19
Helmut Tschemernjak 34:d3d60dbb84ea 20 void RunCommands(int timeout_ms);
Helmut Tschemernjak 34:d3d60dbb84ea 21
Helmut Tschemernjak 3:b5052f3fa638 22 DigitalOut statusLED(LED);
Helmut Tschemernjak 3:b5052f3fa638 23 DigitalOut redLED(LED2);
Helmut Tschemernjak 3:b5052f3fa638 24 InterruptIn buttonIntr(USER_BUTTON);
Helmut Tschemernjak 13:3c7a52b11316 25 volatile int pressedCount;
Helmut64 0:3b6c2ce051a6 26
Helmut Tschemernjak 3:b5052f3fa638 27 void switchInput(void) {
Helmut Tschemernjak 3:b5052f3fa638 28 InterrruptMSG(INT_BUTTON1);
Helmut Tschemernjak 3:b5052f3fa638 29 }
Helmut64 0:3b6c2ce051a6 30
Helmut64 0:3b6c2ce051a6 31
Helmut Tschemernjak 3:b5052f3fa638 32 void timerUpdate(void) {
Helmut Tschemernjak 5:c6a960febe80 33 static LowPowerTimeout timeout;
Helmut Tschemernjak 3:b5052f3fa638 34 if (redLED == 0)
Helmut Tschemernjak 3:b5052f3fa638 35 timeout.attach_us(&timerUpdate, 20000); // setup to call timerUpdate after 20 millis
Helmut Tschemernjak 3:b5052f3fa638 36 else
Helmut Tschemernjak 3:b5052f3fa638 37 timeout.attach_us(&timerUpdate, 2000000); // setup to call timerUpdate after 2 seconds
Helmut Tschemernjak 3:b5052f3fa638 38
Helmut Tschemernjak 34:d3d60dbb84ea 39 redLED = ! redLED;
Helmut Tschemernjak 3:b5052f3fa638 40 InterrruptMSG(INT_TIMEOUT);
Helmut Tschemernjak 3:b5052f3fa638 41 }
Helmut Tschemernjak 3:b5052f3fa638 42
Helmut Tschemernjak 18:d2f227e0a8bf 43
Helmut Tschemernjak 34:d3d60dbb84ea 44
Helmut64 0:3b6c2ce051a6 45 int main() {
Helmut64 0:3b6c2ce051a6 46 /*
Helmut64 0:3b6c2ce051a6 47 * inits the Serial or USBSerial when available (230400 baud).
Helmut64 0:3b6c2ce051a6 48 * If the serial uart is not is not connected it swiches to USB Serial
Helmut64 0:3b6c2ce051a6 49 * blinking LED means USBSerial detected, waiting for a connect.
Helmut64 0:3b6c2ce051a6 50 * It waits up to 30 seconds for a USB terminal connections
Helmut64 0:3b6c2ce051a6 51 */
Helmut Tschemernjak 3:b5052f3fa638 52 InitSerial(30*1000, &statusLED);
Helmut Tschemernjak 3:b5052f3fa638 53 dprintf("Welcome to RadioShuttle v%d.%d", RS_MAJOR, RS_MINOR);
Helmut Tschemernjak 3:b5052f3fa638 54 dprintf("Voltage: %.2f (%s powered)", BatteryVoltage(), BatterySource());
Helmut Tschemernjak 3:b5052f3fa638 55 timerUpdate(); // start timer
Helmut Tschemernjak 3:b5052f3fa638 56 #if defined (USER_BUTTON_RISE) // attach switchInput function to the rising or falling edge
Helmut Tschemernjak 3:b5052f3fa638 57 buttonIntr.rise(&switchInput);
Helmut Tschemernjak 3:b5052f3fa638 58 #else
Helmut Tschemernjak 3:b5052f3fa638 59 buttonIntr.fall(&switchInput);
Helmut Tschemernjak 3:b5052f3fa638 60 #endif
Helmut Tschemernjak 34:d3d60dbb84ea 61
Helmut Tschemernjak 34:d3d60dbb84ea 62 RunCommands(10000); // check for any commands
Helmut Tschemernjak 34:d3d60dbb84ea 63
Helmut Tschemernjak 34:d3d60dbb84ea 64 #ifdef FEATURE_LORA
Helmut Tschemernjak 34:d3d60dbb84ea 65 InitRadio();
Helmut Tschemernjak 34:d3d60dbb84ea 66 #endif
Helmut Tschemernjak 34:d3d60dbb84ea 67
Helmut Tschemernjak 34:d3d60dbb84ea 68 dprintf("InitDefaults Done");
Helmut Tschemernjak 3:b5052f3fa638 69
Helmut Tschemernjak 3:b5052f3fa638 70 /*
Helmut Tschemernjak 3:b5052f3fa638 71 * Main event loop, process interrupts and go to sleep
Helmut Tschemernjak 3:b5052f3fa638 72 * the green statusLED indicates CPU activity
Helmut Tschemernjak 5:c6a960febe80 73 * the red redLED indicates that low power timeout function is running.
Helmut Tschemernjak 3:b5052f3fa638 74 */
Helmut Tschemernjak 3:b5052f3fa638 75 while(true) {
Helmut Tschemernjak 3:b5052f3fa638 76 while ((readPendingInterrupts() == 0)) {
Helmut Tschemernjak 3:b5052f3fa638 77 statusLED = 0;
Helmut Tschemernjak 34:d3d60dbb84ea 78 #ifdef FEATURE_USBSERIAL
Helmut Tschemernjak 3:b5052f3fa638 79 if (!(usb && usb->connected()))
Helmut Tschemernjak 34:d3d60dbb84ea 80 #endif
Helmut Tschemernjak 3:b5052f3fa638 81 sleep();
Helmut Tschemernjak 3:b5052f3fa638 82 statusLED = 1;
Helmut Tschemernjak 3:b5052f3fa638 83 }
Helmut Tschemernjak 3:b5052f3fa638 84
Helmut Tschemernjak 3:b5052f3fa638 85 uint32_t pendirqs = readclrPendingInterrupts();
Helmut Tschemernjak 3:b5052f3fa638 86 if (pendirqs & INT_BUTTON1) {
Helmut Tschemernjak 3:b5052f3fa638 87 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 88 statusLED = !statusLED;
Helmut Tschemernjak 3:b5052f3fa638 89 RadioUpdate(true); // pass the pressed user button to RadioShuttle
Helmut Tschemernjak 3:b5052f3fa638 90 #endif
Helmut Tschemernjak 3:b5052f3fa638 91 }
Helmut Tschemernjak 3:b5052f3fa638 92 if (pendirqs & INT_LORA) {
Helmut Tschemernjak 3:b5052f3fa638 93 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 94 RadioUpdate(false);
Helmut Tschemernjak 3:b5052f3fa638 95 #endif
Helmut Tschemernjak 3:b5052f3fa638 96 }
Helmut Tschemernjak 3:b5052f3fa638 97 if (pendirqs & INT_TIMEOUT) {
Helmut Tschemernjak 3:b5052f3fa638 98 }
Helmut Tschemernjak 3:b5052f3fa638 99 }
Helmut64 0:3b6c2ce051a6 100 }
Helmut Tschemernjak 34:d3d60dbb84ea 101
Helmut Tschemernjak 34:d3d60dbb84ea 102 static const char *cmds = \
Helmut Tschemernjak 34:d3d60dbb84ea 103 "\r\nThe following commands are available:\r\n\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 104 " p -- Property Editor\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 105 " t -- LoRa PingPong Test\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 106 " d -- Hexdump of memory address [offset count]"
Helmut Tschemernjak 34:d3d60dbb84ea 107 " r -- Reset\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 108 " c -- Continue with RadioShuttle\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 109 "\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 110 "waiting 10 secs ...\r\n" \
Helmut Tschemernjak 34:d3d60dbb84ea 111 "\r\n";
Helmut Tschemernjak 34:d3d60dbb84ea 112
Helmut Tschemernjak 34:d3d60dbb84ea 113 void RunCommands(int timeout_ms) {
Helmut Tschemernjak 34:d3d60dbb84ea 114 bool cmdLoop = true;
Helmut Tschemernjak 34:d3d60dbb84ea 115 while(cmdLoop) {
Helmut Tschemernjak 34:d3d60dbb84ea 116 char buf[32];
Helmut Tschemernjak 34:d3d60dbb84ea 117
Helmut Tschemernjak 34:d3d60dbb84ea 118 rprintf(cmds);
Helmut Tschemernjak 34:d3d60dbb84ea 119 rprintf("Turtle$ ");
Helmut Tschemernjak 34:d3d60dbb84ea 120 if (ConsoleReadline(buf, sizeof(buf), true, timeout_ms) == NULL) {
Helmut Tschemernjak 34:d3d60dbb84ea 121 cmdLoop = false;
Helmut Tschemernjak 34:d3d60dbb84ea 122 break;
Helmut Tschemernjak 34:d3d60dbb84ea 123 }
Helmut Tschemernjak 34:d3d60dbb84ea 124 switch(buf[0]) {
Helmut Tschemernjak 34:d3d60dbb84ea 125 case 'p':
Helmut Tschemernjak 34:d3d60dbb84ea 126 case 'P':
Helmut Tschemernjak 34:d3d60dbb84ea 127 #ifdef FEATURE_NVPROPERTYEDITOR
Helmut Tschemernjak 34:d3d60dbb84ea 128 NVPropertyEditor();
Helmut Tschemernjak 34:d3d60dbb84ea 129 #endif
Helmut Tschemernjak 34:d3d60dbb84ea 130 break;
Helmut Tschemernjak 34:d3d60dbb84ea 131 case 't':
Helmut Tschemernjak 34:d3d60dbb84ea 132 case 'T':
Helmut Tschemernjak 34:d3d60dbb84ea 133 #ifdef FEATURE_LORA_PING_PONG
Helmut Tschemernjak 34:d3d60dbb84ea 134 SX1276PingPong(); // basic LoRa raw ping/pong without RadioShuttle
Helmut Tschemernjak 34:d3d60dbb84ea 135 #endif
Helmut Tschemernjak 34:d3d60dbb84ea 136 break;
Helmut Tschemernjak 34:d3d60dbb84ea 137 case 'r':
Helmut Tschemernjak 34:d3d60dbb84ea 138 case 'R':
Helmut Tschemernjak 34:d3d60dbb84ea 139 MCUReset();
Helmut Tschemernjak 34:d3d60dbb84ea 140 break;
Helmut Tschemernjak 34:d3d60dbb84ea 141 case 'd':
Helmut Tschemernjak 34:d3d60dbb84ea 142 case 'D':
Helmut Tschemernjak 34:d3d60dbb84ea 143 {
Helmut Tschemernjak 34:d3d60dbb84ea 144 char *addr = strchr(buf, ' ');
Helmut Tschemernjak 34:d3d60dbb84ea 145 if (addr) {
Helmut Tschemernjak 34:d3d60dbb84ea 146 *addr++ = 0;
Helmut Tschemernjak 34:d3d60dbb84ea 147 char *length = strchr(addr, ' ');
Helmut Tschemernjak 34:d3d60dbb84ea 148 if (length) {
Helmut Tschemernjak 34:d3d60dbb84ea 149 *length++ = 0;
Helmut Tschemernjak 34:d3d60dbb84ea 150 }
Helmut Tschemernjak 34:d3d60dbb84ea 151 unsigned long address = strtoll(addr, NULL, 0);
Helmut Tschemernjak 34:d3d60dbb84ea 152 unsigned long cnt = 32;
Helmut Tschemernjak 34:d3d60dbb84ea 153 if (length)
Helmut Tschemernjak 34:d3d60dbb84ea 154 cnt = strtoll(length, NULL, 0);
Helmut Tschemernjak 34:d3d60dbb84ea 155 dump("Hexdump", (void *)address, cnt);
Helmut Tschemernjak 34:d3d60dbb84ea 156 }
Helmut Tschemernjak 34:d3d60dbb84ea 157 }
Helmut Tschemernjak 34:d3d60dbb84ea 158 break;
Helmut Tschemernjak 34:d3d60dbb84ea 159 case 'c':
Helmut Tschemernjak 34:d3d60dbb84ea 160 case 'C':
Helmut Tschemernjak 34:d3d60dbb84ea 161 cmdLoop = false;
Helmut Tschemernjak 34:d3d60dbb84ea 162 break;
Helmut Tschemernjak 34:d3d60dbb84ea 163 default:
Helmut Tschemernjak 34:d3d60dbb84ea 164 break;
Helmut Tschemernjak 34:d3d60dbb84ea 165 }
Helmut Tschemernjak 34:d3d60dbb84ea 166 }
Helmut Tschemernjak 34:d3d60dbb84ea 167 rprintf("\r\n");
Helmut Tschemernjak 34:d3d60dbb84ea 168
Helmut Tschemernjak 34:d3d60dbb84ea 169 }