STM32L476

Dependencies:   MbedJSONValue SDFileSystem WConstants mbed-dev DS1820 TinyGPSPlus epd1in54

Fork of A_SSL_Main by SilentSensors

Committer:
WaleedElmughrabi
Date:
Wed Nov 07 03:42:37 2018 +0000
Revision:
9:4ac09d77e2a0
Parent:
8:bc5a3b2ff424
Child:
10:a4526c9b8332
State Machine

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WaleedElmughrabi 9:4ac09d77e2a0 1 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 2 // Company: Silent Sensors Ltd
WaleedElmughrabi 9:4ac09d77e2a0 3 // Project: Silent Hub
WaleedElmughrabi 9:4ac09d77e2a0 4 // Author: Waleed Elmughrabi
WaleedElmughrabi 9:4ac09d77e2a0 5 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 6
bcostm 0:eafcd0445e97 7 #include "mbed.h"
WaleedElmughrabi 2:b14aac0ec647 8 #include "DS1820.h"
WaleedElmughrabi 2:b14aac0ec647 9 #include "epd1in54.h"
WaleedElmughrabi 2:b14aac0ec647 10 #include "stdio.h"
WaleedElmughrabi 4:06edbeb05013 11 #include "math.h"
WaleedElmughrabi 4:06edbeb05013 12 #include "TinyGPSPlus.h"
WaleedElmughrabi 6:d30c8e8678c9 13 #include "SDFileSystem.h"
WaleedElmughrabi 6:d30c8e8678c9 14 #include "errno.h"
WaleedElmughrabi 8:bc5a3b2ff424 15 #include "MbedJSONValue.h"
WaleedElmughrabi 8:bc5a3b2ff424 16 #include <string>
WaleedElmughrabi 4:06edbeb05013 17
WaleedElmughrabi 9:4ac09d77e2a0 18
WaleedElmughrabi 9:4ac09d77e2a0 19 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 20 // Definitions and initialization
WaleedElmughrabi 9:4ac09d77e2a0 21 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 22 #define TX5 PC_10
WaleedElmughrabi 9:4ac09d77e2a0 23 #define RX5 PC_11
WaleedElmughrabi 4:06edbeb05013 24 #define GPSBaud 9600
WaleedElmughrabi 9:4ac09d77e2a0 25 #define SerialBaud 115200
WaleedElmughrabi 6:d30c8e8678c9 26 #define SD_FILE_SYSTEM_H
WaleedElmughrabi 6:d30c8e8678c9 27 SDFileSystem* fs;
WaleedElmughrabi 6:d30c8e8678c9 28 FILE* fp;
WaleedElmughrabi 4:06edbeb05013 29 TinyGPSPlus tgps;
WaleedElmughrabi 4:06edbeb05013 30
WaleedElmughrabi 9:4ac09d77e2a0 31 Serial serial(USBTX, USBRX,112500); //Local terminal Baud rate
WaleedElmughrabi 9:4ac09d77e2a0 32 DS1820 ds1820(PB_2); //pin name connected to the DS1820 data pin
WaleedElmughrabi 9:4ac09d77e2a0 33 SDFileSystem sd(PB_5, PB_4, PB_3, PB_12, "sd"); //uSD SPI
WaleedElmughrabi 2:b14aac0ec647 34
WaleedElmughrabi 2:b14aac0ec647 35 //E-ink Display
WaleedElmughrabi 9:4ac09d77e2a0 36 PinName rst; PinName dc; PinName busy; PinName mosi; PinName miso; PinName sclk; PinName cs;
WaleedElmughrabi 2:b14aac0ec647 37 unsigned char frame_black[EPD_HEIGHT*EPD_WIDTH/8];
WaleedElmughrabi 9:4ac09d77e2a0 38 Epd epd = Epd(PB_5, PB_4, PB_3, PA_8, PC_4, PC_7, PB_10);
WaleedElmughrabi 9:4ac09d77e2a0 39 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 40 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 3:bc4495101c7b 41
WaleedElmughrabi 9:4ac09d77e2a0 42 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 43 // Polygon geofence
WaleedElmughrabi 9:4ac09d77e2a0 44 // the last vertix should be the same as the first vertix
WaleedElmughrabi 9:4ac09d77e2a0 45 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 46 int pnpoly(int nvert, double *vertx, double *verty, double testx, double testy)
WaleedElmughrabi 4:06edbeb05013 47 {
WaleedElmughrabi 4:06edbeb05013 48 int i, j, c = 0;
WaleedElmughrabi 4:06edbeb05013 49 for (i = 0, j = nvert-1; i < nvert; j = i++) {
WaleedElmughrabi 4:06edbeb05013 50 if ( ((verty[i]>testy) != (verty[j]>testy)) &&
WaleedElmughrabi 4:06edbeb05013 51 (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
WaleedElmughrabi 4:06edbeb05013 52 c = !c;
WaleedElmughrabi 4:06edbeb05013 53 }
WaleedElmughrabi 4:06edbeb05013 54 return c;
WaleedElmughrabi 4:06edbeb05013 55 }
WaleedElmughrabi 9:4ac09d77e2a0 56 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 57 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 4:06edbeb05013 58
WaleedElmughrabi 9:4ac09d77e2a0 59 double distanceBetween(double lat1, double long1, double lat2, double long2)
WaleedElmughrabi 4:06edbeb05013 60 {
WaleedElmughrabi 9:4ac09d77e2a0 61 // returns distance in meters between two positions, both specified
WaleedElmughrabi 9:4ac09d77e2a0 62 // as signed decimal-degrees latitude and longitude. Uses great-circle
WaleedElmughrabi 9:4ac09d77e2a0 63 // distance computation for hypothetical sphere of radius 6372795 meters.
WaleedElmughrabi 9:4ac09d77e2a0 64 // Because Earth is no exact sphere, rounding errors may be up to 0.5%.
WaleedElmughrabi 9:4ac09d77e2a0 65 // Courtesy of Maarten Lamers
WaleedElmughrabi 9:4ac09d77e2a0 66 double delta = radians(long1-long2);
WaleedElmughrabi 9:4ac09d77e2a0 67 double sdlong = sin(delta);
WaleedElmughrabi 9:4ac09d77e2a0 68 double cdlong = cos(delta);
WaleedElmughrabi 9:4ac09d77e2a0 69 lat1 = radians(lat1);
WaleedElmughrabi 9:4ac09d77e2a0 70 lat2 = radians(lat2);
WaleedElmughrabi 9:4ac09d77e2a0 71 double slat1 = sin(lat1);
WaleedElmughrabi 9:4ac09d77e2a0 72 double clat1 = cos(lat1);
WaleedElmughrabi 9:4ac09d77e2a0 73 double slat2 = sin(lat2);
WaleedElmughrabi 9:4ac09d77e2a0 74 double clat2 = cos(lat2);
WaleedElmughrabi 9:4ac09d77e2a0 75 delta = (clat1 * slat2) - (slat1 * clat2 * cdlong);
WaleedElmughrabi 9:4ac09d77e2a0 76 delta = sq(delta);
WaleedElmughrabi 9:4ac09d77e2a0 77 delta += sq(clat2 * sdlong);
WaleedElmughrabi 9:4ac09d77e2a0 78 delta = sqrt(delta);
WaleedElmughrabi 9:4ac09d77e2a0 79 double denom = (slat1 * slat2) + (clat1 * clat2 * cdlong);
WaleedElmughrabi 9:4ac09d77e2a0 80 delta = atan2(delta, denom);
WaleedElmughrabi 9:4ac09d77e2a0 81 return delta * 6372795;
WaleedElmughrabi 9:4ac09d77e2a0 82 }
WaleedElmughrabi 9:4ac09d77e2a0 83 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 84 // Circle geofonce
WaleedElmughrabi 9:4ac09d77e2a0 85 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 86 int inCircle(double xcentre, double ycentre, double xedge, double yedge, double testx, double testy)
WaleedElmughrabi 9:4ac09d77e2a0 87 {
WaleedElmughrabi 9:4ac09d77e2a0 88 double distance;
WaleedElmughrabi 4:06edbeb05013 89 int test;
WaleedElmughrabi 9:4ac09d77e2a0 90 double radius;
WaleedElmughrabi 9:4ac09d77e2a0 91
WaleedElmughrabi 9:4ac09d77e2a0 92 radius = distanceBetween(xcentre, ycentre, xedge, yedge);
WaleedElmughrabi 9:4ac09d77e2a0 93 distance = distanceBetween(xcentre, ycentre, testx, testy);
WaleedElmughrabi 9:4ac09d77e2a0 94
WaleedElmughrabi 4:06edbeb05013 95 if(distance < radius){
WaleedElmughrabi 4:06edbeb05013 96 test = 1;
WaleedElmughrabi 4:06edbeb05013 97 }
WaleedElmughrabi 4:06edbeb05013 98 else{
WaleedElmughrabi 4:06edbeb05013 99 test = 0;
WaleedElmughrabi 4:06edbeb05013 100 }
WaleedElmughrabi 4:06edbeb05013 101 return (test);
WaleedElmughrabi 4:06edbeb05013 102 }
WaleedElmughrabi 9:4ac09d77e2a0 103 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 104 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 4:06edbeb05013 105
WaleedElmughrabi 4:06edbeb05013 106
WaleedElmughrabi 9:4ac09d77e2a0 107 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 108 // Temperature sensor read
WaleedElmughrabi 9:4ac09d77e2a0 109 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 6:d30c8e8678c9 110 float getTemp()
WaleedElmughrabi 4:06edbeb05013 111 {
WaleedElmughrabi 6:d30c8e8678c9 112 float t;
WaleedElmughrabi 4:06edbeb05013 113 // getTemp(tRead);
WaleedElmughrabi 4:06edbeb05013 114 if(ds1820.begin()) {
WaleedElmughrabi 4:06edbeb05013 115 ds1820.startConversion();
WaleedElmughrabi 4:06edbeb05013 116 wait(1.0);
WaleedElmughrabi 4:06edbeb05013 117 t = ds1820.read(); // read temperature
WaleedElmughrabi 9:4ac09d77e2a0 118 serial.printf("temp = %3.2f\r\n", t); // Display temp on terminal
WaleedElmughrabi 9:4ac09d77e2a0 119 } else
WaleedElmughrabi 4:06edbeb05013 120 serial.printf("No DS1820 sensor found!\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 121 return t;
WaleedElmughrabi 9:4ac09d77e2a0 122 }
WaleedElmughrabi 9:4ac09d77e2a0 123 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 124 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 4:06edbeb05013 125
WaleedElmughrabi 9:4ac09d77e2a0 126 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 127 // Epd display
WaleedElmughrabi 9:4ac09d77e2a0 128 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 129 int Display(float t, int g)
WaleedElmughrabi 9:4ac09d77e2a0 130 {
WaleedElmughrabi 4:06edbeb05013 131
WaleedElmughrabi 9:4ac09d77e2a0 132 char cValt[32];
WaleedElmughrabi 9:4ac09d77e2a0 133 sprintf(cValt,"%.2f", t);
WaleedElmughrabi 4:06edbeb05013 134
WaleedElmughrabi 4:06edbeb05013 135 memset(frame_black, 0xFF, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8);
WaleedElmughrabi 4:06edbeb05013 136 if (epd.Init(lut_full_update) != 0) {
WaleedElmughrabi 4:06edbeb05013 137 return -1;
WaleedElmughrabi 4:06edbeb05013 138 }
WaleedElmughrabi 4:06edbeb05013 139 /*Write strings to the buffer */
WaleedElmughrabi 9:4ac09d77e2a0 140 epd.DrawStringAt(frame_black, 0, 10, "Temperature:", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 141 epd.DrawStringAt(frame_black, 60, 30, cValt, &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 142 epd.DrawStringAt(frame_black, 0, 70, "In Geofence?", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 143 if (g == 1){
WaleedElmughrabi 9:4ac09d77e2a0 144 epd.DrawStringAt(frame_black, 60, 90, "In G1", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 145 }
WaleedElmughrabi 9:4ac09d77e2a0 146 else {
WaleedElmughrabi 9:4ac09d77e2a0 147 epd.DrawStringAt(frame_black, 60, 90, "No", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 148 }
WaleedElmughrabi 4:06edbeb05013 149 /* Display the frame_buffer */
WaleedElmughrabi 4:06edbeb05013 150 epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height);
WaleedElmughrabi 4:06edbeb05013 151 epd.DisplayFrame();
WaleedElmughrabi 4:06edbeb05013 152 epd.Sleep();
WaleedElmughrabi 9:4ac09d77e2a0 153 return 1;
WaleedElmughrabi 9:4ac09d77e2a0 154 }
WaleedElmughrabi 9:4ac09d77e2a0 155
WaleedElmughrabi 9:4ac09d77e2a0 156 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 157 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 158
WaleedElmughrabi 9:4ac09d77e2a0 159 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 160 // SD card functions
WaleedElmughrabi 9:4ac09d77e2a0 161 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 162 int new_file(char* adr_file)//fonction to write on new file
WaleedElmughrabi 9:4ac09d77e2a0 163 {
WaleedElmughrabi 9:4ac09d77e2a0 164 FILE *fp = fopen(adr_file, "w");
WaleedElmughrabi 9:4ac09d77e2a0 165 if(fp == NULL) {
WaleedElmughrabi 9:4ac09d77e2a0 166 serial.printf("Unable to write the file\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 167 return -1;
WaleedElmughrabi 9:4ac09d77e2a0 168 } else {
WaleedElmughrabi 9:4ac09d77e2a0 169 fprintf(fp, "----New File----\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 170 fclose(fp);
WaleedElmughrabi 9:4ac09d77e2a0 171 serial.printf("File successfully written!\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 172 return 0; //success
WaleedElmughrabi 9:4ac09d77e2a0 173 }
WaleedElmughrabi 4:06edbeb05013 174 }
WaleedElmughrabi 4:06edbeb05013 175
WaleedElmughrabi 9:4ac09d77e2a0 176 int read_file(char* adr_file)//fct to read a file
WaleedElmughrabi 6:d30c8e8678c9 177 {
WaleedElmughrabi 9:4ac09d77e2a0 178 char c;
WaleedElmughrabi 9:4ac09d77e2a0 179 FILE *file;
WaleedElmughrabi 9:4ac09d77e2a0 180 serial.printf("\r\nRead: %s\r\n", adr_file);
WaleedElmughrabi 9:4ac09d77e2a0 181 file = fopen(adr_file, "r");
WaleedElmughrabi 9:4ac09d77e2a0 182 if (file) {
WaleedElmughrabi 9:4ac09d77e2a0 183 while (!feof(file)) {
WaleedElmughrabi 9:4ac09d77e2a0 184 c = getc(file);
WaleedElmughrabi 9:4ac09d77e2a0 185 serial.putc(c);
WaleedElmughrabi 6:d30c8e8678c9 186 }
WaleedElmughrabi 9:4ac09d77e2a0 187 fclose(file);
WaleedElmughrabi 9:4ac09d77e2a0 188 return 0; //success
WaleedElmughrabi 6:d30c8e8678c9 189 }
WaleedElmughrabi 9:4ac09d77e2a0 190 return -1;
WaleedElmughrabi 6:d30c8e8678c9 191 }
WaleedElmughrabi 6:d30c8e8678c9 192
WaleedElmughrabi 9:4ac09d77e2a0 193 int add_data(char* adr_flie, char* msg)//fct to update a file
WaleedElmughrabi 9:4ac09d77e2a0 194 {
WaleedElmughrabi 9:4ac09d77e2a0 195 FILE *fp = fopen(adr_flie, "a");
WaleedElmughrabi 9:4ac09d77e2a0 196 if(fp == NULL) {
WaleedElmughrabi 9:4ac09d77e2a0 197 serial.printf("Unable to update the file\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 198 return 0; //success
WaleedElmughrabi 9:4ac09d77e2a0 199 } else {
WaleedElmughrabi 9:4ac09d77e2a0 200 fprintf(fp, msg);
WaleedElmughrabi 9:4ac09d77e2a0 201 fclose(fp);
WaleedElmughrabi 9:4ac09d77e2a0 202 serial.printf("\r\nFile successfully update/written!\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 203 return -1;
WaleedElmughrabi 9:4ac09d77e2a0 204 }
WaleedElmughrabi 9:4ac09d77e2a0 205 }
WaleedElmughrabi 9:4ac09d77e2a0 206 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 207 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 208
WaleedElmughrabi 9:4ac09d77e2a0 209 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 210 // JSON serialize
WaleedElmughrabi 9:4ac09d77e2a0 211 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 212 //ToDo: pass arguments, currently some dummy values
WaleedElmughrabi 9:4ac09d77e2a0 213 string jsonSerializeDeviceToSystem(int deviceID, float xtest, float ytest, float liquidTemp, int tday, int tmonth, int tyear, int thour, int tmin, int tsec)
WaleedElmughrabi 8:bc5a3b2ff424 214 {
WaleedElmughrabi 8:bc5a3b2ff424 215 MbedJSONValue statusReport;
WaleedElmughrabi 8:bc5a3b2ff424 216 std::string s;
WaleedElmughrabi 9:4ac09d77e2a0 217 char SDtime[100];
WaleedElmughrabi 9:4ac09d77e2a0 218 sprintf(SDtime,"%d/%d/%d - %d:%d:%d\r\n", tday, tmonth, tyear, thour, tmin, tsec);
WaleedElmughrabi 9:4ac09d77e2a0 219
WaleedElmughrabi 8:bc5a3b2ff424 220 //fill the object
WaleedElmughrabi 9:4ac09d77e2a0 221 statusReport["timestamp"]= SDtime;
WaleedElmughrabi 9:4ac09d77e2a0 222 statusReport["device"] = deviceID;
WaleedElmughrabi 9:4ac09d77e2a0 223 statusReport["latitude"]= ytest;
WaleedElmughrabi 9:4ac09d77e2a0 224 statusReport["longitude"] = xtest;
WaleedElmughrabi 9:4ac09d77e2a0 225 statusReport["geoFenceEntery"] = 1;
WaleedElmughrabi 9:4ac09d77e2a0 226 statusReport["geoFenceleft"] = 1;
WaleedElmughrabi 9:4ac09d77e2a0 227 statusReport["container"] = liquidTemp;
WaleedElmughrabi 8:bc5a3b2ff424 228 statusReport["heater"] = 34.5;
WaleedElmughrabi 8:bc5a3b2ff424 229 statusReport["batteryVoltage"] = 4.98;
WaleedElmughrabi 9:4ac09d77e2a0 230 statusReport["network"] = "Tele2";
WaleedElmughrabi 8:bc5a3b2ff424 231 statusReport["signalStrength"] = -89;
WaleedElmughrabi 8:bc5a3b2ff424 232
WaleedElmughrabi 8:bc5a3b2ff424 233 //serialize it into a JSON string
WaleedElmughrabi 8:bc5a3b2ff424 234 s = statusReport.serialize();
WaleedElmughrabi 9:4ac09d77e2a0 235 //serial.printf("status: %s\r\n",s );
WaleedElmughrabi 9:4ac09d77e2a0 236
WaleedElmughrabi 8:bc5a3b2ff424 237 return s;
WaleedElmughrabi 8:bc5a3b2ff424 238 }
WaleedElmughrabi 9:4ac09d77e2a0 239 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 240 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 241
WaleedElmughrabi 9:4ac09d77e2a0 242
WaleedElmughrabi 9:4ac09d77e2a0 243 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 244 // JSON parse
WaleedElmughrabi 9:4ac09d77e2a0 245 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 246 double jsonParseSystemToDevice(const char * parameter, int msg_index)
WaleedElmughrabi 9:4ac09d77e2a0 247 {
WaleedElmughrabi 9:4ac09d77e2a0 248 MbedJSONValue journey;
WaleedElmughrabi 9:4ac09d77e2a0 249 const char * system_message = "{\"config\":[5.0,1.0,1.0,240.0],\"route1\":[1.0,0.0,1.0,1.0,1.0,1.0,54.5983852,-1.5708491,54.5969549,-1.5663735],\"route2\":[2.0,0.0,1.0,1.0,1.0,1.0,54.6542957,-1.4459836,54.6495902,-1.4430425],\"route3\":[3.0,0.0,1.0,1.0,1.0,1.0,54.7051416,-1.5638412,54.7101814,-1.5615844],\"route4\":[4.0,0.0,1.0,1.0,1.0,1.0,54.6298560,-1.3059736,54.6267899,-1.3075833],\"route5\":[5.0,0.0,1.0,1.0,1.0,2.0,5.0,54.6710093,-1.4587418,54.6730758,-1.4461951,54.6672642,-1.4436423,54.6678548,-1.4562232,54.6710093,-1.4587418]}";
WaleedElmughrabi 9:4ac09d77e2a0 250
WaleedElmughrabi 9:4ac09d77e2a0 251 parse(journey, system_message);
WaleedElmughrabi 9:4ac09d77e2a0 252 double msg; msg = journey[parameter][msg_index].get<double>(); return msg;
WaleedElmughrabi 9:4ac09d77e2a0 253 }
WaleedElmughrabi 9:4ac09d77e2a0 254 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 255 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 8:bc5a3b2ff424 256
WaleedElmughrabi 4:06edbeb05013 257 int main()
WaleedElmughrabi 4:06edbeb05013 258 {
WaleedElmughrabi 9:4ac09d77e2a0 259 Serial GPSSerial(TX5, RX5);
WaleedElmughrabi 4:06edbeb05013 260 GPSSerial.baud(GPSBaud);
WaleedElmughrabi 4:06edbeb05013 261 wait(0.001);
WaleedElmughrabi 9:4ac09d77e2a0 262 DigitalOut SD_EN(PB_12); //SD SPI enable (active low)
WaleedElmughrabi 9:4ac09d77e2a0 263 DigitalOut Epd_EN(PA_8); //Epd SPI enable (active low)
WaleedElmughrabi 9:4ac09d77e2a0 264
WaleedElmughrabi 9:4ac09d77e2a0 265 Epd_EN = 1; //Disable Epd SPI to only enable uSD
WaleedElmughrabi 9:4ac09d77e2a0 266 new_file("/sd/coordinate.txt"); //create new "empty" juste wrote "New file"
WaleedElmughrabi 9:4ac09d77e2a0 267 Epd_EN = 0; //Enable Epd
WaleedElmughrabi 9:4ac09d77e2a0 268
WaleedElmughrabi 9:4ac09d77e2a0 269 //Variables
WaleedElmughrabi 9:4ac09d77e2a0 270 int deviceID = 1;
WaleedElmughrabi 9:4ac09d77e2a0 271 double xtest,ytest;
WaleedElmughrabi 9:4ac09d77e2a0 272 int tyear,tmonth,tday,thour,tmin,tsec;
WaleedElmughrabi 4:06edbeb05013 273
WaleedElmughrabi 4:06edbeb05013 274
WaleedElmughrabi 4:06edbeb05013 275
WaleedElmughrabi 6:d30c8e8678c9 276 float liquidTemp = 0;
WaleedElmughrabi 9:4ac09d77e2a0 277 char chr_s[600];
WaleedElmughrabi 9:4ac09d77e2a0 278 std::string s;
WaleedElmughrabi 6:d30c8e8678c9 279 wait(2);
WaleedElmughrabi 6:d30c8e8678c9 280
WaleedElmughrabi 9:4ac09d77e2a0 281
WaleedElmughrabi 4:06edbeb05013 282 while(1) {
WaleedElmughrabi 6:d30c8e8678c9 283 //wait (1);
WaleedElmughrabi 9:4ac09d77e2a0 284
WaleedElmughrabi 9:4ac09d77e2a0 285 if(tgps.encode(GPSSerial.getc()))
WaleedElmughrabi 4:06edbeb05013 286 {
WaleedElmughrabi 9:4ac09d77e2a0 287 xtest = tgps.location.lat(); ytest = tgps.location.lng(); //Location
WaleedElmughrabi 9:4ac09d77e2a0 288 tyear = tgps.date.year(); tmonth = tgps.date.month(); tday = tgps.date.day(); //Date
WaleedElmughrabi 9:4ac09d77e2a0 289 thour = tgps.time.hour(); tmin = tgps.time.minute(); tsec = tgps.time.second(); //Time
WaleedElmughrabi 9:4ac09d77e2a0 290
WaleedElmughrabi 9:4ac09d77e2a0 291 //this part is just for local terminal monitoring
WaleedElmughrabi 9:4ac09d77e2a0 292 serial.printf("\r\nLocation: %3.6f, %3.6f, Date: %d-%d-%d, Time: %d:%d:%d \r\n", xtest, ytest, tday, tmonth, tyear, thour, tmin, tsec);
WaleedElmughrabi 9:4ac09d77e2a0 293
WaleedElmughrabi 6:d30c8e8678c9 294 wait(5); //little delay to prevent double writing
WaleedElmughrabi 6:d30c8e8678c9 295 liquidTemp = getTemp();
WaleedElmughrabi 9:4ac09d77e2a0 296
WaleedElmughrabi 9:4ac09d77e2a0 297 //geofence testing
WaleedElmughrabi 9:4ac09d77e2a0 298 const char * parameter;
WaleedElmughrabi 9:4ac09d77e2a0 299 int msg_index;
WaleedElmughrabi 9:4ac09d77e2a0 300 double geofencesNum;
WaleedElmughrabi 9:4ac09d77e2a0 301 parameter = "config";
WaleedElmughrabi 9:4ac09d77e2a0 302 msg_index = 0;
WaleedElmughrabi 9:4ac09d77e2a0 303 geofencesNum = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 304 serial.printf("\r\nNumber of geofences: %2.0f", geofencesNum);
WaleedElmughrabi 9:4ac09d77e2a0 305
WaleedElmughrabi 9:4ac09d77e2a0 306 int geotest = 0;
WaleedElmughrabi 9:4ac09d77e2a0 307 int count=1;
WaleedElmughrabi 9:4ac09d77e2a0 308 int count2;
WaleedElmughrabi 9:4ac09d77e2a0 309 double geo_lat_c; double geo_long_c; double geo_lat_e; double geo_long_e;
WaleedElmughrabi 9:4ac09d77e2a0 310 while ((count <= geofencesNum)&&(geotest == 0))
WaleedElmughrabi 9:4ac09d77e2a0 311 {
WaleedElmughrabi 9:4ac09d77e2a0 312 char geo_extract[6];
WaleedElmughrabi 9:4ac09d77e2a0 313 sprintf(geo_extract,"route%d",count);
WaleedElmughrabi 9:4ac09d77e2a0 314 parameter = geo_extract;
WaleedElmughrabi 9:4ac09d77e2a0 315 msg_index = 5;
WaleedElmughrabi 9:4ac09d77e2a0 316
WaleedElmughrabi 9:4ac09d77e2a0 317 if (jsonParseSystemToDevice(geo_extract,msg_index) == 1) //circular geofence
WaleedElmughrabi 9:4ac09d77e2a0 318 {
WaleedElmughrabi 9:4ac09d77e2a0 319 msg_index = 6; geo_lat_c = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 320 serial.printf("\r\n%4.8f", geo_lat_c);
WaleedElmughrabi 9:4ac09d77e2a0 321 msg_index = 7; geo_long_c = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 322 serial.printf("\r\n%4.8f", geo_long_c);
WaleedElmughrabi 9:4ac09d77e2a0 323 msg_index = 8; geo_lat_e = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 324 serial.printf("\r\n%4.8f", geo_lat_e);
WaleedElmughrabi 9:4ac09d77e2a0 325 msg_index = 9; geo_long_e = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 326 serial.printf("\r\n%4.8f", geo_long_e);
WaleedElmughrabi 9:4ac09d77e2a0 327
WaleedElmughrabi 9:4ac09d77e2a0 328 geotest = inCircle(geo_lat_c, geo_long_c, geo_lat_e, geo_long_e, xtest, ytest);
WaleedElmughrabi 9:4ac09d77e2a0 329 Display(liquidTemp, geotest);
WaleedElmughrabi 9:4ac09d77e2a0 330 serial.printf("\r\nGeofence number = %d: \r\nIn geofence = %d:\r\n", count, geotest);
WaleedElmughrabi 9:4ac09d77e2a0 331 }
WaleedElmughrabi 9:4ac09d77e2a0 332
WaleedElmughrabi 9:4ac09d77e2a0 333 if (jsonParseSystemToDevice(geo_extract,msg_index) == 2) //polygon geofence
WaleedElmughrabi 9:4ac09d77e2a0 334 {
WaleedElmughrabi 9:4ac09d77e2a0 335 msg_index = 6; //The start of coordinates in the message
WaleedElmughrabi 9:4ac09d77e2a0 336 int vertices = jsonParseSystemToDevice(geo_extract,msg_index); //number of polygon vertices
WaleedElmughrabi 9:4ac09d77e2a0 337 double geo_lat[vertices];
WaleedElmughrabi 9:4ac09d77e2a0 338 double geo_long[vertices];
WaleedElmughrabi 9:4ac09d77e2a0 339 msg_index = 7;
WaleedElmughrabi 9:4ac09d77e2a0 340 for (count2=0; count2 < vertices; count2++ )
WaleedElmughrabi 9:4ac09d77e2a0 341 {
WaleedElmughrabi 9:4ac09d77e2a0 342 geo_lat[count2] = jsonParseSystemToDevice(geo_extract,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 343 geo_long[count2] = jsonParseSystemToDevice(geo_extract,msg_index+1);
WaleedElmughrabi 9:4ac09d77e2a0 344 msg_index = msg_index + 2;
WaleedElmughrabi 9:4ac09d77e2a0 345 serial.printf("\r\ncount2: %d",count2);
WaleedElmughrabi 9:4ac09d77e2a0 346 serial.printf("\r\n vertices lat: %4.8f vertices long: %4.8f\r\n",geo_lat[count2],geo_long[count2]);
WaleedElmughrabi 9:4ac09d77e2a0 347 }
WaleedElmughrabi 9:4ac09d77e2a0 348
WaleedElmughrabi 9:4ac09d77e2a0 349
WaleedElmughrabi 9:4ac09d77e2a0 350 wait (1);
WaleedElmughrabi 9:4ac09d77e2a0 351
WaleedElmughrabi 9:4ac09d77e2a0 352 geotest = pnpoly(vertices, geo_long, geo_lat, ytest, xtest);
WaleedElmughrabi 9:4ac09d77e2a0 353 Display(liquidTemp, geotest);
WaleedElmughrabi 9:4ac09d77e2a0 354 serial.printf("\r\nGeofence number = %d: \r\nIn geofence = %d:\r\n", count, geotest);
WaleedElmughrabi 9:4ac09d77e2a0 355 }
WaleedElmughrabi 9:4ac09d77e2a0 356 count++;
WaleedElmughrabi 9:4ac09d77e2a0 357 }
WaleedElmughrabi 9:4ac09d77e2a0 358
WaleedElmughrabi 9:4ac09d77e2a0 359 //msg to be saved on SD and published
WaleedElmughrabi 9:4ac09d77e2a0 360 s = jsonSerializeDeviceToSystem(deviceID, xtest, ytest, liquidTemp, tday, tmonth, tyear, thour, tmin, tsec);
WaleedElmughrabi 9:4ac09d77e2a0 361 sprintf(chr_s,s.c_str());
WaleedElmughrabi 9:4ac09d77e2a0 362
WaleedElmughrabi 9:4ac09d77e2a0 363
WaleedElmughrabi 9:4ac09d77e2a0 364 /*
WaleedElmughrabi 9:4ac09d77e2a0 365 Epd_EN = 1;
WaleedElmughrabi 9:4ac09d77e2a0 366 read_file("/sd/coordinate.txt");
WaleedElmughrabi 9:4ac09d77e2a0 367 add_data("/sd/coordinate.txt",chr_s);
WaleedElmughrabi 9:4ac09d77e2a0 368 Epd_EN = 0;
WaleedElmughrabi 8:bc5a3b2ff424 369 */
WaleedElmughrabi 9:4ac09d77e2a0 370
WaleedElmughrabi 4:06edbeb05013 371 }
WaleedElmughrabi 4:06edbeb05013 372
WaleedElmughrabi 4:06edbeb05013 373 if (millis() > 5000 && tgps.charsProcessed() < 10)
WaleedElmughrabi 4:06edbeb05013 374 {
WaleedElmughrabi 4:06edbeb05013 375 serial.printf("No GPS detected: check wiring.\r\n");
WaleedElmughrabi 4:06edbeb05013 376 // while(true);
WaleedElmughrabi 4:06edbeb05013 377 break;
WaleedElmughrabi 4:06edbeb05013 378 }
WaleedElmughrabi 9:4ac09d77e2a0 379
WaleedElmughrabi 6:d30c8e8678c9 380
WaleedElmughrabi 4:06edbeb05013 381 }
WaleedElmughrabi 4:06edbeb05013 382 }
WaleedElmughrabi 4:06edbeb05013 383
WaleedElmughrabi 4:06edbeb05013 384
WaleedElmughrabi 4:06edbeb05013 385
WaleedElmughrabi 9:4ac09d77e2a0 386