Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:6076b262dc5e, 2021-07-11 (annotated)
- Committer:
- uwizeyimana
- Date:
- Sun Jul 11 08:19:38 2021 +0000
- Revision:
- 3:6076b262dc5e
- Parent:
- 2:b990d41df49e
- Child:
- 4:51ec2290a0fc
updated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uwizeyimana | 0:6e0a4dac6596 | 1 | /*mobile project |
uwizeyimana | 0:6e0a4dac6596 | 2 | GROUP MEMBERS: |
uwizeyimana | 0:6e0a4dac6596 | 3 | 1)UWIZEYIMANA ABDULKARIM REG NBER:220020691 |
uwizeyimana | 0:6e0a4dac6596 | 4 | 2)AMOUR SALIM MOHAMMED REG NBER: 221027397 |
uwizeyimana | 0:6e0a4dac6596 | 5 | 3)SHAAME M. BAKAR REG NBER: 220020578 |
uwizeyimana | 0:6e0a4dac6596 | 6 | 4)ANGELIQUE*/ |
uwizeyimana | 2:b990d41df49e | 7 | |
uwizeyimana | 0:6e0a4dac6596 | 8 | #include "mbed.h" |
uwizeyimana | 0:6e0a4dac6596 | 9 | #include "C12832.h" |
uwizeyimana | 3:6076b262dc5e | 10 | #include "mbed_trace.h" |
uwizeyimana | 3:6076b262dc5e | 11 | #include "mbed_events.h" |
uwizeyimana | 3:6076b262dc5e | 12 | #include "LoRaWANInterface.h" |
uwizeyimana | 0:6e0a4dac6596 | 13 | #include "Sht31.h" |
uwizeyimana | 3:6076b262dc5e | 14 | #include "SX1276_LoRaRadio.h" |
uwizeyimana | 0:6e0a4dac6596 | 15 | #include <string> |
uwizeyimana | 1:2a3b76b2e4e5 | 16 | #include "time.h" |
uwizeyimana | 1:2a3b76b2e4e5 | 17 | time_t startTime; |
uwizeyimana | 1:2a3b76b2e4e5 | 18 | time_t stopTime; |
uwizeyimana | 1:2a3b76b2e4e5 | 19 | time_t startReading; |
uwizeyimana | 1:2a3b76b2e4e5 | 20 | time_t stopReading; |
uwizeyimana | 1:2a3b76b2e4e5 | 21 | int readingDuration; |
uwizeyimana | 0:6e0a4dac6596 | 22 | Serial device (p9,p10); |
uwizeyimana | 0:6e0a4dac6596 | 23 | C12832 lcd(SPI_MOSI, SPI_SCK, SPI_MISO, p8, p11); |
uwizeyimana | 0:6e0a4dac6596 | 24 | Sht31 theo(I2C_SDA, I2C_SCL); |
uwizeyimana | 0:6e0a4dac6596 | 25 | DigitalOut led(p13); |
uwizeyimana | 0:6e0a4dac6596 | 26 | DigitalOut bed(p12); |
uwizeyimana | 0:6e0a4dac6596 | 27 | DigitalOut wed(p14); |
uwizeyimana | 0:6e0a4dac6596 | 28 | InterruptIn btn(p15); |
uwizeyimana | 0:6e0a4dac6596 | 29 | InterruptIn swt(p11); |
uwizeyimana | 1:2a3b76b2e4e5 | 30 | Timeout t; |
uwizeyimana | 1:2a3b76b2e4e5 | 31 | Ticker k; |
uwizeyimana | 1:2a3b76b2e4e5 | 32 | Ticker topicTicker; |
uwizeyimana | 1:2a3b76b2e4e5 | 33 | Ticker durationTime; |
uwizeyimana | 1:2a3b76b2e4e5 | 34 | Ticker resetted; |
uwizeyimana | 3:6076b262dc5e | 35 | //Ticker backagain; |
uwizeyimana | 0:6e0a4dac6596 | 36 | int direction=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 37 | int i=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 38 | int pushDuration; |
uwizeyimana | 0:6e0a4dac6596 | 39 | int current=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 40 | int state=0; |
uwizeyimana | 2:b990d41df49e | 41 | |
uwizeyimana | 0:6e0a4dac6596 | 42 | string str1 = "Menu of the Day"; |
uwizeyimana | 0:6e0a4dac6596 | 43 | string str2 = "Rwanda Food Services Ltd"; |
uwizeyimana | 0:6e0a4dac6596 | 44 | string str3="Rwanda Food Services Ltd,click Btn to browseMenu"; |
uwizeyimana | 0:6e0a4dac6596 | 45 | string topics[]={"1.Out Side catering services", |
uwizeyimana | 0:6e0a4dac6596 | 46 | "2.Restaurent Services","3.fast Food Services", |
uwizeyimana | 0:6e0a4dac6596 | 47 | "4.Online ordering Food Services", |
uwizeyimana | 0:6e0a4dac6596 | 48 | "5.Cook Training Services " |
uwizeyimana | 0:6e0a4dac6596 | 49 | }; |
uwizeyimana | 0:6e0a4dac6596 | 50 | string content[]={"11.online bookings buffet package for 80+ guests with 10 percent off", |
uwizeyimana | 0:6e0a4dac6596 | 51 | "22.Pilawo, biriyani, African food,western food","33.fried chicken with salad,fried fish with salad,Nyama choma", |
uwizeyimana | 0:6e0a4dac6596 | 52 | "44.African food,westen food,fast food,pilawo,biriyani", |
uwizeyimana | 0:6e0a4dac6596 | 53 | "55.bread,samosa cooking and smoothies preparation " |
uwizeyimana | 0:6e0a4dac6596 | 54 | }; |
uwizeyimana | 3:6076b262dc5e | 55 | // Device credentials, register device as OTAA in The Things Network and copy credentials here |
uwizeyimana | 3:6076b262dc5e | 56 | static uint8_t DEV_EUI[] = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 }; |
uwizeyimana | 3:6076b262dc5e | 57 | static uint8_t APP_EUI[] = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 }; |
uwizeyimana | 3:6076b262dc5e | 58 | static uint8_t APP_KEY[] = { 0x51, 0xEA, 0x6E, 0x8B, 0x30, 0x44, 0xE6, 0x4A, 0xBD, 0xD3, 0xFD, 0xD0, 0x4A, 0x1C, 0x4D, 0x2F }; |
uwizeyimana | 3:6076b262dc5e | 59 | |
uwizeyimana | 3:6076b262dc5e | 60 | |
uwizeyimana | 3:6076b262dc5e | 61 | // The port we're sending and receiving on |
uwizeyimana | 3:6076b262dc5e | 62 | #define MBED_CONF_LORA_APP_PORT 15 |
uwizeyimana | 3:6076b262dc5e | 63 | |
uwizeyimana | 3:6076b262dc5e | 64 | // Peripherals (LoRa radio, temperature sensor and button) |
uwizeyimana | 3:6076b262dc5e | 65 | SX1276_LoRaRadio radio(D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9, NC, NC, NC, NC, A4, NC, NC); |
uwizeyimana | 3:6076b262dc5e | 66 | Sht31 sht31(I2C_SDA, I2C_SCL); |
uwizeyimana | 3:6076b262dc5e | 67 | |
uwizeyimana | 3:6076b262dc5e | 68 | |
uwizeyimana | 3:6076b262dc5e | 69 | // EventQueue is required to dispatch events around |
uwizeyimana | 3:6076b262dc5e | 70 | static EventQueue ev_queue; |
uwizeyimana | 3:6076b262dc5e | 71 | |
uwizeyimana | 3:6076b262dc5e | 72 | // Constructing Mbed LoRaWANInterface and passing it down the radio object. |
uwizeyimana | 3:6076b262dc5e | 73 | static LoRaWANInterface lorawan(radio); |
uwizeyimana | 3:6076b262dc5e | 74 | |
uwizeyimana | 3:6076b262dc5e | 75 | // Application specific callbacks |
uwizeyimana | 3:6076b262dc5e | 76 | static lorawan_app_callbacks_t callbacks; |
uwizeyimana | 3:6076b262dc5e | 77 | |
uwizeyimana | 3:6076b262dc5e | 78 | // LoRaWAN stack event handler |
uwizeyimana | 3:6076b262dc5e | 79 | static void lora_event_handler(lorawan_event_t event); |
uwizeyimana | 0:6e0a4dac6596 | 80 | void display(string sms){ |
uwizeyimana | 0:6e0a4dac6596 | 81 | lcd.cls(); // change dane here |
uwizeyimana | 0:6e0a4dac6596 | 82 | lcd.locate(0,0); |
uwizeyimana | 0:6e0a4dac6596 | 83 | lcd.printf(sms.c_str()); |
uwizeyimana | 0:6e0a4dac6596 | 84 | } |
uwizeyimana | 2:b990d41df49e | 85 | |
uwizeyimana | 2:b990d41df49e | 86 | |
uwizeyimana | 1:2a3b76b2e4e5 | 87 | void displayState1(){ |
uwizeyimana | 0:6e0a4dac6596 | 88 | float temp = theo.readTemperature(); |
uwizeyimana | 0:6e0a4dac6596 | 89 | time_t seconds = time(NULL); |
uwizeyimana | 0:6e0a4dac6596 | 90 | char buffer[32]; |
uwizeyimana | 0:6e0a4dac6596 | 91 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
uwizeyimana | 0:6e0a4dac6596 | 92 | lcd.locate(5, 20); // get cursor to position x=3px and y=5px |
uwizeyimana | 0:6e0a4dac6596 | 93 | lcd.cls(); |
uwizeyimana | 0:6e0a4dac6596 | 94 | lcd.set_auto_up(0); |
uwizeyimana | 1:2a3b76b2e4e5 | 95 | lcd.locate(5, 1); |
uwizeyimana | 0:6e0a4dac6596 | 96 | lcd.printf("Local Time: %s",buffer); |
uwizeyimana | 1:2a3b76b2e4e5 | 97 | lcd.locate(5, 9); |
uwizeyimana | 0:6e0a4dac6596 | 98 | lcd.printf("Temperature: %.2f C", temp); |
uwizeyimana | 0:6e0a4dac6596 | 99 | } |
uwizeyimana | 2:b990d41df49e | 100 | |
uwizeyimana | 0:6e0a4dac6596 | 101 | |
uwizeyimana | 1:2a3b76b2e4e5 | 102 | void whiteled() |
uwizeyimana | 0:6e0a4dac6596 | 103 | { |
uwizeyimana | 1:2a3b76b2e4e5 | 104 | wed=!wed; |
uwizeyimana | 1:2a3b76b2e4e5 | 105 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 106 | void forwards(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 107 | display(topics[i]); |
uwizeyimana | 1:2a3b76b2e4e5 | 108 | current=i; |
uwizeyimana | 1:2a3b76b2e4e5 | 109 | i+=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 110 | if(i>4){ |
uwizeyimana | 1:2a3b76b2e4e5 | 111 | i=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 112 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 113 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 114 | void backwards(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 115 | display(topics[i]); |
uwizeyimana | 1:2a3b76b2e4e5 | 116 | current=i; |
uwizeyimana | 1:2a3b76b2e4e5 | 117 | i-=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 118 | if(i<0){ |
uwizeyimana | 1:2a3b76b2e4e5 | 119 | i=4; |
uwizeyimana | 0:6e0a4dac6596 | 120 | } |
uwizeyimana | 0:6e0a4dac6596 | 121 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 122 | void displayState2(){ |
uwizeyimana | 2:b990d41df49e | 123 | printf("direction %d \n",direction); |
uwizeyimana | 1:2a3b76b2e4e5 | 124 | if(direction==0){ |
uwizeyimana | 1:2a3b76b2e4e5 | 125 | i=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 126 | bed=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 127 | led=0; |
uwizeyimana | 3:6076b262dc5e | 128 | topicTicker.attach(ev_queue.event(&forwards),2.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 129 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 130 | else{ |
uwizeyimana | 1:2a3b76b2e4e5 | 131 | i=4; |
uwizeyimana | 1:2a3b76b2e4e5 | 132 | led=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 133 | bed=0; |
uwizeyimana | 3:6076b262dc5e | 134 | topicTicker.attach(ev_queue.event(& backwards),2.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 135 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 136 | } |
uwizeyimana | 2:b990d41df49e | 137 | |
uwizeyimana | 1:2a3b76b2e4e5 | 138 | void fallBtn(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 139 | state = 0; |
uwizeyimana | 2:b990d41df49e | 140 | durationTime.detach(); |
uwizeyimana | 2:b990d41df49e | 141 | |
uwizeyimana | 1:2a3b76b2e4e5 | 142 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 143 | void mode1(){ |
uwizeyimana | 3:6076b262dc5e | 144 | k.attach(ev_queue.event(& whiteled),1.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 145 | displayState1(); |
uwizeyimana | 3:6076b262dc5e | 146 | t.attach(ev_queue.event(&displayState2),3.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 147 | |
uwizeyimana | 1:2a3b76b2e4e5 | 148 | } |
uwizeyimana | 3:6076b262dc5e | 149 | void welcomeMsg(){ |
uwizeyimana | 3:6076b262dc5e | 150 | display(str2); |
uwizeyimana | 3:6076b262dc5e | 151 | t.attach(ev_queue.event(&mode1),5.0f); |
uwizeyimana | 3:6076b262dc5e | 152 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 153 | |
uwizeyimana | 1:2a3b76b2e4e5 | 154 | void riseSwt(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 155 | time(&startReading); |
uwizeyimana | 1:2a3b76b2e4e5 | 156 | display(content[current]); |
uwizeyimana | 1:2a3b76b2e4e5 | 157 | topicTicker.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 158 | |
uwizeyimana | 0:6e0a4dac6596 | 159 | |
uwizeyimana | 0:6e0a4dac6596 | 160 | } |
uwizeyimana | 3:6076b262dc5e | 161 | static uint8_t* create_message(char device[], int topic, int duration) { |
uwizeyimana | 3:6076b262dc5e | 162 | // initialize the buffer |
uwizeyimana | 3:6076b262dc5e | 163 | uint8_t tx_buffer[50] = { 0 }; |
uwizeyimana | 3:6076b262dc5e | 164 | |
uwizeyimana | 3:6076b262dc5e | 165 | // DATA TO SEND (THE BELOW VALUES ARE THE ONES TO BE MODIFIED) |
uwizeyimana | 3:6076b262dc5e | 166 | // char device[] = "infant"; |
uwizeyimana | 3:6076b262dc5e | 167 | // int topic = 4; // topic identifier |
uwizeyimana | 3:6076b262dc5e | 168 | // long int start = 1606037871; // start reading |
uwizeyimana | 3:6076b262dc5e | 169 | // long int end = 1606038090; // end reading |
uwizeyimana | 3:6076b262dc5e | 170 | |
uwizeyimana | 3:6076b262dc5e | 171 | // long int duration = 20; |
uwizeyimana | 3:6076b262dc5e | 172 | |
uwizeyimana | 3:6076b262dc5e | 173 | // Writing string data into a buffer |
uwizeyimana | 3:6076b262dc5e | 174 | sprintf((char*) tx_buffer, "{\"device\":\"%s\",\"topic\":%d,\"duration\":%d }", device, topic,duration); |
uwizeyimana | 3:6076b262dc5e | 175 | return tx_buffer; |
uwizeyimana | 3:6076b262dc5e | 176 | } |
uwizeyimana | 3:6076b262dc5e | 177 | |
uwizeyimana | 3:6076b262dc5e | 178 | |
uwizeyimana | 3:6076b262dc5e | 179 | |
uwizeyimana | 3:6076b262dc5e | 180 | // Send a message over LoRaWAN |
uwizeyimana | 3:6076b262dc5e | 181 | static void send_message(uint8_t *tx_buffer) { |
uwizeyimana | 3:6076b262dc5e | 182 | |
uwizeyimana | 3:6076b262dc5e | 183 | int packet_len = strlen((char*) tx_buffer); |
uwizeyimana | 3:6076b262dc5e | 184 | |
uwizeyimana | 3:6076b262dc5e | 185 | printf("Sending %d bytes: \"%s\"\n", packet_len, tx_buffer); |
uwizeyimana | 3:6076b262dc5e | 186 | |
uwizeyimana | 3:6076b262dc5e | 187 | |
uwizeyimana | 3:6076b262dc5e | 188 | int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG); |
uwizeyimana | 3:6076b262dc5e | 189 | |
uwizeyimana | 3:6076b262dc5e | 190 | // for some reason send() returns -1... I cannot find out why, the stack returns the right number. I feel that this is some weird Emscripten quirk |
uwizeyimana | 3:6076b262dc5e | 191 | if (retcode < 0) { |
uwizeyimana | 3:6076b262dc5e | 192 | retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - duty cycle violation\n") |
uwizeyimana | 3:6076b262dc5e | 193 | : printf("send() - Error code %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 194 | return; |
uwizeyimana | 3:6076b262dc5e | 195 | } |
uwizeyimana | 3:6076b262dc5e | 196 | |
uwizeyimana | 3:6076b262dc5e | 197 | printf("%d bytes scheduled for transmission\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 198 | } |
uwizeyimana | 3:6076b262dc5e | 199 | |
uwizeyimana | 1:2a3b76b2e4e5 | 200 | void fallSwt(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 201 | topicTicker.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 202 | time(&stopReading); |
uwizeyimana | 1:2a3b76b2e4e5 | 203 | readingDuration=stopReading-startReading; |
uwizeyimana | 1:2a3b76b2e4e5 | 204 | printf("Reading time is:%d \n",readingDuration); |
uwizeyimana | 1:2a3b76b2e4e5 | 205 | if(readingDuration>5){ |
uwizeyimana | 3:6076b262dc5e | 206 | |
uwizeyimana | 1:2a3b76b2e4e5 | 207 | printf("message sent,Item Id is:%d \n",current+1); |
uwizeyimana | 3:6076b262dc5e | 208 | char device[] = "mobile"; |
uwizeyimana | 3:6076b262dc5e | 209 | int topic = current+1; // topic identifier |
uwizeyimana | 3:6076b262dc5e | 210 | |
uwizeyimana | 3:6076b262dc5e | 211 | send_message(create_message(device,topic,readingDuration)); |
uwizeyimana | 3:6076b262dc5e | 212 | |
uwizeyimana | 1:2a3b76b2e4e5 | 213 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 214 | displayState2(); |
uwizeyimana | 0:6e0a4dac6596 | 215 | } |
uwizeyimana | 3:6076b262dc5e | 216 | |
uwizeyimana | 3:6076b262dc5e | 217 | |
uwizeyimana | 1:2a3b76b2e4e5 | 218 | void countDuration(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 219 | time(&stopTime); |
uwizeyimana | 1:2a3b76b2e4e5 | 220 | pushDuration=stopTime-startTime; |
uwizeyimana | 2:b990d41df49e | 221 | printf("elapsed time is:%d \n",pushDuration); |
uwizeyimana | 1:2a3b76b2e4e5 | 222 | if(pushDuration>5){ |
uwizeyimana | 1:2a3b76b2e4e5 | 223 | display("System resetting......\n"); |
uwizeyimana | 1:2a3b76b2e4e5 | 224 | durationTime.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 225 | topicTicker.detach(); |
uwizeyimana | 3:6076b262dc5e | 226 | direction=!direction; |
uwizeyimana | 3:6076b262dc5e | 227 | resetted.attach(ev_queue.event(&welcomeMsg),10.0f); |
uwizeyimana | 3:6076b262dc5e | 228 | |
uwizeyimana | 3:6076b262dc5e | 229 | //backagain.attach(callback(&mode1),15.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 230 | |
uwizeyimana | 1:2a3b76b2e4e5 | 231 | } |
uwizeyimana | 2:b990d41df49e | 232 | else if(pushDuration>=3 && state==0 ){ |
uwizeyimana | 2:b990d41df49e | 233 | state =1; |
uwizeyimana | 2:b990d41df49e | 234 | printf("direction changed %d \n",direction); |
uwizeyimana | 1:2a3b76b2e4e5 | 235 | direction=!direction; |
uwizeyimana | 1:2a3b76b2e4e5 | 236 | displayState2(); |
uwizeyimana | 1:2a3b76b2e4e5 | 237 | |
uwizeyimana | 1:2a3b76b2e4e5 | 238 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 239 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 240 | void riseBtn(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 241 | time(&startTime); |
uwizeyimana | 3:6076b262dc5e | 242 | durationTime.attach(ev_queue.event(&countDuration),0.5f); |
uwizeyimana | 2:b990d41df49e | 243 | |
uwizeyimana | 1:2a3b76b2e4e5 | 244 | } |
uwizeyimana | 3:6076b262dc5e | 245 | |
uwizeyimana | 2:b990d41df49e | 246 | |
uwizeyimana | 0:6e0a4dac6596 | 247 | int main() { |
uwizeyimana | 3:6076b262dc5e | 248 | |
uwizeyimana | 3:6076b262dc5e | 249 | |
uwizeyimana | 3:6076b262dc5e | 250 | if (DEV_EUI[0] == 0x0 && DEV_EUI[1] == 0x0 && DEV_EUI[2] == 0x0 && DEV_EUI[3] == 0x0 && DEV_EUI[4] == 0x0 && DEV_EUI[5] == 0x0 && DEV_EUI[6] == 0x0 && DEV_EUI[7] == 0x0) { |
uwizeyimana | 3:6076b262dc5e | 251 | printf("Set your LoRaWAN credentials first!\n"); |
uwizeyimana | 3:6076b262dc5e | 252 | return -1; |
uwizeyimana | 3:6076b262dc5e | 253 | } |
uwizeyimana | 3:6076b262dc5e | 254 | |
uwizeyimana | 3:6076b262dc5e | 255 | printf("Press BUTTON1 to send the current value of the temperature sensor!\n"); |
uwizeyimana | 3:6076b262dc5e | 256 | |
uwizeyimana | 3:6076b262dc5e | 257 | // Enable trace output for this demo, so we can see what the LoRaWAN stack does |
uwizeyimana | 3:6076b262dc5e | 258 | mbed_trace_init(); |
uwizeyimana | 3:6076b262dc5e | 259 | |
uwizeyimana | 3:6076b262dc5e | 260 | if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
uwizeyimana | 3:6076b262dc5e | 261 | printf("LoRa initialization failed!\n"); |
uwizeyimana | 3:6076b262dc5e | 262 | return -1; |
uwizeyimana | 3:6076b262dc5e | 263 | } |
uwizeyimana | 3:6076b262dc5e | 264 | |
uwizeyimana | 3:6076b262dc5e | 265 | // Fire a message when the button is pressed |
uwizeyimana | 3:6076b262dc5e | 266 | //btn.fall(ev_queue.event(&send_data_button_isr)); |
uwizeyimana | 3:6076b262dc5e | 267 | btn.rise(ev_queue.event(&riseBtn)); |
uwizeyimana | 3:6076b262dc5e | 268 | btn.fall(ev_queue.event(&fallBtn)); |
uwizeyimana | 3:6076b262dc5e | 269 | swt.rise(ev_queue.event(&riseSwt)); |
uwizeyimana | 3:6076b262dc5e | 270 | swt.fall(ev_queue.event(&fallSwt)); |
uwizeyimana | 3:6076b262dc5e | 271 | |
uwizeyimana | 3:6076b262dc5e | 272 | // prepare application callbacks |
uwizeyimana | 3:6076b262dc5e | 273 | callbacks.events = mbed::callback(lora_event_handler); |
uwizeyimana | 3:6076b262dc5e | 274 | lorawan.add_app_callbacks(&callbacks); |
uwizeyimana | 3:6076b262dc5e | 275 | |
uwizeyimana | 3:6076b262dc5e | 276 | // Disable adaptive data rating |
uwizeyimana | 3:6076b262dc5e | 277 | if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
uwizeyimana | 3:6076b262dc5e | 278 | printf("disable_adaptive_datarate failed!\n"); |
uwizeyimana | 3:6076b262dc5e | 279 | return -1; |
uwizeyimana | 3:6076b262dc5e | 280 | } |
uwizeyimana | 3:6076b262dc5e | 281 | |
uwizeyimana | 3:6076b262dc5e | 282 | lorawan.set_datarate(5); // SF7BW125 |
uwizeyimana | 3:6076b262dc5e | 283 | |
uwizeyimana | 3:6076b262dc5e | 284 | lorawan_connect_t connect_params; |
uwizeyimana | 3:6076b262dc5e | 285 | connect_params.connect_type = LORAWAN_CONNECTION_OTAA; |
uwizeyimana | 3:6076b262dc5e | 286 | connect_params.connection_u.otaa.dev_eui = DEV_EUI; |
uwizeyimana | 3:6076b262dc5e | 287 | connect_params.connection_u.otaa.app_eui = APP_EUI; |
uwizeyimana | 3:6076b262dc5e | 288 | connect_params.connection_u.otaa.app_key = APP_KEY; |
uwizeyimana | 3:6076b262dc5e | 289 | connect_params.connection_u.otaa.nb_trials = 3; |
uwizeyimana | 3:6076b262dc5e | 290 | |
uwizeyimana | 3:6076b262dc5e | 291 | lorawan_status_t retcode = lorawan.connect(connect_params); |
uwizeyimana | 3:6076b262dc5e | 292 | |
uwizeyimana | 3:6076b262dc5e | 293 | if (retcode == LORAWAN_STATUS_OK || |
uwizeyimana | 3:6076b262dc5e | 294 | retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
uwizeyimana | 3:6076b262dc5e | 295 | } else { |
uwizeyimana | 3:6076b262dc5e | 296 | printf("Connection error, code = %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 297 | return -1; |
uwizeyimana | 3:6076b262dc5e | 298 | } |
uwizeyimana | 3:6076b262dc5e | 299 | |
uwizeyimana | 3:6076b262dc5e | 300 | printf("Connection - In Progress ...\r\n"); |
uwizeyimana | 3:6076b262dc5e | 301 | |
uwizeyimana | 3:6076b262dc5e | 302 | // make your event queue dispatching events forever |
uwizeyimana | 3:6076b262dc5e | 303 | ev_queue.dispatch_forever(); |
uwizeyimana | 3:6076b262dc5e | 304 | |
uwizeyimana | 3:6076b262dc5e | 305 | return 0; |
uwizeyimana | 3:6076b262dc5e | 306 | } |
uwizeyimana | 3:6076b262dc5e | 307 | |
uwizeyimana | 3:6076b262dc5e | 308 | // This is called from RX_DONE, so whenever a message came in |
uwizeyimana | 3:6076b262dc5e | 309 | static void receive_message() |
uwizeyimana | 3:6076b262dc5e | 310 | { |
uwizeyimana | 3:6076b262dc5e | 311 | uint8_t rx_buffer[50] = { 0 }; |
uwizeyimana | 3:6076b262dc5e | 312 | int16_t retcode; |
uwizeyimana | 3:6076b262dc5e | 313 | retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, |
uwizeyimana | 3:6076b262dc5e | 314 | sizeof(rx_buffer), |
uwizeyimana | 3:6076b262dc5e | 315 | MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG); |
uwizeyimana | 3:6076b262dc5e | 316 | |
uwizeyimana | 3:6076b262dc5e | 317 | if (retcode < 0) { |
uwizeyimana | 3:6076b262dc5e | 318 | printf("receive() - Error code %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 319 | return; |
uwizeyimana | 3:6076b262dc5e | 320 | } |
uwizeyimana | 3:6076b262dc5e | 321 | |
uwizeyimana | 3:6076b262dc5e | 322 | printf("Data received on port %d (length %d): ", MBED_CONF_LORA_APP_PORT, retcode); |
uwizeyimana | 3:6076b262dc5e | 323 | |
uwizeyimana | 3:6076b262dc5e | 324 | for (uint8_t i = 0; i < retcode; i++) { |
uwizeyimana | 3:6076b262dc5e | 325 | printf("%02x ", rx_buffer[i]); |
uwizeyimana | 3:6076b262dc5e | 326 | } |
uwizeyimana | 3:6076b262dc5e | 327 | printf("\n"); |
uwizeyimana | 3:6076b262dc5e | 328 | } |
uwizeyimana | 3:6076b262dc5e | 329 | |
uwizeyimana | 3:6076b262dc5e | 330 | // Event handler |
uwizeyimana | 3:6076b262dc5e | 331 | static void lora_event_handler(lorawan_event_t event) { |
uwizeyimana | 3:6076b262dc5e | 332 | switch (event) { |
uwizeyimana | 3:6076b262dc5e | 333 | case CONNECTED: |
uwizeyimana | 3:6076b262dc5e | 334 | printf("Connection - Successful\n"); |
uwizeyimana | 3:6076b262dc5e | 335 | welcomeMsg(); |
uwizeyimana | 3:6076b262dc5e | 336 | |
uwizeyimana | 3:6076b262dc5e | 337 | break; |
uwizeyimana | 3:6076b262dc5e | 338 | case DISCONNECTED: |
uwizeyimana | 3:6076b262dc5e | 339 | ev_queue.break_dispatch(); |
uwizeyimana | 3:6076b262dc5e | 340 | printf("Disconnected Successfully\n"); |
uwizeyimana | 3:6076b262dc5e | 341 | break; |
uwizeyimana | 3:6076b262dc5e | 342 | case TX_DONE: |
uwizeyimana | 3:6076b262dc5e | 343 | printf("Message Sent to Network Server\n"); |
uwizeyimana | 3:6076b262dc5e | 344 | break; |
uwizeyimana | 3:6076b262dc5e | 345 | case TX_TIMEOUT: |
uwizeyimana | 3:6076b262dc5e | 346 | case TX_ERROR: |
uwizeyimana | 3:6076b262dc5e | 347 | case TX_CRYPTO_ERROR: |
uwizeyimana | 3:6076b262dc5e | 348 | case TX_SCHEDULING_ERROR: |
uwizeyimana | 3:6076b262dc5e | 349 | printf("Transmission Error - EventCode = %d\n", event); |
uwizeyimana | 3:6076b262dc5e | 350 | break; |
uwizeyimana | 3:6076b262dc5e | 351 | case RX_DONE: |
uwizeyimana | 3:6076b262dc5e | 352 | printf("Received message from Network Server\n"); |
uwizeyimana | 3:6076b262dc5e | 353 | receive_message(); |
uwizeyimana | 3:6076b262dc5e | 354 | break; |
uwizeyimana | 3:6076b262dc5e | 355 | case RX_TIMEOUT: |
uwizeyimana | 3:6076b262dc5e | 356 | case RX_ERROR: |
uwizeyimana | 3:6076b262dc5e | 357 | printf("Error in reception - Code = %d\n", event); |
uwizeyimana | 3:6076b262dc5e | 358 | break; |
uwizeyimana | 3:6076b262dc5e | 359 | case JOIN_FAILURE: |
uwizeyimana | 3:6076b262dc5e | 360 | printf("OTAA Failed - Check Keys\n"); |
uwizeyimana | 3:6076b262dc5e | 361 | break; |
uwizeyimana | 3:6076b262dc5e | 362 | default: |
uwizeyimana | 3:6076b262dc5e | 363 | MBED_ASSERT("Unknown Event"); |
uwizeyimana | 3:6076b262dc5e | 364 | } |
uwizeyimana | 3:6076b262dc5e | 365 | } |