STM32L476

Dependencies:   MbedJSONValue SDFileSystem WConstants mbed-dev DS1820 TinyGPSPlus epd1in54

Fork of A_SSL_Main by SilentSensors

Committer:
WaleedElmughrabi
Date:
Tue Dec 04 17:02:51 2018 +0000
Revision:
13:0477a745dad2
Parent:
11:9b49bd5a5f8c
Child:
15:fad0681e6fee
Minor changes

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 11:9b49bd5a5f8c 22 #define TX5 PC_12
WaleedElmughrabi 11:9b49bd5a5f8c 23 #define RX5 PD_2
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 11:9b49bd5a5f8c 30 Serial serial(USBTX, USBRX,115200); //Local terminal Baud rate
WaleedElmughrabi 13:0477a745dad2 31 //SDFileSystem sd(PB_5, PB_4, PB_3, PB_12, "sd"); //uSD SPI
WaleedElmughrabi 4:06edbeb05013 32
WaleedElmughrabi 11:9b49bd5a5f8c 33 //Temp sensors
WaleedElmughrabi 11:9b49bd5a5f8c 34 #define MAX_PROBES 16
WaleedElmughrabi 11:9b49bd5a5f8c 35 #define DATA_PIN PB_2
WaleedElmughrabi 11:9b49bd5a5f8c 36 DS1820* probe[MAX_PROBES];
WaleedElmughrabi 11:9b49bd5a5f8c 37
WaleedElmughrabi 2:b14aac0ec647 38 //E-ink Display
WaleedElmughrabi 9:4ac09d77e2a0 39 PinName rst; PinName dc; PinName busy; PinName mosi; PinName miso; PinName sclk; PinName cs;
WaleedElmughrabi 2:b14aac0ec647 40 unsigned char frame_black[EPD_HEIGHT*EPD_WIDTH/8];
WaleedElmughrabi 9:4ac09d77e2a0 41 Epd epd = Epd(PB_5, PB_4, PB_3, PA_8, PC_4, PC_7, PB_10);
WaleedElmughrabi 10:a4526c9b8332 42
WaleedElmughrabi 10:a4526c9b8332 43 const char * system_message; //Journey configuration to be received from server
WaleedElmughrabi 10:a4526c9b8332 44 int deviceID = 1;
WaleedElmughrabi 10:a4526c9b8332 45 double longTest,latTest;
WaleedElmughrabi 10:a4526c9b8332 46 int tyear,tmonth,tday,thour,tmin,tsec;
WaleedElmughrabi 11:9b49bd5a5f8c 47 double liquidTemp = 0;
WaleedElmughrabi 11:9b49bd5a5f8c 48 double ambientTemp = 0;
WaleedElmughrabi 10:a4526c9b8332 49 char cValt[32];
WaleedElmughrabi 10:a4526c9b8332 50 char chr_s[600];
WaleedElmughrabi 10:a4526c9b8332 51 std::string s;
WaleedElmughrabi 10:a4526c9b8332 52 const char * parameter;
WaleedElmughrabi 11:9b49bd5a5f8c 53 char * readLastGeo;
WaleedElmughrabi 10:a4526c9b8332 54 int msg_index;
WaleedElmughrabi 10:a4526c9b8332 55 double geofencesNum;
WaleedElmughrabi 10:a4526c9b8332 56 int geotest;
WaleedElmughrabi 11:9b49bd5a5f8c 57 char geo_extract[6];
WaleedElmughrabi 11:9b49bd5a5f8c 58
WaleedElmughrabi 11:9b49bd5a5f8c 59 DigitalOut en1(PC_5);
WaleedElmughrabi 11:9b49bd5a5f8c 60 DigitalOut en2(PC_6);
WaleedElmughrabi 11:9b49bd5a5f8c 61 DigitalOut en3(PC_8);
WaleedElmughrabi 11:9b49bd5a5f8c 62 DigitalOut en4(PC_9);
WaleedElmughrabi 11:9b49bd5a5f8c 63
WaleedElmughrabi 9:4ac09d77e2a0 64 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 65 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 3:bc4495101c7b 66
WaleedElmughrabi 9:4ac09d77e2a0 67 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 68 // Polygon geofence
WaleedElmughrabi 9:4ac09d77e2a0 69 // the last vertix should be the same as the first vertix
WaleedElmughrabi 9:4ac09d77e2a0 70 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 10:a4526c9b8332 71 int pnpoly(int nvert, double *vertLong, double *vertLat, double testLong, double testLat)
WaleedElmughrabi 4:06edbeb05013 72 {
WaleedElmughrabi 10:a4526c9b8332 73 //Returns 1 if test point is inside polygon, zero otherwise
WaleedElmughrabi 10:a4526c9b8332 74 //last vertix should be the same as the first
WaleedElmughrabi 4:06edbeb05013 75 int i, j, c = 0;
WaleedElmughrabi 4:06edbeb05013 76 for (i = 0, j = nvert-1; i < nvert; j = i++) {
WaleedElmughrabi 10:a4526c9b8332 77 if ( ((vertLat[i]>testLat) != (vertLat[j]>testLat)) &&
WaleedElmughrabi 10:a4526c9b8332 78 (testLong < (vertLong[j]-vertLong[i]) * (testLat-vertLat[i]) / (vertLat[j]-vertLat[i]) + vertLong[i]) )
WaleedElmughrabi 4:06edbeb05013 79 c = !c;
WaleedElmughrabi 4:06edbeb05013 80 }
WaleedElmughrabi 4:06edbeb05013 81 return c;
WaleedElmughrabi 4:06edbeb05013 82 }
WaleedElmughrabi 9:4ac09d77e2a0 83 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 84 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 85 double distanceBetween(double lat1, double long1, double lat2, double long2)
WaleedElmughrabi 4:06edbeb05013 86 {
WaleedElmughrabi 9:4ac09d77e2a0 87 // returns distance in meters between two positions, both specified
WaleedElmughrabi 9:4ac09d77e2a0 88 // as signed decimal-degrees latitude and longitude. Uses great-circle
WaleedElmughrabi 9:4ac09d77e2a0 89 // distance computation for hypothetical sphere of radius 6372795 meters.
WaleedElmughrabi 9:4ac09d77e2a0 90 // Because Earth is no exact sphere, rounding errors may be up to 0.5%.
WaleedElmughrabi 9:4ac09d77e2a0 91 // Courtesy of Maarten Lamers
WaleedElmughrabi 9:4ac09d77e2a0 92 double delta = radians(long1-long2);
WaleedElmughrabi 9:4ac09d77e2a0 93 double sdlong = sin(delta);
WaleedElmughrabi 9:4ac09d77e2a0 94 double cdlong = cos(delta);
WaleedElmughrabi 9:4ac09d77e2a0 95 lat1 = radians(lat1);
WaleedElmughrabi 9:4ac09d77e2a0 96 lat2 = radians(lat2);
WaleedElmughrabi 9:4ac09d77e2a0 97 double slat1 = sin(lat1);
WaleedElmughrabi 9:4ac09d77e2a0 98 double clat1 = cos(lat1);
WaleedElmughrabi 9:4ac09d77e2a0 99 double slat2 = sin(lat2);
WaleedElmughrabi 9:4ac09d77e2a0 100 double clat2 = cos(lat2);
WaleedElmughrabi 9:4ac09d77e2a0 101 delta = (clat1 * slat2) - (slat1 * clat2 * cdlong);
WaleedElmughrabi 9:4ac09d77e2a0 102 delta = sq(delta);
WaleedElmughrabi 9:4ac09d77e2a0 103 delta += sq(clat2 * sdlong);
WaleedElmughrabi 9:4ac09d77e2a0 104 delta = sqrt(delta);
WaleedElmughrabi 9:4ac09d77e2a0 105 double denom = (slat1 * slat2) + (clat1 * clat2 * cdlong);
WaleedElmughrabi 9:4ac09d77e2a0 106 delta = atan2(delta, denom);
WaleedElmughrabi 9:4ac09d77e2a0 107 return delta * 6372795;
WaleedElmughrabi 9:4ac09d77e2a0 108 }
WaleedElmughrabi 9:4ac09d77e2a0 109 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 110 // Circle geofonce
WaleedElmughrabi 9:4ac09d77e2a0 111 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 112 int inCircle(double xcentre, double ycentre, double xedge, double yedge, double testx, double testy)
WaleedElmughrabi 9:4ac09d77e2a0 113 {
WaleedElmughrabi 10:a4526c9b8332 114 //Returns 1 if test point is inside circle, zero otherwise
WaleedElmughrabi 10:a4526c9b8332 115 //The circle is defined by centre and a point on the circumference
WaleedElmughrabi 9:4ac09d77e2a0 116 double distance;
WaleedElmughrabi 4:06edbeb05013 117 int test;
WaleedElmughrabi 9:4ac09d77e2a0 118 double radius;
WaleedElmughrabi 9:4ac09d77e2a0 119
WaleedElmughrabi 9:4ac09d77e2a0 120 radius = distanceBetween(xcentre, ycentre, xedge, yedge);
WaleedElmughrabi 9:4ac09d77e2a0 121 distance = distanceBetween(xcentre, ycentre, testx, testy);
WaleedElmughrabi 9:4ac09d77e2a0 122
WaleedElmughrabi 4:06edbeb05013 123 if(distance < radius){
WaleedElmughrabi 4:06edbeb05013 124 test = 1;
WaleedElmughrabi 4:06edbeb05013 125 }
WaleedElmughrabi 4:06edbeb05013 126 else{
WaleedElmughrabi 4:06edbeb05013 127 test = 0;
WaleedElmughrabi 4:06edbeb05013 128 }
WaleedElmughrabi 4:06edbeb05013 129 return (test);
WaleedElmughrabi 4:06edbeb05013 130 }
WaleedElmughrabi 9:4ac09d77e2a0 131 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 132 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 4:06edbeb05013 133
WaleedElmughrabi 4:06edbeb05013 134
WaleedElmughrabi 9:4ac09d77e2a0 135 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 136 // Temperature sensor read
WaleedElmughrabi 9:4ac09d77e2a0 137 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 11:9b49bd5a5f8c 138 double getTemp(int device) {
WaleedElmughrabi 11:9b49bd5a5f8c 139 // Initialize the probe array to DS1820 objects
WaleedElmughrabi 11:9b49bd5a5f8c 140 int num_devices = 0;
WaleedElmughrabi 11:9b49bd5a5f8c 141 double temp;
WaleedElmughrabi 11:9b49bd5a5f8c 142 while(DS1820::unassignedProbe(DATA_PIN)) {
WaleedElmughrabi 11:9b49bd5a5f8c 143 probe[num_devices] = new DS1820(DATA_PIN);
WaleedElmughrabi 11:9b49bd5a5f8c 144 num_devices++;
WaleedElmughrabi 11:9b49bd5a5f8c 145 if (num_devices == MAX_PROBES)
WaleedElmughrabi 11:9b49bd5a5f8c 146 break;
WaleedElmughrabi 11:9b49bd5a5f8c 147 }
WaleedElmughrabi 11:9b49bd5a5f8c 148 probe[0]->convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready
WaleedElmughrabi 11:9b49bd5a5f8c 149 temp = probe[device]->temperature();
WaleedElmughrabi 11:9b49bd5a5f8c 150 wait(0.01);
WaleedElmughrabi 11:9b49bd5a5f8c 151 return temp;
WaleedElmughrabi 9:4ac09d77e2a0 152 }
WaleedElmughrabi 9:4ac09d77e2a0 153 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 154 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 4:06edbeb05013 155
WaleedElmughrabi 9:4ac09d77e2a0 156 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 157 // Epd display
WaleedElmughrabi 9:4ac09d77e2a0 158 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 11:9b49bd5a5f8c 159 int Display(double t, int g)
WaleedElmughrabi 9:4ac09d77e2a0 160 {
WaleedElmughrabi 10:a4526c9b8332 161 Epd epd = Epd(PB_5, PB_4, PB_3, PA_8, PC_4, PC_7, PB_10);
WaleedElmughrabi 10:a4526c9b8332 162
WaleedElmughrabi 10:a4526c9b8332 163 sprintf(cValt,"%.2f", t);
WaleedElmughrabi 4:06edbeb05013 164 memset(frame_black, 0xFF, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8);
WaleedElmughrabi 4:06edbeb05013 165 if (epd.Init(lut_full_update) != 0) {
WaleedElmughrabi 4:06edbeb05013 166 return -1;
WaleedElmughrabi 4:06edbeb05013 167 }
WaleedElmughrabi 4:06edbeb05013 168 /*Write strings to the buffer */
WaleedElmughrabi 9:4ac09d77e2a0 169 epd.DrawStringAt(frame_black, 0, 10, "Temperature:", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 170 epd.DrawStringAt(frame_black, 60, 30, cValt, &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 171 epd.DrawStringAt(frame_black, 0, 70, "In Geofence?", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 172 if (g == 1){
WaleedElmughrabi 10:a4526c9b8332 173 epd.DrawStringAt(frame_black, 60, 90, "In Geo", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 174 }
WaleedElmughrabi 9:4ac09d77e2a0 175 else {
WaleedElmughrabi 9:4ac09d77e2a0 176 epd.DrawStringAt(frame_black, 60, 90, "No", &Font24, COLORED);
WaleedElmughrabi 9:4ac09d77e2a0 177 }
WaleedElmughrabi 4:06edbeb05013 178 /* Display the frame_buffer */
WaleedElmughrabi 4:06edbeb05013 179 epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height);
WaleedElmughrabi 4:06edbeb05013 180 epd.DisplayFrame();
WaleedElmughrabi 4:06edbeb05013 181 epd.Sleep();
WaleedElmughrabi 9:4ac09d77e2a0 182 return 1;
WaleedElmughrabi 9:4ac09d77e2a0 183 }
WaleedElmughrabi 9:4ac09d77e2a0 184
WaleedElmughrabi 9:4ac09d77e2a0 185 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 186 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 187
WaleedElmughrabi 9:4ac09d77e2a0 188 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 189 // SD card functions
WaleedElmughrabi 9:4ac09d77e2a0 190 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 191 int new_file(char* adr_file)//fonction to write on new file
WaleedElmughrabi 9:4ac09d77e2a0 192 {
WaleedElmughrabi 9:4ac09d77e2a0 193 FILE *fp = fopen(adr_file, "w");
WaleedElmughrabi 9:4ac09d77e2a0 194 if(fp == NULL) {
WaleedElmughrabi 9:4ac09d77e2a0 195 serial.printf("Unable to write the file\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 196 return -1;
WaleedElmughrabi 9:4ac09d77e2a0 197 } else {
WaleedElmughrabi 10:a4526c9b8332 198 fprintf(fp, "Silent Hub - Log\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 199 fclose(fp);
WaleedElmughrabi 9:4ac09d77e2a0 200 serial.printf("File successfully written!\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 201 return 0; //success
WaleedElmughrabi 9:4ac09d77e2a0 202 }
WaleedElmughrabi 4:06edbeb05013 203 }
WaleedElmughrabi 4:06edbeb05013 204
WaleedElmughrabi 11:9b49bd5a5f8c 205 char* read_file(char* adr_file)//fct to read a file
WaleedElmughrabi 6:d30c8e8678c9 206 {
WaleedElmughrabi 9:4ac09d77e2a0 207 FILE *file;
WaleedElmughrabi 9:4ac09d77e2a0 208 serial.printf("\r\nRead: %s\r\n", adr_file);
WaleedElmughrabi 9:4ac09d77e2a0 209 file = fopen(adr_file, "r");
WaleedElmughrabi 11:9b49bd5a5f8c 210
WaleedElmughrabi 11:9b49bd5a5f8c 211 if(!file) {
WaleedElmughrabi 11:9b49bd5a5f8c 212 error("Could not open file!\n");
WaleedElmughrabi 11:9b49bd5a5f8c 213 //return -1;
WaleedElmughrabi 6:d30c8e8678c9 214 }
WaleedElmughrabi 11:9b49bd5a5f8c 215
WaleedElmughrabi 11:9b49bd5a5f8c 216 char buffer[600];
WaleedElmughrabi 11:9b49bd5a5f8c 217 while(fgets(buffer, 600, file)) {
WaleedElmughrabi 11:9b49bd5a5f8c 218 wait(1);
WaleedElmughrabi 11:9b49bd5a5f8c 219 }
WaleedElmughrabi 11:9b49bd5a5f8c 220 printf("Line: %s\n", buffer);
WaleedElmughrabi 11:9b49bd5a5f8c 221 fclose(file);
WaleedElmughrabi 11:9b49bd5a5f8c 222
WaleedElmughrabi 11:9b49bd5a5f8c 223 return buffer; //success
WaleedElmughrabi 11:9b49bd5a5f8c 224
WaleedElmughrabi 6:d30c8e8678c9 225 }
WaleedElmughrabi 6:d30c8e8678c9 226
WaleedElmughrabi 9:4ac09d77e2a0 227 int add_data(char* adr_flie, char* msg)//fct to update a file
WaleedElmughrabi 9:4ac09d77e2a0 228 {
WaleedElmughrabi 9:4ac09d77e2a0 229 FILE *fp = fopen(adr_flie, "a");
WaleedElmughrabi 9:4ac09d77e2a0 230 if(fp == NULL) {
WaleedElmughrabi 9:4ac09d77e2a0 231 serial.printf("Unable to update the file\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 232 return 0; //success
WaleedElmughrabi 9:4ac09d77e2a0 233 } else {
WaleedElmughrabi 9:4ac09d77e2a0 234 fprintf(fp, msg);
WaleedElmughrabi 9:4ac09d77e2a0 235 fclose(fp);
WaleedElmughrabi 9:4ac09d77e2a0 236 serial.printf("\r\nFile successfully update/written!\r\n");
WaleedElmughrabi 9:4ac09d77e2a0 237 return -1;
WaleedElmughrabi 9:4ac09d77e2a0 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 serialize
WaleedElmughrabi 9:4ac09d77e2a0 245 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 246 //ToDo: pass arguments, currently some dummy values
WaleedElmughrabi 10:a4526c9b8332 247 //geoFenceNum: the geofence entered or left, value: 1(entered), 2(left)
WaleedElmughrabi 11:9b49bd5a5f8c 248 string jsonSerializeDeviceToSystem(int deviceID, double longTest, double latTest, int geoFenceNum, int value, double liquidTemp, double ambientTemp, int tday, int tmonth, int tyear, int thour, int tmin, int tsec)
WaleedElmughrabi 8:bc5a3b2ff424 249 {
WaleedElmughrabi 8:bc5a3b2ff424 250 MbedJSONValue statusReport;
WaleedElmughrabi 8:bc5a3b2ff424 251 std::string s;
WaleedElmughrabi 9:4ac09d77e2a0 252 char SDtime[100];
WaleedElmughrabi 10:a4526c9b8332 253 sprintf(SDtime,"%d-%d-%d - %d:%d:%d", tday, tmonth, tyear, thour, tmin, tsec);
WaleedElmughrabi 9:4ac09d77e2a0 254
WaleedElmughrabi 8:bc5a3b2ff424 255 //fill the object
WaleedElmughrabi 9:4ac09d77e2a0 256 statusReport["timestamp"]= SDtime;
WaleedElmughrabi 9:4ac09d77e2a0 257 statusReport["device"] = deviceID;
WaleedElmughrabi 10:a4526c9b8332 258 statusReport["latitude"]= latTest;
WaleedElmughrabi 10:a4526c9b8332 259 statusReport["longitude"] = longTest;
WaleedElmughrabi 10:a4526c9b8332 260 statusReport["geoFenceNum"] = geoFenceNum;
WaleedElmughrabi 10:a4526c9b8332 261 statusReport["geoFenceEnteryDeparture"] = value;
WaleedElmughrabi 9:4ac09d77e2a0 262 statusReport["container"] = liquidTemp;
WaleedElmughrabi 11:9b49bd5a5f8c 263 statusReport["Ambient"] = ambientTemp;
WaleedElmughrabi 8:bc5a3b2ff424 264 statusReport["heater"] = 34.5;
WaleedElmughrabi 10:a4526c9b8332 265 statusReport["batteryVoltage"] = 3.67;
WaleedElmughrabi 9:4ac09d77e2a0 266 statusReport["network"] = "Tele2";
WaleedElmughrabi 8:bc5a3b2ff424 267 statusReport["signalStrength"] = -89;
WaleedElmughrabi 8:bc5a3b2ff424 268
WaleedElmughrabi 8:bc5a3b2ff424 269 //serialize it into a JSON string
WaleedElmughrabi 8:bc5a3b2ff424 270 s = statusReport.serialize();
WaleedElmughrabi 9:4ac09d77e2a0 271
WaleedElmughrabi 8:bc5a3b2ff424 272 return s;
WaleedElmughrabi 8:bc5a3b2ff424 273 }
WaleedElmughrabi 9:4ac09d77e2a0 274 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 275 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 276
WaleedElmughrabi 9:4ac09d77e2a0 277
WaleedElmughrabi 9:4ac09d77e2a0 278 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 279 // JSON parse
WaleedElmughrabi 9:4ac09d77e2a0 280 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 281 double jsonParseSystemToDevice(const char * parameter, int msg_index)
WaleedElmughrabi 9:4ac09d77e2a0 282 {
WaleedElmughrabi 10:a4526c9b8332 283 // Journey message received from system parsed into values. Message description:
WaleedElmughrabi 10:a4526c9b8332 284 //"{\"config\":[device,temperatureRequired,temperatureInterval,numberOfGeos],\"route1\":[geoFenceNum,heating,temperatureRequired,pingOnArrival,pingOnDeparture,shape,outerCircle,latCentre,longCentre,latEdge,LongEdge,latEdge2,longEdge2],.........,\"routeX\":[geoFenceNum,heating,temperatureRequired,pingOnArrival,pingOnDeparture,shape,numOfVertices,lat1,long1,lat2,long2,..............,lat1,long1]}
WaleedElmughrabi 10:a4526c9b8332 285
WaleedElmughrabi 9:4ac09d77e2a0 286 MbedJSONValue journey;
WaleedElmughrabi 9:4ac09d77e2a0 287 parse(journey, system_message);
WaleedElmughrabi 9:4ac09d77e2a0 288 double msg; msg = journey[parameter][msg_index].get<double>(); return msg;
WaleedElmughrabi 9:4ac09d77e2a0 289 }
WaleedElmughrabi 9:4ac09d77e2a0 290 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 9:4ac09d77e2a0 291 ////////////////////////////////////////////////////////////////////////////////////////////////////////
WaleedElmughrabi 8:bc5a3b2ff424 292
WaleedElmughrabi 4:06edbeb05013 293 int main()
WaleedElmughrabi 4:06edbeb05013 294 {
WaleedElmughrabi 11:9b49bd5a5f8c 295 en1=1;en2=1;en3=1;en4=1;
WaleedElmughrabi 9:4ac09d77e2a0 296 Serial GPSSerial(TX5, RX5);
WaleedElmughrabi 4:06edbeb05013 297 GPSSerial.baud(GPSBaud);
WaleedElmughrabi 4:06edbeb05013 298 wait(0.001);
WaleedElmughrabi 9:4ac09d77e2a0 299 DigitalOut SD_EN(PB_12); //SD SPI enable (active low)
WaleedElmughrabi 9:4ac09d77e2a0 300 DigitalOut Epd_EN(PA_8); //Epd SPI enable (active low)
WaleedElmughrabi 10:a4526c9b8332 301
WaleedElmughrabi 10:a4526c9b8332 302 //ToDo: To be replaced by the value received when subscribed to the Iot hub
WaleedElmughrabi 10:a4526c9b8332 303 //Subscribe and save the message in system_message
WaleedElmughrabi 11:9b49bd5a5f8c 304 system_message = "{\"config\":[1.0,1.0,240.0,5.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,1.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 10:a4526c9b8332 305
WaleedElmughrabi 9:4ac09d77e2a0 306
WaleedElmughrabi 10:a4526c9b8332 307 wait(1);
WaleedElmughrabi 10:a4526c9b8332 308 serial.printf("Silent Hub v1.0 ........................\r\n");
WaleedElmughrabi 10:a4526c9b8332 309 serial.printf("SystemCoreClock is %d Hz...........\r\n", SystemCoreClock);
WaleedElmughrabi 10:a4526c9b8332 310 wait (1);
WaleedElmughrabi 11:9b49bd5a5f8c 311 int sleepCounter = 0;
WaleedElmughrabi 11:9b49bd5a5f8c 312 //new_file("/sd/HeatingStationLog.txt");
WaleedElmughrabi 11:9b49bd5a5f8c 313
WaleedElmughrabi 10:a4526c9b8332 314
WaleedElmughrabi 10:a4526c9b8332 315 while(1) {
WaleedElmughrabi 11:9b49bd5a5f8c 316 sleepCounter++;
WaleedElmughrabi 11:9b49bd5a5f8c 317
WaleedElmughrabi 11:9b49bd5a5f8c 318
WaleedElmughrabi 9:4ac09d77e2a0 319 if(tgps.encode(GPSSerial.getc()))
WaleedElmughrabi 4:06edbeb05013 320 {
WaleedElmughrabi 11:9b49bd5a5f8c 321 tgps.encode(GPSSerial.getc());
WaleedElmughrabi 10:a4526c9b8332 322 latTest = tgps.location.lat(); longTest = tgps.location.lng(); //Location
WaleedElmughrabi 9:4ac09d77e2a0 323 tyear = tgps.date.year(); tmonth = tgps.date.month(); tday = tgps.date.day(); //Date
WaleedElmughrabi 9:4ac09d77e2a0 324 thour = tgps.time.hour(); tmin = tgps.time.minute(); tsec = tgps.time.second(); //Time
WaleedElmughrabi 11:9b49bd5a5f8c 325
WaleedElmughrabi 9:4ac09d77e2a0 326 //this part is just for local terminal monitoring
WaleedElmughrabi 10:a4526c9b8332 327 serial.printf("\r\nLocation: %3.6f, %3.6f, Date: %d-%d-%d, Time: %d:%d:%d \r\n", latTest, longTest, tday, tmonth, tyear, thour, tmin, tsec);
WaleedElmughrabi 9:4ac09d77e2a0 328
WaleedElmughrabi 11:9b49bd5a5f8c 329 ambientTemp = getTemp(0);
WaleedElmughrabi 11:9b49bd5a5f8c 330 printf("Ambient Temperature %3.1foC\r\n", ambientTemp);
WaleedElmughrabi 11:9b49bd5a5f8c 331 liquidTemp = getTemp(1);
WaleedElmughrabi 11:9b49bd5a5f8c 332 printf("liquid Temperature %3.1foC\r\n", liquidTemp);
WaleedElmughrabi 10:a4526c9b8332 333 Display(liquidTemp, geotest);
WaleedElmughrabi 6:d30c8e8678c9 334 wait(5); //little delay to prevent double writing
WaleedElmughrabi 10:a4526c9b8332 335
WaleedElmughrabi 9:4ac09d77e2a0 336 //geofence testing
WaleedElmughrabi 9:4ac09d77e2a0 337 parameter = "config";
WaleedElmughrabi 10:a4526c9b8332 338 msg_index = 3;
WaleedElmughrabi 9:4ac09d77e2a0 339 geofencesNum = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 340 serial.printf("\r\nNumber of geofences: %2.0f", geofencesNum);
WaleedElmughrabi 9:4ac09d77e2a0 341
WaleedElmughrabi 10:a4526c9b8332 342 geotest = 0;
WaleedElmughrabi 9:4ac09d77e2a0 343 int count=1;
WaleedElmughrabi 9:4ac09d77e2a0 344 int count2;
WaleedElmughrabi 9:4ac09d77e2a0 345 double geo_lat_c; double geo_long_c; double geo_lat_e; double geo_long_e;
WaleedElmughrabi 11:9b49bd5a5f8c 346
WaleedElmughrabi 10:a4526c9b8332 347 while ((count <= geofencesNum)&&(geotest == 0))
WaleedElmughrabi 10:a4526c9b8332 348 //Can also check latTest,longTest: to make sure we have a fix
WaleedElmughrabi 10:a4526c9b8332 349 //while ((count <= geofencesNum)&&(geotest == 0)&& ((latTest != 0)||(longTest != 0)))
WaleedElmughrabi 9:4ac09d77e2a0 350 {
WaleedElmughrabi 11:9b49bd5a5f8c 351
WaleedElmughrabi 11:9b49bd5a5f8c 352
WaleedElmughrabi 9:4ac09d77e2a0 353 sprintf(geo_extract,"route%d",count);
WaleedElmughrabi 9:4ac09d77e2a0 354 parameter = geo_extract;
WaleedElmughrabi 9:4ac09d77e2a0 355 msg_index = 5;
WaleedElmughrabi 9:4ac09d77e2a0 356
WaleedElmughrabi 9:4ac09d77e2a0 357 if (jsonParseSystemToDevice(geo_extract,msg_index) == 1) //circular geofence
WaleedElmughrabi 9:4ac09d77e2a0 358 {
WaleedElmughrabi 9:4ac09d77e2a0 359 msg_index = 6; geo_lat_c = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 360 msg_index = 7; geo_long_c = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 361 msg_index = 8; geo_lat_e = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 362 msg_index = 9; geo_long_e = jsonParseSystemToDevice(parameter,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 363
WaleedElmughrabi 10:a4526c9b8332 364 geotest = inCircle(geo_lat_c, geo_long_c, geo_lat_e, geo_long_e, latTest, longTest);
WaleedElmughrabi 9:4ac09d77e2a0 365 serial.printf("\r\nGeofence number = %d: \r\nIn geofence = %d:\r\n", count, geotest);
WaleedElmughrabi 9:4ac09d77e2a0 366 }
WaleedElmughrabi 9:4ac09d77e2a0 367
WaleedElmughrabi 9:4ac09d77e2a0 368 if (jsonParseSystemToDevice(geo_extract,msg_index) == 2) //polygon geofence
WaleedElmughrabi 9:4ac09d77e2a0 369 {
WaleedElmughrabi 9:4ac09d77e2a0 370 msg_index = 6; //The start of coordinates in the message
WaleedElmughrabi 9:4ac09d77e2a0 371 int vertices = jsonParseSystemToDevice(geo_extract,msg_index); //number of polygon vertices
WaleedElmughrabi 9:4ac09d77e2a0 372 double geo_lat[vertices];
WaleedElmughrabi 9:4ac09d77e2a0 373 double geo_long[vertices];
WaleedElmughrabi 9:4ac09d77e2a0 374 msg_index = 7;
WaleedElmughrabi 9:4ac09d77e2a0 375 for (count2=0; count2 < vertices; count2++ )
WaleedElmughrabi 9:4ac09d77e2a0 376 {
WaleedElmughrabi 9:4ac09d77e2a0 377 geo_lat[count2] = jsonParseSystemToDevice(geo_extract,msg_index);
WaleedElmughrabi 9:4ac09d77e2a0 378 geo_long[count2] = jsonParseSystemToDevice(geo_extract,msg_index+1);
WaleedElmughrabi 9:4ac09d77e2a0 379 msg_index = msg_index + 2;
WaleedElmughrabi 9:4ac09d77e2a0 380 }
WaleedElmughrabi 9:4ac09d77e2a0 381
WaleedElmughrabi 10:a4526c9b8332 382 geotest = pnpoly(vertices, geo_long, geo_lat,longTest, latTest);
WaleedElmughrabi 9:4ac09d77e2a0 383 serial.printf("\r\nGeofence number = %d: \r\nIn geofence = %d:\r\n", count, geotest);
WaleedElmughrabi 9:4ac09d77e2a0 384 }
WaleedElmughrabi 9:4ac09d77e2a0 385 count++;
WaleedElmughrabi 11:9b49bd5a5f8c 386
WaleedElmughrabi 9:4ac09d77e2a0 387 }
WaleedElmughrabi 11:9b49bd5a5f8c 388 count = count--;
WaleedElmughrabi 13:0477a745dad2 389 /*
WaleedElmughrabi 11:9b49bd5a5f8c 390 if (geotest == 0) //ToDo &&make sure the last publish handshake was successful
WaleedElmughrabi 10:a4526c9b8332 391 {
WaleedElmughrabi 10:a4526c9b8332 392 //msg to be saved on SD and published, will overwrite last saved message
WaleedElmughrabi 11:9b49bd5a5f8c 393 s = jsonSerializeDeviceToSystem(deviceID, longTest, latTest, count, geotest, liquidTemp, ambientTemp, tday, tmonth, tyear, thour, tmin, tsec);
WaleedElmughrabi 10:a4526c9b8332 394 sprintf(chr_s,s.c_str());
WaleedElmughrabi 10:a4526c9b8332 395 Epd_EN = 1;
WaleedElmughrabi 10:a4526c9b8332 396 new_file("/sd/DeviceToSystemLog.txt");
WaleedElmughrabi 10:a4526c9b8332 397 add_data("/sd/DeviceToSystemLog.txt",chr_s);
WaleedElmughrabi 10:a4526c9b8332 398 read_file("/sd/DeviceToSystemLog.txt");
WaleedElmughrabi 9:4ac09d77e2a0 399
WaleedElmughrabi 10:a4526c9b8332 400 //Save last geofence, will overwrite last saved value
WaleedElmughrabi 10:a4526c9b8332 401 char cValGeoNum[8];
WaleedElmughrabi 10:a4526c9b8332 402 sprintf(cValGeoNum,"%d", count);
WaleedElmughrabi 10:a4526c9b8332 403 new_file("/sd/LastGeofence.txt");
WaleedElmughrabi 10:a4526c9b8332 404 add_data("/sd/LastGeofence.txt",cValGeoNum);
WaleedElmughrabi 10:a4526c9b8332 405 read_file("/sd/LastGeofence.txt");
WaleedElmughrabi 11:9b49bd5a5f8c 406 serial.printf("\n\rEnd\n");
WaleedElmughrabi 11:9b49bd5a5f8c 407 wait(1);
WaleedElmughrabi 10:a4526c9b8332 408 Epd_EN = 0;
WaleedElmughrabi 10:a4526c9b8332 409
WaleedElmughrabi 11:9b49bd5a5f8c 410
WaleedElmughrabi 11:9b49bd5a5f8c 411 //To do: if timer >= x, sleep, then sysreset;
WaleedElmughrabi 11:9b49bd5a5f8c 412 //NVIC_SystemReset();
WaleedElmughrabi 11:9b49bd5a5f8c 413
WaleedElmughrabi 10:a4526c9b8332 414 //If it is a heating station log temperature
WaleedElmughrabi 10:a4526c9b8332 415
WaleedElmughrabi 10:a4526c9b8332 416
WaleedElmughrabi 10:a4526c9b8332 417 }
WaleedElmughrabi 11:9b49bd5a5f8c 418 new_file("/sd/HeatingStationLog.txt");
WaleedElmughrabi 11:9b49bd5a5f8c 419 readLastGeo = read_file("/sd/LastGeofence.txt");
WaleedElmughrabi 11:9b49bd5a5f8c 420 int intVal = atoi(readLastGeo);
WaleedElmughrabi 11:9b49bd5a5f8c 421 serial.printf("\r\nlast Geo in int = %d:",intVal);
WaleedElmughrabi 11:9b49bd5a5f8c 422 sprintf(geo_extract,"route%d",intVal);
WaleedElmughrabi 11:9b49bd5a5f8c 423 if (jsonParseSystemToDevice(geo_extract,1) == 1.0); //Check if it is a heating station
WaleedElmughrabi 11:9b49bd5a5f8c 424 {
WaleedElmughrabi 11:9b49bd5a5f8c 425 char liq[32];char amb[32];
WaleedElmughrabi 11:9b49bd5a5f8c 426 //const char seperator = ",";
WaleedElmughrabi 11:9b49bd5a5f8c 427 sprintf(liq,"%.2f", liquidTemp);
WaleedElmughrabi 11:9b49bd5a5f8c 428 add_data("/sd/HeatingStationLog.txt",liq);
WaleedElmughrabi 11:9b49bd5a5f8c 429 add_data("/sd/HeatingStationLog.txt",",");
WaleedElmughrabi 11:9b49bd5a5f8c 430 sprintf(amb,"%.2f", ambientTemp);
WaleedElmughrabi 11:9b49bd5a5f8c 431 add_data("/sd/HeatingStationLog.txt",amb);
WaleedElmughrabi 11:9b49bd5a5f8c 432 add_data("/sd/HeatingStationLog.txt",",");
WaleedElmughrabi 11:9b49bd5a5f8c 433 read_file("/sd/HeatingStationLog.txt");
WaleedElmughrabi 11:9b49bd5a5f8c 434 }
WaleedElmughrabi 13:0477a745dad2 435 */
WaleedElmughrabi 11:9b49bd5a5f8c 436
WaleedElmughrabi 4:06edbeb05013 437 }
WaleedElmughrabi 4:06edbeb05013 438
WaleedElmughrabi 4:06edbeb05013 439 if (millis() > 5000 && tgps.charsProcessed() < 10)
WaleedElmughrabi 4:06edbeb05013 440 {
WaleedElmughrabi 4:06edbeb05013 441 serial.printf("No GPS detected: check wiring.\r\n");
WaleedElmughrabi 4:06edbeb05013 442 break;
WaleedElmughrabi 4:06edbeb05013 443 }
WaleedElmughrabi 9:4ac09d77e2a0 444
WaleedElmughrabi 4:06edbeb05013 445 }
WaleedElmughrabi 4:06edbeb05013 446 }
WaleedElmughrabi 4:06edbeb05013 447
WaleedElmughrabi 4:06edbeb05013 448
WaleedElmughrabi 4:06edbeb05013 449
WaleedElmughrabi 9:4ac09d77e2a0 450