MAX20361 System Demo with Low Power 2 mode

Dependencies:   SX1276GenericLib USBDevice

Fork of NonPingPong_PICO_LoRa by Walter Luu

Committer:
walterluu
Date:
Mon Oct 12 21:55:22 2020 +0000
Revision:
3:85fc843a9d7d
Child:
6:51f492ca61a2
MAX20361 Demo Firmware version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walterluu 3:85fc843a9d7d 1 /*
walterluu 3:85fc843a9d7d 2 * This file contains a copy of the master content sx1276PingPong
walterluu 3:85fc843a9d7d 3 * with adaption for the SX1276Generic environment
walterluu 3:85fc843a9d7d 4 * (c) 2017 Helmut Tschemernjak
walterluu 3:85fc843a9d7d 5 * 30826 Garbsen (Hannover) Germany
walterluu 3:85fc843a9d7d 6 */
walterluu 3:85fc843a9d7d 7
walterluu 3:85fc843a9d7d 8 #include "mbed.h"
walterluu 3:85fc843a9d7d 9 #include "PinMap.h"
walterluu 3:85fc843a9d7d 10 #include "GenericPingPong2.h"
walterluu 3:85fc843a9d7d 11 #include "sx1276-mbed-hal.h"
walterluu 3:85fc843a9d7d 12 #include "main.h"
walterluu 3:85fc843a9d7d 13 #include "global_buffers.h" //adding this for development
walterluu 3:85fc843a9d7d 14
walterluu 3:85fc843a9d7d 15 #include "sx1276.h"
walterluu 3:85fc843a9d7d 16
walterluu 3:85fc843a9d7d 17 #include "USBSerial.h"
walterluu 3:85fc843a9d7d 18
walterluu 3:85fc843a9d7d 19 #ifdef FEATURE_LORA // in main.cpp
walterluu 3:85fc843a9d7d 20
walterluu 3:85fc843a9d7d 21 /* Set this flag to '1' to display debug messages on the console */
walterluu 3:85fc843a9d7d 22 #define DEBUG_MESSAGE 1
walterluu 3:85fc843a9d7d 23
walterluu 3:85fc843a9d7d 24 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
walterluu 3:85fc843a9d7d 25 #define USE_MODEM_LORA 1
walterluu 3:85fc843a9d7d 26 #define USE_MODEM_FSK !USE_MODEM_LORA
walterluu 3:85fc843a9d7d 27 #define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz
walterluu 3:85fc843a9d7d 28 #define TX_OUTPUT_POWER 14 // 14 dBm
walterluu 3:85fc843a9d7d 29
walterluu 3:85fc843a9d7d 30 #if USE_MODEM_LORA == 1
walterluu 3:85fc843a9d7d 31
walterluu 3:85fc843a9d7d 32 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
walterluu 3:85fc843a9d7d 33 #define LORA_SPREADING_FACTOR LORA_SF7
walterluu 3:85fc843a9d7d 34 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
walterluu 3:85fc843a9d7d 35
walterluu 3:85fc843a9d7d 36 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
walterluu 3:85fc843a9d7d 37 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
walterluu 3:85fc843a9d7d 38 #define LORA_FIX_LENGTH_PAYLOAD_ON false
walterluu 3:85fc843a9d7d 39 #define LORA_FHSS_ENABLED false
walterluu 3:85fc843a9d7d 40 #define LORA_NB_SYMB_HOP 4
walterluu 3:85fc843a9d7d 41 #define LORA_IQ_INVERSION_ON false
walterluu 3:85fc843a9d7d 42 #define LORA_CRC_ENABLED true
walterluu 3:85fc843a9d7d 43
walterluu 3:85fc843a9d7d 44 #elif USE_MODEM_FSK == 1
walterluu 3:85fc843a9d7d 45
walterluu 3:85fc843a9d7d 46 #define FSK_FDEV 25000 // Hz
walterluu 3:85fc843a9d7d 47 #define FSK_DATARATE 19200 // bps
walterluu 3:85fc843a9d7d 48 #define FSK_BANDWIDTH 50000 // Hz
walterluu 3:85fc843a9d7d 49 #define FSK_AFC_BANDWIDTH 83333 // Hz
walterluu 3:85fc843a9d7d 50 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
walterluu 3:85fc843a9d7d 51 #define FSK_FIX_LENGTH_PAYLOAD_ON false
walterluu 3:85fc843a9d7d 52 #define FSK_CRC_ENABLED true
walterluu 3:85fc843a9d7d 53
walterluu 3:85fc843a9d7d 54 #else
walterluu 3:85fc843a9d7d 55 #error "Please define a modem in the compiler options."
walterluu 3:85fc843a9d7d 56 #endif
walterluu 3:85fc843a9d7d 57
walterluu 3:85fc843a9d7d 58
walterluu 3:85fc843a9d7d 59 #define RX_TIMEOUT_VALUE 3500 // in ms
walterluu 3:85fc843a9d7d 60 //#define RX_TIMEOUT_VALUE 333 // in ms
walterluu 3:85fc843a9d7d 61
walterluu 3:85fc843a9d7d 62 //#define BUFFER_SIZE 32 // Define the payload size here
walterluu 3:85fc843a9d7d 63 //#define BUFFER_SIZE 64 // Define the payload size here
walterluu 3:85fc843a9d7d 64
walterluu 3:85fc843a9d7d 65
walterluu 3:85fc843a9d7d 66 /*
walterluu 3:85fc843a9d7d 67 * Global variables declarations
walterluu 3:85fc843a9d7d 68 */
walterluu 3:85fc843a9d7d 69 typedef enum
walterluu 3:85fc843a9d7d 70 {
walterluu 3:85fc843a9d7d 71 LOWPOWER = 0,
walterluu 3:85fc843a9d7d 72 IDLE,
walterluu 3:85fc843a9d7d 73
walterluu 3:85fc843a9d7d 74 RX,
walterluu 3:85fc843a9d7d 75 RX_TIMEOUT,
walterluu 3:85fc843a9d7d 76 RX_ERROR,
walterluu 3:85fc843a9d7d 77
walterluu 3:85fc843a9d7d 78 TX,
walterluu 3:85fc843a9d7d 79 TX_TIMEOUT,
walterluu 3:85fc843a9d7d 80
walterluu 3:85fc843a9d7d 81 CAD,
walterluu 3:85fc843a9d7d 82 CAD_DONE
walterluu 3:85fc843a9d7d 83 } AppStates_t;
walterluu 3:85fc843a9d7d 84
walterluu 3:85fc843a9d7d 85 volatile AppStates_t State = LOWPOWER;
walterluu 3:85fc843a9d7d 86
walterluu 3:85fc843a9d7d 87 /*!
walterluu 3:85fc843a9d7d 88 * Radio events function pointer
walterluu 3:85fc843a9d7d 89 */
walterluu 3:85fc843a9d7d 90 static RadioEvents_t RadioEvents;
walterluu 3:85fc843a9d7d 91
walterluu 3:85fc843a9d7d 92 /*
walterluu 3:85fc843a9d7d 93 * Global variables declarations
walterluu 3:85fc843a9d7d 94 */
walterluu 3:85fc843a9d7d 95 SX1276Generic *Radio;
walterluu 3:85fc843a9d7d 96
walterluu 3:85fc843a9d7d 97
walterluu 3:85fc843a9d7d 98 //const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING";
walterluu 3:85fc843a9d7d 99 //const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG";
walterluu 3:85fc843a9d7d 100
walterluu 3:85fc843a9d7d 101 //uint16_t BufferSize = BUFFER_SIZE;
walterluu 3:85fc843a9d7d 102 //uint8_t *Buffer;
walterluu 3:85fc843a9d7d 103
walterluu 3:85fc843a9d7d 104 // Aliases for the buffers that are made in the main()
walterluu 3:85fc843a9d7d 105 uint8_t *BufferTx;
walterluu 3:85fc843a9d7d 106 uint8_t *BufferRx;
walterluu 3:85fc843a9d7d 107 USBSerial *ad;
walterluu 3:85fc843a9d7d 108
walterluu 3:85fc843a9d7d 109 DigitalOut *led3;
walterluu 3:85fc843a9d7d 110
walterluu 3:85fc843a9d7d 111
walterluu 3:85fc843a9d7d 112 /*
walterluu 3:85fc843a9d7d 113 This function is in Devin's main function
walterluu 3:85fc843a9d7d 114
walterluu 3:85fc843a9d7d 115 */
walterluu 3:85fc843a9d7d 116 int SX1276PingPongSetup(uint8_t *BufferTxFromMain, uint8_t *BufferRxFromMain, USBSerial *_ad)
walterluu 3:85fc843a9d7d 117 {
walterluu 3:85fc843a9d7d 118 ad = _ad;
walterluu 3:85fc843a9d7d 119
walterluu 3:85fc843a9d7d 120 ad->printf("TEST\r\n" );
walterluu 3:85fc843a9d7d 121
walterluu 3:85fc843a9d7d 122 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_Lad11U6X ) )
walterluu 3:85fc843a9d7d 123 DigitalOut *led = new DigitalOut(LED2);
walterluu 3:85fc843a9d7d 124 #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1)
walterluu 3:85fc843a9d7d 125 DigitalOut *led = new DigitalOut(LED4); // RX red
walterluu 3:85fc843a9d7d 126 led3 = new DigitalOut(LED3); // TX blue
walterluu 3:85fc843a9d7d 127 #else
walterluu 3:85fc843a9d7d 128 DigitalOut *led = new DigitalOut(LED1);
walterluu 3:85fc843a9d7d 129 // led = 0;
walterluu 3:85fc843a9d7d 130 led3 = led;
walterluu 3:85fc843a9d7d 131 #endif
walterluu 3:85fc843a9d7d 132
walterluu 3:85fc843a9d7d 133 BufferTx = BufferTxFromMain;
walterluu 3:85fc843a9d7d 134 BufferRx = BufferRxFromMain;
walterluu 3:85fc843a9d7d 135 *led3 = 0; // change to 0
walterluu 3:85fc843a9d7d 136
walterluu 3:85fc843a9d7d 137 #ifdef B_L072Z_LRWAN1_LORA
walterluu 3:85fc843a9d7d 138 Radio = new SX1276Generic(NULL, MURATA_SX1276,
walterluu 3:85fc843a9d7d 139 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
walterluu 3:85fc843a9d7d 140 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
walterluu 3:85fc843a9d7d 141 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
walterluu 3:85fc843a9d7d 142 #else // RFM95
walterluu 3:85fc843a9d7d 143 Radio = new SX1276Generic(NULL, RFM95_SX1276,
walterluu 3:85fc843a9d7d 144 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
walterluu 3:85fc843a9d7d 145 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
walterluu 3:85fc843a9d7d 146
walterluu 3:85fc843a9d7d 147 #endif
walterluu 3:85fc843a9d7d 148
walterluu 3:85fc843a9d7d 149 // dprintf("SX1276 Ping Pong Demo Application" );
walterluu 3:85fc843a9d7d 150 ad->printf("SX1276 Ping Pong Demo Application\r\n");
walterluu 3:85fc843a9d7d 151 // dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
walterluu 3:85fc843a9d7d 152 ad->printf("Freqency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0);
walterluu 3:85fc843a9d7d 153 // dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
walterluu 3:85fc843a9d7d 154 ad->printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER);
walterluu 3:85fc843a9d7d 155 #if USE_MODEM_LORA == 1
walterluu 3:85fc843a9d7d 156 // dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
walterluu 3:85fc843a9d7d 157 ad->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH);
walterluu 3:85fc843a9d7d 158 // dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
walterluu 3:85fc843a9d7d 159 ad->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR);
walterluu 3:85fc843a9d7d 160 #elif USE_MODEM_FSK == 1
walterluu 3:85fc843a9d7d 161 // dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
walterluu 3:85fc843a9d7d 162 ad->printf("Bandwidth: %d kHz\r\n", FSK_BANDWIDTH);
walterluu 3:85fc843a9d7d 163 // dprintf("Baudrate: %d", FSK_DATARATE);
walterluu 3:85fc843a9d7d 164 ad->printf("Baudrate: %d\r\n", FSK_DATARATE);
walterluu 3:85fc843a9d7d 165 #endif
walterluu 3:85fc843a9d7d 166 // Initialize Radio driver
walterluu 3:85fc843a9d7d 167 RadioEvents.TxDone = OnTxDone;
walterluu 3:85fc843a9d7d 168 RadioEvents.RxDone = OnRxDone;
walterluu 3:85fc843a9d7d 169 RadioEvents.RxError = OnRxError;
walterluu 3:85fc843a9d7d 170 RadioEvents.TxTimeout = OnTxTimeout;
walterluu 3:85fc843a9d7d 171 RadioEvents.RxTimeout = OnRxTimeout;
walterluu 3:85fc843a9d7d 172 if (Radio->Init( &RadioEvents ) == false) {
walterluu 3:85fc843a9d7d 173 while(1) {
walterluu 3:85fc843a9d7d 174 // dprintf("Radio could not be detected!");
walterluu 3:85fc843a9d7d 175 ad->printf("Radio could not be detected!\r\n");
walterluu 3:85fc843a9d7d 176 wait( 1 );
walterluu 3:85fc843a9d7d 177 }
walterluu 3:85fc843a9d7d 178 }
walterluu 3:85fc843a9d7d 179
walterluu 3:85fc843a9d7d 180
walterluu 3:85fc843a9d7d 181 switch(Radio->DetectBoardType()) {
walterluu 3:85fc843a9d7d 182 case SX1276MB1LAS:
walterluu 3:85fc843a9d7d 183 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 184 ad->printf(" > Board Type: SX1276MB1LAS <\r\n");
walterluu 3:85fc843a9d7d 185 break;
walterluu 3:85fc843a9d7d 186 case SX1276MB1MAS:
walterluu 3:85fc843a9d7d 187 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 188 ad->printf(" > Board Type: SX1276MB1LAS <\r\n");
walterluu 3:85fc843a9d7d 189 case MURATA_SX1276:
walterluu 3:85fc843a9d7d 190 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 191 ad->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n");
walterluu 3:85fc843a9d7d 192 break;
walterluu 3:85fc843a9d7d 193 case RFM95_SX1276:
walterluu 3:85fc843a9d7d 194 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 195 ad->printf(" > HopeRF RFM95xx <\r\n");
walterluu 3:85fc843a9d7d 196 break;
walterluu 3:85fc843a9d7d 197 default:
walterluu 3:85fc843a9d7d 198 ad->printf(" > Board Type: unknown <\r\n");
walterluu 3:85fc843a9d7d 199 }
walterluu 3:85fc843a9d7d 200
walterluu 3:85fc843a9d7d 201 Radio->SetChannel(RF_FREQUENCY );
walterluu 3:85fc843a9d7d 202
walterluu 3:85fc843a9d7d 203 #if USE_MODEM_LORA == 1
walterluu 3:85fc843a9d7d 204
walterluu 3:85fc843a9d7d 205 if (LORA_FHSS_ENABLED)
walterluu 3:85fc843a9d7d 206 ad->printf(" > LORA FHSS Mode <\r\n");
walterluu 3:85fc843a9d7d 207 if (!LORA_FHSS_ENABLED)
walterluu 3:85fc843a9d7d 208 ad->printf(" > LORA Mode <\r\n");
walterluu 3:85fc843a9d7d 209
walterluu 3:85fc843a9d7d 210
walterluu 3:85fc843a9d7d 211 // Without this line, the default max payload length is only 64 bytes
walterluu 3:85fc843a9d7d 212 Radio->SetMaxPayloadLength(MODEM_LORA, 255);
walterluu 3:85fc843a9d7d 213
walterluu 3:85fc843a9d7d 214 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
walterluu 3:85fc843a9d7d 215 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
walterluu 3:85fc843a9d7d 216 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
walterluu 3:85fc843a9d7d 217 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
walterluu 3:85fc843a9d7d 218 LORA_IQ_INVERSION_ON, 2000 );
walterluu 3:85fc843a9d7d 219
walterluu 3:85fc843a9d7d 220 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
walterluu 3:85fc843a9d7d 221 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
walterluu 3:85fc843a9d7d 222 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
walterluu 3:85fc843a9d7d 223 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
walterluu 3:85fc843a9d7d 224 LORA_IQ_INVERSION_ON, true );
walterluu 3:85fc843a9d7d 225
walterluu 3:85fc843a9d7d 226 #elif USE_MODEM_FSK == 1
walterluu 3:85fc843a9d7d 227
walterluu 3:85fc843a9d7d 228 ad->printf(" > FSK Mode <\n");
walterluu 3:85fc843a9d7d 229 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
walterluu 3:85fc843a9d7d 230 FSK_DATARATE, 0,
walterluu 3:85fc843a9d7d 231 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
walterluu 3:85fc843a9d7d 232 FSK_CRC_ENABLED, 0, 0, 0, 2000 );
walterluu 3:85fc843a9d7d 233
walterluu 3:85fc843a9d7d 234 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
walterluu 3:85fc843a9d7d 235 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
walterluu 3:85fc843a9d7d 236 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
walterluu 3:85fc843a9d7d 237 0, 0, false, true );
walterluu 3:85fc843a9d7d 238
walterluu 3:85fc843a9d7d 239 #else
walterluu 3:85fc843a9d7d 240
walterluu 3:85fc843a9d7d 241 #error "Please define a modem in the compiler options."
walterluu 3:85fc843a9d7d 242
walterluu 3:85fc843a9d7d 243 #endif
walterluu 3:85fc843a9d7d 244
walterluu 3:85fc843a9d7d 245 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 246 ad->printf("Starting Ping-Pong loop\r\n");
walterluu 3:85fc843a9d7d 247
walterluu 3:85fc843a9d7d 248
walterluu 3:85fc843a9d7d 249 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 250 return 0; //added by Walter due to "Control reaches end of non-void function"
walterluu 3:85fc843a9d7d 251 }
walterluu 3:85fc843a9d7d 252
walterluu 3:85fc843a9d7d 253 /****************************************************************************************************************************************
walterluu 3:85fc843a9d7d 254 *
walterluu 3:85fc843a9d7d 255 ****************************************************************************************************************************************/
walterluu 3:85fc843a9d7d 256 int SX1276PingPong(void)
walterluu 3:85fc843a9d7d 257 {
walterluu 3:85fc843a9d7d 258 #if MASTER == 1 // Master Device: Bluetooth Gateway
walterluu 3:85fc843a9d7d 259 bool isMaster = true;
walterluu 3:85fc843a9d7d 260 #elif SLAVE == 1 // Slave Device: Robot
walterluu 3:85fc843a9d7d 261 bool isMaster = false;
walterluu 3:85fc843a9d7d 262 #endif
walterluu 3:85fc843a9d7d 263
walterluu 3:85fc843a9d7d 264 switch( State )
walterluu 3:85fc843a9d7d 265 {
walterluu 3:85fc843a9d7d 266 case RX:
walterluu 3:85fc843a9d7d 267 // *led3 = 0; // uncommented
walterluu 3:85fc843a9d7d 268 if( isMaster == true ) // Master Device received payload from Slave
walterluu 3:85fc843a9d7d 269 {
walterluu 3:85fc843a9d7d 270 if( BufferSizeRx > 0 )
walterluu 3:85fc843a9d7d 271 {
walterluu 3:85fc843a9d7d 272 /* This checks if the ID of the received transaction is matching that of
walterluu 3:85fc843a9d7d 273 * the slave device's ID. This is defined in the GenericPingPong.h
walterluu 3:85fc843a9d7d 274 */
walterluu 3:85fc843a9d7d 275 if( memcmp(&BufferRx[rx_idx_signature], PongMsg, sizeof(PongMsg)) == 0 )
walterluu 3:85fc843a9d7d 276 {
walterluu 3:85fc843a9d7d 277 // *led = !*led;
walterluu 3:85fc843a9d7d 278 // *led = 0; // changed to 0
walterluu 3:85fc843a9d7d 279 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 280 ad->printf( "...Pong\r\n" );
walterluu 3:85fc843a9d7d 281 wait_ms( 10 );
walterluu 3:85fc843a9d7d 282 Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 283 } // memcmp != 0
walterluu 3:85fc843a9d7d 284 else // valid reception but not a PONG message
walterluu 3:85fc843a9d7d 285 { // Set device as master and start again
walterluu 3:85fc843a9d7d 286 isMaster = true; // new update
walterluu 3:85fc843a9d7d 287 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 288 } // end of if memcmp
walterluu 3:85fc843a9d7d 289 } // end of if BufferSizeRx > 0
walterluu 3:85fc843a9d7d 290 } // end of isMaster == true
walterluu 3:85fc843a9d7d 291 else // Slave Device received payload from Master
walterluu 3:85fc843a9d7d 292 {
walterluu 3:85fc843a9d7d 293 if( BufferSizeRx > 0 )
walterluu 3:85fc843a9d7d 294 {
walterluu 3:85fc843a9d7d 295 if( memcmp(BufferRx, PingMsg, sizeof(PingMsg)) == 0 )
walterluu 3:85fc843a9d7d 296 {
walterluu 3:85fc843a9d7d 297 // *led = !*led;
walterluu 3:85fc843a9d7d 298 // *led = 0 //changed to 0
walterluu 3:85fc843a9d7d 299 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 300 ad->printf( "...Ping\r\n" );
walterluu 3:85fc843a9d7d 301 wait_ms( 10 );
walterluu 3:85fc843a9d7d 302 Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 303 }
walterluu 3:85fc843a9d7d 304 else // valid reception but not a PING as expected
walterluu 3:85fc843a9d7d 305 { // Set device as slave and start again
walterluu 3:85fc843a9d7d 306 isMaster = false; // new update
walterluu 3:85fc843a9d7d 307 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 308 }
walterluu 3:85fc843a9d7d 309 } // end of if BufferSizeRx > 0
walterluu 3:85fc843a9d7d 310 } // end of if (isMaster == True), end of checking devices
walterluu 3:85fc843a9d7d 311
walterluu 3:85fc843a9d7d 312 State = LOWPOWER; // back to LOWPOWER State
walterluu 3:85fc843a9d7d 313
walterluu 3:85fc843a9d7d 314 break;
walterluu 3:85fc843a9d7d 315 case TX:
walterluu 3:85fc843a9d7d 316 // *led3 = 0; // change to 0
walterluu 3:85fc843a9d7d 317 if( isMaster == true ) // Master Device
walterluu 3:85fc843a9d7d 318 {
walterluu 3:85fc843a9d7d 319 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 320 ad->printf("Ping...\r\n" );
walterluu 3:85fc843a9d7d 321 }
walterluu 3:85fc843a9d7d 322 else // Slave Device
walterluu 3:85fc843a9d7d 323 {
walterluu 3:85fc843a9d7d 324 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 325 ad->printf("Pong...\r\n" );
walterluu 3:85fc843a9d7d 326 }
walterluu 3:85fc843a9d7d 327 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 328 State = LOWPOWER; // back to LOWPOWER State
walterluu 3:85fc843a9d7d 329 break;
walterluu 3:85fc843a9d7d 330 case RX_TIMEOUT:
walterluu 3:85fc843a9d7d 331 if( isMaster == true ) // Master Device
walterluu 3:85fc843a9d7d 332 {
walterluu 3:85fc843a9d7d 333 wait_ms( 10 );
walterluu 3:85fc843a9d7d 334 Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 335 }
walterluu 3:85fc843a9d7d 336 else // Slave Device
walterluu 3:85fc843a9d7d 337 {
walterluu 3:85fc843a9d7d 338 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 339 }
walterluu 3:85fc843a9d7d 340 State = LOWPOWER; // back to LOWPOWER State
walterluu 3:85fc843a9d7d 341 break;
walterluu 3:85fc843a9d7d 342 case RX_ERROR:
walterluu 3:85fc843a9d7d 343 // We have received a Packet with a CRC error, send reply as if packet was correct
walterluu 3:85fc843a9d7d 344 if( isMaster == true ) // Master Device
walterluu 3:85fc843a9d7d 345 {
walterluu 3:85fc843a9d7d 346 // Send the next PING frame
walterluu 3:85fc843a9d7d 347 // memcpy(BufferTx, PingMsg, sizeof(PingMsg));
walterluu 3:85fc843a9d7d 348 /*
walterluu 3:85fc843a9d7d 349 for( i = 4; i < BufferSizeTx; i++ )
walterluu 3:85fc843a9d7d 350 {
walterluu 3:85fc843a9d7d 351 BufferTx[i] = i - 4;
walterluu 3:85fc843a9d7d 352 }
walterluu 3:85fc843a9d7d 353 */
walterluu 3:85fc843a9d7d 354 // fillPayloadWithGlobalBufs(BufferTx);
walterluu 3:85fc843a9d7d 355 wait_ms( 10 );
walterluu 3:85fc843a9d7d 356 Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 357 }
walterluu 3:85fc843a9d7d 358 else // Slave Device
walterluu 3:85fc843a9d7d 359 {
walterluu 3:85fc843a9d7d 360 // Send the next PONG frame
walterluu 3:85fc843a9d7d 361 // memcpy(BufferTx, PongMsg, sizeof(PongMsg));
walterluu 3:85fc843a9d7d 362 /*
walterluu 3:85fc843a9d7d 363 for( i = sizeof(PongMsg); i < BufferSizeTx; i++ )
walterluu 3:85fc843a9d7d 364 {
walterluu 3:85fc843a9d7d 365 BufferTx[i] = i - sizeof(PongMsg);
walterluu 3:85fc843a9d7d 366 }
walterluu 3:85fc843a9d7d 367 */
walterluu 3:85fc843a9d7d 368 wait_ms( 10 );
walterluu 3:85fc843a9d7d 369 Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 370 }
walterluu 3:85fc843a9d7d 371 State = LOWPOWER; // Back to Low Power State
walterluu 3:85fc843a9d7d 372 break;
walterluu 3:85fc843a9d7d 373 case TX_TIMEOUT:
walterluu 3:85fc843a9d7d 374 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 375 State = LOWPOWER;
walterluu 3:85fc843a9d7d 376 break;
walterluu 3:85fc843a9d7d 377 case LOWPOWER:
walterluu 3:85fc843a9d7d 378 sleep();
walterluu 3:85fc843a9d7d 379 break;
walterluu 3:85fc843a9d7d 380 default:
walterluu 3:85fc843a9d7d 381 State = LOWPOWER;
walterluu 3:85fc843a9d7d 382 break;
walterluu 3:85fc843a9d7d 383 }
walterluu 3:85fc843a9d7d 384 }
walterluu 3:85fc843a9d7d 385
walterluu 3:85fc843a9d7d 386
walterluu 3:85fc843a9d7d 387 int TimeOnAirSend(void) {
walterluu 3:85fc843a9d7d 388
walterluu 3:85fc843a9d7d 389 return Radio->TimeOnAir( MODEM_LORA, sizeof(BufferSizeTx));
walterluu 3:85fc843a9d7d 390
walterluu 3:85fc843a9d7d 391 }
walterluu 3:85fc843a9d7d 392
walterluu 3:85fc843a9d7d 393
walterluu 3:85fc843a9d7d 394 int SX1276SensorSend(void) {
walterluu 3:85fc843a9d7d 395
walterluu 3:85fc843a9d7d 396 switch( State )
walterluu 3:85fc843a9d7d 397 {
walterluu 3:85fc843a9d7d 398 case RX:
walterluu 3:85fc843a9d7d 399 // if( BufferSizeRx > 0 )
walterluu 3:85fc843a9d7d 400 // {
walterluu 3:85fc843a9d7d 401 // Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 402 // Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 403 // } // end of if BufferSizeRx > 0
walterluu 3:85fc843a9d7d 404
walterluu 3:85fc843a9d7d 405 Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 406 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 407
walterluu 3:85fc843a9d7d 408 State = LOWPOWER; // back to LOWPOWER State
walterluu 3:85fc843a9d7d 409
walterluu 3:85fc843a9d7d 410 break;
walterluu 3:85fc843a9d7d 411 } // end of switch statement
walterluu 3:85fc843a9d7d 412 }
walterluu 3:85fc843a9d7d 413
walterluu 3:85fc843a9d7d 414
walterluu 3:85fc843a9d7d 415
walterluu 3:85fc843a9d7d 416 int SX1276GateWayReceive(int TimeOut) {
walterluu 3:85fc843a9d7d 417
walterluu 3:85fc843a9d7d 418 switch( State )
walterluu 3:85fc843a9d7d 419 {
walterluu 3:85fc843a9d7d 420 case RX:
walterluu 3:85fc843a9d7d 421 // if( BufferSizeRx > 0 )
walterluu 3:85fc843a9d7d 422 // {
walterluu 3:85fc843a9d7d 423 //// Radio->Send( BufferTx, BufferSizeTx );
walterluu 3:85fc843a9d7d 424 // Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 425 // } // end of if BufferSizeRx > 0
walterluu 3:85fc843a9d7d 426
walterluu 3:85fc843a9d7d 427
walterluu 3:85fc843a9d7d 428 // Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 3:85fc843a9d7d 429
walterluu 3:85fc843a9d7d 430 Radio->Rx( TimeOut );
walterluu 3:85fc843a9d7d 431
walterluu 3:85fc843a9d7d 432 State = LOWPOWER; // back to LOWPOWER State
walterluu 3:85fc843a9d7d 433
walterluu 3:85fc843a9d7d 434 break;
walterluu 3:85fc843a9d7d 435 } // end of switch statement
walterluu 3:85fc843a9d7d 436 }
walterluu 3:85fc843a9d7d 437
walterluu 3:85fc843a9d7d 438
walterluu 3:85fc843a9d7d 439
walterluu 3:85fc843a9d7d 440
walterluu 3:85fc843a9d7d 441 //void OnTxDone(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 442 //{
walterluu 3:85fc843a9d7d 443 // Radio->Sleep( );
walterluu 3:85fc843a9d7d 444 // State = TX;
walterluu 3:85fc843a9d7d 445 // if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 446 // dprintf("> OnTxDone");
walterluu 3:85fc843a9d7d 447 //}
walterluu 3:85fc843a9d7d 448
walterluu 3:85fc843a9d7d 449 // moved to main
walterluu 3:85fc843a9d7d 450 void OnTxDone(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 451 {
walterluu 3:85fc843a9d7d 452 Radio->Sleep( );
walterluu 3:85fc843a9d7d 453 State = TX;
walterluu 3:85fc843a9d7d 454 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 455 //dprintf("> OnTxDone");
walterluu 3:85fc843a9d7d 456 ad->printf("> OnTxDone");
walterluu 3:85fc843a9d7d 457 }
walterluu 3:85fc843a9d7d 458
walterluu 3:85fc843a9d7d 459
walterluu 3:85fc843a9d7d 460 //void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
walterluu 3:85fc843a9d7d 461 //{
walterluu 3:85fc843a9d7d 462 // Radio->Sleep( );
walterluu 3:85fc843a9d7d 463 // BufferSize = size;
walterluu 3:85fc843a9d7d 464 // memcpy( Buffer, payload, BufferSize );
walterluu 3:85fc843a9d7d 465 // State = RX;
walterluu 3:85fc843a9d7d 466 // if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 467 // dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
walterluu 3:85fc843a9d7d 468 // dump("Data:", payload, size);
walterluu 3:85fc843a9d7d 469 //}
walterluu 3:85fc843a9d7d 470
walterluu 3:85fc843a9d7d 471 // moved to main
walterluu 3:85fc843a9d7d 472 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
walterluu 3:85fc843a9d7d 473 {
walterluu 3:85fc843a9d7d 474 Radio->Sleep( );
walterluu 3:85fc843a9d7d 475
walterluu 3:85fc843a9d7d 476 if(BufferSizeRx != size)
walterluu 3:85fc843a9d7d 477 memcpy( BufferRx, payload, size );
walterluu 3:85fc843a9d7d 478 else
walterluu 3:85fc843a9d7d 479 memcpy( BufferRx, payload, BufferSizeRx );
walterluu 3:85fc843a9d7d 480 State = RX;
walterluu 3:85fc843a9d7d 481
walterluu 3:85fc843a9d7d 482 // Reset the RxTimeoutCount
walterluu 3:85fc843a9d7d 483 RxTimeoutCount = 0;
walterluu 3:85fc843a9d7d 484
walterluu 3:85fc843a9d7d 485 if (DEBUG_MESSAGE) {
walterluu 3:85fc843a9d7d 486 ad->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\n", rssi, snr);
walterluu 3:85fc843a9d7d 487 dump("Data:", payload, size);
walterluu 3:85fc843a9d7d 488 }
walterluu 3:85fc843a9d7d 489 }
walterluu 3:85fc843a9d7d 490
walterluu 3:85fc843a9d7d 491 //void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 492 //{
walterluu 3:85fc843a9d7d 493 // *led3 = 0;
walterluu 3:85fc843a9d7d 494 // Radio->Sleep( );
walterluu 3:85fc843a9d7d 495 // State = TX_TIMEOUT;
walterluu 3:85fc843a9d7d 496 // if(DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 497 // dprintf("> OnTxTimeout");
walterluu 3:85fc843a9d7d 498 //}
walterluu 3:85fc843a9d7d 499
walterluu 3:85fc843a9d7d 500 // moved to main
walterluu 3:85fc843a9d7d 501 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 502 {
walterluu 3:85fc843a9d7d 503 // *led3 = 0;
walterluu 3:85fc843a9d7d 504 Radio->Sleep( );
walterluu 3:85fc843a9d7d 505 State = TX_TIMEOUT;
walterluu 3:85fc843a9d7d 506 if(DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 507 ad->printf("> OnTxTimeout");
walterluu 3:85fc843a9d7d 508 }
walterluu 3:85fc843a9d7d 509
walterluu 3:85fc843a9d7d 510 //void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 511 //{
walterluu 3:85fc843a9d7d 512 // *led3 = 0;
walterluu 3:85fc843a9d7d 513 // Radio->Sleep( );
walterluu 3:85fc843a9d7d 514 // Buffer[BufferSize-1] = 0;
walterluu 3:85fc843a9d7d 515 // State = RX_TIMEOUT;
walterluu 3:85fc843a9d7d 516 // if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 517 // dprintf("> OnRxTimeout");
walterluu 3:85fc843a9d7d 518 //}
walterluu 3:85fc843a9d7d 519
walterluu 3:85fc843a9d7d 520 // moved to main
walterluu 3:85fc843a9d7d 521 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 522 {
walterluu 3:85fc843a9d7d 523 Radio->Sleep( );
walterluu 3:85fc843a9d7d 524 BufferRx[BufferSizeRx-1] = 0;
walterluu 3:85fc843a9d7d 525 State = RX_TIMEOUT;
walterluu 3:85fc843a9d7d 526 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 527 ad->printf("> OnRxTimeout\n");
walterluu 3:85fc843a9d7d 528
walterluu 3:85fc843a9d7d 529 // Increment how many times a transmission times out\
walterluu 3:85fc843a9d7d 530 RxTimeoutCount = RxTimeoutCount + 1;
walterluu 3:85fc843a9d7d 531 }
walterluu 3:85fc843a9d7d 532
walterluu 3:85fc843a9d7d 533 //void OnRxError(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 534 //{
walterluu 3:85fc843a9d7d 535 // Radio->Sleep( );
walterluu 3:85fc843a9d7d 536 // State = RX_ERROR;
walterluu 3:85fc843a9d7d 537 // if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 538 // dprintf("> OnRxError");
walterluu 3:85fc843a9d7d 539 //}
walterluu 3:85fc843a9d7d 540
walterluu 3:85fc843a9d7d 541 // moved to main
walterluu 3:85fc843a9d7d 542 void OnRxError(void *radio, void *userThisPtr, void *userData)
walterluu 3:85fc843a9d7d 543 {
walterluu 3:85fc843a9d7d 544 Radio->Sleep( );
walterluu 3:85fc843a9d7d 545 State = RX_ERROR;
walterluu 3:85fc843a9d7d 546 if (DEBUG_MESSAGE)
walterluu 3:85fc843a9d7d 547 ad->printf("> OnRxError\n");
walterluu 3:85fc843a9d7d 548
walterluu 3:85fc843a9d7d 549 // Increment how many times a transmission times out\
walterluu 3:85fc843a9d7d 550 RxTimeoutCount = RxTimeoutCount + 1;
walterluu 3:85fc843a9d7d 551 }
walterluu 3:85fc843a9d7d 552
walterluu 3:85fc843a9d7d 553
walterluu 3:85fc843a9d7d 554 int numOfRxTimeouts()
walterluu 3:85fc843a9d7d 555 {
walterluu 3:85fc843a9d7d 556 return RxTimeoutCount;
walterluu 3:85fc843a9d7d 557 }
walterluu 3:85fc843a9d7d 558
walterluu 3:85fc843a9d7d 559
walterluu 3:85fc843a9d7d 560 #endif