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@10:bdd6069f1345, 2021-07-12 (annotated)
- Committer:
- uwizeyimana
- Date:
- Mon Jul 12 15:17:31 2021 +0000
- Revision:
- 10:bdd6069f1345
- Parent:
- 9:9ff8ceda23ac
- Child:
- 11:54d3db4e073d
update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uwizeyimana | 0:6e0a4dac6596 | 1 | /*mobile project |
uwizeyimana | 8:cf01437054e6 | 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 | 10:bdd6069f1345 | 38 | int Situation=0; |
uwizeyimana | 1:2a3b76b2e4e5 | 39 | int state=0; |
uwizeyimana | 2:b990d41df49e | 40 | |
uwizeyimana | 0:6e0a4dac6596 | 41 | string str1 = "Menu of the Day"; |
uwizeyimana | 6:dee22a227ee4 | 42 | string str2 = "Welcome to Rwanda Food\n 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 | 8:cf01437054e6 | 49 | string content[]={"11.online bookings buffet\n package for 80+ guests with\t 10 percent off", |
uwizeyimana | 8:cf01437054e6 | 50 | "22.Pilawo,\t biriyani,\n African food,\t western food","33.fried chicken with salad,\nfried fish with salad,\nNyama choma", |
uwizeyimana | 8:cf01437054e6 | 51 | "44.African food,\t westen food,\t fast food,\t pilawo,\t biriyani", |
uwizeyimana | 8:cf01437054e6 | 52 | "55.bread,\t samosa cooking and\t 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 | 10:bdd6069f1345 | 107 | Situation=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 | 10:bdd6069f1345 | 116 | Situation=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 | 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 | 4:51ec2290a0fc | 137 | //message to call when button has been let go |
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 | 4:51ec2290a0fc | 143 | //message to display after welcome message on the screen |
uwizeyimana | 1:2a3b76b2e4e5 | 144 | void mode1(){ |
uwizeyimana | 3:6076b262dc5e | 145 | k.attach(ev_queue.event(& whiteled),1.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 146 | displayState1(); |
uwizeyimana | 3:6076b262dc5e | 147 | t.attach(ev_queue.event(&displayState2),3.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 148 | |
uwizeyimana | 1:2a3b76b2e4e5 | 149 | } |
uwizeyimana | 4:51ec2290a0fc | 150 | //message to be displayed on the screen while on start up |
uwizeyimana | 3:6076b262dc5e | 151 | void welcomeMsg(){ |
uwizeyimana | 3:6076b262dc5e | 152 | display(str2); |
uwizeyimana | 3:6076b262dc5e | 153 | t.attach(ev_queue.event(&mode1),5.0f); |
uwizeyimana | 3:6076b262dc5e | 154 | } |
uwizeyimana | 4:51ec2290a0fc | 155 | //message to call when switch is rised |
uwizeyimana | 1:2a3b76b2e4e5 | 156 | void riseSwt(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 157 | time(&startReading); |
uwizeyimana | 10:bdd6069f1345 | 158 | display(content[Situation]); |
uwizeyimana | 1:2a3b76b2e4e5 | 159 | topicTicker.detach(); |
uwizeyimana | 0:6e0a4dac6596 | 160 | } |
uwizeyimana | 4:51ec2290a0fc | 161 | // declaration messages to be sent on the cloud |
uwizeyimana | 3:6076b262dc5e | 162 | static uint8_t* create_message(char device[], int topic, int duration) { |
uwizeyimana | 3:6076b262dc5e | 163 | // initialize the buffer |
uwizeyimana | 3:6076b262dc5e | 164 | uint8_t tx_buffer[50] = { 0 }; |
uwizeyimana | 3:6076b262dc5e | 165 | // Writing string data into a buffer |
uwizeyimana | 3:6076b262dc5e | 166 | sprintf((char*) tx_buffer, "{\"device\":\"%s\",\"topic\":%d,\"duration\":%d }", device, topic,duration); |
uwizeyimana | 3:6076b262dc5e | 167 | return tx_buffer; |
uwizeyimana | 3:6076b262dc5e | 168 | } |
uwizeyimana | 3:6076b262dc5e | 169 | // Send a message over LoRaWAN |
uwizeyimana | 3:6076b262dc5e | 170 | static void send_message(uint8_t *tx_buffer) { |
uwizeyimana | 3:6076b262dc5e | 171 | |
uwizeyimana | 3:6076b262dc5e | 172 | int packet_len = strlen((char*) tx_buffer); |
uwizeyimana | 3:6076b262dc5e | 173 | |
uwizeyimana | 3:6076b262dc5e | 174 | printf("Sending %d bytes: \"%s\"\n", packet_len, tx_buffer); |
uwizeyimana | 3:6076b262dc5e | 175 | |
uwizeyimana | 3:6076b262dc5e | 176 | |
uwizeyimana | 3:6076b262dc5e | 177 | int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG); |
uwizeyimana | 3:6076b262dc5e | 178 | |
uwizeyimana | 3:6076b262dc5e | 179 | // 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 | 180 | if (retcode < 0) { |
uwizeyimana | 3:6076b262dc5e | 181 | retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - duty cycle violation\n") |
uwizeyimana | 3:6076b262dc5e | 182 | : printf("send() - Error code %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 183 | return; |
uwizeyimana | 3:6076b262dc5e | 184 | } |
uwizeyimana | 3:6076b262dc5e | 185 | |
uwizeyimana | 3:6076b262dc5e | 186 | printf("%d bytes scheduled for transmission\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 187 | } |
uwizeyimana | 4:51ec2290a0fc | 188 | //action to be processed when the button has been let go |
uwizeyimana | 1:2a3b76b2e4e5 | 189 | void fallSwt(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 190 | topicTicker.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 191 | time(&stopReading); |
uwizeyimana | 1:2a3b76b2e4e5 | 192 | readingDuration=stopReading-startReading; |
uwizeyimana | 1:2a3b76b2e4e5 | 193 | printf("Reading time is:%d \n",readingDuration); |
uwizeyimana | 1:2a3b76b2e4e5 | 194 | if(readingDuration>5){ |
uwizeyimana | 3:6076b262dc5e | 195 | |
uwizeyimana | 10:bdd6069f1345 | 196 | printf("message sent,Item Id is:%d \n",Situation+1); |
uwizeyimana | 3:6076b262dc5e | 197 | char device[] = "mobile"; |
uwizeyimana | 10:bdd6069f1345 | 198 | int topic = Situation+1; // topic identifier |
uwizeyimana | 3:6076b262dc5e | 199 | |
uwizeyimana | 3:6076b262dc5e | 200 | send_message(create_message(device,topic,readingDuration)); |
uwizeyimana | 3:6076b262dc5e | 201 | |
uwizeyimana | 1:2a3b76b2e4e5 | 202 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 203 | displayState2(); |
uwizeyimana | 0:6e0a4dac6596 | 204 | } |
uwizeyimana | 4:51ec2290a0fc | 205 | //count how long the button have been pushed |
uwizeyimana | 1:2a3b76b2e4e5 | 206 | void countDuration(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 207 | time(&stopTime); |
uwizeyimana | 1:2a3b76b2e4e5 | 208 | pushDuration=stopTime-startTime; |
uwizeyimana | 1:2a3b76b2e4e5 | 209 | if(pushDuration>5){ |
uwizeyimana | 1:2a3b76b2e4e5 | 210 | display("System resetting......\n"); |
uwizeyimana | 1:2a3b76b2e4e5 | 211 | durationTime.detach(); |
uwizeyimana | 1:2a3b76b2e4e5 | 212 | topicTicker.detach(); |
uwizeyimana | 3:6076b262dc5e | 213 | direction=!direction; |
uwizeyimana | 3:6076b262dc5e | 214 | resetted.attach(ev_queue.event(&welcomeMsg),10.0f); |
uwizeyimana | 1:2a3b76b2e4e5 | 215 | } |
uwizeyimana | 2:b990d41df49e | 216 | else if(pushDuration>=3 && state==0 ){ |
uwizeyimana | 2:b990d41df49e | 217 | state =1; |
uwizeyimana | 1:2a3b76b2e4e5 | 218 | direction=!direction; |
uwizeyimana | 1:2a3b76b2e4e5 | 219 | displayState2(); |
uwizeyimana | 1:2a3b76b2e4e5 | 220 | } |
uwizeyimana | 1:2a3b76b2e4e5 | 221 | } |
uwizeyimana | 4:51ec2290a0fc | 222 | //action to be done when button is pushed |
uwizeyimana | 1:2a3b76b2e4e5 | 223 | void riseBtn(){ |
uwizeyimana | 1:2a3b76b2e4e5 | 224 | time(&startTime); |
uwizeyimana | 3:6076b262dc5e | 225 | durationTime.attach(ev_queue.event(&countDuration),0.5f); |
uwizeyimana | 2:b990d41df49e | 226 | |
uwizeyimana | 1:2a3b76b2e4e5 | 227 | } |
uwizeyimana | 3:6076b262dc5e | 228 | |
uwizeyimana | 0:6e0a4dac6596 | 229 | int main() { |
uwizeyimana | 3:6076b262dc5e | 230 | |
uwizeyimana | 3:6076b262dc5e | 231 | |
uwizeyimana | 3:6076b262dc5e | 232 | 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 | 233 | printf("Set your LoRaWAN credentials first!\n"); |
uwizeyimana | 3:6076b262dc5e | 234 | return -1; |
uwizeyimana | 3:6076b262dc5e | 235 | } |
uwizeyimana | 3:6076b262dc5e | 236 | mbed_trace_init(); |
uwizeyimana | 3:6076b262dc5e | 237 | |
uwizeyimana | 3:6076b262dc5e | 238 | if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
uwizeyimana | 3:6076b262dc5e | 239 | printf("LoRa initialization failed!\n"); |
uwizeyimana | 3:6076b262dc5e | 240 | return -1; |
uwizeyimana | 3:6076b262dc5e | 241 | } |
uwizeyimana | 3:6076b262dc5e | 242 | |
uwizeyimana | 3:6076b262dc5e | 243 | // Fire a message when the button is pressed |
uwizeyimana | 3:6076b262dc5e | 244 | //btn.fall(ev_queue.event(&send_data_button_isr)); |
uwizeyimana | 3:6076b262dc5e | 245 | btn.rise(ev_queue.event(&riseBtn)); |
uwizeyimana | 3:6076b262dc5e | 246 | btn.fall(ev_queue.event(&fallBtn)); |
uwizeyimana | 3:6076b262dc5e | 247 | swt.rise(ev_queue.event(&riseSwt)); |
uwizeyimana | 3:6076b262dc5e | 248 | swt.fall(ev_queue.event(&fallSwt)); |
uwizeyimana | 3:6076b262dc5e | 249 | |
uwizeyimana | 3:6076b262dc5e | 250 | // prepare application callbacks |
uwizeyimana | 3:6076b262dc5e | 251 | callbacks.events = mbed::callback(lora_event_handler); |
uwizeyimana | 3:6076b262dc5e | 252 | lorawan.add_app_callbacks(&callbacks); |
uwizeyimana | 3:6076b262dc5e | 253 | |
uwizeyimana | 3:6076b262dc5e | 254 | // Disable adaptive data rating |
uwizeyimana | 3:6076b262dc5e | 255 | if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
uwizeyimana | 3:6076b262dc5e | 256 | printf("disable_adaptive_datarate failed!\n"); |
uwizeyimana | 3:6076b262dc5e | 257 | return -1; |
uwizeyimana | 3:6076b262dc5e | 258 | } |
uwizeyimana | 3:6076b262dc5e | 259 | |
uwizeyimana | 3:6076b262dc5e | 260 | lorawan.set_datarate(5); // SF7BW125 |
uwizeyimana | 3:6076b262dc5e | 261 | |
uwizeyimana | 3:6076b262dc5e | 262 | lorawan_connect_t connect_params; |
uwizeyimana | 3:6076b262dc5e | 263 | connect_params.connect_type = LORAWAN_CONNECTION_OTAA; |
uwizeyimana | 3:6076b262dc5e | 264 | connect_params.connection_u.otaa.dev_eui = DEV_EUI; |
uwizeyimana | 3:6076b262dc5e | 265 | connect_params.connection_u.otaa.app_eui = APP_EUI; |
uwizeyimana | 3:6076b262dc5e | 266 | connect_params.connection_u.otaa.app_key = APP_KEY; |
uwizeyimana | 3:6076b262dc5e | 267 | connect_params.connection_u.otaa.nb_trials = 3; |
uwizeyimana | 3:6076b262dc5e | 268 | |
uwizeyimana | 3:6076b262dc5e | 269 | lorawan_status_t retcode = lorawan.connect(connect_params); |
uwizeyimana | 3:6076b262dc5e | 270 | |
uwizeyimana | 3:6076b262dc5e | 271 | if (retcode == LORAWAN_STATUS_OK || |
uwizeyimana | 3:6076b262dc5e | 272 | retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
uwizeyimana | 3:6076b262dc5e | 273 | } else { |
uwizeyimana | 3:6076b262dc5e | 274 | printf("Connection error, code = %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 275 | return -1; |
uwizeyimana | 3:6076b262dc5e | 276 | } |
uwizeyimana | 3:6076b262dc5e | 277 | |
uwizeyimana | 3:6076b262dc5e | 278 | printf("Connection - In Progress ...\r\n"); |
uwizeyimana | 8:cf01437054e6 | 279 | display("Connection - In Progress ...\r\nPlease wait..."); |
uwizeyimana | 3:6076b262dc5e | 280 | |
uwizeyimana | 3:6076b262dc5e | 281 | // make your event queue dispatching events forever |
uwizeyimana | 3:6076b262dc5e | 282 | ev_queue.dispatch_forever(); |
uwizeyimana | 3:6076b262dc5e | 283 | |
uwizeyimana | 3:6076b262dc5e | 284 | return 0; |
uwizeyimana | 3:6076b262dc5e | 285 | } |
uwizeyimana | 3:6076b262dc5e | 286 | |
uwizeyimana | 3:6076b262dc5e | 287 | // This is called from RX_DONE, so whenever a message came in |
uwizeyimana | 3:6076b262dc5e | 288 | static void receive_message() |
uwizeyimana | 3:6076b262dc5e | 289 | { |
uwizeyimana | 3:6076b262dc5e | 290 | uint8_t rx_buffer[50] = { 0 }; |
uwizeyimana | 3:6076b262dc5e | 291 | int16_t retcode; |
uwizeyimana | 3:6076b262dc5e | 292 | retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, |
uwizeyimana | 3:6076b262dc5e | 293 | sizeof(rx_buffer), |
uwizeyimana | 3:6076b262dc5e | 294 | MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG); |
uwizeyimana | 3:6076b262dc5e | 295 | |
uwizeyimana | 3:6076b262dc5e | 296 | if (retcode < 0) { |
uwizeyimana | 3:6076b262dc5e | 297 | printf("receive() - Error code %d\n", retcode); |
uwizeyimana | 3:6076b262dc5e | 298 | return; |
uwizeyimana | 3:6076b262dc5e | 299 | } |
uwizeyimana | 3:6076b262dc5e | 300 | |
uwizeyimana | 3:6076b262dc5e | 301 | printf("Data received on port %d (length %d): ", MBED_CONF_LORA_APP_PORT, retcode); |
uwizeyimana | 3:6076b262dc5e | 302 | |
uwizeyimana | 3:6076b262dc5e | 303 | for (uint8_t i = 0; i < retcode; i++) { |
uwizeyimana | 3:6076b262dc5e | 304 | printf("%02x ", rx_buffer[i]); |
uwizeyimana | 3:6076b262dc5e | 305 | } |
uwizeyimana | 3:6076b262dc5e | 306 | printf("\n"); |
uwizeyimana | 3:6076b262dc5e | 307 | } |
uwizeyimana | 3:6076b262dc5e | 308 | |
uwizeyimana | 3:6076b262dc5e | 309 | // Event handler |
uwizeyimana | 3:6076b262dc5e | 310 | static void lora_event_handler(lorawan_event_t event) { |
uwizeyimana | 3:6076b262dc5e | 311 | switch (event) { |
uwizeyimana | 3:6076b262dc5e | 312 | case CONNECTED: |
uwizeyimana | 3:6076b262dc5e | 313 | printf("Connection - Successful\n"); |
uwizeyimana | 4:51ec2290a0fc | 314 | display("Connection - Successful\n"); |
uwizeyimana | 6:dee22a227ee4 | 315 | wait_ms(3000); |
uwizeyimana | 3:6076b262dc5e | 316 | welcomeMsg(); |
uwizeyimana | 3:6076b262dc5e | 317 | |
uwizeyimana | 3:6076b262dc5e | 318 | break; |
uwizeyimana | 3:6076b262dc5e | 319 | case DISCONNECTED: |
uwizeyimana | 3:6076b262dc5e | 320 | ev_queue.break_dispatch(); |
uwizeyimana | 4:51ec2290a0fc | 321 | printf("unable to connect\n"); |
uwizeyimana | 4:51ec2290a0fc | 322 | display("unable to connect\n"); |
uwizeyimana | 3:6076b262dc5e | 323 | break; |
uwizeyimana | 3:6076b262dc5e | 324 | case TX_DONE: |
uwizeyimana | 3:6076b262dc5e | 325 | printf("Message Sent to Network Server\n"); |
uwizeyimana | 3:6076b262dc5e | 326 | break; |
uwizeyimana | 3:6076b262dc5e | 327 | case TX_TIMEOUT: |
uwizeyimana | 3:6076b262dc5e | 328 | case TX_ERROR: |
uwizeyimana | 3:6076b262dc5e | 329 | case TX_CRYPTO_ERROR: |
uwizeyimana | 3:6076b262dc5e | 330 | case TX_SCHEDULING_ERROR: |
uwizeyimana | 3:6076b262dc5e | 331 | printf("Transmission Error - EventCode = %d\n", event); |
uwizeyimana | 3:6076b262dc5e | 332 | break; |
uwizeyimana | 3:6076b262dc5e | 333 | case RX_DONE: |
uwizeyimana | 3:6076b262dc5e | 334 | printf("Received message from Network Server\n"); |
uwizeyimana | 3:6076b262dc5e | 335 | receive_message(); |
uwizeyimana | 3:6076b262dc5e | 336 | break; |
uwizeyimana | 3:6076b262dc5e | 337 | case RX_TIMEOUT: |
uwizeyimana | 3:6076b262dc5e | 338 | case RX_ERROR: |
uwizeyimana | 3:6076b262dc5e | 339 | printf("Error in reception - Code = %d\n", event); |
uwizeyimana | 3:6076b262dc5e | 340 | break; |
uwizeyimana | 3:6076b262dc5e | 341 | case JOIN_FAILURE: |
uwizeyimana | 3:6076b262dc5e | 342 | printf("OTAA Failed - Check Keys\n"); |
uwizeyimana | 3:6076b262dc5e | 343 | break; |
uwizeyimana | 3:6076b262dc5e | 344 | default: |
uwizeyimana | 3:6076b262dc5e | 345 | MBED_ASSERT("Unknown Event"); |
uwizeyimana | 3:6076b262dc5e | 346 | } |
uwizeyimana | 3:6076b262dc5e | 347 | } |