I-O DATA DEV2 / Mbed 2 deprecated Nucleo_Private_LoRa

Dependencies:   mbed Private_lora_SX1276

Committer:
hakusan270
Date:
Fri Dec 18 00:29:26 2020 +0000
Revision:
3:87140a4e4903
Parent:
2:0da0a3008102
1st Lora

Who changed what in which revision?

UserRevisionLine numberNew contents of line
allankliu 0:90252f6ec3d0 1 #include "mbed.h"
allankliu 0:90252f6ec3d0 2 #include "main.h"
allankliu 0:90252f6ec3d0 3 #include "sx1276-hal.h"
allankliu 0:90252f6ec3d0 4 #include "debug.h"
allankliu 0:90252f6ec3d0 5
hakusan270 2:0da0a3008102 6 /***********************************************
hakusan270 2:0da0a3008102 7 Semtech SX1276 Loraの実験
hakusan270 2:0da0a3008102 8   Priva Lora
hakusan270 2:0da0a3008102 9
hakusan270 2:0da0a3008102 10 SX1278 NUCLEO 接続
hakusan270 2:0da0a3008102 11 3.3V AVDD
hakusan270 2:0da0a3008102 12 GND GND
hakusan270 2:0da0a3008102 13 SPI SCK D13
hakusan270 2:0da0a3008102 14 SPI MISO D12
hakusan270 2:0da0a3008102 15 SPI MOSI D11
hakusan270 2:0da0a3008102 16 SPI CS D10
hakusan270 2:0da0a3008102 17 RESET D9
hakusan270 2:0da0a3008102 18 DIO0 D8
hakusan270 2:0da0a3008102 19
hakusan270 2:0da0a3008102 20 通常は送信
hakusan270 2:0da0a3008102 21 ボタン押し リセットで受信モード
hakusan270 2:0da0a3008102 22
hakusan270 2:0da0a3008102 23 ***********************************************/
hakusan270 2:0da0a3008102 24
allankliu 0:90252f6ec3d0 25 /* Set this flag to '1' to display debug messages on the console */
hakusan270 2:0da0a3008102 26 #define DEBUG_MESSAGE 1
allankliu 0:90252f6ec3d0 27
allankliu 0:90252f6ec3d0 28 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
allankliu 0:90252f6ec3d0 29 #define USE_MODEM_LORA 1
allankliu 0:90252f6ec3d0 30 #define USE_MODEM_FSK !USE_MODEM_LORA
allankliu 0:90252f6ec3d0 31
hakusan270 2:0da0a3008102 32 #define RF868 1 //920Mhz 429MHzはコメントにする
allankliu 0:90252f6ec3d0 33
allankliu 0:90252f6ec3d0 34 #ifdef RF868
allankliu 0:90252f6ec3d0 35
hakusan270 1:b8126d119fda 36 #define RF_FREQUENCY 921000000 // Hz
hakusan270 2:0da0a3008102 37 #define TX_OUTPUT_POWER 13 // 13 dBm 20mW 20dB 100mWまで可能
allankliu 0:90252f6ec3d0 38
allankliu 0:90252f6ec3d0 39 #else
allankliu 0:90252f6ec3d0 40
hakusan270 2:0da0a3008102 41 #define RF_FREQUENCY 426375000 // Hz
hakusan270 2:0da0a3008102 42 #define TX_OUTPUT_POWER 13 // 20 dBm 20mW 20dB 100mWまで可能
allankliu 0:90252f6ec3d0 43
allankliu 0:90252f6ec3d0 44 #endif
allankliu 0:90252f6ec3d0 45
allankliu 0:90252f6ec3d0 46 #if USE_MODEM_LORA == 1
allankliu 0:90252f6ec3d0 47 #define LORA_BANDWIDTH 0
hakusan270 2:0da0a3008102 48 #define LORA_SPREADING_FACTOR 12 /*6-12 12が一番遅いが感度*/
allankliu 0:90252f6ec3d0 49 #define LORA_CODINGRATE 2
allankliu 0:90252f6ec3d0 50
allankliu 0:90252f6ec3d0 51 //#define LORA_BANDWIDTH 2 // [0: 125 kHz,
allankliu 0:90252f6ec3d0 52 // 1: 250 kHz,
allankliu 0:90252f6ec3d0 53 // 2: 500 kHz,
allankliu 0:90252f6ec3d0 54 // 3: Reserved]
allankliu 0:90252f6ec3d0 55 //#define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
allankliu 0:90252f6ec3d0 56 //#define LORA_CODINGRATE 1 // [1: 4/5,
allankliu 0:90252f6ec3d0 57 // 2: 4/6,
allankliu 0:90252f6ec3d0 58 // 3: 4/7,
allankliu 0:90252f6ec3d0 59 // 4: 4/8]
allankliu 0:90252f6ec3d0 60 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
allankliu 0:90252f6ec3d0 61 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
allankliu 0:90252f6ec3d0 62 #define LORA_FIX_LENGTH_PAYLOAD_ON false
allankliu 0:90252f6ec3d0 63 #define LORA_FHSS_ENABLED false
allankliu 0:90252f6ec3d0 64 #define LORA_NB_SYMB_HOP 4
allankliu 0:90252f6ec3d0 65 #define LORA_IQ_INVERSION_ON false
allankliu 0:90252f6ec3d0 66 #define LORA_CRC_ENABLED true
allankliu 0:90252f6ec3d0 67
allankliu 0:90252f6ec3d0 68 #elif USE_MODEM_FSK == 1
allankliu 0:90252f6ec3d0 69
allankliu 0:90252f6ec3d0 70 #define FSK_FDEV 25000 // Hz
allankliu 0:90252f6ec3d0 71 #define FSK_DATARATE 19200 // bps
allankliu 0:90252f6ec3d0 72 #define FSK_BANDWIDTH 50000 // Hz
allankliu 0:90252f6ec3d0 73 #define FSK_AFC_BANDWIDTH 83333 // Hz
allankliu 0:90252f6ec3d0 74 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
allankliu 0:90252f6ec3d0 75 #define FSK_FIX_LENGTH_PAYLOAD_ON false
allankliu 0:90252f6ec3d0 76 #define FSK_CRC_ENABLED true
allankliu 0:90252f6ec3d0 77
allankliu 0:90252f6ec3d0 78 #else
allankliu 0:90252f6ec3d0 79 #error "Please define a modem in the compiler options."
allankliu 0:90252f6ec3d0 80 #endif
allankliu 0:90252f6ec3d0 81
allankliu 0:90252f6ec3d0 82 #define RX_TIMEOUT_VALUE 3500000 // in us
hakusan270 1:b8126d119fda 83 #define BUFFER_SIZE 64 // Define the payload size here
allankliu 0:90252f6ec3d0 84
allankliu 0:90252f6ec3d0 85 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
allankliu 0:90252f6ec3d0 86 DigitalOut led(LED2);
allankliu 0:90252f6ec3d0 87 #else
allankliu 0:90252f6ec3d0 88 //DigitalOut led(LED1);
allankliu 0:90252f6ec3d0 89 //DigitalOut led2(LED2);
allankliu 0:90252f6ec3d0 90 //DigitalOut led3(LED3);
allankliu 0:90252f6ec3d0 91 //DigitalOut led4(LED4);
allankliu 0:90252f6ec3d0 92 DigitalOut debugled(D6);
allankliu 0:90252f6ec3d0 93 DigitalOut debugled2(D7);
allankliu 0:90252f6ec3d0 94
allankliu 0:90252f6ec3d0 95 #endif
allankliu 0:90252f6ec3d0 96
allankliu 0:90252f6ec3d0 97 DigitalIn role(USER_BUTTON); // PC_13 in Mini 103RC mini board
allankliu 0:90252f6ec3d0 98 Timer tx_tmr;
allankliu 0:90252f6ec3d0 99
allankliu 0:90252f6ec3d0 100 #define UART_ENABLE
allankliu 0:90252f6ec3d0 101
allankliu 0:90252f6ec3d0 102 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 103 //Serial pc(USBTX, USBRX);
hakusan270 1:b8126d119fda 104 Serial pc(SERIAL_TX, SERIAL_RX,115200);
allankliu 0:90252f6ec3d0 105 #endif
allankliu 0:90252f6ec3d0 106
allankliu 0:90252f6ec3d0 107 Ticker nwk_ticker;
allankliu 0:90252f6ec3d0 108
allankliu 0:90252f6ec3d0 109 bool channelOccupied = false;
allankliu 0:90252f6ec3d0 110
allankliu 0:90252f6ec3d0 111 #define NWK_SLEEP 0
allankliu 0:90252f6ec3d0 112 #define NWK_TX 1
allankliu 0:90252f6ec3d0 113 #define NWK_TX_NOK 2
allankliu 0:90252f6ec3d0 114 #define NWK_RX_OK 3
allankliu 0:90252f6ec3d0 115 #define NWK_RX_NOK 4
allankliu 0:90252f6ec3d0 116
allankliu 0:90252f6ec3d0 117 //#define PINGPONG
allankliu 0:90252f6ec3d0 118
allankliu 0:90252f6ec3d0 119 void nwk_toggle()
allankliu 0:90252f6ec3d0 120 {
allankliu 0:90252f6ec3d0 121 debugled = !debugled;
allankliu 0:90252f6ec3d0 122 debugled2 = !debugled2;
allankliu 0:90252f6ec3d0 123 }
allankliu 0:90252f6ec3d0 124
allankliu 0:90252f6ec3d0 125 void nwk_setmode(uint8_t mode)
allankliu 0:90252f6ec3d0 126 {
allankliu 0:90252f6ec3d0 127 switch(mode){
allankliu 0:90252f6ec3d0 128 case NWK_TX:
allankliu 0:90252f6ec3d0 129 case NWK_RX_OK:
allankliu 0:90252f6ec3d0 130 nwk_ticker.attach(&nwk_toggle, 1);
allankliu 0:90252f6ec3d0 131 break;
allankliu 0:90252f6ec3d0 132 case NWK_TX_NOK:
allankliu 0:90252f6ec3d0 133 case NWK_RX_NOK:
allankliu 0:90252f6ec3d0 134 nwk_ticker.attach(&nwk_toggle, 0.1);
allankliu 0:90252f6ec3d0 135 break;
allankliu 0:90252f6ec3d0 136 case NWK_SLEEP:
allankliu 0:90252f6ec3d0 137 default:
allankliu 0:90252f6ec3d0 138 debugled = 0;
allankliu 0:90252f6ec3d0 139 debugled2 = 0;
allankliu 0:90252f6ec3d0 140 nwk_ticker.detach();
allankliu 0:90252f6ec3d0 141 break;
allankliu 0:90252f6ec3d0 142 }
allankliu 0:90252f6ec3d0 143 }
allankliu 0:90252f6ec3d0 144
allankliu 0:90252f6ec3d0 145 /*
allankliu 0:90252f6ec3d0 146 * Global variables declarations
allankliu 0:90252f6ec3d0 147 */
allankliu 0:90252f6ec3d0 148 typedef enum
allankliu 0:90252f6ec3d0 149 {
allankliu 0:90252f6ec3d0 150 ST_LOWPOWER = 0,
allankliu 0:90252f6ec3d0 151 ST_IDLE,
allankliu 0:90252f6ec3d0 152
allankliu 0:90252f6ec3d0 153 ST_RX,
allankliu 0:90252f6ec3d0 154 ST_RX_TIMEOUT,
allankliu 0:90252f6ec3d0 155 ST_RX_ERROR,
allankliu 0:90252f6ec3d0 156
allankliu 0:90252f6ec3d0 157 ST_TX,
allankliu 0:90252f6ec3d0 158 ST_TX_TIMEOUT,
allankliu 0:90252f6ec3d0 159
allankliu 0:90252f6ec3d0 160 ST_CAD,
allankliu 0:90252f6ec3d0 161 ST_CAD_DONE
allankliu 0:90252f6ec3d0 162 }AppStates_t;
allankliu 0:90252f6ec3d0 163
allankliu 0:90252f6ec3d0 164 volatile AppStates_t State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 165
allankliu 0:90252f6ec3d0 166 /*!
allankliu 0:90252f6ec3d0 167 * Radio events function pointer
allankliu 0:90252f6ec3d0 168 */
allankliu 0:90252f6ec3d0 169 static RadioEvents_t RadioEvents;
allankliu 0:90252f6ec3d0 170
allankliu 0:90252f6ec3d0 171 /*
allankliu 0:90252f6ec3d0 172 * Global variables declarations
allankliu 0:90252f6ec3d0 173 */
allankliu 0:90252f6ec3d0 174 SX1276MB1xAS Radio( NULL );
allankliu 0:90252f6ec3d0 175
allankliu 0:90252f6ec3d0 176 const uint8_t PingMsg[] = "PING";
allankliu 0:90252f6ec3d0 177 const uint8_t PongMsg[] = "PONG";
allankliu 0:90252f6ec3d0 178 const uint8_t TestMsg[] = "LoRa Test";
allankliu 0:90252f6ec3d0 179
hakusan270 2:0da0a3008102 180 uint16_t BufferSize = 56;//up to 56 BUFFER_SIZE;
allankliu 0:90252f6ec3d0 181 uint8_t Buffer[BUFFER_SIZE];
allankliu 0:90252f6ec3d0 182
allankliu 0:90252f6ec3d0 183 //int16_t RssiValue = 0.0;
allankliu 0:90252f6ec3d0 184 //int8_t SnrValue = 0.0;
allankliu 0:90252f6ec3d0 185
allankliu 0:90252f6ec3d0 186 int16_t RssiValue = 0;
allankliu 0:90252f6ec3d0 187 int8_t SnrValue = 0;
allankliu 0:90252f6ec3d0 188
allankliu 0:90252f6ec3d0 189 #define REG_SIZE 0x70 // see below
allankliu 0:90252f6ec3d0 190 #define REG_IDX_SIZE 39
allankliu 0:90252f6ec3d0 191
allankliu 0:90252f6ec3d0 192 static int my_strncmp(const char *, const char *, int);
allankliu 0:90252f6ec3d0 193 static void my_strcpy(char * , const char *);
allankliu 0:90252f6ec3d0 194
allankliu 0:90252f6ec3d0 195 int my_strncmp(const char * s1, const char * s2, int size)
allankliu 0:90252f6ec3d0 196 {
allankliu 0:90252f6ec3d0 197 int n = size;
allankliu 0:90252f6ec3d0 198 for ( ; n > 0; s1++, s2++, --n)
allankliu 0:90252f6ec3d0 199 if (*s1 != *s2)
allankliu 0:90252f6ec3d0 200 return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
allankliu 0:90252f6ec3d0 201 else if (*s1 == '\0')
allankliu 0:90252f6ec3d0 202 return 0;
allankliu 0:90252f6ec3d0 203 return 0;
allankliu 0:90252f6ec3d0 204 }
allankliu 0:90252f6ec3d0 205
allankliu 0:90252f6ec3d0 206 void my_strcpy(char * s1, const char * s2)
allankliu 0:90252f6ec3d0 207 {
allankliu 0:90252f6ec3d0 208 char *s = s1;
allankliu 0:90252f6ec3d0 209 while ((*s++ = *s2++) != 0)
allankliu 0:90252f6ec3d0 210 ;
allankliu 0:90252f6ec3d0 211 }
allankliu 0:90252f6ec3d0 212
allankliu 0:90252f6ec3d0 213 void Sender ( void )
allankliu 0:90252f6ec3d0 214 {
allankliu 0:90252f6ec3d0 215 int i;
allankliu 0:90252f6ec3d0 216 my_strcpy( ( char* )Buffer, ( char* )PingMsg );
allankliu 0:90252f6ec3d0 217 for( i = 4; i < BufferSize; i++ ){
hakusan270 1:b8126d119fda 218 Buffer[i] = (i % 10) + '0' ;
allankliu 0:90252f6ec3d0 219 }
allankliu 0:90252f6ec3d0 220 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 221 }
allankliu 0:90252f6ec3d0 222
allankliu 0:90252f6ec3d0 223 int main()
allankliu 0:90252f6ec3d0 224 {
allankliu 0:90252f6ec3d0 225 uint8_t i;
allankliu 0:90252f6ec3d0 226 uint8_t regval;
allankliu 0:90252f6ec3d0 227 bool isMaster = true;
allankliu 0:90252f6ec3d0 228 int begin, end;
allankliu 0:90252f6ec3d0 229
allankliu 0:90252f6ec3d0 230 uint32_t rand;
allankliu 0:90252f6ec3d0 231 debugled = 1;
allankliu 0:90252f6ec3d0 232 debugled2 = 1;
allankliu 0:90252f6ec3d0 233
allankliu 0:90252f6ec3d0 234 isMaster = role.read();
allankliu 0:90252f6ec3d0 235
allankliu 0:90252f6ec3d0 236 //debug( "\n\n\r SX1276 Ping Pong Demo Application \n\n\r" );
allankliu 0:90252f6ec3d0 237
allankliu 0:90252f6ec3d0 238 // Initialize Radio driver
allankliu 0:90252f6ec3d0 239 RadioEvents.TxDone = OnTxDone;
allankliu 0:90252f6ec3d0 240 RadioEvents.RxDone = OnRxDone;
allankliu 0:90252f6ec3d0 241 RadioEvents.RxError = OnRxError;
allankliu 0:90252f6ec3d0 242 RadioEvents.TxTimeout = OnTxTimeout;
allankliu 0:90252f6ec3d0 243 RadioEvents.RxTimeout = OnRxTimeout;
allankliu 0:90252f6ec3d0 244 Radio.Init( &RadioEvents );
allankliu 0:90252f6ec3d0 245
allankliu 0:90252f6ec3d0 246 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 247 regval = Radio.Read(REG_VERSION);
hakusan270 2:0da0a3008102 248 pc.printf("%s freq=%d", TestMsg, RF_FREQUENCY );
allankliu 0:90252f6ec3d0 249 pc.printf("IC Version: %02X\r\n", regval);
allankliu 0:90252f6ec3d0 250 regval = Radio.Read(REG_OPMODE);
allankliu 0:90252f6ec3d0 251 pc.printf("OPMODE: %02X\r\n", regval);
allankliu 0:90252f6ec3d0 252 #endif
allankliu 0:90252f6ec3d0 253
allankliu 0:90252f6ec3d0 254 debugled = 0;
allankliu 0:90252f6ec3d0 255 debugled2 = 0;
allankliu 0:90252f6ec3d0 256
allankliu 0:90252f6ec3d0 257 // verify the connection with the board
allankliu 0:90252f6ec3d0 258 while( Radio.Read( REG_VERSION ) == 0x00 )
allankliu 0:90252f6ec3d0 259 {
allankliu 0:90252f6ec3d0 260 //debug( "Radio could not be detected!\n\r", NULL );
allankliu 0:90252f6ec3d0 261 wait( 1 );
allankliu 0:90252f6ec3d0 262 }
allankliu 0:90252f6ec3d0 263
allankliu 0:90252f6ec3d0 264 //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r > Board Type: SX1276MB1LAS < \n\r" );
allankliu 0:90252f6ec3d0 265 //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r > Board Type: SX1276MB1MAS < \n\r" );
allankliu 0:90252f6ec3d0 266
allankliu 0:90252f6ec3d0 267 Radio.SetChannel( RF_FREQUENCY );
allankliu 0:90252f6ec3d0 268
allankliu 0:90252f6ec3d0 269 #if USE_MODEM_LORA == 1
allankliu 0:90252f6ec3d0 270
allankliu 0:90252f6ec3d0 271 //debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r");
allankliu 0:90252f6ec3d0 272 //debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r");
allankliu 0:90252f6ec3d0 273
allankliu 0:90252f6ec3d0 274 Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
allankliu 0:90252f6ec3d0 275 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
allankliu 0:90252f6ec3d0 276 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
allankliu 0:90252f6ec3d0 277 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
allankliu 0:90252f6ec3d0 278 LORA_IQ_INVERSION_ON, 2000000 );
allankliu 0:90252f6ec3d0 279
allankliu 0:90252f6ec3d0 280 Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
allankliu 0:90252f6ec3d0 281 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
allankliu 0:90252f6ec3d0 282 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
allankliu 0:90252f6ec3d0 283 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
allankliu 0:90252f6ec3d0 284 LORA_IQ_INVERSION_ON, true );
allankliu 0:90252f6ec3d0 285
allankliu 0:90252f6ec3d0 286 #elif USE_MODEM_FSK == 1
allankliu 0:90252f6ec3d0 287
allankliu 0:90252f6ec3d0 288 //debug("\n\n\r > FSK Mode < \n\n\r");
allankliu 0:90252f6ec3d0 289 Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
allankliu 0:90252f6ec3d0 290 FSK_DATARATE, 0,
allankliu 0:90252f6ec3d0 291 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
allankliu 0:90252f6ec3d0 292 FSK_CRC_ENABLED, 0, 0, 0, 2000000 );
allankliu 0:90252f6ec3d0 293
allankliu 0:90252f6ec3d0 294 Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
allankliu 0:90252f6ec3d0 295 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
allankliu 0:90252f6ec3d0 296 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
allankliu 0:90252f6ec3d0 297 0, 0, false, true );
allankliu 0:90252f6ec3d0 298
allankliu 0:90252f6ec3d0 299 #else
allankliu 0:90252f6ec3d0 300
allankliu 0:90252f6ec3d0 301 #error "Please define a modem in the compiler options."
allankliu 0:90252f6ec3d0 302
allankliu 0:90252f6ec3d0 303 #endif
allankliu 0:90252f6ec3d0 304
allankliu 0:90252f6ec3d0 305 //debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" );
allankliu 0:90252f6ec3d0 306
allankliu 0:90252f6ec3d0 307 rand = Radio.Random();
allankliu 0:90252f6ec3d0 308 rand = rand%1000;
allankliu 0:90252f6ec3d0 309 wait_ms((uint16_t)rand);
allankliu 0:90252f6ec3d0 310
allankliu 0:90252f6ec3d0 311 #ifdef PINGPONG
allankliu 0:90252f6ec3d0 312 Radio.Rx( RX_TIMEOUT_VALUE );
hakusan270 2:0da0a3008102 313 int j=0;
allankliu 0:90252f6ec3d0 314
allankliu 0:90252f6ec3d0 315 while( 1 )
allankliu 0:90252f6ec3d0 316 {
allankliu 0:90252f6ec3d0 317 switch( State )
allankliu 0:90252f6ec3d0 318 {
allankliu 0:90252f6ec3d0 319 case ST_RX:
allankliu 0:90252f6ec3d0 320 if( isMaster == true )
allankliu 0:90252f6ec3d0 321 {
allankliu 0:90252f6ec3d0 322 if( BufferSize > 0 )
allankliu 0:90252f6ec3d0 323 {
allankliu 0:90252f6ec3d0 324 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 325 pc.printf("Received message:\r\n");
allankliu 0:90252f6ec3d0 326 pc.printf("%s",Buffer);
allankliu 0:90252f6ec3d0 327 #endif
allankliu 0:90252f6ec3d0 328 //if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
allankliu 0:90252f6ec3d0 329 if( my_strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
allankliu 0:90252f6ec3d0 330 {
allankliu 0:90252f6ec3d0 331 nwk_setmode(NWK_NORMAL);
allankliu 0:90252f6ec3d0 332 //debug( "...Pong\r\n" );
allankliu 0:90252f6ec3d0 333 // Send the next PING frame
allankliu 0:90252f6ec3d0 334 my_strcpy( ( char* )Buffer, ( char* )PingMsg );
allankliu 0:90252f6ec3d0 335 //_strcpy( ( char* )Buffer, ( char* )PingMsg );
allankliu 0:90252f6ec3d0 336 // We fill the buffer with numbers for the payload
allankliu 0:90252f6ec3d0 337 for( i = 4; i < BufferSize; i++ )
allankliu 0:90252f6ec3d0 338 {
allankliu 0:90252f6ec3d0 339 Buffer[i] = i - 4;
allankliu 0:90252f6ec3d0 340 }
allankliu 0:90252f6ec3d0 341 wait_ms( 10 );
allankliu 0:90252f6ec3d0 342 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 343 }
allankliu 0:90252f6ec3d0 344 else if( my_strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
allankliu 0:90252f6ec3d0 345 { // A master already exists then become a slave
allankliu 0:90252f6ec3d0 346 debug( "...Ping\r\n" );
allankliu 0:90252f6ec3d0 347 //nwk_setmode(NWK_NORMAL);
allankliu 0:90252f6ec3d0 348 //led = !led;
allankliu 0:90252f6ec3d0 349 isMaster = false;
allankliu 0:90252f6ec3d0 350 // Send the next PONG frame
allankliu 0:90252f6ec3d0 351 my_strcpy( ( char* )Buffer, ( char* )PongMsg );
allankliu 0:90252f6ec3d0 352 // We fill the buffer with numbers for the payload
allankliu 0:90252f6ec3d0 353 for( i = 4; i < BufferSize; i++ )
allankliu 0:90252f6ec3d0 354 {
allankliu 0:90252f6ec3d0 355 Buffer[i] = i - 4;
allankliu 0:90252f6ec3d0 356 }
allankliu 0:90252f6ec3d0 357 wait_ms( 10 );
allankliu 0:90252f6ec3d0 358 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 359 }
allankliu 0:90252f6ec3d0 360 else // valid reception but neither a PING or a PONG message
allankliu 0:90252f6ec3d0 361 { // Set device as master ans start again
allankliu 0:90252f6ec3d0 362 isMaster = true;
allankliu 0:90252f6ec3d0 363 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 364 }
allankliu 0:90252f6ec3d0 365 }
allankliu 0:90252f6ec3d0 366 }
allankliu 0:90252f6ec3d0 367 else
allankliu 0:90252f6ec3d0 368 {
allankliu 0:90252f6ec3d0 369 if( BufferSize > 0 )
allankliu 0:90252f6ec3d0 370 {
allankliu 0:90252f6ec3d0 371 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 372 pc.printf("Received message:\r\n");
allankliu 0:90252f6ec3d0 373 pc.printf("%s",Buffer);
allankliu 0:90252f6ec3d0 374 #endif
allankliu 0:90252f6ec3d0 375
allankliu 0:90252f6ec3d0 376 if( my_strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
allankliu 0:90252f6ec3d0 377 {
allankliu 0:90252f6ec3d0 378 nwk_setmode(NWK_NORMAL);
allankliu 0:90252f6ec3d0 379 //led = !led;
allankliu 0:90252f6ec3d0 380 //debug( "...Ping\r\n" );
allankliu 0:90252f6ec3d0 381 // Send the reply to the PING string
allankliu 0:90252f6ec3d0 382 my_strcpy( ( char* )Buffer, ( char* )PongMsg );
allankliu 0:90252f6ec3d0 383 // We fill the buffer with numbers for the payload
allankliu 0:90252f6ec3d0 384 for( i = 4; i < BufferSize; i++ )
allankliu 0:90252f6ec3d0 385 {
allankliu 0:90252f6ec3d0 386 Buffer[i] = i - 4;
allankliu 0:90252f6ec3d0 387 }
allankliu 0:90252f6ec3d0 388 wait_ms( 10 );
allankliu 0:90252f6ec3d0 389 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 390 }
allankliu 0:90252f6ec3d0 391 else // valid reception but not a PING as expected
allankliu 0:90252f6ec3d0 392 { // Set device as master and start again
allankliu 0:90252f6ec3d0 393 isMaster = true;
allankliu 0:90252f6ec3d0 394 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 395 }
allankliu 0:90252f6ec3d0 396 }
allankliu 0:90252f6ec3d0 397 }
allankliu 0:90252f6ec3d0 398 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 399 break;
allankliu 0:90252f6ec3d0 400 case ST_TX:
allankliu 0:90252f6ec3d0 401 //nwk_setmode(NWK_NORMAL);
allankliu 0:90252f6ec3d0 402 //led = !led;
allankliu 0:90252f6ec3d0 403 if( isMaster == true )
allankliu 0:90252f6ec3d0 404 {
allankliu 0:90252f6ec3d0 405 //debug( "Ping...\r\n" );
allankliu 0:90252f6ec3d0 406 }
allankliu 0:90252f6ec3d0 407 else
allankliu 0:90252f6ec3d0 408 {
allankliu 0:90252f6ec3d0 409 //debug( "Pong...\r\n" );
allankliu 0:90252f6ec3d0 410 }
allankliu 0:90252f6ec3d0 411 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 412 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 413 break;
allankliu 0:90252f6ec3d0 414 case ST_RX_TIMEOUT:
allankliu 0:90252f6ec3d0 415 //debugled = !debugled;
allankliu 0:90252f6ec3d0 416 //debugled2 = !debugled2;
allankliu 0:90252f6ec3d0 417 nwk_setmode(NWK_ERR);
allankliu 0:90252f6ec3d0 418 if( isMaster == true )
allankliu 0:90252f6ec3d0 419 {
allankliu 0:90252f6ec3d0 420 // Send the next PING frame
allankliu 0:90252f6ec3d0 421 my_strcpy( ( char* )Buffer, ( char* )PingMsg );
allankliu 0:90252f6ec3d0 422 for( i = 4; i < BufferSize; i++ )
allankliu 0:90252f6ec3d0 423 {
allankliu 0:90252f6ec3d0 424 Buffer[i] = i - 4;
allankliu 0:90252f6ec3d0 425 }
allankliu 0:90252f6ec3d0 426 wait_ms( 10 );
allankliu 0:90252f6ec3d0 427 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 428 }
allankliu 0:90252f6ec3d0 429 else
allankliu 0:90252f6ec3d0 430 {
allankliu 0:90252f6ec3d0 431 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 432 }
allankliu 0:90252f6ec3d0 433 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 434 break;
allankliu 0:90252f6ec3d0 435 case ST_RX_ERROR:
allankliu 0:90252f6ec3d0 436 // We have received a Packet with a CRC error, send reply as if packet was correct
allankliu 0:90252f6ec3d0 437 nwk_setmode(NWK_ERR);
allankliu 0:90252f6ec3d0 438 if( isMaster == true )
allankliu 0:90252f6ec3d0 439 {
allankliu 0:90252f6ec3d0 440 // Send the next PING frame
allankliu 0:90252f6ec3d0 441 my_strcpy( ( char* )Buffer, ( char* )PingMsg );
allankliu 0:90252f6ec3d0 442 for( i = 4; i < BufferSize; i++ )
allankliu 0:90252f6ec3d0 443 {
allankliu 0:90252f6ec3d0 444 Buffer[i] = i - 4;
allankliu 0:90252f6ec3d0 445 }
allankliu 0:90252f6ec3d0 446 wait_ms( 10 );
allankliu 0:90252f6ec3d0 447 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 448 }
allankliu 0:90252f6ec3d0 449 else
allankliu 0:90252f6ec3d0 450 {
allankliu 0:90252f6ec3d0 451 // Send the next PONG frame
allankliu 0:90252f6ec3d0 452 my_strcpy( ( char* )Buffer, ( char* )PongMsg );
allankliu 0:90252f6ec3d0 453 for( i = 4; i < BufferSize; i++ )
allankliu 0:90252f6ec3d0 454 {
allankliu 0:90252f6ec3d0 455 Buffer[i] = i - 4;
allankliu 0:90252f6ec3d0 456 }
allankliu 0:90252f6ec3d0 457 wait_ms( 10 );
allankliu 0:90252f6ec3d0 458 Radio.Send( Buffer, BufferSize );
allankliu 0:90252f6ec3d0 459 }
allankliu 0:90252f6ec3d0 460 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 461 break;
allankliu 0:90252f6ec3d0 462 case ST_TX_TIMEOUT:
allankliu 0:90252f6ec3d0 463 nwk_setmode(NWK_ERR);
allankliu 0:90252f6ec3d0 464 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 465 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 466 break;
allankliu 0:90252f6ec3d0 467 case ST_CAD:
allankliu 0:90252f6ec3d0 468 break;
allankliu 0:90252f6ec3d0 469 case ST_CAD_DONE:
allankliu 0:90252f6ec3d0 470 if(channelOccupied){
allankliu 0:90252f6ec3d0 471 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 472 }else{
allankliu 0:90252f6ec3d0 473 // start to transmit here.
allankliu 0:90252f6ec3d0 474 }
allankliu 0:90252f6ec3d0 475 break;
allankliu 0:90252f6ec3d0 476 case ST_LOWPOWER:
allankliu 0:90252f6ec3d0 477 break;
allankliu 0:90252f6ec3d0 478 default:
allankliu 0:90252f6ec3d0 479 nwk_setmode(0xFF);
allankliu 0:90252f6ec3d0 480 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 481 break;
allankliu 0:90252f6ec3d0 482 }
allankliu 0:90252f6ec3d0 483 }
allankliu 0:90252f6ec3d0 484
allankliu 0:90252f6ec3d0 485 #else
hakusan270 2:0da0a3008102 486 int j=0;
allankliu 0:90252f6ec3d0 487 if(isMaster == true){
allankliu 0:90252f6ec3d0 488 tx_tmr.start();
allankliu 0:90252f6ec3d0 489 begin = tx_tmr.read_ms();
allankliu 0:90252f6ec3d0 490 }else{
allankliu 0:90252f6ec3d0 491 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 492 }
allankliu 0:90252f6ec3d0 493
allankliu 0:90252f6ec3d0 494 while(1){
allankliu 0:90252f6ec3d0 495 switch(State){
allankliu 0:90252f6ec3d0 496 case ST_RX:
allankliu 0:90252f6ec3d0 497 //nwk_setmode(NWK_RX_OK);
allankliu 0:90252f6ec3d0 498 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 499 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 500 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 501 //pc.printf("\r\nRX OK\tRSSI:%f SNR:%f \r\n",float(RssiValue),float(SnrValue));
hakusan270 2:0da0a3008102 502 if (RssiValue>=64) RssiValue -= 256;
hakusan270 2:0da0a3008102 503 pc.printf("RX OK\tRSSI:%d SNR:%d ",RssiValue,SnrValue);
hakusan270 2:0da0a3008102 504 for(i=0;i<BufferSize;i++) if (Buffer[i] & 0x80) Buffer[i]=0;
hakusan270 2:0da0a3008102 505 pc.printf("\tSZ=%d %s\r\n", BufferSize,Buffer);
hakusan270 1:b8126d119fda 506 Buffer[0]=0;
allankliu 0:90252f6ec3d0 507 #endif
allankliu 0:90252f6ec3d0 508 break;
allankliu 0:90252f6ec3d0 509 case ST_TX:
allankliu 0:90252f6ec3d0 510 nwk_setmode(NWK_TX);
allankliu 0:90252f6ec3d0 511 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 512 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 513 pc.printf("\r\nTX Done.\r\n");
allankliu 0:90252f6ec3d0 514 #endif
allankliu 0:90252f6ec3d0 515 break;
allankliu 0:90252f6ec3d0 516 case ST_RX_TIMEOUT:
allankliu 0:90252f6ec3d0 517 case ST_RX_ERROR:
allankliu 0:90252f6ec3d0 518 //nwk_setmode(NWK_RX_NOK);
allankliu 0:90252f6ec3d0 519 Radio.Rx( RX_TIMEOUT_VALUE );
allankliu 0:90252f6ec3d0 520 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 521 #ifdef UART_ENABLE
allankliu 0:90252f6ec3d0 522 pc.printf("\r\nRX TIMEOUT or ERROR.\r\n");
allankliu 0:90252f6ec3d0 523 #endif
allankliu 0:90252f6ec3d0 524 break;
allankliu 0:90252f6ec3d0 525 case ST_TX_TIMEOUT:
allankliu 0:90252f6ec3d0 526 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 527 break;
allankliu 0:90252f6ec3d0 528 case ST_LOWPOWER:
allankliu 0:90252f6ec3d0 529 if (isMaster){
allankliu 0:90252f6ec3d0 530 end = tx_tmr.read_ms();
allankliu 0:90252f6ec3d0 531 if ((end-begin) >= 2000){
hakusan270 2:0da0a3008102 532
allankliu 0:90252f6ec3d0 533 Sender();
allankliu 0:90252f6ec3d0 534 tx_tmr.stop();
allankliu 0:90252f6ec3d0 535 tx_tmr.start();
allankliu 0:90252f6ec3d0 536 begin = tx_tmr.read_ms();
hakusan270 2:0da0a3008102 537 if (j++ > 500) NVIC_SystemReset();
hakusan270 2:0da0a3008102 538
allankliu 0:90252f6ec3d0 539 }
allankliu 0:90252f6ec3d0 540 }
allankliu 0:90252f6ec3d0 541 break;
allankliu 0:90252f6ec3d0 542 default:
allankliu 0:90252f6ec3d0 543 State = ST_LOWPOWER;
allankliu 0:90252f6ec3d0 544 break;
allankliu 0:90252f6ec3d0 545 }
allankliu 0:90252f6ec3d0 546 }
allankliu 0:90252f6ec3d0 547 #endif
allankliu 0:90252f6ec3d0 548
allankliu 0:90252f6ec3d0 549 }
allankliu 0:90252f6ec3d0 550
allankliu 0:90252f6ec3d0 551
allankliu 0:90252f6ec3d0 552 void OnTxDone( void )
allankliu 0:90252f6ec3d0 553 {
allankliu 0:90252f6ec3d0 554 Radio.Sleep( );
allankliu 0:90252f6ec3d0 555 State = ST_TX;
allankliu 0:90252f6ec3d0 556 //debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
allankliu 0:90252f6ec3d0 557 }
allankliu 0:90252f6ec3d0 558
allankliu 0:90252f6ec3d0 559 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
allankliu 0:90252f6ec3d0 560 {
allankliu 0:90252f6ec3d0 561 Radio.Sleep( );
allankliu 0:90252f6ec3d0 562 BufferSize = size;
allankliu 0:90252f6ec3d0 563 memcpy( Buffer, payload, BufferSize );
allankliu 0:90252f6ec3d0 564 RssiValue = rssi;
allankliu 0:90252f6ec3d0 565 SnrValue = snr;
allankliu 0:90252f6ec3d0 566 State = ST_RX;
allankliu 0:90252f6ec3d0 567 nwk_setmode(NWK_RX_OK);
allankliu 0:90252f6ec3d0 568 //debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
allankliu 0:90252f6ec3d0 569 }
allankliu 0:90252f6ec3d0 570
allankliu 0:90252f6ec3d0 571 void OnTxTimeout( void )
allankliu 0:90252f6ec3d0 572 {
allankliu 0:90252f6ec3d0 573 Radio.Sleep( );
allankliu 0:90252f6ec3d0 574 State = ST_TX_TIMEOUT;
allankliu 0:90252f6ec3d0 575 //debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
allankliu 0:90252f6ec3d0 576 }
allankliu 0:90252f6ec3d0 577
allankliu 0:90252f6ec3d0 578 void OnRxTimeout( void )
allankliu 0:90252f6ec3d0 579 {
allankliu 0:90252f6ec3d0 580 Radio.Sleep( );
allankliu 0:90252f6ec3d0 581 Buffer[ BufferSize ] = 0;
allankliu 0:90252f6ec3d0 582 State = ST_RX_TIMEOUT;
allankliu 0:90252f6ec3d0 583 nwk_setmode(NWK_RX_NOK);
allankliu 0:90252f6ec3d0 584 //debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
allankliu 0:90252f6ec3d0 585 }
allankliu 0:90252f6ec3d0 586
allankliu 0:90252f6ec3d0 587 void OnRxError( void )
allankliu 0:90252f6ec3d0 588 {
allankliu 0:90252f6ec3d0 589 Radio.Sleep( );
allankliu 0:90252f6ec3d0 590 State = ST_RX_ERROR;
allankliu 0:90252f6ec3d0 591 //debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
allankliu 0:90252f6ec3d0 592 }
allankliu 0:90252f6ec3d0 593
allankliu 0:90252f6ec3d0 594 // Added by allankliu
allankliu 0:90252f6ec3d0 595 void OnCadDone( bool channelActivityDetected )
allankliu 0:90252f6ec3d0 596 {
allankliu 0:90252f6ec3d0 597 Radio.Sleep();
allankliu 0:90252f6ec3d0 598 channelOccupied = channelActivityDetected;
allankliu 0:90252f6ec3d0 599 State = ST_CAD_DONE;
allankliu 0:90252f6ec3d0 600 }