basic lightning detector with gps and sd card logging
Dependencies: AS3935 AdafruitGPS SDFileSystem TSI mbed ConfigFile
main.cpp.orig@12:7c58c7a6b25c, 2015-07-01 (annotated)
- Committer:
- cmkachur
- Date:
- Wed Jul 01 19:39:05 2015 +0000
- Revision:
- 12:7c58c7a6b25c
Update FW version. Add 2 ms delay in ISR per the AS3935 data sheet.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |