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:
Mon Jan 21 11:56:10 2019 +0100
Revision:
5:c6a960febe80
Parent:
3:b5052f3fa638
Child:
9:a988aa7a4652
Moved PendingInterrupts into utils
InitSerial should always set the RTC when needed.
Fix RX to GND to avoid floating pins

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"
Helmut64 0:3b6c2ce051a6 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);
Helmut64 0:3b6c2ce051a6 19
Helmut Tschemernjak 3:b5052f3fa638 20 void switchInput(void) {
Helmut Tschemernjak 3:b5052f3fa638 21 InterrruptMSG(INT_BUTTON1);
Helmut Tschemernjak 3:b5052f3fa638 22 }
Helmut64 0:3b6c2ce051a6 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
Helmut64 0:3b6c2ce051a6 35 int main() {
Helmut64 0:3b6c2ce051a6 36 /*
Helmut64 0:3b6c2ce051a6 37 * inits the Serial or USBSerial when available (230400 baud).
Helmut64 0:3b6c2ce051a6 38 * If the serial uart is not is not connected it swiches to USB Serial
Helmut64 0:3b6c2ce051a6 39 * blinking LED means USBSerial detected, waiting for a connect.
Helmut64 0:3b6c2ce051a6 40 * It waits up to 30 seconds for a USB terminal connections
Helmut64 0:3b6c2ce051a6 41 */
Helmut Tschemernjak 3:b5052f3fa638 42 InitSerial(30*1000, &statusLED);
Helmut Tschemernjak 3:b5052f3fa638 43 dprintf("Welcome to RadioShuttle v%d.%d", RS_MAJOR, RS_MINOR);
Helmut Tschemernjak 3:b5052f3fa638 44 dprintf("Voltage: %.2f (%s powered)", BatteryVoltage(), BatterySource());
Helmut Tschemernjak 3:b5052f3fa638 45
Helmut Tschemernjak 3:b5052f3fa638 46
Helmut Tschemernjak 3:b5052f3fa638 47 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 48 InitRadio();
Helmut Tschemernjak 3:b5052f3fa638 49 #endif
Helmut Tschemernjak 3:b5052f3fa638 50 #ifdef FEATURE_LORA_PING_PONG
Helmut Tschemernjak 3:b5052f3fa638 51 DeInitRadio();
Helmut Tschemernjak 3:b5052f3fa638 52 SX1276PingPong(); // basic LoRa raw ping/pong without RadioShuttle
Helmut Tschemernjak 3:b5052f3fa638 53 #endif
Helmut Tschemernjak 3:b5052f3fa638 54 dprintf("InitDefaults Done");
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 3:b5052f3fa638 61
Helmut Tschemernjak 3:b5052f3fa638 62 /*
Helmut Tschemernjak 3:b5052f3fa638 63 * Main event loop, process interrupts and go to sleep
Helmut Tschemernjak 3:b5052f3fa638 64 * the green statusLED indicates CPU activity
Helmut Tschemernjak 5:c6a960febe80 65 * the red redLED indicates that low power timeout function is running.
Helmut Tschemernjak 3:b5052f3fa638 66 */
Helmut Tschemernjak 3:b5052f3fa638 67 while(true) {
Helmut Tschemernjak 3:b5052f3fa638 68 while ((readPendingInterrupts() == 0)) {
Helmut Tschemernjak 3:b5052f3fa638 69 statusLED = 0;
Helmut Tschemernjak 3:b5052f3fa638 70 if (!(usb && usb->connected()))
Helmut Tschemernjak 3:b5052f3fa638 71 sleep();
Helmut Tschemernjak 3:b5052f3fa638 72 statusLED = 1;
Helmut Tschemernjak 3:b5052f3fa638 73 }
Helmut Tschemernjak 3:b5052f3fa638 74
Helmut Tschemernjak 3:b5052f3fa638 75 uint32_t pendirqs = readclrPendingInterrupts();
Helmut Tschemernjak 3:b5052f3fa638 76 if (pendirqs & INT_BUTTON1) {
Helmut Tschemernjak 3:b5052f3fa638 77 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 78 statusLED = !statusLED;
Helmut Tschemernjak 3:b5052f3fa638 79 RadioUpdate(true); // pass the pressed user button to RadioShuttle
Helmut Tschemernjak 3:b5052f3fa638 80 #endif
Helmut Tschemernjak 3:b5052f3fa638 81 }
Helmut Tschemernjak 3:b5052f3fa638 82 if (pendirqs & INT_LORA) {
Helmut Tschemernjak 3:b5052f3fa638 83 #ifdef FEATURE_LORA
Helmut Tschemernjak 3:b5052f3fa638 84 RadioUpdate(false);
Helmut Tschemernjak 3:b5052f3fa638 85 #endif
Helmut Tschemernjak 3:b5052f3fa638 86 }
Helmut Tschemernjak 3:b5052f3fa638 87 if (pendirqs & INT_TIMEOUT) {
Helmut Tschemernjak 3:b5052f3fa638 88 redLED = ! redLED;
Helmut Tschemernjak 3:b5052f3fa638 89 }
Helmut Tschemernjak 3:b5052f3fa638 90 }
Helmut64 0:3b6c2ce051a6 91 }