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:
Thu Jun 06 09:31:08 2019 +0200
Revision:
62:86aaaf9fa55d
Parent:
46:a9241f24f4b7
Updated OLED lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 37:77fa81e4ad79 1 /*
Helmut Tschemernjak 37:77fa81e4ad79 2 * The file is Licensed under the Apache License, Version 2.0
Helmut Tschemernjak 37:77fa81e4ad79 3 * (c) 2017 Helmut Tschemernjak
Helmut Tschemernjak 37:77fa81e4ad79 4 * 30826 Garbsen (Hannover) Germany
Helmut Tschemernjak 37:77fa81e4ad79 5 */
Helmut Tschemernjak 37:77fa81e4ad79 6
Helmut Tschemernjak 37:77fa81e4ad79 7 #include "mbed.h"
Helmut Tschemernjak 37:77fa81e4ad79 8 #include "PinMap.h"
Helmut Tschemernjak 37:77fa81e4ad79 9
Helmut Tschemernjak 37:77fa81e4ad79 10 #if defined(FEATURE_LORA) && defined(FEATURE_RADIOTESTSAMPLE)
Helmut Tschemernjak 37:77fa81e4ad79 11
Helmut Tschemernjak 37:77fa81e4ad79 12 #include "sx1276-mbed-hal.h"
Helmut Tschemernjak 37:77fa81e4ad79 13 #include "RadioShuttle.h"
Helmut Tschemernjak 37:77fa81e4ad79 14 #include "RadioStatus.h"
Helmut Tschemernjak 37:77fa81e4ad79 15 #include "RadioSecurity.h"
Helmut Tschemernjak 37:77fa81e4ad79 16 #include "main.h"
Helmut Tschemernjak 37:77fa81e4ad79 17 #ifdef FEATURE_NVPROPERTY
Helmut Tschemernjak 37:77fa81e4ad79 18 #include <NVPropertyProviderInterface.h>
Helmut Tschemernjak 37:77fa81e4ad79 19 #include "NVProperty.h"
Helmut Tschemernjak 37:77fa81e4ad79 20 #endif
Helmut Tschemernjak 37:77fa81e4ad79 21
Helmut Tschemernjak 37:77fa81e4ad79 22
Helmut Tschemernjak 37:77fa81e4ad79 23
Helmut Tschemernjak 37:77fa81e4ad79 24 #define CHECK_ERROR_RET(func, err) { \
Helmut Tschemernjak 37:77fa81e4ad79 25 if (err) { \
Helmut Tschemernjak 37:77fa81e4ad79 26 dprintf("Error in %s: %s", func, rs->StrError(err)); \
Helmut Tschemernjak 37:77fa81e4ad79 27 return err; \
Helmut Tschemernjak 37:77fa81e4ad79 28 } \
Helmut Tschemernjak 37:77fa81e4ad79 29 }
Helmut Tschemernjak 37:77fa81e4ad79 30
Helmut Tschemernjak 37:77fa81e4ad79 31 // #define RADIO_SERVER 1
Helmut Tschemernjak 37:77fa81e4ad79 32
Helmut Tschemernjak 37:77fa81e4ad79 33
Helmut Tschemernjak 37:77fa81e4ad79 34 bool usePassword = false; // password the can used indepenend of AES
Helmut Tschemernjak 37:77fa81e4ad79 35 bool server; // automatically being set if radioTypeMode RadioShuttle::RS_Station_Basic
Helmut Tschemernjak 37:77fa81e4ad79 36 bool useAES = false; // AES needs the usePassword option on
Helmut Tschemernjak 37:77fa81e4ad79 37 const char *appPassword; // the AES password
Helmut Tschemernjak 37:77fa81e4ad79 38
Helmut Tschemernjak 37:77fa81e4ad79 39 static const int myTempSensorApp = 0x0001; // Must be unique world wide.
Helmut Tschemernjak 37:77fa81e4ad79 40 #ifdef RADIO_SERVER
Helmut Tschemernjak 37:77fa81e4ad79 41 int myDeviceID = 1;
Helmut Tschemernjak 37:77fa81e4ad79 42 int remoteDeviceID = 14;
Helmut Tschemernjak 37:77fa81e4ad79 43 uint32_t myCode = 0;
Helmut Tschemernjak 37:77fa81e4ad79 44 RadioShuttle::RadioType radioTypeMode = RadioShuttle::RS_Station_Basic; // 1 = RS_Node_Offline, 3 = RS_Node_Online, 4 = RS_Station_Basic
Helmut Tschemernjak 37:77fa81e4ad79 45 #else
Helmut Tschemernjak 37:77fa81e4ad79 46 int myDeviceID = 14;
Helmut Tschemernjak 37:77fa81e4ad79 47 int remoteDeviceID = 1;
Helmut Tschemernjak 37:77fa81e4ad79 48 uint32_t myCode = 0;
Helmut Tschemernjak 37:77fa81e4ad79 49 RadioShuttle::RadioType radioTypeMode = RadioShuttle::RS_Node_Offline; // 1 = RS_Node_Offline, 3 = RS_Node_Online, 4 = RS_Station_Basic
Helmut Tschemernjak 37:77fa81e4ad79 50 #endif
Helmut Tschemernjak 37:77fa81e4ad79 51
Helmut Tschemernjak 37:77fa81e4ad79 52
Helmut Tschemernjak 37:77fa81e4ad79 53 /*
Helmut Tschemernjak 37:77fa81e4ad79 54 * For details review: SX1276GenericLib/sx1276/sx1276.h
Helmut Tschemernjak 37:77fa81e4ad79 55 * Supported spreading factors SF 7,8, 9, 10, 11, (12 does not work well)
Helmut Tschemernjak 37:77fa81e4ad79 56 * Working frequencies using the 125000 bandwidth which leaves
Helmut Tschemernjak 37:77fa81e4ad79 57 * sufficient distance to the neighbour channel
Helmut Tschemernjak 37:77fa81e4ad79 58 * EU: 868.1, 868.3, 868.5 (Default LoRaWAN EU channels)
Helmut Tschemernjak 37:77fa81e4ad79 59 * EU: 865.1, 865.3, 865.5, 865.7, 865.9 (additional channels)
Helmut Tschemernjak 37:77fa81e4ad79 60 * EU: 866.1, 866.3, 866.5, 866.7, 866.9 (additional channels)
Helmut Tschemernjak 37:77fa81e4ad79 61 * EU: 867.1, 867.3, 867.5, 867.7, 867.9 (additional channels)
Helmut Tschemernjak 37:77fa81e4ad79 62 * Utilisation of these channels should not exceed 1% per hour per node
Helmut Tschemernjak 37:77fa81e4ad79 63 * Bandwidth changes other than 125k requires different channels distances
Helmut Tschemernjak 37:77fa81e4ad79 64 */
Helmut Tschemernjak 37:77fa81e4ad79 65 RadioShuttle::RadioProfile myProfile[] = {
Helmut Tschemernjak 37:77fa81e4ad79 66 /*
Helmut Tschemernjak 37:77fa81e4ad79 67 * Our default profile
Helmut Tschemernjak 37:77fa81e4ad79 68 * frequency, bandwidth, TX power, spreading factor, frequency-offset
Helmut Tschemernjak 37:77fa81e4ad79 69 */
Helmut Tschemernjak 37:77fa81e4ad79 70 { 868100000, 125000, 14, 7, 0 },
Helmut Tschemernjak 37:77fa81e4ad79 71 { 0, 0, 0, 0, 0 },
Helmut Tschemernjak 37:77fa81e4ad79 72 };
Helmut Tschemernjak 37:77fa81e4ad79 73
Helmut Tschemernjak 37:77fa81e4ad79 74
Helmut Tschemernjak 37:77fa81e4ad79 75 struct sensor {
Helmut Tschemernjak 37:77fa81e4ad79 76 uint8_t version;
Helmut Tschemernjak 37:77fa81e4ad79 77 uint8_t padding;
Helmut Tschemernjak 37:77fa81e4ad79 78 uint16_t pm25;
Helmut Tschemernjak 37:77fa81e4ad79 79 uint16_t pm10;
Helmut Tschemernjak 37:77fa81e4ad79 80 uint16_t id;
Helmut Tschemernjak 37:77fa81e4ad79 81 } PMAppData;
Helmut Tschemernjak 37:77fa81e4ad79 82
Helmut Tschemernjak 37:77fa81e4ad79 83
Helmut Tschemernjak 37:77fa81e4ad79 84 void TempSensorRecvHandler(int AppID, RadioShuttle::devid_t stationID, int msgID, int status, void *buffer, int length)
Helmut Tschemernjak 37:77fa81e4ad79 85 {
Helmut Tschemernjak 37:77fa81e4ad79 86 switch(status) {
Helmut Tschemernjak 37:77fa81e4ad79 87 case RadioShuttle::MS_SentCompleted: // A SendMsg has been sent.
Helmut Tschemernjak 37:77fa81e4ad79 88 dprintf("MSG_SentCompleted: id=%d %d bytes", msgID, length);
Helmut Tschemernjak 37:77fa81e4ad79 89 break;
Helmut Tschemernjak 37:77fa81e4ad79 90 case RadioShuttle::MS_SentCompletedConfirmed:// A SendMsg has been sent and confirmed
Helmut Tschemernjak 37:77fa81e4ad79 91 dprintf("MSG_SentCompletedConfirmed: id=%d %d bytes", msgID, length);
Helmut Tschemernjak 37:77fa81e4ad79 92 break;
Helmut Tschemernjak 37:77fa81e4ad79 93 case RadioShuttle::MS_SentTimeout: // A timeout occurred, number of retries exceeded
Helmut Tschemernjak 37:77fa81e4ad79 94 dprintf("MSG_SentTimeout ID: %d", msgID);
Helmut Tschemernjak 37:77fa81e4ad79 95 break;
Helmut Tschemernjak 37:77fa81e4ad79 96
Helmut Tschemernjak 37:77fa81e4ad79 97 case RadioShuttle::MS_RecvData: // a simple input message
Helmut Tschemernjak 37:77fa81e4ad79 98 dprintf("MSG_RecvData ID: %d, len=%d", msgID, length);
Helmut Tschemernjak 37:77fa81e4ad79 99 // dump("MSG_RecvData", buffer, length);
Helmut Tschemernjak 37:77fa81e4ad79 100 break;
Helmut Tschemernjak 37:77fa81e4ad79 101 case RadioShuttle::MS_RecvDataConfirmed: // received a confirmed message
Helmut Tschemernjak 37:77fa81e4ad79 102 dprintf("MSG_RecvDataConfirmed ID: %d, len=%d", msgID, length);
Helmut Tschemernjak 37:77fa81e4ad79 103 // dump("MSG_RecvDataConfirmed", buffer, length);
Helmut Tschemernjak 37:77fa81e4ad79 104 break;
Helmut Tschemernjak 37:77fa81e4ad79 105 case RadioShuttle::MS_NoStationFound:
Helmut Tschemernjak 37:77fa81e4ad79 106 dprintf("MSG_NoStationFound");
Helmut Tschemernjak 37:77fa81e4ad79 107 break;
Helmut Tschemernjak 37:77fa81e4ad79 108 case RadioShuttle::MS_NoStationSupportsApp:
Helmut Tschemernjak 37:77fa81e4ad79 109 dprintf("MSG_NoStationSupportsApp");
Helmut Tschemernjak 37:77fa81e4ad79 110 break;
Helmut Tschemernjak 37:77fa81e4ad79 111 case RadioShuttle::MS_AuthenicationRequired: // the password does not match.
Helmut Tschemernjak 37:77fa81e4ad79 112 dprintf("MSG_AuthenicationRequired");
Helmut Tschemernjak 37:77fa81e4ad79 113 break;
Helmut Tschemernjak 37:77fa81e4ad79 114
Helmut Tschemernjak 37:77fa81e4ad79 115 case RadioShuttle::MS_StationConnected: // a confirmation that the connection was accepted
Helmut Tschemernjak 37:77fa81e4ad79 116 dprintf("MSG_StationConnected");
Helmut Tschemernjak 37:77fa81e4ad79 117 break;
Helmut Tschemernjak 37:77fa81e4ad79 118 case RadioShuttle::MS_StationDisconnected: // a confirmation that the disconnect was accepted
Helmut Tschemernjak 37:77fa81e4ad79 119 dprintf("MSG_StationDisconnected");
Helmut Tschemernjak 37:77fa81e4ad79 120 break;
Helmut Tschemernjak 37:77fa81e4ad79 121 default:
Helmut Tschemernjak 37:77fa81e4ad79 122 break;
Helmut Tschemernjak 37:77fa81e4ad79 123 }
Helmut Tschemernjak 37:77fa81e4ad79 124 }
Helmut Tschemernjak 37:77fa81e4ad79 125
Helmut Tschemernjak 37:77fa81e4ad79 126
Helmut Tschemernjak 37:77fa81e4ad79 127 Radio *radio;
Helmut Tschemernjak 37:77fa81e4ad79 128 RadioShuttle *rs;
Helmut Tschemernjak 37:77fa81e4ad79 129 RadioStatusInterface *statusIntf;
Helmut Tschemernjak 37:77fa81e4ad79 130 RadioSecurityInterface *securityIntf;
Helmut Tschemernjak 37:77fa81e4ad79 131
Helmut Tschemernjak 37:77fa81e4ad79 132 int InitRadio()
Helmut Tschemernjak 37:77fa81e4ad79 133 {
Helmut Tschemernjak 37:77fa81e4ad79 134 Radio *radio;
Helmut Tschemernjak 37:77fa81e4ad79 135 RSCode err;
Helmut Tschemernjak 37:77fa81e4ad79 136
Helmut Tschemernjak 37:77fa81e4ad79 137 #ifdef FEATURE_NVPROPERTY
Helmut Tschemernjak 37:77fa81e4ad79 138 NVProperty prop;
Helmut Tschemernjak 37:77fa81e4ad79 139 int value;
Helmut Tschemernjak 37:77fa81e4ad79 140
Helmut Tschemernjak 37:77fa81e4ad79 141 myDeviceID = prop.GetProperty(prop.LORA_DEVICE_ID, 0);
Helmut Tschemernjak 37:77fa81e4ad79 142 myCode = prop.GetProperty(prop.LORA_CODE_ID, 0);
Helmut Tschemernjak 37:77fa81e4ad79 143 if ((value = prop.GetProperty(prop.LORA_RADIO_TYPE, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 144 radioTypeMode = (RadioShuttle::RadioType)value;
Helmut Tschemernjak 37:77fa81e4ad79 145
Helmut Tschemernjak 37:77fa81e4ad79 146 if (myDeviceID == 0 || myCode == 0 || radioTypeMode == 0) {
Helmut Tschemernjak 37:77fa81e4ad79 147 dprintf("LORA_DEVICE_ID or LORA_CODE_ID or LORA_RADIO_TYPE not set, use PropertyEditor to set this!");
Helmut Tschemernjak 37:77fa81e4ad79 148 return -1;
Helmut Tschemernjak 37:77fa81e4ad79 149 }
Helmut Tschemernjak 37:77fa81e4ad79 150 /*
Helmut Tschemernjak 37:77fa81e4ad79 151 * Here are optional properties for custom settings
Helmut Tschemernjak 37:77fa81e4ad79 152 */
Helmut Tschemernjak 37:77fa81e4ad79 153 if ((value = prop.GetProperty(prop.LORA_REMOTE_ID, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 154 remoteDeviceID = value;
Helmut Tschemernjak 37:77fa81e4ad79 155 if ((value = prop.GetProperty(prop.LORA_FREQUENCY, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 156 myProfile[0].Frequency = value;
Helmut Tschemernjak 37:77fa81e4ad79 157 if ((value = prop.GetProperty(prop.LORA_BANDWIDTH, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 158 myProfile[0].Bandwidth = value;
Helmut Tschemernjak 37:77fa81e4ad79 159 if ((value = prop.GetProperty(prop.LORA_SPREADING_FACTOR, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 160 myProfile[0].SpreadingFaktor = value;
Helmut Tschemernjak 37:77fa81e4ad79 161 if ((value = prop.GetProperty(prop.LORA_TXPOWER, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 162 myProfile[0].TXPower = value;
Helmut Tschemernjak 37:77fa81e4ad79 163 if ((value = prop.GetProperty(prop.LORA_FREQUENCY_OFFSET, 0)) != 0)
Helmut Tschemernjak 37:77fa81e4ad79 164 myProfile[0].FrequencyOffset = value;
Helmut Tschemernjak 37:77fa81e4ad79 165 appPassword = prop.GetProperty(prop.LORA_APP_PWD, (const char *)NULL);
Helmut Tschemernjak 37:77fa81e4ad79 166 #endif
Helmut Tschemernjak 37:77fa81e4ad79 167
Helmut Tschemernjak 37:77fa81e4ad79 168 if (radioTypeMode >= RadioShuttle::RS_Station_Basic)
Helmut Tschemernjak 37:77fa81e4ad79 169 server = true;
Helmut Tschemernjak 37:77fa81e4ad79 170
Helmut Tschemernjak 37:77fa81e4ad79 171 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Helmut Tschemernjak 37:77fa81e4ad79 172 radio = new SX1276Generic(NULL, MURATA_SX1276,
Helmut Tschemernjak 37:77fa81e4ad79 173 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 37:77fa81e4ad79 174 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
Helmut Tschemernjak 37:77fa81e4ad79 175 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
Helmut Tschemernjak 37:77fa81e4ad79 176 #elif defined(HELTECL432_REV1)
Helmut Tschemernjak 37:77fa81e4ad79 177 radio = new SX1276Generic(NULL, HELTEC_L4_1276,
Helmut Tschemernjak 37:77fa81e4ad79 178 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 37:77fa81e4ad79 179 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
Helmut Tschemernjak 37:77fa81e4ad79 180 LORA_ANT_PWR);
Helmut Tschemernjak 37:77fa81e4ad79 181 #else // RFM95
Helmut Tschemernjak 37:77fa81e4ad79 182 radio = new SX1276Generic(NULL, RFM95_SX1276,
Helmut Tschemernjak 37:77fa81e4ad79 183 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 37:77fa81e4ad79 184 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
Helmut Tschemernjak 37:77fa81e4ad79 185 #endif
Helmut Tschemernjak 37:77fa81e4ad79 186
Helmut Tschemernjak 37:77fa81e4ad79 187
Helmut Tschemernjak 37:77fa81e4ad79 188 statusIntf = new MyRadioStatus();
Helmut Tschemernjak 37:77fa81e4ad79 189 securityIntf = new RadioSecurity();
Helmut Tschemernjak 37:77fa81e4ad79 190
Helmut Tschemernjak 37:77fa81e4ad79 191 rs = new RadioShuttle("MyRadioShuttle");
Helmut Tschemernjak 37:77fa81e4ad79 192
Helmut Tschemernjak 37:77fa81e4ad79 193 rs->EnablePacketTrace(RadioShuttle::DEV_ID_ANY, true, true);
Helmut Tschemernjak 37:77fa81e4ad79 194
Helmut Tschemernjak 37:77fa81e4ad79 195 err = rs->AddLicense(myDeviceID, myCode);
Helmut Tschemernjak 37:77fa81e4ad79 196 CHECK_ERROR_RET("AddLicense", err);
Helmut Tschemernjak 37:77fa81e4ad79 197
Helmut Tschemernjak 37:77fa81e4ad79 198 err = rs->AddRadio(radio, MODEM_LORA, myProfile);
Helmut Tschemernjak 37:77fa81e4ad79 199 CHECK_ERROR_RET("AddRadio", err);
Helmut Tschemernjak 37:77fa81e4ad79 200 dprintf("Radio: %.1f MHz, SF%d, %.f kHz", (float)myProfile[0].Frequency/1000000.0, myProfile[0].SpreadingFaktor, (float)myProfile[0].Bandwidth/1000.0);
Helmut Tschemernjak 37:77fa81e4ad79 201
Helmut Tschemernjak 37:77fa81e4ad79 202 rs->AddRadioStatus(statusIntf);
Helmut Tschemernjak 37:77fa81e4ad79 203 CHECK_ERROR_RET("AddRadioStatus", err);
Helmut Tschemernjak 37:77fa81e4ad79 204
Helmut Tschemernjak 37:77fa81e4ad79 205 rs->AddRadioSecurity(securityIntf);
Helmut Tschemernjak 37:77fa81e4ad79 206 CHECK_ERROR_RET("AddRadioSecurity", err);
Helmut Tschemernjak 37:77fa81e4ad79 207
Helmut Tschemernjak 37:77fa81e4ad79 208 /*
Helmut Tschemernjak 37:77fa81e4ad79 209 * The password parameter can be NULL if no password is required
Helmut Tschemernjak 37:77fa81e4ad79 210 */
Helmut Tschemernjak 37:77fa81e4ad79 211 err = rs->RegisterApplication(myTempSensorApp, &TempSensorRecvHandler, (void *)appPassword);
Helmut Tschemernjak 37:77fa81e4ad79 212 CHECK_ERROR_RET("RegisterApplication", err);
Helmut Tschemernjak 37:77fa81e4ad79 213
Helmut Tschemernjak 37:77fa81e4ad79 214 if (server) {
Helmut Tschemernjak 37:77fa81e4ad79 215 // usually RadioShuttle::RS_Station_Basic, set via properties
Helmut Tschemernjak 37:77fa81e4ad79 216 err = rs->Startup(radioTypeMode);
Helmut Tschemernjak 37:77fa81e4ad79 217 dprintf("Startup as a Server: %s ID=%d", rs->GetRadioName(rs->GetRadioType()), myDeviceID);
Helmut Tschemernjak 37:77fa81e4ad79 218 } else {
Helmut Tschemernjak 37:77fa81e4ad79 219 // usually RadioShuttle::RS_Node_Online or RadioShuttle, set via properties
Helmut Tschemernjak 37:77fa81e4ad79 220 err = rs->Startup(radioTypeMode);
Helmut Tschemernjak 37:77fa81e4ad79 221 dprintf("Startup as a Node: %s ID=%d", rs->GetRadioName(rs->GetRadioType()), myDeviceID);
Helmut Tschemernjak 37:77fa81e4ad79 222 if (!err && rs->AppRequiresAuthentication(myTempSensorApp) == RS_PasswordSet) {
Helmut Tschemernjak 37:77fa81e4ad79 223 err = rs->Connect(myTempSensorApp, remoteDeviceID);
Helmut Tschemernjak 37:77fa81e4ad79 224 }
Helmut Tschemernjak 37:77fa81e4ad79 225 }
Helmut Tschemernjak 37:77fa81e4ad79 226 CHECK_ERROR_RET("Startup", err);
Helmut Tschemernjak 37:77fa81e4ad79 227 return 0;
Helmut Tschemernjak 37:77fa81e4ad79 228 }
Helmut Tschemernjak 37:77fa81e4ad79 229
Helmut Tschemernjak 37:77fa81e4ad79 230 void DeInitRadio()
Helmut Tschemernjak 37:77fa81e4ad79 231 {
Helmut Tschemernjak 37:77fa81e4ad79 232 if (securityIntf) {
Helmut Tschemernjak 37:77fa81e4ad79 233 delete securityIntf;
Helmut Tschemernjak 37:77fa81e4ad79 234 securityIntf = NULL;
Helmut Tschemernjak 37:77fa81e4ad79 235 }
Helmut Tschemernjak 37:77fa81e4ad79 236 if (statusIntf) {
Helmut Tschemernjak 37:77fa81e4ad79 237 delete statusIntf;
Helmut Tschemernjak 37:77fa81e4ad79 238 statusIntf = NULL;
Helmut Tschemernjak 37:77fa81e4ad79 239 }
Helmut Tschemernjak 37:77fa81e4ad79 240 if (rs) {
Helmut Tschemernjak 37:77fa81e4ad79 241 delete rs;
Helmut Tschemernjak 37:77fa81e4ad79 242 rs = NULL;
Helmut Tschemernjak 37:77fa81e4ad79 243 }
Helmut Tschemernjak 37:77fa81e4ad79 244 if (radio) {
Helmut Tschemernjak 37:77fa81e4ad79 245 delete radio;
Helmut Tschemernjak 37:77fa81e4ad79 246 radio = NULL;
Helmut Tschemernjak 37:77fa81e4ad79 247 }
Helmut Tschemernjak 37:77fa81e4ad79 248 }
Helmut Tschemernjak 37:77fa81e4ad79 249
Helmut Tschemernjak 37:77fa81e4ad79 250
Helmut Tschemernjak 37:77fa81e4ad79 251 int RadioUpdate(bool keyPressed)
Helmut Tschemernjak 37:77fa81e4ad79 252 {
Helmut Tschemernjak 37:77fa81e4ad79 253 if (!rs)
Helmut Tschemernjak 37:77fa81e4ad79 254 return 0;
Helmut Tschemernjak 37:77fa81e4ad79 255
Helmut Tschemernjak 37:77fa81e4ad79 256 if (keyPressed) {
Helmut Tschemernjak 37:77fa81e4ad79 257 int flags = 0;
Helmut Tschemernjak 37:77fa81e4ad79 258 flags |= RadioShuttle::MF_NeedsConfirm; // optional
Helmut Tschemernjak 37:77fa81e4ad79 259 if (usePassword && useAES)
Helmut Tschemernjak 37:77fa81e4ad79 260 flags |= RadioShuttle::MF_Encrypted;
Helmut Tschemernjak 37:77fa81e4ad79 261 if (server) {
Helmut Tschemernjak 37:77fa81e4ad79 262 static char msg[] = "The server feels very good today";
Helmut Tschemernjak 37:77fa81e4ad79 263 rs->SendMsg(myTempSensorApp, msg, sizeof(msg), flags, remoteDeviceID);
Helmut Tschemernjak 37:77fa81e4ad79 264 } else {
Helmut Tschemernjak 37:77fa81e4ad79 265 static char msg[] = "Hello, the temperature is 26 celsius";
Helmut Tschemernjak 37:77fa81e4ad79 266 rs->SendMsg(myTempSensorApp, msg, sizeof(msg), flags, remoteDeviceID);
Helmut Tschemernjak 37:77fa81e4ad79 267 }
Helmut Tschemernjak 37:77fa81e4ad79 268 }
Helmut Tschemernjak 37:77fa81e4ad79 269 rs->RunShuttle();
Helmut Tschemernjak 37:77fa81e4ad79 270 return 0;
Helmut Tschemernjak 37:77fa81e4ad79 271 }
Helmut Tschemernjak 37:77fa81e4ad79 272
Helmut Tschemernjak 37:77fa81e4ad79 273 bool RadioISIdle()
Helmut Tschemernjak 37:77fa81e4ad79 274 {
Helmut Tschemernjak 37:77fa81e4ad79 275 if (!rs)
Helmut Tschemernjak 37:77fa81e4ad79 276 return true;
Helmut Tschemernjak 37:77fa81e4ad79 277 return rs->Idle();
Helmut Tschemernjak 37:77fa81e4ad79 278 }
Helmut Tschemernjak 37:77fa81e4ad79 279
Helmut Tschemernjak 37:77fa81e4ad79 280 void InitLoRaChipWithShutdown()
Helmut Tschemernjak 37:77fa81e4ad79 281 {
Helmut Tschemernjak 37:77fa81e4ad79 282 #ifdef LORA_CS
Helmut Tschemernjak 37:77fa81e4ad79 283 if (LORA_CS == NC)
Helmut Tschemernjak 37:77fa81e4ad79 284 return;
Helmut Tschemernjak 37:77fa81e4ad79 285 #ifdef HELTECL432_REV1
Helmut Tschemernjak 37:77fa81e4ad79 286 Radio *radio = new SX1276Generic(NULL, HELTEC_L4_1276,
Helmut Tschemernjak 37:77fa81e4ad79 287 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 37:77fa81e4ad79 288 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, LORA_ANT_PWR);
Helmut Tschemernjak 37:77fa81e4ad79 289 #else
Helmut Tschemernjak 37:77fa81e4ad79 290 Radio *radio = new SX1276Generic(NULL, RFM95_SX1276,
Helmut Tschemernjak 37:77fa81e4ad79 291 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 37:77fa81e4ad79 292 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
Helmut Tschemernjak 37:77fa81e4ad79 293 #endif
Helmut Tschemernjak 37:77fa81e4ad79 294
Helmut Tschemernjak 37:77fa81e4ad79 295 RadioEvents_t radioEvents;
Helmut Tschemernjak 37:77fa81e4ad79 296 memset(&radioEvents, 0, sizeof(radioEvents));
Helmut Tschemernjak 37:77fa81e4ad79 297 if (radio->Init(&radioEvents)) {
Helmut Tschemernjak 37:77fa81e4ad79 298 radio->Sleep();
Helmut Tschemernjak 37:77fa81e4ad79 299 delete radio;
Helmut Tschemernjak 37:77fa81e4ad79 300 }
Helmut Tschemernjak 37:77fa81e4ad79 301 #endif
Helmut Tschemernjak 37:77fa81e4ad79 302 }
Helmut Tschemernjak 40:46374c762e37 303
Helmut Tschemernjak 40:46374c762e37 304
Helmut Tschemernjak 40:46374c762e37 305 void RadioContinuesTX(void)
Helmut Tschemernjak 40:46374c762e37 306 {
Helmut Tschemernjak 40:46374c762e37 307 Radio *radio;
Helmut Tschemernjak 40:46374c762e37 308
Helmut Tschemernjak 40:46374c762e37 309 #ifdef FEATURE_NVPROPERTY
Helmut Tschemernjak 40:46374c762e37 310 NVProperty prop;
Helmut Tschemernjak 40:46374c762e37 311 int value;
Helmut Tschemernjak 40:46374c762e37 312
Helmut Tschemernjak 40:46374c762e37 313 /*
Helmut Tschemernjak 40:46374c762e37 314 * Here are optional properties for custom settings
Helmut Tschemernjak 40:46374c762e37 315 */
Helmut Tschemernjak 40:46374c762e37 316 if ((value = prop.GetProperty(prop.LORA_FREQUENCY, 0)) != 0)
Helmut Tschemernjak 40:46374c762e37 317 myProfile[0].Frequency = value;
Helmut Tschemernjak 40:46374c762e37 318 if ((value = prop.GetProperty(prop.LORA_TXPOWER, 0)) != 0)
Helmut Tschemernjak 40:46374c762e37 319 myProfile[0].TXPower = value;
Helmut Tschemernjak 46:a9241f24f4b7 320 if ((value = prop.GetProperty(prop.LORA_SPREADING_FACTOR, 0)) != 0)
Helmut Tschemernjak 46:a9241f24f4b7 321 myProfile[0].SpreadingFaktor = value;
Helmut Tschemernjak 40:46374c762e37 322 #endif
Helmut Tschemernjak 40:46374c762e37 323
Helmut Tschemernjak 40:46374c762e37 324
Helmut Tschemernjak 40:46374c762e37 325 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Helmut Tschemernjak 40:46374c762e37 326 radio = new SX1276Generic(NULL, MURATA_SX1276,
Helmut Tschemernjak 40:46374c762e37 327 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 40:46374c762e37 328 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
Helmut Tschemernjak 40:46374c762e37 329 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
Helmut Tschemernjak 40:46374c762e37 330 #elif defined(HELTECL432_REV1)
Helmut Tschemernjak 40:46374c762e37 331 radio = new SX1276Generic(NULL, HELTEC_L4_1276,
Helmut Tschemernjak 40:46374c762e37 332 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 40:46374c762e37 333 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
Helmut Tschemernjak 40:46374c762e37 334 LORA_ANT_PWR);
Helmut Tschemernjak 40:46374c762e37 335 #else // RFM95
Helmut Tschemernjak 40:46374c762e37 336 radio = new SX1276Generic(NULL, RFM95_SX1276,
Helmut Tschemernjak 40:46374c762e37 337 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
Helmut Tschemernjak 40:46374c762e37 338 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
Helmut Tschemernjak 40:46374c762e37 339 #endif
Helmut Tschemernjak 40:46374c762e37 340
Helmut Tschemernjak 40:46374c762e37 341 dprintf("RadioContinuesTX test, press reset to abort");
Helmut Tschemernjak 40:46374c762e37 342 while(true) {
Helmut Tschemernjak 40:46374c762e37 343 int secs = 10;
Helmut Tschemernjak 40:46374c762e37 344 radio->SetTxContinuousWave(myProfile[0].Frequency, myProfile[0].TXPower, secs);
Helmut Tschemernjak 40:46374c762e37 345 wait_ms(secs * 1000);
Helmut Tschemernjak 40:46374c762e37 346 rprintf(".");
Helmut Tschemernjak 40:46374c762e37 347 }
Helmut Tschemernjak 40:46374c762e37 348 }
Helmut Tschemernjak 40:46374c762e37 349
Helmut Tschemernjak 37:77fa81e4ad79 350 #endif // FEATURE_LORA