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