Team Walter / Mbed OS NonPingPong_PICO_LoRa_LP1

Dependencies:   SX1276GenericLib USBDevice

Fork of NonPingPong_PICO_LoRa_LP1 by Walter Luu

Committer:
walterluu
Date:
Fri Oct 16 23:26:04 2020 +0000
Revision:
8:5ff74d7381dc
Parent:
7:6264bc5b6421
LP1 code with PingPong removal and 10 second transmission

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