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
RadioTestSample.cpp@40:46374c762e37, 2019-02-13 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Wed Feb 13 17:10:45 2019 +0100
- Revision:
- 40:46374c762e37
- Parent:
- 37:77fa81e4ad79
- Child:
- 46:a9241f24f4b7
Added continues wave testing
Who changed what in which revision?
User | Revision | Line number | New 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 | 40:46374c762e37 | 320 | #endif |
Helmut Tschemernjak | 40:46374c762e37 | 321 | |
Helmut Tschemernjak | 40:46374c762e37 | 322 | |
Helmut Tschemernjak | 40:46374c762e37 | 323 | #ifdef TARGET_DISCO_L072CZ_LRWAN1 |
Helmut Tschemernjak | 40:46374c762e37 | 324 | radio = new SX1276Generic(NULL, MURATA_SX1276, |
Helmut Tschemernjak | 40:46374c762e37 | 325 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
Helmut Tschemernjak | 40:46374c762e37 | 326 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, |
Helmut Tschemernjak | 40:46374c762e37 | 327 | LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); |
Helmut Tschemernjak | 40:46374c762e37 | 328 | #elif defined(HELTECL432_REV1) |
Helmut Tschemernjak | 40:46374c762e37 | 329 | radio = new SX1276Generic(NULL, HELTEC_L4_1276, |
Helmut Tschemernjak | 40:46374c762e37 | 330 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
Helmut Tschemernjak | 40:46374c762e37 | 331 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, |
Helmut Tschemernjak | 40:46374c762e37 | 332 | LORA_ANT_PWR); |
Helmut Tschemernjak | 40:46374c762e37 | 333 | #else // RFM95 |
Helmut Tschemernjak | 40:46374c762e37 | 334 | radio = new SX1276Generic(NULL, RFM95_SX1276, |
Helmut Tschemernjak | 40:46374c762e37 | 335 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
Helmut Tschemernjak | 40:46374c762e37 | 336 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5); |
Helmut Tschemernjak | 40:46374c762e37 | 337 | #endif |
Helmut Tschemernjak | 40:46374c762e37 | 338 | if ((value = prop.GetProperty(prop.LORA_SPREADING_FACTOR, 0)) != 0) |
Helmut Tschemernjak | 40:46374c762e37 | 339 | myProfile[0].SpreadingFaktor = value; |
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 |