1 /*
2  * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3  */
4 
5 #include <string.h>
6 #include "board.h"
7 #include "radio.h"
8 #include "aos/hal/gpio.h"
9 #include "aos/hal/spi.h"
10 #include "sx126x-board.h"
11 #include "aos/hal/timer.h"
12 #include "ulog/ulog.h"
13 
14 #define TRANS_MODE_TX        (0xEF)
15 #define TRANS_MODE_RX        (0xFE)
16 
17 // set transmission mode here, TRANS_MODE_TX or TRANS_MODE_RX
18 #define TRANSMIT_MODE TRANS_MODE_TX
19 
20 #define RF_FREQUENCY                                470000000 // 779000000 Hz
21 #define TX_OUTPUT_POWER                             14        // dBm
22 #define LORA_BANDWIDTH                              2         // [0: 125 kHz, 1: 250 kHz, 2: 500 kHz]
23 #define LORA_SPREADING_FACTOR                       7         // [SF7..SF12]
24 #define LORA_CODINGRATE                             1         // [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
25 #define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
26 #define LORA_SYMBOL_TIMEOUT                         0         // Symbols
27 #define LORA_FIX_LENGTH_PAYLOAD_ON                  false
28 #define LORA_IQ_INVERSION_ON                        false
29 
30 #define BUFFER_SIZE                                 64 // Define the payload size here
31 uint8_t g_buffer[BUFFER_SIZE] = {0};
32 
33 static RadioEvents_t g_RadioCallback;
34 
OnTxDone()35 void OnTxDone( ) {
36     LOG("[lora demo][%s] << %s \n", __func__, g_buffer);
37     memset(g_buffer, 0, BUFFER_SIZE);
38     sleep(5);
39 }
40 
OnRxDone(uint8_t * payload,uint16_t size,int16_t rssi,int8_t snr)41 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) {
42     LOG("[lora demo][%s] >> %s \n", __func__, payload);
43     Radio.Sleep();
44     Radio.Rx( 1000 );
45 }
46 
47 /**
48  * Main application entry point.
49  */
application_start(int argc,char * argv[])50 int application_start(int argc, char *argv[]) {
51     bool isMaster = true;
52     uint8_t i;
53 
54     // set log level
55     aos_set_log_level(AOS_LL_DEBUG);
56 
57     // Radio initialization
58     g_RadioCallback.TxDone = OnTxDone;
59     g_RadioCallback.RxDone = OnRxDone;
60     Radio.Init( &g_RadioCallback );
61     LOG("[lora demo] ++init radio done++");
62 
63     Radio.SetChannel( RF_FREQUENCY );
64 
65 #if defined(TRANSMIT_MODE) && (TRANSMIT_MODE == TRANS_MODE_TX)
66     Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
67                                    LORA_SPREADING_FACTOR, LORA_CODINGRATE,
68                                    LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
69                                    true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );
70     LOG("[lora demo] ++set TX config done++");
71 #elif defined(TRANSMIT_MODE) && (TRANSMIT_MODE == TRANS_MODE_RX)
72     Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
73                                    LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
74                                    LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
75                                    0, true, 0, 0, LORA_IQ_INVERSION_ON, true );
76     LOG("[lora demo] ++set RX config done++");
77 #else
78     #error "PLEASE SET VALID TRANSMIT MODE FIRST!!"
79 #endif
80 
81     Radio.SetMaxPayloadLength( MODEM_LORA, BUFFER_SIZE );
82     LOG("[lora demo] ++lora init done++\n");
83 
84 #if defined(TRANSMIT_MODE) && (TRANSMIT_MODE == TRANS_MODE_RX)
85     Radio.Rx( 1000 );
86 #endif
87 
88     while( 1 )
89     {
90 #if defined(TRANSMIT_MODE) && (TRANSMIT_MODE == TRANS_MODE_TX)
91         if(strlen(g_buffer) == 0) {
92             snprintf(g_buffer, BUFFER_SIZE, "Hello from HaaS@%llu...", aos_now_ms());
93             Radio.Send( g_buffer, strlen(g_buffer)+1);
94         }
95 #endif
96         if( Radio.IrqProcess != NULL )
97         {
98             Radio.IrqProcess( );
99         }
100         // sleep for other system task, such as CLI task.
101         aos_msleep(100);
102     }
103     return 0;
104 }
105