This is an example program that shows how to use the RadioHeadLite library, and does it using threads.

Dependencies:   RadioHeadLite

Committer:
rlanders73
Date:
Thu Jun 10 16:26:02 2021 +0000
Revision:
4:8fbdf64301c5
Parent:
3:fd3a7f10eed3
Child:
5:75659bdf6605
updating to the latest RH lib;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rlanders73 0:f4015c8e84c3 1 #include "mbed.h"
rlanders73 3:fd3a7f10eed3 2 #include "Geneva.h"
rlanders73 3:fd3a7f10eed3 3 #include "RH_RF95.h"
rlanders73 3:fd3a7f10eed3 4 #include "SPI.h"
rlanders73 0:f4015c8e84c3 5
rlanders73 0:f4015c8e84c3 6 /******************** Comms *********************/
rlanders73 3:fd3a7f10eed3 7 #include "USBSerial.h"
rlanders73 3:fd3a7f10eed3 8 USBSerial USB; // This allows us to have a non-blocking USB serial thingy
rlanders73 3:fd3a7f10eed3 9 FileHandle* mbed::mbed_override_console(int)
rlanders73 3:fd3a7f10eed3 10 {
rlanders73 3:fd3a7f10eed3 11 return &USB;
rlanders73 3:fd3a7f10eed3 12 }
rlanders73 3:fd3a7f10eed3 13 DigitalIn userBtn(USER_BUTTON);
rlanders73 2:57fefd8ae87c 14
rlanders73 3:fd3a7f10eed3 15 // Change to match RX's freq!
rlanders73 3:fd3a7f10eed3 16 #define RF95_FREQ 915.0
rlanders73 0:f4015c8e84c3 17
rlanders73 3:fd3a7f10eed3 18 // Singleton instance of the radio driver
rlanders73 3:fd3a7f10eed3 19 RH_RF95 radio(RADIO_CS, RADIO_INT);
rlanders73 3:fd3a7f10eed3 20 DigitalInOut radio_cs(RADIO_CS, PIN_OUTPUT, OpenDrainPullUp, 1);
rlanders73 3:fd3a7f10eed3 21 DigitalOut radio_rst(RADIO_RST, 1);
rlanders73 3:fd3a7f10eed3 22 DigitalOut greenLed(LED_GREEN, 1);
rlanders73 3:fd3a7f10eed3 23 DigitalOut blueLed(LED_BLUE, 1);
rlanders73 3:fd3a7f10eed3 24 DigitalOut redLed(LED_RED, 1);
rlanders73 0:f4015c8e84c3 25
rlanders73 3:fd3a7f10eed3 26 #define wait_ms(X) (wait_us(X*1000))
rlanders73 3:fd3a7f10eed3 27
rlanders73 3:fd3a7f10eed3 28 void doLED(uint8_t mask){
rlanders73 3:fd3a7f10eed3 29 redLed = ((mask & 4)>>2)^1;
rlanders73 3:fd3a7f10eed3 30 greenLed = ((mask & 2)>>1)^1;
rlanders73 3:fd3a7f10eed3 31 blueLed = ((mask & 1))^1;
rlanders73 3:fd3a7f10eed3 32 }
rlanders73 3:fd3a7f10eed3 33
rlanders73 3:fd3a7f10eed3 34 static void press_power_button(int time_ms)
rlanders73 0:f4015c8e84c3 35 {
rlanders73 0:f4015c8e84c3 36 }
rlanders73 0:f4015c8e84c3 37
rlanders73 3:fd3a7f10eed3 38 bool initModem(void)
rlanders73 2:57fefd8ae87c 39 {
rlanders73 3:fd3a7f10eed3 40 bool success = true;
rlanders73 3:fd3a7f10eed3 41 printf("Starting LoRa radio...\n");
rlanders73 3:fd3a7f10eed3 42 radio_rst = 0;
rlanders73 3:fd3a7f10eed3 43 delay(10);
rlanders73 3:fd3a7f10eed3 44 radio_rst = 1;
rlanders73 3:fd3a7f10eed3 45 delay(10);
rlanders73 3:fd3a7f10eed3 46 if(!radio.init()){
rlanders73 3:fd3a7f10eed3 47 printf("init failed, ");
rlanders73 3:fd3a7f10eed3 48 success = false;
rlanders73 3:fd3a7f10eed3 49 }
rlanders73 3:fd3a7f10eed3 50
rlanders73 3:fd3a7f10eed3 51 // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
rlanders73 3:fd3a7f10eed3 52 if (success && !radio.setFrequency(RF95_FREQ)) {
rlanders73 3:fd3a7f10eed3 53 printf("setFrequency failed, ");
rlanders73 3:fd3a7f10eed3 54 success = false;
rlanders73 3:fd3a7f10eed3 55 }
rlanders73 3:fd3a7f10eed3 56
rlanders73 3:fd3a7f10eed3 57 // The default transmitter power is 13dBm, using PA_BOOST.
rlanders73 3:fd3a7f10eed3 58 // If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then
rlanders73 3:fd3a7f10eed3 59 // you can set transmitter powers from 5 to 23 dBm:
rlanders73 3:fd3a7f10eed3 60 if(success){
rlanders73 3:fd3a7f10eed3 61 radio.setTxPower(18);
rlanders73 3:fd3a7f10eed3 62 }
rlanders73 3:fd3a7f10eed3 63 else
rlanders73 3:fd3a7f10eed3 64 printf("LoRa driver not functional\n");
rlanders73 3:fd3a7f10eed3 65
rlanders73 3:fd3a7f10eed3 66 return success;
rlanders73 3:fd3a7f10eed3 67 }
rlanders73 3:fd3a7f10eed3 68
rlanders73 3:fd3a7f10eed3 69 void pdwnModem(void)
rlanders73 3:fd3a7f10eed3 70 {
rlanders73 3:fd3a7f10eed3 71 radio_rst = 0;
rlanders73 2:57fefd8ae87c 72 }
rlanders73 2:57fefd8ae87c 73
rlanders73 3:fd3a7f10eed3 74 static Thread radioThread( osPriorityNormal, OS_STACK_SIZE / 2, NULL, "radio_thread" );
rlanders73 3:fd3a7f10eed3 75 void writeRadio(){
rlanders73 3:fd3a7f10eed3 76 uint8_t inbuf[RH_RF95_MAX_MESSAGE_LEN];
rlanders73 3:fd3a7f10eed3 77 uint8_t size = 0;
rlanders73 3:fd3a7f10eed3 78 uint8_t len = 0;
rlanders73 3:fd3a7f10eed3 79 while(1)
rlanders73 1:75d533f15c95 80 {
rlanders73 3:fd3a7f10eed3 81 // store up chars in buffer
rlanders73 3:fd3a7f10eed3 82 if(USB.readable()){
rlanders73 3:fd3a7f10eed3 83 size = USB.available();
rlanders73 3:fd3a7f10eed3 84 if(USB.receive(inbuf+len,size))
rlanders73 3:fd3a7f10eed3 85 USB.send(inbuf+len, size);
rlanders73 3:fd3a7f10eed3 86 len += size;
rlanders73 1:75d533f15c95 87 }
rlanders73 3:fd3a7f10eed3 88
rlanders73 3:fd3a7f10eed3 89 // Send data if newline is found
rlanders73 3:fd3a7f10eed3 90 if(inbuf[len - 1] == '\n'){
rlanders73 4:8fbdf64301c5 91 len -= 2; // strip off the newline stuff
rlanders73 4:8fbdf64301c5 92 // inbuf[len++] = 0; // make sure we terminate the string
rlanders73 3:fd3a7f10eed3 93 radio.send(inbuf,len);
rlanders73 3:fd3a7f10eed3 94 radio.waitPacketSent();
rlanders73 3:fd3a7f10eed3 95 len = 0;
rlanders73 1:75d533f15c95 96 }
rlanders73 1:75d533f15c95 97 }
rlanders73 1:75d533f15c95 98 }
rlanders73 0:f4015c8e84c3 99
rlanders73 3:fd3a7f10eed3 100 static Thread pcThread( osPriorityNormal, OS_STACK_SIZE / 2, NULL, "pc_thread" );
rlanders73 3:fd3a7f10eed3 101 void writePC(){
rlanders73 3:fd3a7f10eed3 102 uint8_t rxBuf[RH_RF95_MAX_MESSAGE_LEN];
rlanders73 3:fd3a7f10eed3 103 uint8_t size = sizeof(rxBuf);
rlanders73 3:fd3a7f10eed3 104 printf("starting PC thread\n");
rlanders73 3:fd3a7f10eed3 105 while(1)
rlanders73 3:fd3a7f10eed3 106 {
rlanders73 3:fd3a7f10eed3 107 if(radio.available()){
rlanders73 3:fd3a7f10eed3 108 if(radio.recv(rxBuf,&size))
rlanders73 4:8fbdf64301c5 109 // printf("Got: %s\n", rxBuf);
rlanders73 4:8fbdf64301c5 110 USB.send(rxBuf, size);
rlanders73 4:8fbdf64301c5 111 USB.putc('\n'); // put a new line in just in case
rlanders73 3:fd3a7f10eed3 112 }
rlanders73 3:fd3a7f10eed3 113 }
rlanders73 3:fd3a7f10eed3 114 }
rlanders73 0:f4015c8e84c3 115
rlanders73 1:75d533f15c95 116 void setup(void)
rlanders73 1:75d533f15c95 117 {
rlanders73 3:fd3a7f10eed3 118 userBtn.mode(PullUp);
rlanders73 3:fd3a7f10eed3 119 USB.connect();
rlanders73 3:fd3a7f10eed3 120 wait_ms(1000);
rlanders73 3:fd3a7f10eed3 121 printf("Lora Modem\n------------\n");
rlanders73 3:fd3a7f10eed3 122 printf("* mbed-os: %d.%d.%d\n\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
rlanders73 3:fd3a7f10eed3 123
rlanders73 3:fd3a7f10eed3 124 wait_ms(10);
rlanders73 3:fd3a7f10eed3 125 initModem();
rlanders73 3:fd3a7f10eed3 126 radioThread.start(writeRadio);
rlanders73 3:fd3a7f10eed3 127 pcThread.start(writePC);
rlanders73 3:fd3a7f10eed3 128 }
rlanders73 1:75d533f15c95 129
rlanders73 1:75d533f15c95 130 int main(void)
rlanders73 1:75d533f15c95 131 {
rlanders73 1:75d533f15c95 132 setup();
rlanders73 1:75d533f15c95 133
rlanders73 3:fd3a7f10eed3 134 while(1){
rlanders73 3:fd3a7f10eed3 135 ThisThread::sleep_for(1000);
rlanders73 3:fd3a7f10eed3 136 blueLed = !blueLed;
rlanders73 3:fd3a7f10eed3 137 }
rlanders73 3:fd3a7f10eed3 138
rlanders73 0:f4015c8e84c3 139 }
rlanders73 0:f4015c8e84c3 140
rlanders73 0:f4015c8e84c3 141