Simple transmitter application for SX127x radio.

Dependencies:   MbedJSONValue SX127x sx12xx_hal

Committer:
corymast
Date:
Fri Sep 06 19:55:25 2019 +0000
Revision:
3:5e25ec621190
Parent:
2:efc0c1bbdffc
Child:
4:b2fc780be0b3
Added functions for modifying transmit message.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LoRaToolbox 0:44fb2db84011 1 #include "radio.h"
corymast 3:5e25ec621190 2 #include "mbed.h"
corymast 3:5e25ec621190 3 #include "platform/CircularBuffer.h"
corymast 3:5e25ec621190 4 #include "MbedJSONValue/MbedJSONValue.h"
LoRaToolbox 0:44fb2db84011 5
LoRaToolbox 1:b277f5a65c1c 6 // Semtech radio definitions for SX127x, SX126x and SX128x
LoRaToolbox 1:b277f5a65c1c 7
LoRaToolbox 0:44fb2db84011 8 #if defined(SX127x_H)
LoRaToolbox 0:44fb2db84011 9 #define BW_KHZ 500
LoRaToolbox 0:44fb2db84011 10 #define SPREADING_FACTOR 11
LoRaToolbox 0:44fb2db84011 11 #define CF_HZ 912000000
LoRaToolbox 0:44fb2db84011 12 #define TX_DBM 20
LoRaToolbox 0:44fb2db84011 13 #elif defined(SX126x_H)
LoRaToolbox 0:44fb2db84011 14 #define BW_KHZ 500
LoRaToolbox 0:44fb2db84011 15 #define SPREADING_FACTOR 10
LoRaToolbox 0:44fb2db84011 16 #define CF_HZ 915000000
LoRaToolbox 0:44fb2db84011 17 #define TX_DBM (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14)
LoRaToolbox 0:44fb2db84011 18 #elif defined(SX128x_H)
LoRaToolbox 0:44fb2db84011 19 #define BW_KHZ 200
LoRaToolbox 0:44fb2db84011 20 #define SPREADING_FACTOR 7
LoRaToolbox 0:44fb2db84011 21 #define CF_HZ 2487000000
LoRaToolbox 0:44fb2db84011 22 #define TX_DBM 6
LoRaToolbox 0:44fb2db84011 23 #endif
LoRaToolbox 0:44fb2db84011 24
corymast 3:5e25ec621190 25 // The buffer size should match the tx_buf length in sx12xx.h
corymast 3:5e25ec621190 26 #define BUF_SIZE 256
corymast 3:5e25ec621190 27
LoRaToolbox 1:b277f5a65c1c 28 /******************** Setup radio transmitter ****************************/
LoRaToolbox 1:b277f5a65c1c 29
LoRaToolbox 0:44fb2db84011 30 volatile bool txDone;
corymast 3:5e25ec621190 31 CircularBuffer<uint8_t, BUF_SIZE> msg;
LoRaToolbox 0:44fb2db84011 32
LoRaToolbox 0:44fb2db84011 33 void txDoneCB()
LoRaToolbox 0:44fb2db84011 34 {
LoRaToolbox 0:44fb2db84011 35 txDone = true;
LoRaToolbox 0:44fb2db84011 36 }
LoRaToolbox 0:44fb2db84011 37
LoRaToolbox 0:44fb2db84011 38 void rxDoneCB(uint8_t size, float rssi, float snr)
LoRaToolbox 0:44fb2db84011 39 {
LoRaToolbox 0:44fb2db84011 40 }
LoRaToolbox 0:44fb2db84011 41
LoRaToolbox 1:b277f5a65c1c 42 // Define radio events for transmitter
LoRaToolbox 1:b277f5a65c1c 43
LoRaToolbox 0:44fb2db84011 44 const RadioEvents_t rev = {
LoRaToolbox 0:44fb2db84011 45 /* Dio0_top_half */ NULL,
LoRaToolbox 0:44fb2db84011 46 /* TxDone_topHalf */ NULL,
LoRaToolbox 0:44fb2db84011 47 /* TxDone_botHalf */ txDoneCB,
LoRaToolbox 0:44fb2db84011 48 /* TxTimeout */ NULL,
LoRaToolbox 0:44fb2db84011 49 /* RxDone */ rxDoneCB,
LoRaToolbox 0:44fb2db84011 50 /* RxTimeout */ NULL,
LoRaToolbox 0:44fb2db84011 51 /* RxError */ NULL,
LoRaToolbox 0:44fb2db84011 52 /* FhssChangeChannel */NULL,
LoRaToolbox 0:44fb2db84011 53 /* CadDone */ NULL
LoRaToolbox 0:44fb2db84011 54 };
LoRaToolbox 0:44fb2db84011 55
corymast 3:5e25ec621190 56 void print_radio_tx_buffer(uint8_t len)
corymast 3:5e25ec621190 57 {
corymast 3:5e25ec621190 58 printf("Tx Buffer = ");
corymast 3:5e25ec621190 59 for(int i=0; i<len; i++)
corymast 3:5e25ec621190 60 {
corymast 3:5e25ec621190 61 printf("%d ", Radio::radio.tx_buf[i]);
corymast 3:5e25ec621190 62 }
corymast 3:5e25ec621190 63 printf("\r\n\n");
corymast 3:5e25ec621190 64 }
corymast 3:5e25ec621190 65
corymast 3:5e25ec621190 66 void msg_append_bytes(uint8_t data[], uint8_t len)
corymast 3:5e25ec621190 67 {
corymast 3:5e25ec621190 68 for(int i=0; i < len; i++)
corymast 3:5e25ec621190 69 {
corymast 3:5e25ec621190 70 if(!msg.full())
corymast 3:5e25ec621190 71 {
corymast 3:5e25ec621190 72 msg.push(data[i]);
corymast 3:5e25ec621190 73 }
corymast 3:5e25ec621190 74 else{
corymast 3:5e25ec621190 75 // If buffer is full, contents will be over-written
corymast 3:5e25ec621190 76 // TODO: Handle this error case
corymast 3:5e25ec621190 77 printf("buffer is full\n");
corymast 3:5e25ec621190 78 }
corymast 3:5e25ec621190 79 }
corymast 3:5e25ec621190 80 }
corymast 3:5e25ec621190 81
corymast 3:5e25ec621190 82 void msg_append_string(string str, uint8_t len)
LoRaToolbox 0:44fb2db84011 83 {
corymast 3:5e25ec621190 84 msg_append_bytes(reinterpret_cast<uint8_t*>(&str[0]), len);
corymast 3:5e25ec621190 85 }
corymast 3:5e25ec621190 86
corymast 3:5e25ec621190 87 void msg_send()
corymast 3:5e25ec621190 88 {
corymast 3:5e25ec621190 89 uint8_t len = 0;
corymast 3:5e25ec621190 90 while(!msg.empty())
corymast 3:5e25ec621190 91 {
corymast 3:5e25ec621190 92 // Pop data from the circular buffer to Radio tx_buf
corymast 3:5e25ec621190 93 msg.pop(Radio::radio.tx_buf[len]);
corymast 3:5e25ec621190 94
corymast 3:5e25ec621190 95 // Track the size of the tx_buf
corymast 3:5e25ec621190 96 len++;
corymast 3:5e25ec621190 97 }
corymast 3:5e25ec621190 98 print_radio_tx_buffer(len);
corymast 3:5e25ec621190 99 txDone = false;
corymast 3:5e25ec621190 100 Radio::Send(len, 0, 0, 0); // begin transmission of payload
corymast 3:5e25ec621190 101
corymast 3:5e25ec621190 102 while (!txDone)
corymast 3:5e25ec621190 103 {
corymast 3:5e25ec621190 104 Radio::service();
corymast 3:5e25ec621190 105 }
corymast 3:5e25ec621190 106
corymast 3:5e25ec621190 107 printf("Tx Done.\r\n");
corymast 3:5e25ec621190 108 }
corymast 3:5e25ec621190 109
corymast 3:5e25ec621190 110 void radio_init()
corymast 3:5e25ec621190 111 {
LoRaToolbox 1:b277f5a65c1c 112 // Start radio transmitter after POR or reset
LoRaToolbox 0:44fb2db84011 113
LoRaToolbox 0:44fb2db84011 114 Radio::Init(&rev);
LoRaToolbox 0:44fb2db84011 115
LoRaToolbox 1:b277f5a65c1c 116 //Set radio properties for transmitter
LoRaToolbox 1:b277f5a65c1c 117
LoRaToolbox 0:44fb2db84011 118 Radio::Standby();
LoRaToolbox 0:44fb2db84011 119 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
LoRaToolbox 0:44fb2db84011 120 Radio::SetChannel(CF_HZ);
LoRaToolbox 0:44fb2db84011 121
LoRaToolbox 1:b277f5a65c1c 122 // Set transmitter output power
LoRaToolbox 1:b277f5a65c1c 123
LoRaToolbox 0:44fb2db84011 124 Radio::set_tx_dbm(TX_DBM);
LoRaToolbox 0:44fb2db84011 125
LoRaToolbox 1:b277f5a65c1c 126 // Setup transmit packet payload -> preambleLen, fixLen, crcOn, invIQ
LoRaToolbox 1:b277f5a65c1c 127
LoRaToolbox 0:44fb2db84011 128 Radio::LoRaPacketConfig(8, false, true, false);
corymast 3:5e25ec621190 129 }
corymast 3:5e25ec621190 130
corymast 3:5e25ec621190 131 int main()
corymast 3:5e25ec621190 132 {
corymast 3:5e25ec621190 133 printf("\r\nreset-tx \n");
LoRaToolbox 0:44fb2db84011 134
corymast 3:5e25ec621190 135 radio_init();
LoRaToolbox 0:44fb2db84011 136
corymast 3:5e25ec621190 137 uint8_t seq = 0; // Set initial transmit sequence to 0
LoRaToolbox 0:44fb2db84011 138
LoRaToolbox 0:44fb2db84011 139 for (;;) {
corymast 3:5e25ec621190 140 // Create an array to hold byte data
corymast 3:5e25ec621190 141 uint8_t data[] = {seq};
corymast 3:5e25ec621190 142
corymast 3:5e25ec621190 143 // Append the byte array to the message
corymast 3:5e25ec621190 144 msg_append_bytes(data, sizeof(data)/sizeof(data[0]));
corymast 2:efc0c1bbdffc 145
corymast 3:5e25ec621190 146 // Append a new value to the message
corymast 3:5e25ec621190 147 data[0] = seq+1;
corymast 3:5e25ec621190 148 msg_append_bytes(data, sizeof(data)/sizeof(data[0]));
corymast 3:5e25ec621190 149
corymast 3:5e25ec621190 150 // Append a string to the message
corymast 3:5e25ec621190 151 string myString = "Hello World!";
corymast 3:5e25ec621190 152 msg_append_string(myString, myString.length());
corymast 3:5e25ec621190 153 msg_send();
LoRaToolbox 0:44fb2db84011 154
LoRaToolbox 1:b277f5a65c1c 155 // Transmit payload every 500mS
LoRaToolbox 1:b277f5a65c1c 156 wait(0.5); // throttle sending rate
corymast 3:5e25ec621190 157 seq+=2; // change payload (increment sequence number)
LoRaToolbox 1:b277f5a65c1c 158 }
LoRaToolbox 0:44fb2db84011 159 }