STM32L476

Dependencies:   MbedJSONValue SDFileSystem WConstants mbed-dev DS1820 TinyGPSPlus epd1in54

Fork of A_SSL_Main by SilentSensors

Committer:
WaleedElmughrabi
Date:
Sun Dec 16 19:37:42 2018 +0000
Revision:
15:fad0681e6fee
Parent:
13:0477a745dad2
Preparing to merge with CLI

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