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

main.cpp

Committer:
Helmut Tschemernjak
Date:
2019-02-12
Revision:
34:d3d60dbb84ea
Parent:
30:8bc655c9b224
Child:
35:9e799d093b7f

File content as of revision 34:d3d60dbb84ea:

/*
 * Copyright (c) 2019 Helmut Tschemernjak
 * 30826 Garbsen (Hannover) Germany
 * Licensed under the Apache License, Version 2.0);
 */

 /*
  * TODO:
  * Compiler Date/Time is not set correctly on startup
  */
#include "main.h"
#include "RadioShuttle.h"
#include "RadioTest.h"
#include "GenericPingPong.h"
#ifdef FEATURE_NVPROPERTY
#include <NVPropertyProviderInterface.h>
#include "NVProperty.h"
#endif

void RunCommands(int timeout_ms);

DigitalOut statusLED(LED);
DigitalOut redLED(LED2);
InterruptIn buttonIntr(USER_BUTTON);
volatile int pressedCount;

void switchInput(void) {
	InterrruptMSG(INT_BUTTON1);
}


void timerUpdate(void) {
	static LowPowerTimeout timeout;
	if (redLED == 0)
		timeout.attach_us(&timerUpdate, 20000); // setup to call timerUpdate after 20 millis
	else
    	timeout.attach_us(&timerUpdate, 2000000); // setup to call timerUpdate after 2 seconds

	redLED = ! redLED;
	InterrruptMSG(INT_TIMEOUT);
}



int main() {
    /*
     * inits the Serial or USBSerial when available (230400 baud).
     * If the serial uart is not is not connected it swiches to USB Serial
     * blinking LED means USBSerial detected, waiting for a connect.
     * It waits up to 30 seconds for a USB terminal connections 
     */
    InitSerial(30*1000, &statusLED);
	dprintf("Welcome to RadioShuttle v%d.%d", RS_MAJOR, RS_MINOR);
    dprintf("Voltage: %.2f (%s powered)", BatteryVoltage(), BatterySource());
    timerUpdate(); // start timer
#if defined (USER_BUTTON_RISE) // attach switchInput function to the rising or falling edge
	buttonIntr.rise(&switchInput);
#else
	buttonIntr.fall(&switchInput);
#endif
	
	RunCommands(10000);	// check for any commands
	
#ifdef FEATURE_LORA
    InitRadio();
#endif

    dprintf("InitDefaults Done");

	/*
	 * Main event loop, process interrupts and go to sleep
	 * the green statusLED indicates CPU activity
	 * the red redLED indicates that low power timeout function is running.
	 */
	while(true) {
        while ((readPendingInterrupts() == 0)) {
			statusLED = 0;
#ifdef FEATURE_USBSERIAL
			if (!(usb && usb->connected()))
#endif
				sleep();
			statusLED = 1;
        }

        uint32_t pendirqs = readclrPendingInterrupts();
        if (pendirqs & INT_BUTTON1) {
#ifdef FEATURE_LORA
			statusLED = !statusLED;
            RadioUpdate(true); // pass the pressed user button to RadioShuttle
#endif
		}
        if (pendirqs & INT_LORA) {
#ifdef FEATURE_LORA
            RadioUpdate(false);
#endif
        }
        if (pendirqs & INT_TIMEOUT) {
		}
	}
}

static const char *cmds = \
	"\r\nThe following commands are available:\r\n\r\n" \
	" p -- Property Editor\r\n" \
	" t -- LoRa PingPong Test\r\n" \
	" d -- Hexdump of memory address [offset count]"
	" r -- Reset\r\n" \
	" c -- Continue with RadioShuttle\r\n" \
	"\r\n" \
	"waiting 10 secs ...\r\n" \
	"\r\n";

void RunCommands(int timeout_ms) {
	bool cmdLoop = true;
	while(cmdLoop) {
		char buf[32];

		rprintf(cmds);
		rprintf("Turtle$ ");
		if (ConsoleReadline(buf, sizeof(buf), true, timeout_ms) == NULL) {
			cmdLoop = false;
			break;
		}
		switch(buf[0]) {
			case 'p':
			case 'P':
#ifdef FEATURE_NVPROPERTYEDITOR
				NVPropertyEditor();
#endif
			break;
			case 't':
			case 'T':
#ifdef FEATURE_LORA_PING_PONG
    			SX1276PingPong();	// basic LoRa raw ping/pong without RadioShuttle
#endif
				break;
			case 'r':
			case 'R':
				MCUReset();
				break;
			case 'd':
			case 'D':
				{
					char *addr = strchr(buf, ' ');
					if (addr) {
						*addr++ = 0;
						char *length = strchr(addr, ' ');
						if (length) {
							*length++ = 0;
						}
						unsigned long address = strtoll(addr, NULL, 0);
						unsigned long cnt = 32;
						if (length)
							cnt = strtoll(length, NULL, 0);
						dump("Hexdump", (void *)address, cnt);
					}
				}
				break;
			case 'c':
			case 'C':
				cmdLoop = false;
				break;
			default:
				break;
		}
	}
	rprintf("\r\n");

}