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:
37:77fa81e4ad79
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 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 45:22bb680cad5a 9 * Compiler Date/Time is not set correctly on startup using gcc
Helmut Tschemernjak 45:22bb680cad5a 10 * USB Serial block deepsleep
Helmut Tschemernjak 3:b5052f3fa638 11 */
Helmut Tschemernjak 3:b5052f3fa638 12 #include "main.h"
Helmut Tschemernjak 3:b5052f3fa638 13 #include "RadioTest.h"
Helmut64 0:3b6c2ce051a6 14
Helmut Tschemernjak 34:d3d60dbb84ea 15
Helmut Tschemernjak 3:b5052f3fa638 16 DigitalOut statusLED(LED);
Helmut Tschemernjak 3:b5052f3fa638 17 DigitalOut redLED(LED2);
Helmut Tschemernjak 3:b5052f3fa638 18 InterruptIn buttonIntr(USER_BUTTON);
Helmut Tschemernjak 13:3c7a52b11316 19 volatile int pressedCount;
Helmut64 0:3b6c2ce051a6 20
Helmut Tschemernjak 3:b5052f3fa638 21 void switchInput(void) {
Helmut Tschemernjak 3:b5052f3fa638 22 InterrruptMSG(INT_BUTTON1);
Helmut Tschemernjak 3:b5052f3fa638 23 }
Helmut64 0:3b6c2ce051a6 24
Helmut Tschemernjak 3:b5052f3fa638 25 void timerUpdate(void) {
Helmut Tschemernjak 5:c6a960febe80 26 static LowPowerTimeout timeout;
Helmut Tschemernjak 3:b5052f3fa638 27 if (redLED == 0)
Helmut Tschemernjak 3:b5052f3fa638 28 timeout.attach_us(&timerUpdate, 20000); // setup to call timerUpdate after 20 millis
Helmut Tschemernjak 3:b5052f3fa638 29 else
Helmut Tschemernjak 3:b5052f3fa638 30 timeout.attach_us(&timerUpdate, 2000000); // setup to call timerUpdate after 2 seconds
Helmut Tschemernjak 3:b5052f3fa638 31
Helmut Tschemernjak 3:b5052f3fa638 32 InterrruptMSG(INT_TIMEOUT);
Helmut Tschemernjak 3:b5052f3fa638 33 }
Helmut Tschemernjak 3:b5052f3fa638 34
Helmut Tschemernjak 18:d2f227e0a8bf 35
Helmut Tschemernjak 34:d3d60dbb84ea 36
Helmut64 0:3b6c2ce051a6 37 int main() {
Helmut64 0:3b6c2ce051a6 38 /*
Helmut64 0:3b6c2ce051a6 39 * inits the Serial or USBSerial when available (230400 baud).
Helmut64 0:3b6c2ce051a6 40 * If the serial uart is not is not connected it swiches to USB Serial
Helmut64 0:3b6c2ce051a6 41 * blinking LED means USBSerial detected, waiting for a connect.
Helmut64 0:3b6c2ce051a6 42 * It waits up to 30 seconds for a USB terminal connections
Helmut64 0:3b6c2ce051a6 43 */
Helmut Tschemernjak 45:22bb680cad5a 44 InitSerial(30*1000, &statusLED, &buttonIntr);
Helmut Tschemernjak 37:77fa81e4ad79 45 RunStartup();
Helmut Tschemernjak 3:b5052f3fa638 46 dprintf("Welcome to RadioShuttle v%d.%d", RS_MAJOR, RS_MINOR);
Helmut Tschemernjak 37:77fa81e4ad79 47 timerUpdate(); // start timer for status blinked, can be disalbed to save energy
Helmut Tschemernjak 3:b5052f3fa638 48 #if defined (USER_BUTTON_RISE) // attach switchInput function to the rising or falling edge
Helmut Tschemernjak 3:b5052f3fa638 49 buttonIntr.rise(&switchInput);
Helmut Tschemernjak 3:b5052f3fa638 50 #else
Helmut Tschemernjak 3:b5052f3fa638 51 buttonIntr.fall(&switchInput);
Helmut Tschemernjak 3:b5052f3fa638 52 #endif
Helmut Tschemernjak 34:d3d60dbb84ea 53
Helmut Tschemernjak 37:77fa81e4ad79 54 RunCommands(10000); // check 10 secs for any commands
Helmut Tschemernjak 34:d3d60dbb84ea 55
Helmut Tschemernjak 34:d3d60dbb84ea 56 #ifdef FEATURE_LORA
Helmut Tschemernjak 34:d3d60dbb84ea 57 InitRadio();
Helmut Tschemernjak 34:d3d60dbb84ea 58 #endif
Helmut Tschemernjak 34:d3d60dbb84ea 59
Helmut Tschemernjak 3:b5052f3fa638 60 /*
Helmut Tschemernjak 45:22bb680cad5a 61 * Main event loop, process interrupts and goes to sleep when idle.
Helmut Tschemernjak 3:b5052f3fa638 62 * the green statusLED indicates CPU activity
Helmut Tschemernjak 45:22bb680cad5a 63 * the red redLED indicates that low power timerUpdate function is running.
Helmut Tschemernjak 3:b5052f3fa638 64 */
Helmut Tschemernjak 3:b5052f3fa638 65 while(true) {
Helmut Tschemernjak 3:b5052f3fa638 66 while ((readPendingInterrupts() == 0)) {
Helmut Tschemernjak 3:b5052f3fa638 67 statusLED = 0;
Helmut Tschemernjak 45:22bb680cad5a 68 sleep();
Helmut Tschemernjak 3:b5052f3fa638 69 statusLED = 1;
Helmut Tschemernjak 3:b5052f3fa638 70 }
Helmut Tschemernjak 3:b5052f3fa638 71
Helmut Tschemernjak 3:b5052f3fa638 72 uint32_t pendirqs = readclrPendingInterrupts();
Helmut Tschemernjak 3:b5052f3fa638 73 if (pendirqs & INT_BUTTON1) {
Helmut Tschemernjak 3:b5052f3fa638 74 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 75 statusLED = !statusLED;
Helmut Tschemernjak 3:b5052f3fa638 76 RadioUpdate(true); // pass the pressed user button to RadioShuttle
Helmut Tschemernjak 3:b5052f3fa638 77 #endif
Helmut Tschemernjak 3:b5052f3fa638 78 }
Helmut Tschemernjak 3:b5052f3fa638 79 if (pendirqs & INT_LORA) {
Helmut Tschemernjak 3:b5052f3fa638 80 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 81 RadioUpdate(false);
Helmut Tschemernjak 3:b5052f3fa638 82 #endif
Helmut Tschemernjak 3:b5052f3fa638 83 }
Helmut Tschemernjak 3:b5052f3fa638 84 if (pendirqs & INT_TIMEOUT) {
Helmut Tschemernjak 37:77fa81e4ad79 85 redLED = ! redLED;
Helmut Tschemernjak 3:b5052f3fa638 86 }
Helmut Tschemernjak 3:b5052f3fa638 87 }
Helmut64 0:3b6c2ce051a6 88 }