STM32L476
Dependencies: MbedJSONValue SDFileSystem WConstants mbed-dev DS1820 TinyGPSPlus epd1in54
Fork of A_SSL_Main by
main.cpp@11:9b49bd5a5f8c, 2018-11-27 (annotated)
- Committer:
- WaleedElmughrabi
- Date:
- Tue Nov 27 13:57:52 2018 +0000
- Revision:
- 11:9b49bd5a5f8c
- Parent:
- 10:a4526c9b8332
- Child:
- 13:0477a745dad2
Logging update
Who changed what in which revision?
User | Revision | Line number | New 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 | 11:9b49bd5a5f8c | 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 | 11:9b49bd5a5f8c | 389 | if (geotest == 0) //ToDo &&make sure the last publish handshake was successful |
WaleedElmughrabi | 10:a4526c9b8332 | 390 | { |
WaleedElmughrabi | 10:a4526c9b8332 | 391 | //msg to be saved on SD and published, will overwrite last saved message |
WaleedElmughrabi | 11:9b49bd5a5f8c | 392 | s = jsonSerializeDeviceToSystem(deviceID, longTest, latTest, count, geotest, liquidTemp, ambientTemp, tday, tmonth, tyear, thour, tmin, tsec); |
WaleedElmughrabi | 10:a4526c9b8332 | 393 | sprintf(chr_s,s.c_str()); |
WaleedElmughrabi | 10:a4526c9b8332 | 394 | Epd_EN = 1; |
WaleedElmughrabi | 10:a4526c9b8332 | 395 | new_file("/sd/DeviceToSystemLog.txt"); |
WaleedElmughrabi | 10:a4526c9b8332 | 396 | add_data("/sd/DeviceToSystemLog.txt",chr_s); |
WaleedElmughrabi | 10:a4526c9b8332 | 397 | read_file("/sd/DeviceToSystemLog.txt"); |
WaleedElmughrabi | 9:4ac09d77e2a0 | 398 | |
WaleedElmughrabi | 10:a4526c9b8332 | 399 | //Save last geofence, will overwrite last saved value |
WaleedElmughrabi | 10:a4526c9b8332 | 400 | char cValGeoNum[8]; |
WaleedElmughrabi | 10:a4526c9b8332 | 401 | sprintf(cValGeoNum,"%d", count); |
WaleedElmughrabi | 10:a4526c9b8332 | 402 | new_file("/sd/LastGeofence.txt"); |
WaleedElmughrabi | 10:a4526c9b8332 | 403 | add_data("/sd/LastGeofence.txt",cValGeoNum); |
WaleedElmughrabi | 10:a4526c9b8332 | 404 | read_file("/sd/LastGeofence.txt"); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 405 | serial.printf("\n\rEnd\n"); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 406 | wait(1); |
WaleedElmughrabi | 10:a4526c9b8332 | 407 | Epd_EN = 0; |
WaleedElmughrabi | 10:a4526c9b8332 | 408 | |
WaleedElmughrabi | 11:9b49bd5a5f8c | 409 | |
WaleedElmughrabi | 11:9b49bd5a5f8c | 410 | //To do: if timer >= x, sleep, then sysreset; |
WaleedElmughrabi | 11:9b49bd5a5f8c | 411 | //NVIC_SystemReset(); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 412 | |
WaleedElmughrabi | 10:a4526c9b8332 | 413 | //If it is a heating station log temperature |
WaleedElmughrabi | 10:a4526c9b8332 | 414 | |
WaleedElmughrabi | 10:a4526c9b8332 | 415 | |
WaleedElmughrabi | 10:a4526c9b8332 | 416 | } |
WaleedElmughrabi | 11:9b49bd5a5f8c | 417 | new_file("/sd/HeatingStationLog.txt"); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 418 | readLastGeo = read_file("/sd/LastGeofence.txt"); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 419 | int intVal = atoi(readLastGeo); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 420 | serial.printf("\r\nlast Geo in int = %d:",intVal); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 421 | sprintf(geo_extract,"route%d",intVal); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 422 | if (jsonParseSystemToDevice(geo_extract,1) == 1.0); //Check if it is a heating station |
WaleedElmughrabi | 11:9b49bd5a5f8c | 423 | { |
WaleedElmughrabi | 11:9b49bd5a5f8c | 424 | char liq[32];char amb[32]; |
WaleedElmughrabi | 11:9b49bd5a5f8c | 425 | //const char seperator = ","; |
WaleedElmughrabi | 11:9b49bd5a5f8c | 426 | sprintf(liq,"%.2f", liquidTemp); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 427 | add_data("/sd/HeatingStationLog.txt",liq); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 428 | add_data("/sd/HeatingStationLog.txt",","); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 429 | sprintf(amb,"%.2f", ambientTemp); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 430 | add_data("/sd/HeatingStationLog.txt",amb); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 431 | add_data("/sd/HeatingStationLog.txt",","); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 432 | read_file("/sd/HeatingStationLog.txt"); |
WaleedElmughrabi | 11:9b49bd5a5f8c | 433 | } |
WaleedElmughrabi | 11:9b49bd5a5f8c | 434 | |
WaleedElmughrabi | 11:9b49bd5a5f8c | 435 | |
WaleedElmughrabi | 4:06edbeb05013 | 436 | } |
WaleedElmughrabi | 4:06edbeb05013 | 437 | |
WaleedElmughrabi | 4:06edbeb05013 | 438 | if (millis() > 5000 && tgps.charsProcessed() < 10) |
WaleedElmughrabi | 4:06edbeb05013 | 439 | { |
WaleedElmughrabi | 4:06edbeb05013 | 440 | serial.printf("No GPS detected: check wiring.\r\n"); |
WaleedElmughrabi | 4:06edbeb05013 | 441 | break; |
WaleedElmughrabi | 4:06edbeb05013 | 442 | } |
WaleedElmughrabi | 9:4ac09d77e2a0 | 443 | |
WaleedElmughrabi | 4:06edbeb05013 | 444 | } |
WaleedElmughrabi | 4:06edbeb05013 | 445 | } |
WaleedElmughrabi | 4:06edbeb05013 | 446 | |
WaleedElmughrabi | 4:06edbeb05013 | 447 | |
WaleedElmughrabi | 4:06edbeb05013 | 448 | |
WaleedElmughrabi | 9:4ac09d77e2a0 | 449 |