Embedded System Project for Group 9 Wearable Infant Growth Monitoring

Dependencies:   SX1276 Sht31 C12832

Committer:
akramaliomar
Date:
Mon Jul 12 12:42:29 2021 +0000
Revision:
0:bcf3192451ab
Child:
3:e441033734d3
import libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akramaliomar 0:bcf3192451ab 1 #include "mbed.h"
akramaliomar 0:bcf3192451ab 2 #include "C12832.h"
akramaliomar 0:bcf3192451ab 3 #include "Sht31.h"
akramaliomar 0:bcf3192451ab 4 #include <string>
akramaliomar 0:bcf3192451ab 5 #include <time.h>
akramaliomar 0:bcf3192451ab 6 #include "mbed_trace.h"
akramaliomar 0:bcf3192451ab 7 #include "mbed_events.h"
akramaliomar 0:bcf3192451ab 8 #include "LoRaWANInterface.h"
akramaliomar 0:bcf3192451ab 9 #include "SX1276_LoRaRadio.h"
akramaliomar 0:bcf3192451ab 10
akramaliomar 0:bcf3192451ab 11
akramaliomar 0:bcf3192451ab 12 // Device credentials, register device as OTAA in The Things Network and copy credentials here
akramaliomar 0:bcf3192451ab 13 static uint8_t DEV_EUI[] = { 0x13, 0x15, 0x17, 0x19, 0x23, 0x25, 0x27, 0x29 };
akramaliomar 0:bcf3192451ab 14 static uint8_t APP_EUI[] = { 0x13, 0x15, 0x17, 0x19, 0x23, 0x25, 0x27, 0x29 };
akramaliomar 0:bcf3192451ab 15 static uint8_t APP_KEY[] = { 0x86, 0xD9, 0x65, 0x1C, 0x29, 0x05, 0x78, 0xCF, 0x7E, 0x44, 0x2E, 0x63, 0x13, 0xAB, 0x51, 0x93 };
akramaliomar 0:bcf3192451ab 16
akramaliomar 0:bcf3192451ab 17 // The port we're sending and receiving on
akramaliomar 0:bcf3192451ab 18 #define MBED_CONF_LORA_APP_PORT 15
akramaliomar 0:bcf3192451ab 19
akramaliomar 0:bcf3192451ab 20 // Peripherals (LoRa radio, temperature sensor and button)
akramaliomar 0:bcf3192451ab 21 SX1276_LoRaRadio radio(D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9, NC, NC, NC, NC, A4, NC, NC);
akramaliomar 0:bcf3192451ab 22 //Sht31 sht31(I2C_SDA, I2C_SCL);
akramaliomar 0:bcf3192451ab 23 DigitalOut led(LED1);
akramaliomar 0:bcf3192451ab 24 // EventQueue is required to dispatch events around
akramaliomar 0:bcf3192451ab 25 static EventQueue ev_queue;
akramaliomar 0:bcf3192451ab 26
akramaliomar 0:bcf3192451ab 27 // Constructing Mbed LoRaWANInterface and passing it down the radio object.
akramaliomar 0:bcf3192451ab 28 static LoRaWANInterface lorawan(radio);
akramaliomar 0:bcf3192451ab 29
akramaliomar 0:bcf3192451ab 30 // Application specific callbacks
akramaliomar 0:bcf3192451ab 31 static lorawan_app_callbacks_t callbacks;
akramaliomar 0:bcf3192451ab 32
akramaliomar 0:bcf3192451ab 33 // LoRaWAN stack event handler
akramaliomar 0:bcf3192451ab 34 static void lora_event_handler(lorawan_event_t event);
akramaliomar 0:bcf3192451ab 35
akramaliomar 0:bcf3192451ab 36
akramaliomar 0:bcf3192451ab 37 C12832 lcd(SPI_MOSI, SPI_SCK, SPI_MISO, p8, p11);
akramaliomar 0:bcf3192451ab 38 Sht31 sht31(I2C_SDA, I2C_SCL);
akramaliomar 0:bcf3192451ab 39 DigitalOut whiteLed(p10);
akramaliomar 0:bcf3192451ab 40 DigitalOut blueLed(p11);
akramaliomar 0:bcf3192451ab 41 DigitalOut redLed(p9);
akramaliomar 0:bcf3192451ab 42 InterruptIn directionBtn(p20);
akramaliomar 0:bcf3192451ab 43 InterruptIn modeSwith(p8);
akramaliomar 0:bcf3192451ab 44 Timeout t,t2;
akramaliomar 0:bcf3192451ab 45 EventQueue queue;
akramaliomar 0:bcf3192451ab 46 int scrollingState=0;
akramaliomar 0:bcf3192451ab 47 int currentTopic=0;
akramaliomar 0:bcf3192451ab 48 int currentIndex=0;
akramaliomar 0:bcf3192451ab 49 int scrolling=1;
akramaliomar 0:bcf3192451ab 50 bool direction = false;
akramaliomar 0:bcf3192451ab 51 Ticker ticker, ticker2, ticker3, ticker4;
akramaliomar 0:bcf3192451ab 52 int hold3=0;
akramaliomar 0:bcf3192451ab 53 int hold5=0;
akramaliomar 0:bcf3192451ab 54 int holdDuration=0;
akramaliomar 0:bcf3192451ab 55 time_t rawtime, rawtime1, rawreadtime1;
akramaliomar 0:bcf3192451ab 56 int starttime=0;
akramaliomar 0:bcf3192451ab 57 int duration=0;
akramaliomar 0:bcf3192451ab 58 int starreadttime=0;
akramaliomar 0:bcf3192451ab 59 char birth[25]="Sun May 02 00:00:00 2021";
akramaliomar 0:bcf3192451ab 60 int readingDuration=0;
akramaliomar 0:bcf3192451ab 61 string topic[5][5] = {
akramaliomar 0:bcf3192451ab 62 {
akramaliomar 0:bcf3192451ab 63 "1- Fulfill Increased Feeding Requirements",
akramaliomar 0:bcf3192451ab 64 "2- Identify And Take Care Of Sleeping Times",
akramaliomar 0:bcf3192451ab 65 "3- Attend To Your Baby When She Cries",
akramaliomar 0:bcf3192451ab 66 "4- Encourage Your Baby’s Development",
akramaliomar 0:bcf3192451ab 67 "5- Interact With Her"
akramaliomar 0:bcf3192451ab 68 },
akramaliomar 0:bcf3192451ab 69 {
akramaliomar 0:bcf3192451ab 70 "1- Burping your baby",
akramaliomar 0:bcf3192451ab 71 "2- Preventing bug bites",
akramaliomar 0:bcf3192451ab 72 "3- Practicing sun safety",
akramaliomar 0:bcf3192451ab 73 "4- Not giving honey",
akramaliomar 0:bcf3192451ab 74 "5- Bathing"
akramaliomar 0:bcf3192451ab 75 },
akramaliomar 0:bcf3192451ab 76 {
akramaliomar 0:bcf3192451ab 77 "1- A Day in the Life",
akramaliomar 0:bcf3192451ab 78 "2- Baby Care Basics",
akramaliomar 0:bcf3192451ab 79 "3- Feeding & Nutrition",
akramaliomar 0:bcf3192451ab 80 "4- Sleep",
akramaliomar 0:bcf3192451ab 81 "5- Health & Safety"
akramaliomar 0:bcf3192451ab 82 },
akramaliomar 0:bcf3192451ab 83 {
akramaliomar 0:bcf3192451ab 84 "1- Walking",
akramaliomar 0:bcf3192451ab 85 "2- Speech",
akramaliomar 0:bcf3192451ab 86 "3- Teething",
akramaliomar 0:bcf3192451ab 87 "4- Identification",
akramaliomar 0:bcf3192451ab 88 "5- Sleep"
akramaliomar 0:bcf3192451ab 89 }
akramaliomar 0:bcf3192451ab 90
akramaliomar 0:bcf3192451ab 91 };
akramaliomar 0:bcf3192451ab 92
akramaliomar 0:bcf3192451ab 93 string content[5][5] = {
akramaliomar 0:bcf3192451ab 94 {
akramaliomar 0:bcf3192451ab 95 "11- Try to identify their needs and feed them whenever you find them crying. If you have been breastfeeding and have been offering breast milk of only one breast, you may need to start offering both breasts to feed your infant",
akramaliomar 0:bcf3192451ab 96 "22- Watch sleeping patterns of your growing infant. Your baby can sleep anywhere between one to three hours during the day",
akramaliomar 0:bcf3192451ab 97 "33- whenever your baby crying, attend your baby and give her all you attention",
akramaliomar 0:bcf3192451ab 98 "44- You can tie wrist rattles on your baby’s wrists and let them gaze at the color and sound of the rattle",
akramaliomar 0:bcf3192451ab 99 "55- Watch her coo and throw her hands around on hearing a loud noise. Talk with your dear little one"
akramaliomar 0:bcf3192451ab 100 },
akramaliomar 0:bcf3192451ab 101 {
akramaliomar 0:bcf3192451ab 102 "11- As your baby is able to sit up more and hold their head up better, they may be able to tolerate feedings without burpings now",
akramaliomar 0:bcf3192451ab 103 "22- Most insect repellents are safe to use on your baby once they are 2 months old, but you should always exercise caution and do your best to protect your baby naturally",
akramaliomar 0:bcf3192451ab 104 "33- Babies under 6 months old cannot use sunscreen, so if you will be enjoying outdoor fun in the sun, you should keep your little one in the shade and use protective clothing, such as sun hats",
akramaliomar 0:bcf3192451ab 105 "44- Babies cannot have honey until they are over 1 year old.",
akramaliomar 0:bcf3192451ab 106 "55- ust like the past few months, you should aim to bathe your baby every two to three days. Your little one’s skin is still sensitive and too many baths may dry out their skin"
akramaliomar 0:bcf3192451ab 107 },
akramaliomar 0:bcf3192451ab 108 {
akramaliomar 0:bcf3192451ab 109 "11- Give your little one plenty of time to explore the world around them while sticking to nap and bedtime routines that will help you both get the rest you need",
akramaliomar 0:bcf3192451ab 110 "22- You’re likely still trying to adjust to life with a baby while trying to make time for adult things like hobbies and exercise—maybe even reading a book or going out to dinner every now then",
akramaliomar 0:bcf3192451ab 111 "33- You should continue to introduce new foods and textures to your baby. Keep in mind, there is no rush and your little one might just take their time adjusting",
akramaliomar 0:bcf3192451ab 112 "44- Your infant’s sleep might be disrupted for a month or so while they begin teething for the first time",
akramaliomar 0:bcf3192451ab 113 "55- If your baby’s first tooth didn’t begin to come in last month, get ready! Your child’s pediatrician will likely advise you to monitor your child’s teething symptoms, keep them comfortable and administer medication if needed for the pain, and begin oral hygiene"
akramaliomar 0:bcf3192451ab 114 },
akramaliomar 0:bcf3192451ab 115 {
akramaliomar 0:bcf3192451ab 116 "11- Your child is probably taking at least a few steps on her own. About half of 15-month-olds can walk well. A few are even running or starting to learn to walk backwards!",
akramaliomar 0:bcf3192451ab 117 "22- The babies of this age stat to say at least one word. Half can say at least two words. And some tots will have now ventured past \"dada\" and \"mama\" to form a growing vocabulary that includes words like \"dog,\" \"juice\" and— if you’re still breastfeeding \"boobies.\"",
akramaliomar 0:bcf3192451ab 118 "33- First molars may be starting to erupt. For some kids, cutting teeth can be painful and bothersome. For others, you just happen to notice one day a new pearly white poking through the gums—no biggie",
akramaliomar 0:bcf3192451ab 119 "44- Your child is starting to understand what everyday objects are used for—a broom is for sweeping and a wooden spoon is for stirring, for example",
akramaliomar 0:bcf3192451ab 120 "55- should get 11 to 14 hours of sleep total in a 24-hour day. Wondering when your kid’s going to become a one-nap-a-day tot? Her sleep schedule will usually start to shift from two naps on its own right about now"
akramaliomar 0:bcf3192451ab 121 }
akramaliomar 0:bcf3192451ab 122
akramaliomar 0:bcf3192451ab 123 };
akramaliomar 0:bcf3192451ab 124
akramaliomar 0:bcf3192451ab 125 int month[4][2] = {{0,3},{3,6}, {6,12},{12,24}};
akramaliomar 0:bcf3192451ab 126 int getAge(char birthDate[]){
akramaliomar 0:bcf3192451ab 127 struct tm tm;
akramaliomar 0:bcf3192451ab 128 time_t t;
akramaliomar 0:bcf3192451ab 129 time_t ct;
akramaliomar 0:bcf3192451ab 130 if (strptime(birthDate, "%A %b %d %H:%M:%S %Y", &tm) != NULL){
akramaliomar 0:bcf3192451ab 131 tm.tm_isdst = -1;
akramaliomar 0:bcf3192451ab 132 t = mktime(&tm);
akramaliomar 0:bcf3192451ab 133 time( &ct );
akramaliomar 0:bcf3192451ab 134 double td = difftime( ct, t );
akramaliomar 0:bcf3192451ab 135 int totalseconds = (long) td;
akramaliomar 0:bcf3192451ab 136 int agemonth = totalseconds /2592000;
akramaliomar 0:bcf3192451ab 137 return agemonth;
akramaliomar 0:bcf3192451ab 138 }else{
akramaliomar 0:bcf3192451ab 139 return 0;
akramaliomar 0:bcf3192451ab 140 }
akramaliomar 0:bcf3192451ab 141 }
akramaliomar 0:bcf3192451ab 142 int fetchMonth(){
akramaliomar 0:bcf3192451ab 143 int index;
akramaliomar 0:bcf3192451ab 144 int currentMonth = getAge(birth);
akramaliomar 0:bcf3192451ab 145 for(int i=0;i<4;i++){
akramaliomar 0:bcf3192451ab 146 if(currentMonth>month[i][0] && currentMonth<=month[i][1]){
akramaliomar 0:bcf3192451ab 147 index = i;
akramaliomar 0:bcf3192451ab 148 break;
akramaliomar 0:bcf3192451ab 149 }else{
akramaliomar 0:bcf3192451ab 150 index = 0;
akramaliomar 0:bcf3192451ab 151 }
akramaliomar 0:bcf3192451ab 152 }
akramaliomar 0:bcf3192451ab 153 return index;
akramaliomar 0:bcf3192451ab 154 }
akramaliomar 0:bcf3192451ab 155
akramaliomar 0:bcf3192451ab 156 static uint8_t* create_message(int topic, int dur) {
akramaliomar 0:bcf3192451ab 157 // initialize the buffer
akramaliomar 0:bcf3192451ab 158 uint8_t tx_buffer[50] = { 0 };
akramaliomar 0:bcf3192451ab 159
akramaliomar 0:bcf3192451ab 160 // DATA TO SEND (THE BELOW VALUES ARE THE ONES TO BE MODIFIED)
akramaliomar 0:bcf3192451ab 161 char device[] = "infant";
akramaliomar 0:bcf3192451ab 162 //int topic = 3; // topic identifier
akramaliomar 0:bcf3192451ab 163 // long int start = 1606037871; // start reading
akramaliomar 0:bcf3192451ab 164 // long int end = 1606038090; // end reading
akramaliomar 0:bcf3192451ab 165
akramaliomar 0:bcf3192451ab 166 // int durations = end - start;
akramaliomar 0:bcf3192451ab 167
akramaliomar 0:bcf3192451ab 168 // Writing string data into a buffer
akramaliomar 0:bcf3192451ab 169 sprintf((char*) tx_buffer, "{\"device\":\"%s\",\"topic\":%d,\"duration\":%d }", device, topic,dur);
akramaliomar 0:bcf3192451ab 170 return tx_buffer;
akramaliomar 0:bcf3192451ab 171 }
akramaliomar 0:bcf3192451ab 172
akramaliomar 0:bcf3192451ab 173
akramaliomar 0:bcf3192451ab 174 // Send a message over LoRaWAN
akramaliomar 0:bcf3192451ab 175 static void send_message(uint8_t *tx_buffer) {
akramaliomar 0:bcf3192451ab 176
akramaliomar 0:bcf3192451ab 177 int packet_len = strlen((char*) tx_buffer);
akramaliomar 0:bcf3192451ab 178
akramaliomar 0:bcf3192451ab 179 printf("Sending %d bytes: \"%s\"\n", packet_len, tx_buffer);
akramaliomar 0:bcf3192451ab 180
akramaliomar 0:bcf3192451ab 181
akramaliomar 0:bcf3192451ab 182 int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG);
akramaliomar 0:bcf3192451ab 183
akramaliomar 0:bcf3192451ab 184 // 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
akramaliomar 0:bcf3192451ab 185 if (retcode < 0) {
akramaliomar 0:bcf3192451ab 186 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - duty cycle violation\n")
akramaliomar 0:bcf3192451ab 187 : printf("send() - Error code %d\n", retcode);
akramaliomar 0:bcf3192451ab 188 return;
akramaliomar 0:bcf3192451ab 189 }
akramaliomar 0:bcf3192451ab 190
akramaliomar 0:bcf3192451ab 191 printf("%d bytes scheduled for transmission\n", retcode);
akramaliomar 0:bcf3192451ab 192 }
akramaliomar 0:bcf3192451ab 193
akramaliomar 0:bcf3192451ab 194 void display(string msg){
akramaliomar 0:bcf3192451ab 195 lcd.cls();
akramaliomar 0:bcf3192451ab 196 lcd.locate(0,0);
akramaliomar 0:bcf3192451ab 197 lcd.printf(msg.c_str());
akramaliomar 0:bcf3192451ab 198 }
akramaliomar 0:bcf3192451ab 199 void blinkWhiteLed(){
akramaliomar 0:bcf3192451ab 200 whiteLed=!whiteLed;
akramaliomar 0:bcf3192451ab 201 }
akramaliomar 0:bcf3192451ab 202 void checkReadingTime(){
akramaliomar 0:bcf3192451ab 203 time( &rawreadtime1 );
akramaliomar 0:bcf3192451ab 204 readingDuration = rawreadtime1 - starreadttime;
akramaliomar 0:bcf3192451ab 205 }
akramaliomar 0:bcf3192451ab 206 void showMode2(){
akramaliomar 0:bcf3192451ab 207 scrolling=0;
akramaliomar 0:bcf3192451ab 208 string x="";
akramaliomar 0:bcf3192451ab 209 if(scrollingState==0){
akramaliomar 0:bcf3192451ab 210 x = content[fetchMonth()][0]+"\n";
akramaliomar 0:bcf3192451ab 211 }else{
akramaliomar 0:bcf3192451ab 212 x = content[fetchMonth()][currentIndex]+"\n";
akramaliomar 0:bcf3192451ab 213 }
akramaliomar 0:bcf3192451ab 214 display(x);
akramaliomar 0:bcf3192451ab 215 time( &rawreadtime1 );
akramaliomar 0:bcf3192451ab 216 starreadttime = rawreadtime1;
akramaliomar 0:bcf3192451ab 217 ticker2.detach();
akramaliomar 0:bcf3192451ab 218 ticker3.attach(ev_queue.event(&checkReadingTime),0.01f);
akramaliomar 0:bcf3192451ab 219 }
akramaliomar 0:bcf3192451ab 220 void sendData(){
akramaliomar 0:bcf3192451ab 221 if(readingDuration>=5){
akramaliomar 0:bcf3192451ab 222 send_message(create_message((currentIndex+1),readingDuration));
akramaliomar 0:bcf3192451ab 223 printf("topic sent\n");
akramaliomar 0:bcf3192451ab 224 printf("topic ID: %d Duration: %d \n",(currentIndex+1),readingDuration );
akramaliomar 0:bcf3192451ab 225 }
akramaliomar 0:bcf3192451ab 226 }
akramaliomar 0:bcf3192451ab 227 void forwards(){
akramaliomar 0:bcf3192451ab 228 display(topic[fetchMonth()][currentTopic].c_str());
akramaliomar 0:bcf3192451ab 229 currentIndex = currentTopic;
akramaliomar 0:bcf3192451ab 230 currentTopic++;
akramaliomar 0:bcf3192451ab 231 if(currentTopic>4){
akramaliomar 0:bcf3192451ab 232 currentTopic=0;
akramaliomar 0:bcf3192451ab 233 }
akramaliomar 0:bcf3192451ab 234 }
akramaliomar 0:bcf3192451ab 235 void backwards(){
akramaliomar 0:bcf3192451ab 236 display(topic[fetchMonth()][currentTopic].c_str());
akramaliomar 0:bcf3192451ab 237 currentIndex = currentTopic;
akramaliomar 0:bcf3192451ab 238 currentTopic--;
akramaliomar 0:bcf3192451ab 239 if(currentTopic<0){
akramaliomar 0:bcf3192451ab 240 currentTopic=4;
akramaliomar 0:bcf3192451ab 241 }
akramaliomar 0:bcf3192451ab 242 }
akramaliomar 0:bcf3192451ab 243 void showTopic(){
akramaliomar 0:bcf3192451ab 244 ticker.attach(ev_queue.event(&blinkWhiteLed), 1.0f);
akramaliomar 0:bcf3192451ab 245 scrollingState=1;
akramaliomar 0:bcf3192451ab 246 ticker2.detach();
akramaliomar 0:bcf3192451ab 247 if(direction){
akramaliomar 0:bcf3192451ab 248 blueLed=1;
akramaliomar 0:bcf3192451ab 249 redLed=0;
akramaliomar 0:bcf3192451ab 250 int i=0;
akramaliomar 0:bcf3192451ab 251 currentTopic=5;
akramaliomar 0:bcf3192451ab 252 ticker2.attach(ev_queue.event(&backwards),2.0f);
akramaliomar 0:bcf3192451ab 253 }else{
akramaliomar 0:bcf3192451ab 254 blueLed=0;
akramaliomar 0:bcf3192451ab 255 redLed=1;
akramaliomar 0:bcf3192451ab 256 int i=5;
akramaliomar 0:bcf3192451ab 257 currentTopic=0;
akramaliomar 0:bcf3192451ab 258 ticker2.attach(ev_queue.event(&forwards),2.0f);
akramaliomar 0:bcf3192451ab 259 }
akramaliomar 0:bcf3192451ab 260 }
akramaliomar 0:bcf3192451ab 261
akramaliomar 0:bcf3192451ab 262 void showMode1(){
akramaliomar 0:bcf3192451ab 263 ticker3.detach();
akramaliomar 0:bcf3192451ab 264 sendData();
akramaliomar 0:bcf3192451ab 265 readingDuration=0;
akramaliomar 0:bcf3192451ab 266 lcd.cls();
akramaliomar 0:bcf3192451ab 267 lcd.locate(0, 0);
akramaliomar 0:bcf3192451ab 268 scrollingState=0;
akramaliomar 0:bcf3192451ab 269 float temp = sht31.readTemperature();
akramaliomar 0:bcf3192451ab 270 float humidity = sht31.readHumidity();
akramaliomar 0:bcf3192451ab 271 lcd.printf("Temperature: %.2f C", temp);
akramaliomar 0:bcf3192451ab 272 lcd.locate(3, 13);
akramaliomar 0:bcf3192451ab 273 lcd.printf("Humidity: %.2f %%", humidity);
akramaliomar 0:bcf3192451ab 274 scrolling=1;
akramaliomar 0:bcf3192451ab 275 t.attach(ev_queue.event(&showTopic),3.0f);
akramaliomar 0:bcf3192451ab 276 }
akramaliomar 0:bcf3192451ab 277
akramaliomar 0:bcf3192451ab 278 void startup(){
akramaliomar 0:bcf3192451ab 279 string msg = "Welcome to Infant Care \n";
akramaliomar 0:bcf3192451ab 280 struct tm *info;
akramaliomar 0:bcf3192451ab 281 time( &rawtime );
akramaliomar 0:bcf3192451ab 282 info = localtime( &rawtime );
akramaliomar 0:bcf3192451ab 283 display(msg);
akramaliomar 0:bcf3192451ab 284 lcd.printf("%s", asctime(info));
akramaliomar 0:bcf3192451ab 285 lcd.printf("Baby's age of %d months\n",getAge(birth));
akramaliomar 0:bcf3192451ab 286 t.attach(ev_queue.event(&showMode1),5.0f);
akramaliomar 0:bcf3192451ab 287 }
akramaliomar 0:bcf3192451ab 288 void shutDown(){
akramaliomar 0:bcf3192451ab 289 ticker2.detach();
akramaliomar 0:bcf3192451ab 290 ticker4.detach();
akramaliomar 0:bcf3192451ab 291 display("Reset to factory\n Wait for 10 seconds for fresh sturtup\n");
akramaliomar 0:bcf3192451ab 292 direction=true;
akramaliomar 0:bcf3192451ab 293 t2.attach(ev_queue.event(&startup),10.0f);
akramaliomar 0:bcf3192451ab 294 }
akramaliomar 0:bcf3192451ab 295 void checktime(){
akramaliomar 0:bcf3192451ab 296 time( &rawtime1 );
akramaliomar 0:bcf3192451ab 297 duration = rawtime1 - starttime;
akramaliomar 0:bcf3192451ab 298 if(duration>=5){
akramaliomar 0:bcf3192451ab 299 hold5=1;
akramaliomar 0:bcf3192451ab 300 printf("shut down\n");
akramaliomar 0:bcf3192451ab 301 t.detach();
akramaliomar 0:bcf3192451ab 302 ticker2.detach();
akramaliomar 0:bcf3192451ab 303 ticker4.detach();
akramaliomar 0:bcf3192451ab 304 shutDown();
akramaliomar 0:bcf3192451ab 305 }
akramaliomar 0:bcf3192451ab 306 else if(duration>=3 && duration<5 && hold3==0){
akramaliomar 0:bcf3192451ab 307 hold3=1;
akramaliomar 0:bcf3192451ab 308 direction=!direction;
akramaliomar 0:bcf3192451ab 309 scrolling=1;
akramaliomar 0:bcf3192451ab 310 showTopic();
akramaliomar 0:bcf3192451ab 311 }
akramaliomar 0:bcf3192451ab 312 }
akramaliomar 0:bcf3192451ab 313 void riseBtn(){
akramaliomar 0:bcf3192451ab 314 time( &rawtime1 );
akramaliomar 0:bcf3192451ab 315 starttime = rawtime1;
akramaliomar 0:bcf3192451ab 316 ticker4.attach(ev_queue.event(&checktime),0.01f);
akramaliomar 0:bcf3192451ab 317 }
akramaliomar 0:bcf3192451ab 318 void fallBtn(){
akramaliomar 0:bcf3192451ab 319 duration=0;
akramaliomar 0:bcf3192451ab 320 hold3=0;
akramaliomar 0:bcf3192451ab 321 ticker4.detach();
akramaliomar 0:bcf3192451ab 322 }
akramaliomar 0:bcf3192451ab 323
akramaliomar 0:bcf3192451ab 324 int main() {
akramaliomar 0:bcf3192451ab 325 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) {
akramaliomar 0:bcf3192451ab 326 printf("Set your LoRaWAN credentials first!\n");
akramaliomar 0:bcf3192451ab 327 return -1;
akramaliomar 0:bcf3192451ab 328 }
akramaliomar 0:bcf3192451ab 329
akramaliomar 0:bcf3192451ab 330 printf("Press BUTTON1 to send the current value of the temperature sensor!\n");
akramaliomar 0:bcf3192451ab 331
akramaliomar 0:bcf3192451ab 332 // Enable trace output for this demo, so we can see what the LoRaWAN stack does
akramaliomar 0:bcf3192451ab 333 mbed_trace_init();
akramaliomar 0:bcf3192451ab 334
akramaliomar 0:bcf3192451ab 335 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
akramaliomar 0:bcf3192451ab 336 printf("LoRa initialization failed!\n");
akramaliomar 0:bcf3192451ab 337 return -1;
akramaliomar 0:bcf3192451ab 338 }
akramaliomar 0:bcf3192451ab 339
akramaliomar 0:bcf3192451ab 340 // Fire a message when the button is pressed
akramaliomar 0:bcf3192451ab 341 // btn1.fall(ev_queue.event(&send_data_button_isr));
akramaliomar 0:bcf3192451ab 342 directionBtn.rise(ev_queue.event(&riseBtn));
akramaliomar 0:bcf3192451ab 343 directionBtn.fall(ev_queue.event(&fallBtn));
akramaliomar 0:bcf3192451ab 344 modeSwith.rise(ev_queue.event(&showMode2));
akramaliomar 0:bcf3192451ab 345 modeSwith.fall(ev_queue.event(&showMode1));
akramaliomar 0:bcf3192451ab 346
akramaliomar 0:bcf3192451ab 347 // prepare application callbacks
akramaliomar 0:bcf3192451ab 348 callbacks.events = mbed::callback(lora_event_handler);
akramaliomar 0:bcf3192451ab 349 lorawan.add_app_callbacks(&callbacks);
akramaliomar 0:bcf3192451ab 350
akramaliomar 0:bcf3192451ab 351 // Disable adaptive data rating
akramaliomar 0:bcf3192451ab 352 if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) {
akramaliomar 0:bcf3192451ab 353 printf("disable_adaptive_datarate failed!\n");
akramaliomar 0:bcf3192451ab 354 return -1;
akramaliomar 0:bcf3192451ab 355 }
akramaliomar 0:bcf3192451ab 356
akramaliomar 0:bcf3192451ab 357 lorawan.set_datarate(5); // SF7BW125
akramaliomar 0:bcf3192451ab 358
akramaliomar 0:bcf3192451ab 359 lorawan_connect_t connect_params;
akramaliomar 0:bcf3192451ab 360 connect_params.connect_type = LORAWAN_CONNECTION_OTAA;
akramaliomar 0:bcf3192451ab 361 connect_params.connection_u.otaa.dev_eui = DEV_EUI;
akramaliomar 0:bcf3192451ab 362 connect_params.connection_u.otaa.app_eui = APP_EUI;
akramaliomar 0:bcf3192451ab 363 connect_params.connection_u.otaa.app_key = APP_KEY;
akramaliomar 0:bcf3192451ab 364 connect_params.connection_u.otaa.nb_trials = 3;
akramaliomar 0:bcf3192451ab 365
akramaliomar 0:bcf3192451ab 366 lorawan_status_t retcode = lorawan.connect(connect_params);
akramaliomar 0:bcf3192451ab 367
akramaliomar 0:bcf3192451ab 368 if (retcode == LORAWAN_STATUS_OK ||
akramaliomar 0:bcf3192451ab 369 retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
akramaliomar 0:bcf3192451ab 370 } else {
akramaliomar 0:bcf3192451ab 371 printf("Connection error, code = %d\n", retcode);
akramaliomar 0:bcf3192451ab 372 return -1;
akramaliomar 0:bcf3192451ab 373 }
akramaliomar 0:bcf3192451ab 374
akramaliomar 0:bcf3192451ab 375 printf("Connection - In Progress ...\r\n");
akramaliomar 0:bcf3192451ab 376
akramaliomar 0:bcf3192451ab 377 // make your event queue dispatching events forever
akramaliomar 0:bcf3192451ab 378 ev_queue.dispatch_forever();
akramaliomar 0:bcf3192451ab 379
akramaliomar 0:bcf3192451ab 380
akramaliomar 0:bcf3192451ab 381
akramaliomar 0:bcf3192451ab 382 return 0;
akramaliomar 0:bcf3192451ab 383
akramaliomar 0:bcf3192451ab 384
akramaliomar 0:bcf3192451ab 385
akramaliomar 0:bcf3192451ab 386 }
akramaliomar 0:bcf3192451ab 387
akramaliomar 0:bcf3192451ab 388 // This is called from RX_DONE, so whenever a message came in
akramaliomar 0:bcf3192451ab 389 static void receive_message()
akramaliomar 0:bcf3192451ab 390 {
akramaliomar 0:bcf3192451ab 391 uint8_t rx_buffer[50] = { 0 };
akramaliomar 0:bcf3192451ab 392 int16_t retcode;
akramaliomar 0:bcf3192451ab 393 retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer,
akramaliomar 0:bcf3192451ab 394 sizeof(rx_buffer),
akramaliomar 0:bcf3192451ab 395 MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG);
akramaliomar 0:bcf3192451ab 396
akramaliomar 0:bcf3192451ab 397 if (retcode < 0) {
akramaliomar 0:bcf3192451ab 398 printf("receive() - Error code %d\n", retcode);
akramaliomar 0:bcf3192451ab 399 return;
akramaliomar 0:bcf3192451ab 400 }
akramaliomar 0:bcf3192451ab 401
akramaliomar 0:bcf3192451ab 402 printf("Data received on port %d (length %d): ", MBED_CONF_LORA_APP_PORT, retcode);
akramaliomar 0:bcf3192451ab 403
akramaliomar 0:bcf3192451ab 404 for (uint8_t i = 0; i < retcode; i++) {
akramaliomar 0:bcf3192451ab 405 printf("%02x ", rx_buffer[i]);
akramaliomar 0:bcf3192451ab 406 }
akramaliomar 0:bcf3192451ab 407 printf("\n");
akramaliomar 0:bcf3192451ab 408 }
akramaliomar 0:bcf3192451ab 409
akramaliomar 0:bcf3192451ab 410 // Event handler
akramaliomar 0:bcf3192451ab 411 static void lora_event_handler(lorawan_event_t event) {
akramaliomar 0:bcf3192451ab 412 switch (event) {
akramaliomar 0:bcf3192451ab 413 case CONNECTED:
akramaliomar 0:bcf3192451ab 414 printf("Connection - Successful\n");
akramaliomar 0:bcf3192451ab 415 startup();
akramaliomar 0:bcf3192451ab 416
akramaliomar 0:bcf3192451ab 417 break;
akramaliomar 0:bcf3192451ab 418 case DISCONNECTED:
akramaliomar 0:bcf3192451ab 419 ev_queue.break_dispatch();
akramaliomar 0:bcf3192451ab 420 printf("Disconnected Successfully\n");
akramaliomar 0:bcf3192451ab 421 break;
akramaliomar 0:bcf3192451ab 422 case TX_DONE:
akramaliomar 0:bcf3192451ab 423 printf("Message Sent to Network Server\n");
akramaliomar 0:bcf3192451ab 424 break;
akramaliomar 0:bcf3192451ab 425 case TX_TIMEOUT:
akramaliomar 0:bcf3192451ab 426 case TX_ERROR:
akramaliomar 0:bcf3192451ab 427 case TX_CRYPTO_ERROR:
akramaliomar 0:bcf3192451ab 428 case TX_SCHEDULING_ERROR:
akramaliomar 0:bcf3192451ab 429 printf("Transmission Error - EventCode = %d\n", event);
akramaliomar 0:bcf3192451ab 430 break;
akramaliomar 0:bcf3192451ab 431 case RX_DONE:
akramaliomar 0:bcf3192451ab 432 printf("Received message from Network Server\n");
akramaliomar 0:bcf3192451ab 433 receive_message();
akramaliomar 0:bcf3192451ab 434 break;
akramaliomar 0:bcf3192451ab 435 case RX_TIMEOUT:
akramaliomar 0:bcf3192451ab 436 case RX_ERROR:
akramaliomar 0:bcf3192451ab 437 printf("Error in reception - Code = %d\n", event);
akramaliomar 0:bcf3192451ab 438 break;
akramaliomar 0:bcf3192451ab 439 case JOIN_FAILURE:
akramaliomar 0:bcf3192451ab 440 printf("OTAA Failed - Check Keys\n");
akramaliomar 0:bcf3192451ab 441 break;
akramaliomar 0:bcf3192451ab 442 default:
akramaliomar 0:bcf3192451ab 443 MBED_ASSERT("Unknown Event");
akramaliomar 0:bcf3192451ab 444 }
akramaliomar 0:bcf3192451ab 445 }