RadioShuttle Lib for the STM32 L4 Heltec Board

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Mon Mar 04 09:41:41 2019 +0100
Revision:
11:91bc7ef20f21
Parent:
9:02766ad58bdd
Updated lib

Who changed what in which revision?

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