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@5:97e965dd4bff, 2021-07-11 (annotated)
- Committer:
- uwizeyimana
- Date:
- Sun Jul 11 15:54:28 2021 +0000
- Revision:
- 5:97e965dd4bff
- Parent:
- 4:51ec2290a0fc
- Child:
- 6:dee22a227ee4
UPDATE
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 | 5:97e965dd4bff | 6 | 4)UMUGWANEZA ANGELIQUE REG NBER: 221004229*/ |
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 | 0:6e0a4dac6596 | 35 | int direction=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 36 | int i=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 37 | int pushDuration; |
uwizeyimana | 0:6e0a4dac6596 | 38 | int current=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 39 | int state=0; |
uwizeyimana | 2:b990d41df49e | 40 | |
uwizeyimana | 0:6e0a4dac6596 | 41 | string str1 = "Menu of the Day"; |
uwizeyimana | 0:6e0a4dac6596 | 42 | string str2 = "Rwanda Food Services Ltd"; |
uwizeyimana | 0:6e0a4dac6596 | 43 | string str3="Rwanda Food Services Ltd,click Btn to browseMenu"; |
uwizeyimana | 0:6e0a4dac6596 | 44 | string topics[]={"1.Out Side catering services", |
uwizeyimana | 0:6e0a4dac6596 | 45 | "2.Restaurent Services","3.fast Food Services", |
uwizeyimana | 0:6e0a4dac6596 | 46 | "4.Online ordering Food Services", |
uwizeyimana | 0:6e0a4dac6596 | 47 | "5.Cook Training Services " |
uwizeyimana | 0:6e0a4dac6596 | 48 | }; |
uwizeyimana | 0:6e0a4dac6596 | 49 | string content[]={"11.online bookings buffet package for 80+ guests with 10 percent off", |
uwizeyimana | 0:6e0a4dac6596 | 50 | "22.Pilawo, biriyani, African food,western food","33.fried chicken with salad,fried fish with salad,Nyama choma", |
uwizeyimana | 0:6e0a4dac6596 | 51 | "44.African food,westen food,fast food,pilawo,biriyani", |
uwizeyimana | 0:6e0a4dac6596 | 52 | "55.bread,samosa cooking and smoothies preparation " |
uwizeyimana | 0:6e0a4dac6596 | 53 | }; |
uwizeyimana | 3:6076b262dc5e | 54 | // Device credentials, register device as OTAA in The Things Network and copy credentials here |
uwizeyimana | 3:6076b262dc5e | 55 | static uint8_t DEV_EUI[] = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 }; |
uwizeyimana | 3:6076b262dc5e | 56 | static uint8_t APP_EUI[] = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 }; |
uwizeyimana | 3:6076b262dc5e | 57 | static uint8_t APP_KEY[] = { 0x51, 0xEA, 0x6E, 0x8B, 0x30, 0x44, 0xE6, 0x4A, 0xBD, 0xD3, 0xFD, 0xD0, 0x4A, 0x1C, 0x4D, 0x2F }; |
uwizeyimana | 3:6076b262dc5e | 58 | |
uwizeyimana | 3:6076b262dc5e | 59 | |
uwizeyimana | 3:6076b262dc5e | 60 | // The port we're sending and receiving on |
uwizeyimana | 3:6076b262dc5e | 61 | #define MBED_CONF_LORA_APP_PORT 15 |
uwizeyimana | 3:6076b262dc5e | 62 | |
uwizeyimana | 3:6076b262dc5e | 63 | // Peripherals (LoRa radio, temperature sensor and button) |
uwizeyimana | 3:6076b262dc5e | 64 | SX1276_LoRaRadio radio(D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9, NC, NC, NC, NC, A4, NC, NC); |
uwizeyimana | 3:6076b262dc5e | 65 | Sht31 sht31(I2C_SDA, I2C_SCL); |
uwizeyimana | 3:6076b262dc5e | 66 | |
uwizeyimana | 3:6076b262dc5e | 67 | |
uwizeyimana | 3:6076b262dc5e | 68 | // EventQueue is required to dispatch events around |
uwizeyimana | 3:6076b262dc5e | 69 | static EventQueue ev_queue; |
uwizeyimana | 3:6076b262dc5e | 70 | |
uwizeyimana | 3:6076b262dc5e | 71 | // Constructing Mbed LoRaWANInterface and passing it down the radio object. |
uwizeyimana | 3:6076b262dc5e | 72 | static LoRaWANInterface lorawan(radio); |
uwizeyimana | 3:6076b262dc5e | 73 | |
uwizeyimana | 3:6076b262dc5e | 74 | // Application specific callbacks |
uwizeyimana | 3:6076b262dc5e | 75 | static lorawan_app_callbacks_t callbacks; |
uwizeyimana | 3:6076b262dc5e | 76 | |
uwizeyimana | 3:6076b262dc5e | 77 | // LoRaWAN stack event handler |
uwizeyimana | 3:6076b262dc5e | 78 | static void lora_event_handler(lorawan_event_t event); |
uwizeyimana | 4:51ec2290a0fc | 79 | //function to enable display to work |
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 | 4:51ec2290a0fc | 85 | //function to display time and temp |
uwizeyimana | 1:2a3b76b2e4e5 | 86 | void displayState1(){ |
uwizeyimana | 0:6e0a4dac6596 | 87 | float temp = theo.readTemperature(); |
uwizeyimana | 0:6e0a4dac6596 | 88 | time_t seconds = time(NULL); |
uwizeyimana | 0:6e0a4dac6596 | 89 | char buffer[32]; |
uwizeyimana | 0:6e0a4dac6596 | 90 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
uwizeyimana | 0:6e0a4dac6596 | 91 | lcd.locate(5, 20); // get cursor to position x=3px and y=5px |
uwizeyimana | 0:6e0a4dac6596 | 92 | lcd.cls(); |
uwizeyimana | 0:6e0a4dac6596 | 93 | lcd.set_auto_up(0); |
uwizeyimana | 1:2a3b76b2e4e5 | 94 | lcd.locate(5, 1); |
uwizeyimana | 0:6e0a4dac6596 | 95 | lcd.printf("Local Time: %s",buffer); |
uwizeyimana | 1:2a3b76b2e4e5 | 96 | lcd.locate(5, 9); |
uwizeyimana | 0:6e0a4dac6596 | 97 | lcd.printf("Temperature: %.2f C", temp); |
uwizeyimana | 0:6e0a4dac6596 | 98 | } |
uwizeyimana | 4:51ec2290a0fc | 99 | //function to blink white led |
uwizeyimana | 1:2a3b76b2e4e5 | 100 | void whiteled() |
uwizeyimana | 0:6e0a4dac6596 | 101 | { |
uwizeyimana | 1:2a3b76b2e4e5 | 102 | wed=!wed; |
uwizeyimana | 1:2a3b76b2e4e5 | 103 | } |
uwizeyimana | 4:51ec2290a0fc | 104 | //message to display when in forward mode |
uwizeyimana | 1:2a3b76b2e4e5 | 105 | void forwards(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 106 | display(topics[i]); |
uwizeyimana | 1:2a3b76b2e4e5 | 107 | current=i; |
uwizeyimana | 1:2a3b76b2e4e5 | 108 | i+=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 109 | if(i>4){ |
uwizeyimana | 1:2a3b76b2e4e5 | 110 | i=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 111 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 112 | } |
uwizeyimana | 4:51ec2290a0fc | 113 | //message to display in backward mode |
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 | 4:51ec2290a0fc | 122 | //direction control function |
uwizeyimana | 1:2a3b76b2e4e5 | 123 | void displayState2(){ |
uwizeyimana | 2:b990d41df49e | 124 | printf("direction %d \n",direction); |
uwizeyimana | 1:2a3b76b2e4e5 | 125 | if(direction==0){ |
uwizeyimana | 1:2a3b76b2e4e5 | 126 | i=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 127 | bed=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 128 | led=0; |
uwizeyimana | 3:6076b262dc5e | 129 | topicTicker.attach(ev_queue.event(&forwards),2.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 130 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 131 | else{ |
uwizeyimana | 1:2a3b76b2e4e5 | 132 | i=4; |
uwizeyimana | 1:2a3b76b2e4e5 | 133 | led=1; |
uwizeyimana | 1:2a3b76b2e4e5 | 134 | bed=0; |
uwizeyimana | 3:6076b262dc5e | 135 | topicTicker.attach(ev_queue.event(& backwards),2.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 136 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 137 | } |
uwizeyimana | 4:51ec2290a0fc | 138 | //message to call when button has been let go |
uwizeyimana | 1:2a3b76b2e4e5 | 139 | void fallBtn(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 140 | state = 0; |
uwizeyimana | 2:b990d41df49e | 141 | durationTime.detach(); |
uwizeyimana | 2:b990d41df49e | 142 | |
uwizeyimana | 1:2a3b76b2e4e5 | 143 | } |
uwizeyimana | 4:51ec2290a0fc | 144 | //message to display after welcome message on the screen |
uwizeyimana | 1:2a3b76b2e4e5 | 145 | void mode1(){ |
uwizeyimana | 3:6076b262dc5e | 146 | k.attach(ev_queue.event(& whiteled),1.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 147 | displayState1(); |
uwizeyimana | 3:6076b262dc5e | 148 | t.attach(ev_queue.event(&displayState2),3.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 149 | |
uwizeyimana | 1:2a3b76b2e4e5 | 150 | } |
uwizeyimana | 4:51ec2290a0fc | 151 | //message to be displayed on the screen while on start up |
uwizeyimana | 3:6076b262dc5e | 152 | void welcomeMsg(){ |
uwizeyimana | 3:6076b262dc5e | 153 | display(str2); |
uwizeyimana | 3:6076b262dc5e | 154 | t.attach(ev_queue.event(&mode1),5.0f); |
uwizeyimana | 3:6076b262dc5e | 155 | } |
uwizeyimana | 4:51ec2290a0fc | 156 | //message to call when switch is rised |
uwizeyimana | 1:2a3b76b2e4e5 | 157 | void riseSwt(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 158 | time(&startReading); |
uwizeyimana | 1:2a3b76b2e4e5 | 159 | display(content[current]); |
uwizeyimana | 1:2a3b76b2e4e5 | 160 | topicTicker.detach(); |
uwizeyimana | 0:6e0a4dac6596 | 161 | } |
uwizeyimana | 4:51ec2290a0fc | 162 | // declaration messages to be sent on the cloud |
uwizeyimana | 3:6076b262dc5e | 163 | static uint8_t* create_message(char device[], int topic, int duration) { |
uwizeyimana | 3:6076b262dc5e | 164 | // initialize the buffer |
uwizeyimana | 3:6076b262dc5e | 165 | uint8_t tx_buffer[50] = { 0 }; |
uwizeyimana | 3:6076b262dc5e | 166 | // Writing string data into a buffer |
uwizeyimana | 3:6076b262dc5e | 167 | sprintf((char*) tx_buffer, "{\"device\":\"%s\",\"topic\":%d,\"duration\":%d }", device, topic,duration); |
uwizeyimana | 3:6076b262dc5e | 168 | return tx_buffer; |
uwizeyimana | 3:6076b262dc5e | 169 | } |
uwizeyimana | 3:6076b262dc5e | 170 | // Send a message over LoRaWAN |
uwizeyimana | 3:6076b262dc5e | 171 | static void send_message(uint8_t *tx_buffer) { |
uwizeyimana | 3:6076b262dc5e | 172 | |
uwizeyimana | 3:6076b262dc5e | 173 | int packet_len = strlen((char*) tx_buffer); |
uwizeyimana | 3:6076b262dc5e | 174 | |
uwizeyimana | 3:6076b262dc5e | 175 | printf("Sending %d bytes: \"%s\"\n", packet_len, tx_buffer); |
uwizeyimana | 3:6076b262dc5e | 176 | |
uwizeyimana | 3:6076b262dc5e | 177 | |
uwizeyimana | 3:6076b262dc5e | 178 | int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG); |
uwizeyimana | 3:6076b262dc5e | 179 | |
uwizeyimana | 3:6076b262dc5e | 180 | // 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 | 181 | if (retcode < 0) { |
uwizeyimana | 3:6076b262dc5e | 182 | retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - duty cycle violation\n") |
uwizeyimana | 3:6076b262dc5e | 183 | : printf("send() - Error code %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 184 | return; |
uwizeyimana | 3:6076b262dc5e | 185 | } |
uwizeyimana | 3:6076b262dc5e | 186 | |
uwizeyimana | 3:6076b262dc5e | 187 | printf("%d bytes scheduled for transmission\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 188 | } |
uwizeyimana | 4:51ec2290a0fc | 189 | //action to be processed when the button has been let go |
uwizeyimana | 1:2a3b76b2e4e5 | 190 | void fallSwt(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 191 | topicTicker.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 192 | time(&stopReading); |
uwizeyimana | 1:2a3b76b2e4e5 | 193 | readingDuration=stopReading-startReading; |
uwizeyimana | 1:2a3b76b2e4e5 | 194 | printf("Reading time is:%d \n",readingDuration); |
uwizeyimana | 1:2a3b76b2e4e5 | 195 | if(readingDuration>5){ |
uwizeyimana | 3:6076b262dc5e | 196 | |
uwizeyimana | 1:2a3b76b2e4e5 | 197 | printf("message sent,Item Id is:%d \n",current+1); |
uwizeyimana | 3:6076b262dc5e | 198 | char device[] = "mobile"; |
uwizeyimana | 3:6076b262dc5e | 199 | int topic = current+1; // topic identifier |
uwizeyimana | 3:6076b262dc5e | 200 | |
uwizeyimana | 3:6076b262dc5e | 201 | send_message(create_message(device,topic,readingDuration)); |
uwizeyimana | 3:6076b262dc5e | 202 | |
uwizeyimana | 1:2a3b76b2e4e5 | 203 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 204 | displayState2(); |
uwizeyimana | 0:6e0a4dac6596 | 205 | } |
uwizeyimana | 4:51ec2290a0fc | 206 | //count how long the button have been pushed |
uwizeyimana | 1:2a3b76b2e4e5 | 207 | void countDuration(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 208 | time(&stopTime); |
uwizeyimana | 1:2a3b76b2e4e5 | 209 | pushDuration=stopTime-startTime; |
uwizeyimana | 2:b990d41df49e | 210 | printf("elapsed time is:%d \n",pushDuration); |
uwizeyimana | 1:2a3b76b2e4e5 | 211 | if(pushDuration>5){ |
uwizeyimana | 1:2a3b76b2e4e5 | 212 | display("System resetting......\n"); |
uwizeyimana | 1:2a3b76b2e4e5 | 213 | durationTime.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 214 | topicTicker.detach(); |
uwizeyimana | 3:6076b262dc5e | 215 | direction=!direction; |
uwizeyimana | 3:6076b262dc5e | 216 | resetted.attach(ev_queue.event(&welcomeMsg),10.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 217 | } |
uwizeyimana | 2:b990d41df49e | 218 | else if(pushDuration>=3 && state==0 ){ |
uwizeyimana | 2:b990d41df49e | 219 | state =1; |
uwizeyimana | 2:b990d41df49e | 220 | printf("direction changed %d \n",direction); |
uwizeyimana | 1:2a3b76b2e4e5 | 221 | direction=!direction; |
uwizeyimana | 1:2a3b76b2e4e5 | 222 | displayState2(); |
uwizeyimana | 1:2a3b76b2e4e5 | 223 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 224 | } |
uwizeyimana | 4:51ec2290a0fc | 225 | //action to be done when button is pushed |
uwizeyimana | 1:2a3b76b2e4e5 | 226 | void riseBtn(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 227 | time(&startTime); |
uwizeyimana | 3:6076b262dc5e | 228 | durationTime.attach(ev_queue.event(&countDuration),0.5f); |
uwizeyimana | 2:b990d41df49e | 229 | |
uwizeyimana | 1:2a3b76b2e4e5 | 230 | } |
uwizeyimana | 3:6076b262dc5e | 231 | |
uwizeyimana | 0:6e0a4dac6596 | 232 | int main() { |
uwizeyimana | 3:6076b262dc5e | 233 | |
uwizeyimana | 3:6076b262dc5e | 234 | |
uwizeyimana | 3:6076b262dc5e | 235 | 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 | 236 | printf("Set your LoRaWAN credentials first!\n"); |
uwizeyimana | 3:6076b262dc5e | 237 | return -1; |
uwizeyimana | 3:6076b262dc5e | 238 | } |
uwizeyimana | 3:6076b262dc5e | 239 | mbed_trace_init(); |
uwizeyimana | 3:6076b262dc5e | 240 | |
uwizeyimana | 3:6076b262dc5e | 241 | if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
uwizeyimana | 3:6076b262dc5e | 242 | printf("LoRa initialization failed!\n"); |
uwizeyimana | 3:6076b262dc5e | 243 | return -1; |
uwizeyimana | 3:6076b262dc5e | 244 | } |
uwizeyimana | 3:6076b262dc5e | 245 | |
uwizeyimana | 3:6076b262dc5e | 246 | // Fire a message when the button is pressed |
uwizeyimana | 3:6076b262dc5e | 247 | //btn.fall(ev_queue.event(&send_data_button_isr)); |
uwizeyimana | 3:6076b262dc5e | 248 | btn.rise(ev_queue.event(&riseBtn)); |
uwizeyimana | 3:6076b262dc5e | 249 | btn.fall(ev_queue.event(&fallBtn)); |
uwizeyimana | 3:6076b262dc5e | 250 | swt.rise(ev_queue.event(&riseSwt)); |
uwizeyimana | 3:6076b262dc5e | 251 | swt.fall(ev_queue.event(&fallSwt)); |
uwizeyimana | 3:6076b262dc5e | 252 | |
uwizeyimana | 3:6076b262dc5e | 253 | // prepare application callbacks |
uwizeyimana | 3:6076b262dc5e | 254 | callbacks.events = mbed::callback(lora_event_handler); |
uwizeyimana | 3:6076b262dc5e | 255 | lorawan.add_app_callbacks(&callbacks); |
uwizeyimana | 3:6076b262dc5e | 256 | |
uwizeyimana | 3:6076b262dc5e | 257 | // Disable adaptive data rating |
uwizeyimana | 3:6076b262dc5e | 258 | if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
uwizeyimana | 3:6076b262dc5e | 259 | printf("disable_adaptive_datarate failed!\n"); |
uwizeyimana | 3:6076b262dc5e | 260 | return -1; |
uwizeyimana | 3:6076b262dc5e | 261 | } |
uwizeyimana | 3:6076b262dc5e | 262 | |
uwizeyimana | 3:6076b262dc5e | 263 | lorawan.set_datarate(5); // SF7BW125 |
uwizeyimana | 3:6076b262dc5e | 264 | |
uwizeyimana | 3:6076b262dc5e | 265 | lorawan_connect_t connect_params; |
uwizeyimana | 3:6076b262dc5e | 266 | connect_params.connect_type = LORAWAN_CONNECTION_OTAA; |
uwizeyimana | 3:6076b262dc5e | 267 | connect_params.connection_u.otaa.dev_eui = DEV_EUI; |
uwizeyimana | 3:6076b262dc5e | 268 | connect_params.connection_u.otaa.app_eui = APP_EUI; |
uwizeyimana | 3:6076b262dc5e | 269 | connect_params.connection_u.otaa.app_key = APP_KEY; |
uwizeyimana | 3:6076b262dc5e | 270 | connect_params.connection_u.otaa.nb_trials = 3; |
uwizeyimana | 3:6076b262dc5e | 271 | |
uwizeyimana | 3:6076b262dc5e | 272 | lorawan_status_t retcode = lorawan.connect(connect_params); |
uwizeyimana | 3:6076b262dc5e | 273 | |
uwizeyimana | 3:6076b262dc5e | 274 | if (retcode == LORAWAN_STATUS_OK || |
uwizeyimana | 3:6076b262dc5e | 275 | retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
uwizeyimana | 3:6076b262dc5e | 276 | } else { |
uwizeyimana | 3:6076b262dc5e | 277 | printf("Connection error, code = %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 278 | return -1; |
uwizeyimana | 3:6076b262dc5e | 279 | } |
uwizeyimana | 3:6076b262dc5e | 280 | |
uwizeyimana | 3:6076b262dc5e | 281 | printf("Connection - In Progress ...\r\n"); |
uwizeyimana | 4:51ec2290a0fc | 282 | display("Connection - In Progress ...\r\n"); |
uwizeyimana | 3:6076b262dc5e | 283 | |
uwizeyimana | 3:6076b262dc5e | 284 | // make your event queue dispatching events forever |
uwizeyimana | 3:6076b262dc5e | 285 | ev_queue.dispatch_forever(); |
uwizeyimana | 3:6076b262dc5e | 286 | |
uwizeyimana | 3:6076b262dc5e | 287 | return 0; |
uwizeyimana | 3:6076b262dc5e | 288 | } |
uwizeyimana | 3:6076b262dc5e | 289 | |
uwizeyimana | 3:6076b262dc5e | 290 | // This is called from RX_DONE, so whenever a message came in |
uwizeyimana | 3:6076b262dc5e | 291 | static void receive_message() |
uwizeyimana | 3:6076b262dc5e | 292 | { |
uwizeyimana | 3:6076b262dc5e | 293 | uint8_t rx_buffer[50] = { 0 }; |
uwizeyimana | 3:6076b262dc5e | 294 | int16_t retcode; |
uwizeyimana | 3:6076b262dc5e | 295 | retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, |
uwizeyimana | 3:6076b262dc5e | 296 | sizeof(rx_buffer), |
uwizeyimana | 3:6076b262dc5e | 297 | MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG); |
uwizeyimana | 3:6076b262dc5e | 298 | |
uwizeyimana | 3:6076b262dc5e | 299 | if (retcode < 0) { |
uwizeyimana | 3:6076b262dc5e | 300 | printf("receive() - Error code %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 301 | return; |
uwizeyimana | 3:6076b262dc5e | 302 | } |
uwizeyimana | 3:6076b262dc5e | 303 | |
uwizeyimana | 3:6076b262dc5e | 304 | printf("Data received on port %d (length %d): ", MBED_CONF_LORA_APP_PORT, retcode); |
uwizeyimana | 3:6076b262dc5e | 305 | |
uwizeyimana | 3:6076b262dc5e | 306 | for (uint8_t i = 0; i < retcode; i++) { |
uwizeyimana | 3:6076b262dc5e | 307 | printf("%02x ", rx_buffer[i]); |
uwizeyimana | 3:6076b262dc5e | 308 | } |
uwizeyimana | 3:6076b262dc5e | 309 | printf("\n"); |
uwizeyimana | 3:6076b262dc5e | 310 | } |
uwizeyimana | 3:6076b262dc5e | 311 | |
uwizeyimana | 3:6076b262dc5e | 312 | // Event handler |
uwizeyimana | 3:6076b262dc5e | 313 | static void lora_event_handler(lorawan_event_t event) { |
uwizeyimana | 3:6076b262dc5e | 314 | switch (event) { |
uwizeyimana | 3:6076b262dc5e | 315 | case CONNECTED: |
uwizeyimana | 3:6076b262dc5e | 316 | printf("Connection - Successful\n"); |
uwizeyimana | 4:51ec2290a0fc | 317 | display("Connection - Successful\n"); |
uwizeyimana | 4:51ec2290a0fc | 318 | wait_ms(1000); |
uwizeyimana | 3:6076b262dc5e | 319 | welcomeMsg(); |
uwizeyimana | 3:6076b262dc5e | 320 | |
uwizeyimana | 3:6076b262dc5e | 321 | break; |
uwizeyimana | 3:6076b262dc5e | 322 | case DISCONNECTED: |
uwizeyimana | 3:6076b262dc5e | 323 | ev_queue.break_dispatch(); |
uwizeyimana | 4:51ec2290a0fc | 324 | printf("unable to connect\n"); |
uwizeyimana | 4:51ec2290a0fc | 325 | display("unable to connect\n"); |
uwizeyimana | 3:6076b262dc5e | 326 | break; |
uwizeyimana | 3:6076b262dc5e | 327 | case TX_DONE: |
uwizeyimana | 3:6076b262dc5e | 328 | printf("Message Sent to Network Server\n"); |
uwizeyimana | 3:6076b262dc5e | 329 | break; |
uwizeyimana | 3:6076b262dc5e | 330 | case TX_TIMEOUT: |
uwizeyimana | 3:6076b262dc5e | 331 | case TX_ERROR: |
uwizeyimana | 3:6076b262dc5e | 332 | case TX_CRYPTO_ERROR: |
uwizeyimana | 3:6076b262dc5e | 333 | case TX_SCHEDULING_ERROR: |
uwizeyimana | 3:6076b262dc5e | 334 | printf("Transmission Error - EventCode = %d\n", event); |
uwizeyimana | 3:6076b262dc5e | 335 | break; |
uwizeyimana | 3:6076b262dc5e | 336 | case RX_DONE: |
uwizeyimana | 3:6076b262dc5e | 337 | printf("Received message from Network Server\n"); |
uwizeyimana | 3:6076b262dc5e | 338 | receive_message(); |
uwizeyimana | 3:6076b262dc5e | 339 | break; |
uwizeyimana | 3:6076b262dc5e | 340 | case RX_TIMEOUT: |
uwizeyimana | 3:6076b262dc5e | 341 | case RX_ERROR: |
uwizeyimana | 3:6076b262dc5e | 342 | printf("Error in reception - Code = %d\n", event); |
uwizeyimana | 3:6076b262dc5e | 343 | break; |
uwizeyimana | 3:6076b262dc5e | 344 | case JOIN_FAILURE: |
uwizeyimana | 3:6076b262dc5e | 345 | printf("OTAA Failed - Check Keys\n"); |
uwizeyimana | 3:6076b262dc5e | 346 | break; |
uwizeyimana | 3:6076b262dc5e | 347 | default: |
uwizeyimana | 3:6076b262dc5e | 348 | MBED_ASSERT("Unknown Event"); |
uwizeyimana | 3:6076b262dc5e | 349 | } |
uwizeyimana | 3:6076b262dc5e | 350 | } |