basic lightning detector with gps and sd card logging

Dependencies:   AS3935 AdafruitGPS SDFileSystem TSI mbed ConfigFile

Committer:
cmkachur
Date:
Wed Jul 15 21:25:24 2015 +0000
Revision:
13:3d717008645c
Parent:
12:7c58c7a6b25c
Eliminate 50 ms delay when changing LED in main loop. ; Add a configuration parameter for using the RTC. The default is to use the RTC time.; Update FW version to 5.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ftagius 0:3328df4c3116 1 #include "mbed.h"
ftagius 0:3328df4c3116 2 #include "GPS.h"
ftagius 0:3328df4c3116 3 #include "main.h"
ftagius 0:3328df4c3116 4 #include "TSISensor.h"
ftagius 0:3328df4c3116 5 #include "SDFileSystem.h"
ftagius 0:3328df4c3116 6 #include "AS3935.h"
cmkachur 6:96b0dbe76357 7 #include "ConfigFile.h"
ftagius 8:f8830b6c6d9b 8 #include "datetime.h"
ftagius 8:f8830b6c6d9b 9 #include "time.h"
cmkachur 6:96b0dbe76357 10 #include <string>
ftagius 0:3328df4c3116 11
cmkachur 13:3d717008645c 12 #define FW_VER 5
cmkachur 4:4d26ba1ae0f7 13
ftagius 3:e3974328d808 14 // frdm-kl25z as3935 connections for spi1
ftagius 0:3328df4c3116 15 // ------------------------------------------------
ftagius 0:3328df4c3116 16 // Header -- kl25z -- SD/MMC
ftagius 0:3328df4c3116 17 // J2-20 -- PTE1 -- MOSI
ftagius 0:3328df4c3116 18 // J9-13 -- PTE4 -- CS
ftagius 0:3328df4c3116 19 // J2-14 -- GND -- Vss (GND)
ftagius 0:3328df4c3116 20 // J9-9 -- PTE2 -- SCK
ftagius 0:3328df4c3116 21 // J9-11 -- PTE3 -- MISO
ftagius 0:3328df4c3116 22
ftagius 0:3328df4c3116 23 AS3935 ld(PTE1, PTE3, PTE2, PTE4, "ld", 1000000); // MOSI, MISO, SCK, CS, SPI bus freq (hz)
ftagius 0:3328df4c3116 24 InterruptIn IntLightning(PTA12); //IRQ AS3935
ftagius 0:3328df4c3116 25
ftagius 0:3328df4c3116 26
ftagius 0:3328df4c3116 27 // frdm-kl25z sd card connections spi0
ftagius 0:3328df4c3116 28 // ------------------------------------------------
ftagius 0:3328df4c3116 29 // Header -- kl25z -- SPI
ftagius 0:3328df4c3116 30 // J2-8 -- PTD2 -- MOSI
ftagius 0:3328df4c3116 31 // J2-6 -- PTD0 -- CS
ftagius 0:3328df4c3116 32 // J9-12 -- GND -- Vss (GND)
ftagius 0:3328df4c3116 33 // J9-4 -- P3V3 -- Vdd (+3.3v)
ftagius 0:3328df4c3116 34 // J2-12 -- PTD1 -- SCK
ftagius 0:3328df4c3116 35 // J9-14 -- GND -- Vss (GND)
ftagius 0:3328df4c3116 36 // J2-10 -- PTD3 -- MISO
ftagius 0:3328df4c3116 37
ftagius 0:3328df4c3116 38 SDFileSystem sd(PTD2, PTD3, PTD1, PTD0, "sd"); // MOSI, MISO, SCK, CS
ftagius 0:3328df4c3116 39
ftagius 0:3328df4c3116 40 Serial pc(USBTX, USBRX);
ftagius 0:3328df4c3116 41 GPS gpsd(PTE20, PTE21);
ftagius 0:3328df4c3116 42 DigitalOut red(LED_RED);
ftagius 0:3328df4c3116 43 DigitalOut green(LED_GREEN);
ftagius 0:3328df4c3116 44 //DigitalOut blue(LED_BLUE); don't use the blue led, due to a board error, writing to the blue led kills spi
ftagius 3:e3974328d808 45 bool debug=false;
cmkachur 2:3edb129c60b2 46 void writeLogFile(int interruptSource, int distance, long energy);
ftagius 1:10d2a051285e 47 char logName[]="lightning_data.csv";
ftagius 1:10d2a051285e 48 int rdistance, rinterrupt;
ftagius 1:10d2a051285e 49 char directory[]="/sd/lightning_data";
ftagius 3:e3974328d808 50 int OriginInt=-1;
cmkachur 6:96b0dbe76357 51 int gDistance=-1;
ftagius 3:e3974328d808 52 long energy=-1;
ftagius 8:f8830b6c6d9b 53 struct tm Clock;
ftagius 0:3328df4c3116 54
cmkachur 6:96b0dbe76357 55 typedef struct
cmkachur 6:96b0dbe76357 56 {
cmkachur 6:96b0dbe76357 57 unsigned int bOutdoorMode;
cmkachur 6:96b0dbe76357 58 unsigned int noiseFloor;
cmkachur 6:96b0dbe76357 59 unsigned int wdogThresh;
cmkachur 6:96b0dbe76357 60 unsigned int bClrStat;
cmkachur 6:96b0dbe76357 61 unsigned int minNumLight;
cmkachur 6:96b0dbe76357 62 unsigned int spikeRej;
cmkachur 6:96b0dbe76357 63 unsigned int maskDisturber;
cmkachur 13:3d717008645c 64 unsigned int bUseRtc;
cmkachur 6:96b0dbe76357 65 }sys_cfg_t;
cmkachur 6:96b0dbe76357 66
cmkachur 6:96b0dbe76357 67 // default configuration values
cmkachur 6:96b0dbe76357 68 sys_cfg_t sysCfg = { .bOutdoorMode = 1,
cmkachur 6:96b0dbe76357 69 .noiseFloor = 2,
cmkachur 6:96b0dbe76357 70 .wdogThresh = 2,
cmkachur 6:96b0dbe76357 71 .bClrStat = 0,
cmkachur 6:96b0dbe76357 72 .minNumLight = 0,
cmkachur 6:96b0dbe76357 73 .spikeRej = 2,
cmkachur 6:96b0dbe76357 74 .maskDisturber = 0,
cmkachur 13:3d717008645c 75 .bUseRtc = 1,
cmkachur 6:96b0dbe76357 76 };
cmkachur 6:96b0dbe76357 77
cmkachur 6:96b0dbe76357 78
ftagius 0:3328df4c3116 79 void DetectLightning()
ftagius 0:3328df4c3116 80 {
cmkachur 11:a4096e656762 81 /* After the signal IRQ goes high the external
cmkachur 11:a4096e656762 82 unit should wait 2ms before reading the interrupt register. */
cmkachur 11:a4096e656762 83 wait_ms(2);
ftagius 0:3328df4c3116 84 OriginInt = ld.interruptSource();
cmkachur 6:96b0dbe76357 85 gDistance = ld.lightningDistanceKm();
ftagius 3:e3974328d808 86 energy = ld.getEnergy();
ftagius 0:3328df4c3116 87 }
ftagius 0:3328df4c3116 88
cmkachur 2:3edb129c60b2 89 void writeLogFile(int interruptSource, int distance, long energy)
ftagius 0:3328df4c3116 90 {
ftagius 1:10d2a051285e 91 char logFilePath[128];
ftagius 0:3328df4c3116 92 static bool header=false;
ftagius 0:3328df4c3116 93 FILE *fp;
ftagius 1:10d2a051285e 94
ftagius 1:10d2a051285e 95 sprintf(logFilePath, "%s/%s", directory,logName);
ftagius 0:3328df4c3116 96 sd.mount();
ftagius 1:10d2a051285e 97 fp = fopen(logFilePath, "a");
ftagius 0:3328df4c3116 98 if(fp == NULL) {
ftagius 0:3328df4c3116 99 // retry
ftagius 3:e3974328d808 100 wait_ms(200);
ftagius 1:10d2a051285e 101 fp = fopen(logFilePath, "a");
ftagius 0:3328df4c3116 102 if (fp == NULL)
ftagius 0:3328df4c3116 103 {
ftagius 1:10d2a051285e 104 printf("Could not open file %s for writing\r\n",logFilePath);
ftagius 0:3328df4c3116 105 sd.unmount();
ftagius 1:10d2a051285e 106 printf("unmount sd card \r\n");
ftagius 0:3328df4c3116 107 return;
ftagius 0:3328df4c3116 108 }
ftagius 0:3328df4c3116 109 }
ftagius 3:e3974328d808 110 if (debug)
ftagius 3:e3974328d808 111 pc.printf("Opened log file %s\r\n",logFilePath);
ftagius 0:3328df4c3116 112 // write the log file header
ftagius 0:3328df4c3116 113 if (header == false)
ftagius 0:3328df4c3116 114 {
cmkachur 2:3edb129c60b2 115 fprintf(fp,"# date,time,raw timestamp,latitude,longitude,distance,interrupt,energy\r\n");
ftagius 0:3328df4c3116 116 header = true;
ftagius 0:3328df4c3116 117 }
ftagius 0:3328df4c3116 118 // write to the current log file
ftagius 8:f8830b6c6d9b 119 char time_str[32];
ftagius 8:f8830b6c6d9b 120 time_t seconds = time(NULL);
cmkachur 11:a4096e656762 121 seconds -= 14400; // 14400 = 60*60*4, kludgy way of setting est
ftagius 8:f8830b6c6d9b 122 struct tm *tminfo = localtime(&seconds);
ftagius 8:f8830b6c6d9b 123 strftime(time_str, 32, "%m/%d/%Y,%T", tminfo);
ftagius 8:f8830b6c6d9b 124 fprintf(fp,"%s,%ld,",time_str,seconds);
ftagius 0:3328df4c3116 125 fprintf(fp,"%5.7f,%5.7f,", gpsd.lat_deg, gpsd.lon_deg);
ftagius 1:10d2a051285e 126 fprintf(fp,"%d,",distance);
cmkachur 2:3edb129c60b2 127 fprintf(fp,"%d,",interruptSource);
cmkachur 2:3edb129c60b2 128 fprintf(fp,"%ld",energy);
ftagius 0:3328df4c3116 129 fprintf(fp,"\r\n");
ftagius 0:3328df4c3116 130 fflush(fp);
ftagius 0:3328df4c3116 131 f_sync((FIL*)fp);
ftagius 0:3328df4c3116 132 fclose(fp);
ftagius 0:3328df4c3116 133 sd.unmount();
ftagius 3:e3974328d808 134 pc.printf("Event: ");
ftagius 8:f8830b6c6d9b 135 pc.printf(" %s - ", time_str);
ftagius 3:e3974328d808 136 switch (interruptSource)
ftagius 3:e3974328d808 137 {
ftagius 3:e3974328d808 138 case 1:
ftagius 3:e3974328d808 139 pc.printf("Noise level too high\r\n");
ftagius 3:e3974328d808 140 break;
ftagius 3:e3974328d808 141 case 4:
ftagius 3:e3974328d808 142 pc.printf("Disturber\r\n");
ftagius 3:e3974328d808 143 break;
ftagius 3:e3974328d808 144 case 8:
ftagius 3:e3974328d808 145 pc.printf("Lightning detection, distance=%dkm energy=%ld\r\n", distance, energy);
cmkachur 6:96b0dbe76357 146
cmkachur 6:96b0dbe76357 147 if (sysCfg.bClrStat)
cmkachur 6:96b0dbe76357 148 ld.clearStats();
ftagius 3:e3974328d808 149 break;
ftagius 3:e3974328d808 150 default:
ftagius 3:e3974328d808 151 pc.printf("Unknown interrupt %d\r\n", OriginInt);
ftagius 3:e3974328d808 152
ftagius 3:e3974328d808 153 }
ftagius 3:e3974328d808 154
ftagius 3:e3974328d808 155 if (debug)
ftagius 3:e3974328d808 156 pc.printf("Closed log file %s\r\n",logFilePath);
ftagius 0:3328df4c3116 157 }
ftagius 0:3328df4c3116 158
cmkachur 4:4d26ba1ae0f7 159
cmkachur 4:4d26ba1ae0f7 160 void writeCfgFile(unsigned char *pBuff, unsigned char buffLen, unsigned char fwVer)
cmkachur 4:4d26ba1ae0f7 161 {
cmkachur 4:4d26ba1ae0f7 162 char cfgFilePath[128];
cmkachur 4:4d26ba1ae0f7 163 FILE *fp;
cmkachur 4:4d26ba1ae0f7 164 unsigned char cnt = 0;
cmkachur 4:4d26ba1ae0f7 165
cmkachur 4:4d26ba1ae0f7 166 sprintf(cfgFilePath, "%s/%s", directory, "config_data.csv");
cmkachur 4:4d26ba1ae0f7 167 sd.mount();
cmkachur 4:4d26ba1ae0f7 168 fp = fopen(cfgFilePath, "w");
cmkachur 4:4d26ba1ae0f7 169 if(fp == NULL) {
cmkachur 4:4d26ba1ae0f7 170 // retry
cmkachur 4:4d26ba1ae0f7 171 wait_ms(200);
cmkachur 4:4d26ba1ae0f7 172 fp = fopen(cfgFilePath, "w");
cmkachur 4:4d26ba1ae0f7 173 if (fp == NULL)
cmkachur 4:4d26ba1ae0f7 174 {
cmkachur 4:4d26ba1ae0f7 175 printf("Could not open file %s for writing\r\n",cfgFilePath);
cmkachur 4:4d26ba1ae0f7 176 sd.unmount();
cmkachur 4:4d26ba1ae0f7 177 printf("unmount sd card \r\n");
cmkachur 4:4d26ba1ae0f7 178 return;
cmkachur 4:4d26ba1ae0f7 179 }
cmkachur 4:4d26ba1ae0f7 180 }
cmkachur 4:4d26ba1ae0f7 181 if (debug)
cmkachur 4:4d26ba1ae0f7 182 pc.printf("Opened log file %s\r\n",cfgFilePath);
cmkachur 4:4d26ba1ae0f7 183
cmkachur 4:4d26ba1ae0f7 184 // write the header
cmkachur 4:4d26ba1ae0f7 185 fprintf(fp,"# FW_VER,REG0,REG1,REG2,REG3,REG4,REG5,REG6,REG7,REG8\r\n");
cmkachur 4:4d26ba1ae0f7 186
cmkachur 4:4d26ba1ae0f7 187 // write the firmware version
cmkachur 4:4d26ba1ae0f7 188 fprintf(fp,"%d,", fwVer);
cmkachur 4:4d26ba1ae0f7 189
cmkachur 4:4d26ba1ae0f7 190 // write all the configuration registers
cmkachur 4:4d26ba1ae0f7 191 for (cnt = 0; cnt < buffLen && cnt < MAX_CONFIG_REGS; ++cnt)
cmkachur 4:4d26ba1ae0f7 192 fprintf(fp,"0x%x,", pBuff[cnt]);
cmkachur 4:4d26ba1ae0f7 193
cmkachur 4:4d26ba1ae0f7 194 fflush(fp);
cmkachur 4:4d26ba1ae0f7 195 f_sync((FIL*)fp);
cmkachur 4:4d26ba1ae0f7 196 fclose(fp);
cmkachur 4:4d26ba1ae0f7 197 sd.unmount();
cmkachur 4:4d26ba1ae0f7 198
cmkachur 4:4d26ba1ae0f7 199 if (debug)
cmkachur 4:4d26ba1ae0f7 200 pc.printf("Closed cfg file %s\r\n",cfgFilePath);
cmkachur 4:4d26ba1ae0f7 201 }
cmkachur 4:4d26ba1ae0f7 202
cmkachur 4:4d26ba1ae0f7 203
cmkachur 6:96b0dbe76357 204 bool readCfgFile(char *paDirectory, sys_cfg_t *paSysCfg)
cmkachur 6:96b0dbe76357 205 {
cmkachur 6:96b0dbe76357 206 bool bRetVal = false;
ftagius 8:f8830b6c6d9b 207 FILE *fp;
cmkachur 6:96b0dbe76357 208 sys_cfg_t lSysCfg;
cmkachur 6:96b0dbe76357 209 typedef struct
cmkachur 6:96b0dbe76357 210 {
cmkachur 6:96b0dbe76357 211 const char *token;
cmkachur 6:96b0dbe76357 212 unsigned int *value;
cmkachur 6:96b0dbe76357 213 }token_map_t;
cmkachur 6:96b0dbe76357 214
cmkachur 6:96b0dbe76357 215 token_map_t tokenMap[] = { {"outdoor_mode", &lSysCfg.bOutdoorMode},
cmkachur 6:96b0dbe76357 216 {"noise_floor", &lSysCfg.noiseFloor},
cmkachur 6:96b0dbe76357 217 {"watchdog_threshold", &lSysCfg.wdogThresh},
cmkachur 6:96b0dbe76357 218 {"clear_stat", &lSysCfg.bClrStat},
cmkachur 6:96b0dbe76357 219 {"minimum_num_light", &lSysCfg.minNumLight},
cmkachur 6:96b0dbe76357 220 {"spike_reject", &lSysCfg.spikeRej},
cmkachur 6:96b0dbe76357 221 {"mask_disturber", &lSysCfg.maskDisturber},
cmkachur 13:3d717008645c 222 {"use_rtc", &lSysCfg.bUseRtc},
cmkachur 6:96b0dbe76357 223 };
cmkachur 6:96b0dbe76357 224 ConfigFile *plCfgFile;
cmkachur 6:96b0dbe76357 225 string fileName;
cmkachur 6:96b0dbe76357 226 int count = sizeof(tokenMap) / sizeof(token_map_t);
cmkachur 6:96b0dbe76357 227 char szValue[8];
cmkachur 6:96b0dbe76357 228
cmkachur 6:96b0dbe76357 229 if ((NULL == paDirectory) || (NULL == paSysCfg))
cmkachur 6:96b0dbe76357 230 return false;
cmkachur 6:96b0dbe76357 231
cmkachur 6:96b0dbe76357 232 // start with whatever configuration params are passed in, in case some params are not found in the file
cmkachur 6:96b0dbe76357 233 lSysCfg = *paSysCfg;
cmkachur 6:96b0dbe76357 234
cmkachur 6:96b0dbe76357 235 plCfgFile = new ConfigFile();
cmkachur 6:96b0dbe76357 236 fileName = paDirectory;
cmkachur 6:96b0dbe76357 237 fileName += "/";
cmkachur 6:96b0dbe76357 238 fileName += "zeus.cfg";
ftagius 8:f8830b6c6d9b 239
cmkachur 6:96b0dbe76357 240 sd.mount();
ftagius 8:f8830b6c6d9b 241 fp = fopen(fileName.c_str(), "r");
ftagius 9:15c9bf86d908 242 printf ("\n\rReading configuration file [%s]\n\r", fileName.c_str());
cmkachur 6:96b0dbe76357 243
cmkachur 6:96b0dbe76357 244 // try to read values from the configuration file
cmkachur 6:96b0dbe76357 245 if (plCfgFile->read((char *)fileName.c_str()))
cmkachur 6:96b0dbe76357 246 {
cmkachur 6:96b0dbe76357 247 for (int i = 0; i < count; ++i)
cmkachur 6:96b0dbe76357 248 {
cmkachur 6:96b0dbe76357 249 if (plCfgFile->getValue((char *)tokenMap[i].token, szValue, sizeof(szValue)))
cmkachur 6:96b0dbe76357 250 {
cmkachur 6:96b0dbe76357 251 if (1 == sscanf(szValue, "%d", tokenMap[i].value))
cmkachur 6:96b0dbe76357 252 {
cmkachur 6:96b0dbe76357 253 printf ("Convert success %s[%d]\n\r", tokenMap[i].token, *(tokenMap[i].value));
cmkachur 6:96b0dbe76357 254 }
cmkachur 6:96b0dbe76357 255 }
cmkachur 6:96b0dbe76357 256 }
ftagius 9:15c9bf86d908 257
cmkachur 6:96b0dbe76357 258 // copy out the new found values
cmkachur 6:96b0dbe76357 259 *paSysCfg = lSysCfg;
cmkachur 6:96b0dbe76357 260 bRetVal = true;
cmkachur 6:96b0dbe76357 261 }
cmkachur 6:96b0dbe76357 262 else
cmkachur 6:96b0dbe76357 263 {
cmkachur 6:96b0dbe76357 264 printf ("Failed to read configuration file[%s]\n\r", fileName.c_str());
cmkachur 6:96b0dbe76357 265
cmkachur 6:96b0dbe76357 266 // try to create a default configuration file
cmkachur 6:96b0dbe76357 267 for (int i = 0; i < count; ++i)
cmkachur 6:96b0dbe76357 268 {
cmkachur 6:96b0dbe76357 269 if (snprintf(szValue, sizeof(szValue), "%d", *(tokenMap[i].value)))
cmkachur 6:96b0dbe76357 270 {
cmkachur 6:96b0dbe76357 271 if (plCfgFile->setValue((char *)tokenMap[i].token, szValue))
cmkachur 6:96b0dbe76357 272 {
cmkachur 6:96b0dbe76357 273 printf ("Token creation success %s[%s]\n\r", tokenMap[i].token, szValue);
cmkachur 6:96b0dbe76357 274 }
cmkachur 6:96b0dbe76357 275 }
cmkachur 6:96b0dbe76357 276 }
cmkachur 6:96b0dbe76357 277 if (plCfgFile->write((char *)fileName.c_str(), NULL, DOS))
cmkachur 6:96b0dbe76357 278 printf ("Success: Created default configuration file [%s]\n\r", fileName.c_str());
cmkachur 6:96b0dbe76357 279 else
cmkachur 6:96b0dbe76357 280 printf ("Failed to create default configuration file [%s]\n\r", fileName.c_str());
cmkachur 6:96b0dbe76357 281 }
cmkachur 6:96b0dbe76357 282
cmkachur 6:96b0dbe76357 283 if (plCfgFile)
cmkachur 6:96b0dbe76357 284 delete plCfgFile;
cmkachur 6:96b0dbe76357 285
ftagius 10:499140eb469b 286 if (fp != NULL)
ftagius 9:15c9bf86d908 287 fclose(fp);
ftagius 9:15c9bf86d908 288
cmkachur 6:96b0dbe76357 289 sd.unmount();
cmkachur 6:96b0dbe76357 290 return bRetVal;
cmkachur 6:96b0dbe76357 291 }
cmkachur 6:96b0dbe76357 292
cmkachur 4:4d26ba1ae0f7 293
ftagius 0:3328df4c3116 294 int main()
ftagius 0:3328df4c3116 295 {
cmkachur 4:4d26ba1ae0f7 296 unsigned char regBuff[MAX_CONFIG_REGS];
ftagius 0:3328df4c3116 297 char c;
ftagius 0:3328df4c3116 298 Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
ftagius 0:3328df4c3116 299 const int refresh_Time = 1000; //refresh time in ms
ftagius 0:3328df4c3116 300 TSISensor tsi; // touch slider
ftagius 0:3328df4c3116 301 unsigned long measFreq;
ftagius 1:10d2a051285e 302 rdistance=-1;
ftagius 1:10d2a051285e 303 rinterrupt=-1;
ftagius 0:3328df4c3116 304 pc.baud(9600);
ftagius 0:3328df4c3116 305 // initializations for gps
ftagius 0:3328df4c3116 306 green = 1;
ftagius 0:3328df4c3116 307 gpsd.setBaud(9600);
ftagius 0:3328df4c3116 308 gpsd.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
ftagius 0:3328df4c3116 309 gpsd.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
ftagius 0:3328df4c3116 310 gpsd.sendCommand(PGCMD_ANTENNA);
ftagius 0:3328df4c3116 311 gpsd.day=01;
ftagius 0:3328df4c3116 312 gpsd.month=01;
ftagius 0:3328df4c3116 313 gpsd.year=15;
ftagius 0:3328df4c3116 314 gpsd.hour=1;
ftagius 0:3328df4c3116 315 gpsd.minute=1;
ftagius 0:3328df4c3116 316 gpsd.seconds=1;
ftagius 0:3328df4c3116 317 red = 1;
cmkachur 13:3d717008645c 318
ftagius 3:e3974328d808 319 pc.printf("Touch slider to start lightning detector application\r\n");
ftagius 0:3328df4c3116 320 while(1) {
ftagius 0:3328df4c3116 321 green = 1; // turn led off
ftagius 0:3328df4c3116 322 wait_ms(200);
ftagius 0:3328df4c3116 323 if (tsi.readPercentage())
ftagius 0:3328df4c3116 324 break;
ftagius 0:3328df4c3116 325 green = 0; // turn led on
ftagius 0:3328df4c3116 326 wait_ms(200);
ftagius 0:3328df4c3116 327 if (tsi.readPercentage())
ftagius 0:3328df4c3116 328 break;
ftagius 0:3328df4c3116 329 }
cmkachur 6:96b0dbe76357 330 //Mount the filesystem
cmkachur 6:96b0dbe76357 331 sd.mount();
cmkachur 6:96b0dbe76357 332 mkdir(directory, 0777);
cmkachur 6:96b0dbe76357 333 sd.unmount();
cmkachur 6:96b0dbe76357 334
cmkachur 6:96b0dbe76357 335 // read configuration values fro SD file system to allow override of defaults in sysCfg
cmkachur 6:96b0dbe76357 336 readCfgFile(directory, &sysCfg);
cmkachur 6:96b0dbe76357 337
ftagius 3:e3974328d808 338 pc.printf("\r\nInitialize lightning detector\r\n");
ftagius 0:3328df4c3116 339 //initializations for lightning detector
ftagius 0:3328df4c3116 340 ld.init();
ftagius 0:3328df4c3116 341 ld.clearStats();
ftagius 1:10d2a051285e 342
cmkachur 5:1d4fd419cfb7 343 /* The precision of the calibration will depend on the
cmkachur 5:1d4fd419cfb7 344 accuracy of the resonance frequency of the antenna. It is
cmkachur 5:1d4fd419cfb7 345 recommended to first trim the receiver antenna before the
cmkachur 5:1d4fd419cfb7 346 calibration of both oscillators is done.
cmkachur 5:1d4fd419cfb7 347 */
cmkachur 5:1d4fd419cfb7 348 measFreq = ld.tuneAntenna(IntLightning);
cmkachur 2:3edb129c60b2 349 ld.calibrateRCOs(IntLightning);
ftagius 1:10d2a051285e 350
cmkachur 6:96b0dbe76357 351 if (sysCfg.bOutdoorMode)
cmkachur 6:96b0dbe76357 352 ld.setOutdoors();
cmkachur 6:96b0dbe76357 353 else
cmkachur 6:96b0dbe76357 354 ld.setIndoors();
cmkachur 6:96b0dbe76357 355
cmkachur 6:96b0dbe76357 356 ld.setMinimumLightnings(sysCfg.minNumLight);
cmkachur 6:96b0dbe76357 357 ld.setSpikeRejection(sysCfg.spikeRej);
cmkachur 6:96b0dbe76357 358 ld.setNoiseFloor(sysCfg.noiseFloor);
cmkachur 4:4d26ba1ae0f7 359
cmkachur 6:96b0dbe76357 360 if (sysCfg.maskDisturber)
cmkachur 6:96b0dbe76357 361 ld.disableDisturbers();
cmkachur 6:96b0dbe76357 362 else
cmkachur 6:96b0dbe76357 363 ld.enableDisturbers();
cmkachur 6:96b0dbe76357 364
cmkachur 6:96b0dbe76357 365 ld.setWatchdogThreshold(sysCfg.wdogThresh);
ftagius 0:3328df4c3116 366 IntLightning.rise(&DetectLightning);
cmkachur 6:96b0dbe76357 367
cmkachur 6:96b0dbe76357 368 int MinLight = ld.getMinimumLightnings();
cmkachur 6:96b0dbe76357 369 int Noise = ld.getNoiseFloor();
cmkachur 6:96b0dbe76357 370 int TuneCap = ld.getTuneCap();
cmkachur 6:96b0dbe76357 371 int SpikeRej = ld.getSpikeRejection();
cmkachur 6:96b0dbe76357 372 int WatchDog = ld.getWatchdogThreshold();
ftagius 0:3328df4c3116 373
cmkachur 6:96b0dbe76357 374 pc.printf("\r\n Min lightning: %i", MinLight);
ftagius 0:3328df4c3116 375 pc.printf("\r\n");
ftagius 0:3328df4c3116 376 pc.printf(" Gain: 0x%02x\r\n",ld.getGain());
ftagius 0:3328df4c3116 377 pc.printf(" Noise: %i", Noise);
ftagius 0:3328df4c3116 378 pc.printf("\r\n");
ftagius 0:3328df4c3116 379 pc.printf(" Tune CAP: %i", TuneCap);
ftagius 0:3328df4c3116 380 pc.printf("\r\n");
ftagius 0:3328df4c3116 381 pc.printf(" Spike rej: %i", SpikeRej);
ftagius 0:3328df4c3116 382 pc.printf("\r\n");
ftagius 0:3328df4c3116 383 pc.printf(" Watchdog: %i", WatchDog);
ftagius 0:3328df4c3116 384 pc.printf("\r\n");
ftagius 0:3328df4c3116 385 pc.printf(" LCO calibration: %ld Hz\n\r", measFreq);
ftagius 0:3328df4c3116 386
ftagius 0:3328df4c3116 387 refresh_Timer.start(); //starts the clock on the timer
cmkachur 4:4d26ba1ae0f7 388
cmkachur 4:4d26ba1ae0f7 389 // get a copy of all config registers
cmkachur 4:4d26ba1ae0f7 390 ld.getConfigRegisters(regBuff, sizeof(regBuff));
cmkachur 4:4d26ba1ae0f7 391
cmkachur 6:96b0dbe76357 392 pc.printf("\n\rSystem Registers:\n\r");
cmkachur 6:96b0dbe76357 393 for (int i = 0; i < sizeof(regBuff); ++i)
cmkachur 6:96b0dbe76357 394 pc.printf("REG%d [0x%02x]:\n\r", i, regBuff[i]);
cmkachur 6:96b0dbe76357 395 pc.printf("\n\r");
cmkachur 6:96b0dbe76357 396
cmkachur 4:4d26ba1ae0f7 397 // write to the config file
cmkachur 4:4d26ba1ae0f7 398 writeCfgFile(regBuff, sizeof(regBuff), FW_VER);
ftagius 1:10d2a051285e 399
ftagius 0:3328df4c3116 400 bool gpsFix=false;
ftagius 8:f8830b6c6d9b 401 bool rtcRunning=false;
ftagius 0:3328df4c3116 402 while (1)
ftagius 0:3328df4c3116 403 {
ftagius 3:e3974328d808 404 if (OriginInt != -1)
ftagius 3:e3974328d808 405 {
ftagius 3:e3974328d808 406 // the ld detector generated an interrupt, log the event
ftagius 3:e3974328d808 407 IntLightning.disable_irq();
cmkachur 6:96b0dbe76357 408 writeLogFile(OriginInt,gDistance, energy);
cmkachur 13:3d717008645c 409
ftagius 3:e3974328d808 410 OriginInt = -1;
cmkachur 6:96b0dbe76357 411 gDistance = -1;
ftagius 3:e3974328d808 412 energy = -1;
ftagius 3:e3974328d808 413 IntLightning.enable_irq();
ftagius 3:e3974328d808 414 }
ftagius 3:e3974328d808 415
ftagius 0:3328df4c3116 416 c = gpsd.read(); //queries the GPS
ftagius 0:3328df4c3116 417 if (debug)
ftagius 0:3328df4c3116 418 {
ftagius 0:3328df4c3116 419 if (c) {
ftagius 0:3328df4c3116 420 printf("%c", c); //this line will echo the GPS data if not paused
ftagius 0:3328df4c3116 421 continue;
ftagius 0:3328df4c3116 422 }
ftagius 0:3328df4c3116 423 }
ftagius 0:3328df4c3116 424
ftagius 0:3328df4c3116 425 //check if we recieved a new message from GPS, if so, attempt to parse it,
cmkachur 13:3d717008645c 426 if ( gpsd.newNMEAreceived() )
cmkachur 13:3d717008645c 427 {
cmkachur 13:3d717008645c 428 if ( !gpsd.parse(gpsd.lastNMEA()) )
cmkachur 13:3d717008645c 429 {
ftagius 0:3328df4c3116 430 continue;
ftagius 0:3328df4c3116 431 }
cmkachur 13:3d717008645c 432 else
cmkachur 13:3d717008645c 433 {
cmkachur 13:3d717008645c 434 // if the rtc is not running, update the rtc clock with the latest gps time stamp
cmkachur 13:3d717008645c 435 if ( rtcRunning == false )
cmkachur 13:3d717008645c 436 {
cmkachur 13:3d717008645c 437 IntLightning.disable_irq();
cmkachur 13:3d717008645c 438 // update system time with the lastest gps time stamp
cmkachur 13:3d717008645c 439 SetDateTime(gpsd.year+2000,
cmkachur 13:3d717008645c 440 gpsd.month-1,
cmkachur 13:3d717008645c 441 gpsd.day,
cmkachur 13:3d717008645c 442 gpsd.hour,
cmkachur 13:3d717008645c 443 gpsd.minute,
cmkachur 13:3d717008645c 444 gpsd.seconds);
cmkachur 13:3d717008645c 445 IntLightning.enable_irq();
cmkachur 13:3d717008645c 446 }
cmkachur 13:3d717008645c 447 }
ftagius 0:3328df4c3116 448 }
ftagius 8:f8830b6c6d9b 449
ftagius 0:3328df4c3116 450 //check if enough time has passed to warrant printing GPS info to screen
ftagius 0:3328df4c3116 451 //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
ftagius 0:3328df4c3116 452 if (refresh_Timer.read_ms() >= refresh_Time)
ftagius 0:3328df4c3116 453 {
cmkachur 13:3d717008645c 454 if (green)
cmkachur 13:3d717008645c 455 green = 0;
cmkachur 13:3d717008645c 456 else
cmkachur 13:3d717008645c 457 green = 1;
cmkachur 13:3d717008645c 458
ftagius 0:3328df4c3116 459 if (gpsd.fix) {
ftagius 0:3328df4c3116 460 // got a gps fix
ftagius 0:3328df4c3116 461 if (gpsFix == false)
ftagius 0:3328df4c3116 462 {
ftagius 0:3328df4c3116 463 // first time fix obtained
ftagius 0:3328df4c3116 464 gpsFix = true;
cmkachur 13:3d717008645c 465
cmkachur 13:3d717008645c 466 if (sysCfg.bUseRtc)
ftagius 8:f8830b6c6d9b 467 {
cmkachur 13:3d717008645c 468 // bug check - rtc may not be running. check if it is incrementing
cmkachur 13:3d717008645c 469 time_t seconds_a = time(NULL); // get the current rtc second count
cmkachur 13:3d717008645c 470 wait(2); // wait two seconds
cmkachur 13:3d717008645c 471 time_t seconds_b = time(NULL); // get the current rtc second count
cmkachur 13:3d717008645c 472 if (seconds_a != seconds_b)
cmkachur 13:3d717008645c 473 {
cmkachur 13:3d717008645c 474 // rtc must be running
cmkachur 13:3d717008645c 475 rtcRunning = true;
cmkachur 13:3d717008645c 476 pc.printf("RTC is running\r\n");
cmkachur 13:3d717008645c 477 }
cmkachur 13:3d717008645c 478 else
cmkachur 13:3d717008645c 479 {
cmkachur 13:3d717008645c 480 // rtc is not running, we need to update the rtc every pass through the while loop
cmkachur 13:3d717008645c 481 rtcRunning = false; // the gps time will update the system time
cmkachur 13:3d717008645c 482 pc.printf("RTC is not running\r\n");
cmkachur 13:3d717008645c 483 }
ftagius 8:f8830b6c6d9b 484 }
cmkachur 13:3d717008645c 485 else
ftagius 8:f8830b6c6d9b 486 {
cmkachur 13:3d717008645c 487 rtcRunning = false; // the gps time will update the system clock time
ftagius 8:f8830b6c6d9b 488 }
ftagius 8:f8830b6c6d9b 489
cmkachur 13:3d717008645c 490 IntLightning.disable_irq();
cmkachur 13:3d717008645c 491 // set the system with the latest gps time
ftagius 8:f8830b6c6d9b 492 SetDateTime(gpsd.year+2000,
cmkachur 13:3d717008645c 493 gpsd.month-1,
cmkachur 13:3d717008645c 494 gpsd.day,
cmkachur 13:3d717008645c 495 gpsd.hour,
cmkachur 13:3d717008645c 496 gpsd.minute,
cmkachur 13:3d717008645c 497 gpsd.seconds);
cmkachur 13:3d717008645c 498 IntLightning.enable_irq();
cmkachur 13:3d717008645c 499
ftagius 0:3328df4c3116 500 pc.printf("GPS fix obtained on %02d/%02d/20%02d_%02d:%02d:%02d (UTC)\r\n",gpsd.month,gpsd.day,gpsd.year,gpsd.hour,gpsd.minute,gpsd.seconds);
cmkachur 13:3d717008645c 501
ftagius 0:3328df4c3116 502 pc.printf("Waiting for lighting detection...\r\n");
ftagius 0:3328df4c3116 503 }
ftagius 0:3328df4c3116 504 }
ftagius 0:3328df4c3116 505 else
ftagius 0:3328df4c3116 506 {
ftagius 3:e3974328d808 507 gpsFix = false;
ftagius 0:3328df4c3116 508 pc.printf("Waiting for GPS FIX\r\n");
ftagius 0:3328df4c3116 509 red = 0; // turn led on
ftagius 0:3328df4c3116 510 }
ftagius 0:3328df4c3116 511
ftagius 0:3328df4c3116 512 // restart the timer for the gps print loop
ftagius 0:3328df4c3116 513 refresh_Timer.reset();
ftagius 0:3328df4c3116 514 }
ftagius 0:3328df4c3116 515 }
ftagius 0:3328df4c3116 516 }