Point Labs / Mbed OS Threaded_LoRa_Modem

Dependencies:   RadioHeadLite

Committer:
rlanders73
Date:
Mon May 31 02:59:41 2021 +0000
Revision:
3:fd3a7f10eed3
Parent:
2:57fefd8ae87c
Child:
4:8fbdf64301c5
Initial working version

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 3:fd3a7f10eed3 91 inbuf[len++] = 0; // make sure we terminate the string
rlanders73 3:fd3a7f10eed3 92 radio.send(inbuf,len);
rlanders73 3:fd3a7f10eed3 93 radio.waitPacketSent();
rlanders73 3:fd3a7f10eed3 94 len = 0;
rlanders73 1:75d533f15c95 95 }
rlanders73 1:75d533f15c95 96 }
rlanders73 1:75d533f15c95 97 }
rlanders73 0:f4015c8e84c3 98
rlanders73 3:fd3a7f10eed3 99 static Thread pcThread( osPriorityNormal, OS_STACK_SIZE / 2, NULL, "pc_thread" );
rlanders73 3:fd3a7f10eed3 100 void writePC(){
rlanders73 3:fd3a7f10eed3 101 uint8_t rxBuf[RH_RF95_MAX_MESSAGE_LEN];
rlanders73 3:fd3a7f10eed3 102 uint8_t size = sizeof(rxBuf);
rlanders73 3:fd3a7f10eed3 103 printf("starting PC thread\n");
rlanders73 3:fd3a7f10eed3 104 while(1)
rlanders73 3:fd3a7f10eed3 105 {
rlanders73 3:fd3a7f10eed3 106 if(radio.available()){
rlanders73 3:fd3a7f10eed3 107 if(radio.recv(rxBuf,&size))
rlanders73 3:fd3a7f10eed3 108 printf("Got: %s\n", rxBuf);
rlanders73 3:fd3a7f10eed3 109 // USB.send(rxBuf, size);
rlanders73 3:fd3a7f10eed3 110 }
rlanders73 3:fd3a7f10eed3 111 }
rlanders73 3:fd3a7f10eed3 112 }
rlanders73 0:f4015c8e84c3 113
rlanders73 1:75d533f15c95 114 void setup(void)
rlanders73 1:75d533f15c95 115 {
rlanders73 3:fd3a7f10eed3 116 userBtn.mode(PullUp);
rlanders73 3:fd3a7f10eed3 117 USB.connect();
rlanders73 3:fd3a7f10eed3 118 wait_ms(1000);
rlanders73 3:fd3a7f10eed3 119 printf("Lora Modem\n------------\n");
rlanders73 3:fd3a7f10eed3 120 printf("* mbed-os: %d.%d.%d\n\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
rlanders73 3:fd3a7f10eed3 121
rlanders73 3:fd3a7f10eed3 122 wait_ms(10);
rlanders73 3:fd3a7f10eed3 123 initModem();
rlanders73 3:fd3a7f10eed3 124 radioThread.start(writeRadio);
rlanders73 3:fd3a7f10eed3 125 pcThread.start(writePC);
rlanders73 3:fd3a7f10eed3 126 }
rlanders73 1:75d533f15c95 127
rlanders73 1:75d533f15c95 128 int main(void)
rlanders73 1:75d533f15c95 129 {
rlanders73 1:75d533f15c95 130 setup();
rlanders73 1:75d533f15c95 131
rlanders73 3:fd3a7f10eed3 132 while(1){
rlanders73 3:fd3a7f10eed3 133 ThisThread::sleep_for(1000);
rlanders73 3:fd3a7f10eed3 134 blueLed = !blueLed;
rlanders73 3:fd3a7f10eed3 135 }
rlanders73 3:fd3a7f10eed3 136
rlanders73 0:f4015c8e84c3 137 }
rlanders73 0:f4015c8e84c3 138
rlanders73 0:f4015c8e84c3 139