Updated
SDCard.cpp@0:1b17fef4fd93, 2019-01-05 (annotated)
- Committer:
- Swabey89
- Date:
- Sat Jan 05 15:02:40 2019 +0000
- Revision:
- 0:1b17fef4fd93
Updated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Swabey89 | 0:1b17fef4fd93 | 1 | #include "SDCard.hpp" |
Swabey89 | 0:1b17fef4fd93 | 2 | |
Swabey89 | 0:1b17fef4fd93 | 3 | char fileDir[30]; |
Swabey89 | 0:1b17fef4fd93 | 4 | |
Swabey89 | 0:1b17fef4fd93 | 5 | void SDcard(void) |
Swabey89 | 0:1b17fef4fd93 | 6 | { |
Swabey89 | 0:1b17fef4fd93 | 7 | SD_tout.attach(SD_toutISR,TOUT_TIME_DEF); |
Swabey89 | 0:1b17fef4fd93 | 8 | |
Swabey89 | 0:1b17fef4fd93 | 9 | //Initialise the SD card |
Swabey89 | 0:1b17fef4fd93 | 10 | if (sd.init() != 0) { |
Swabey89 | 0:1b17fef4fd93 | 11 | |
Swabey89 | 0:1b17fef4fd93 | 12 | printQueue.call(puts,"WARNING:SD CARD INITIALISATION FAILED\r"); |
Swabey89 | 0:1b17fef4fd93 | 13 | sd_init = false; |
Swabey89 | 0:1b17fef4fd93 | 14 | } |
Swabey89 | 0:1b17fef4fd93 | 15 | else |
Swabey89 | 0:1b17fef4fd93 | 16 | { |
Swabey89 | 0:1b17fef4fd93 | 17 | //Create a filing system for SD Card |
Swabey89 | 0:1b17fef4fd93 | 18 | fs = new FATFileSystem("sd", &sd); |
Swabey89 | 0:1b17fef4fd93 | 19 | |
Swabey89 | 0:1b17fef4fd93 | 20 | printQueue.call(puts,"SD CARD INITIALISED\r\n"); |
Swabey89 | 0:1b17fef4fd93 | 21 | |
Swabey89 | 0:1b17fef4fd93 | 22 | //Open to WRITE |
Swabey89 | 0:1b17fef4fd93 | 23 | timeLock.lock(); |
Swabey89 | 0:1b17fef4fd93 | 24 | seconds = time(NULL); |
Swabey89 | 0:1b17fef4fd93 | 25 | timeData = localtime(&seconds); |
Swabey89 | 0:1b17fef4fd93 | 26 | strftime(fileDir, 30, "sd/log_%d_%m_%y.csv", timeData); |
Swabey89 | 0:1b17fef4fd93 | 27 | timeLock.unlock(); |
Swabey89 | 0:1b17fef4fd93 | 28 | fp = fopen(fileDir,"a"); |
Swabey89 | 0:1b17fef4fd93 | 29 | |
Swabey89 | 0:1b17fef4fd93 | 30 | if (fp == NULL) |
Swabey89 | 0:1b17fef4fd93 | 31 | { |
Swabey89 | 0:1b17fef4fd93 | 32 | printQueue.call(puts,"WARNING: COULD NOT OPEN FILE FOR WRITE\r\n"); |
Swabey89 | 0:1b17fef4fd93 | 33 | } |
Swabey89 | 0:1b17fef4fd93 | 34 | else |
Swabey89 | 0:1b17fef4fd93 | 35 | { |
Swabey89 | 0:1b17fef4fd93 | 36 | printQueue.call(puts,"FILE OPEN FOR WRITING\r\n"); |
Swabey89 | 0:1b17fef4fd93 | 37 | sd_init = true; |
Swabey89 | 0:1b17fef4fd93 | 38 | } |
Swabey89 | 0:1b17fef4fd93 | 39 | fclose(fp); |
Swabey89 | 0:1b17fef4fd93 | 40 | } |
Swabey89 | 0:1b17fef4fd93 | 41 | SD_tout.detach(); |
Swabey89 | 0:1b17fef4fd93 | 42 | } |
Swabey89 | 0:1b17fef4fd93 | 43 | |
Swabey89 | 0:1b17fef4fd93 | 44 | void SDread(int n) |
Swabey89 | 0:1b17fef4fd93 | 45 | { |
Swabey89 | 0:1b17fef4fd93 | 46 | bufferLock.lock(); |
Swabey89 | 0:1b17fef4fd93 | 47 | SD_tout.attach(SD_toutISR,TOUT_TIME_SDREAD); |
Swabey89 | 0:1b17fef4fd93 | 48 | |
Swabey89 | 0:1b17fef4fd93 | 49 | //Read n samples from the SD card |
Swabey89 | 0:1b17fef4fd93 | 50 | unsigned int i=0; |
Swabey89 | 0:1b17fef4fd93 | 51 | unsigned int j = newestIndex; |
Swabey89 | 0:1b17fef4fd93 | 52 | if (n==-1) {n = (BUFFERSIZE-Nspaces);} |
Swabey89 | 0:1b17fef4fd93 | 53 | |
Swabey89 | 0:1b17fef4fd93 | 54 | while (i < n) |
Swabey89 | 0:1b17fef4fd93 | 55 | { |
Swabey89 | 0:1b17fef4fd93 | 56 | printQueue.call(printf,"Date/Time: %s\tTemperature: %5.2f\tPressure: %5.2f\tLight: %5.2f\n\r", buffer[j].getTime(), buffer[j].gettemp(), buffer[j].getpress(), buffer[j].getlight()); |
Swabey89 | 0:1b17fef4fd93 | 57 | j = (j?j:BUFFERSIZE)-1; |
Swabey89 | 0:1b17fef4fd93 | 58 | i++; |
Swabey89 | 0:1b17fef4fd93 | 59 | } |
Swabey89 | 0:1b17fef4fd93 | 60 | bufferLock.unlock(); |
Swabey89 | 0:1b17fef4fd93 | 61 | printQueue.call(printf,"%d records read\r\n\n", i); |
Swabey89 | 0:1b17fef4fd93 | 62 | SD_tout.detach(); |
Swabey89 | 0:1b17fef4fd93 | 63 | } |
Swabey89 | 0:1b17fef4fd93 | 64 | |
Swabey89 | 0:1b17fef4fd93 | 65 | void SDdelete(int n) |
Swabey89 | 0:1b17fef4fd93 | 66 | { |
Swabey89 | 0:1b17fef4fd93 | 67 | bufferLock.lock(); |
Swabey89 | 0:1b17fef4fd93 | 68 | SD_tout.attach(SD_toutISR,TOUT_TIME_DEF); |
Swabey89 | 0:1b17fef4fd93 | 69 | |
Swabey89 | 0:1b17fef4fd93 | 70 | //Delete n samples from the SD card |
Swabey89 | 0:1b17fef4fd93 | 71 | unsigned int i = 0; |
Swabey89 | 0:1b17fef4fd93 | 72 | if (n==-1) {n = (BUFFERSIZE-Nspaces);} |
Swabey89 | 0:1b17fef4fd93 | 73 | while (i < n) |
Swabey89 | 0:1b17fef4fd93 | 74 | { |
Swabey89 | 0:1b17fef4fd93 | 75 | spaceAvailable.release(); |
Swabey89 | 0:1b17fef4fd93 | 76 | i++; |
Swabey89 | 0:1b17fef4fd93 | 77 | } |
Swabey89 | 0:1b17fef4fd93 | 78 | bufferLock.unlock(); |
Swabey89 | 0:1b17fef4fd93 | 79 | Nspaces += i; |
Swabey89 | 0:1b17fef4fd93 | 80 | |
Swabey89 | 0:1b17fef4fd93 | 81 | printQueue.call(printf,"Deleted %d records\r\n\n\n", i); |
Swabey89 | 0:1b17fef4fd93 | 82 | SD_tout.detach(); |
Swabey89 | 0:1b17fef4fd93 | 83 | } |
Swabey89 | 0:1b17fef4fd93 | 84 | |
Swabey89 | 0:1b17fef4fd93 | 85 | |
Swabey89 | 0:1b17fef4fd93 | 86 | void SDaddSample(string timedata, double temp, double pressure, float light, int buffind) |
Swabey89 | 0:1b17fef4fd93 | 87 | { |
Swabey89 | 0:1b17fef4fd93 | 88 | if(sd_init) |
Swabey89 | 0:1b17fef4fd93 | 89 | { |
Swabey89 | 0:1b17fef4fd93 | 90 | timeLock.lock(); |
Swabey89 | 0:1b17fef4fd93 | 91 | seconds = time(NULL); |
Swabey89 | 0:1b17fef4fd93 | 92 | timeData = localtime(&seconds); |
Swabey89 | 0:1b17fef4fd93 | 93 | strftime(fileDir, 20, "sd/log_%d_%m_%y.csv", timeData); |
Swabey89 | 0:1b17fef4fd93 | 94 | timeLock.unlock(); |
Swabey89 | 0:1b17fef4fd93 | 95 | |
Swabey89 | 0:1b17fef4fd93 | 96 | fp = fopen(fileDir,"a"); |
Swabey89 | 0:1b17fef4fd93 | 97 | |
Swabey89 | 0:1b17fef4fd93 | 98 | if (fp == NULL) |
Swabey89 | 0:1b17fef4fd93 | 99 | { |
Swabey89 | 0:1b17fef4fd93 | 100 | printQueue.call(puts,"WARNING: FILE COULD NOT BE OPENED\r\n"); |
Swabey89 | 0:1b17fef4fd93 | 101 | sd_init = false; |
Swabey89 | 0:1b17fef4fd93 | 102 | samplesInBuffer.release(); |
Swabey89 | 0:1b17fef4fd93 | 103 | bufferLock.lock(); |
Swabey89 | 0:1b17fef4fd93 | 104 | oldestIndex = (oldestIndex?oldestIndex:BUFFERSIZE)-1; //Doesn't work properly - oldestindex will be increased by the conditional statement in the producer |
Swabey89 | 0:1b17fef4fd93 | 105 | bufferLock.unlock(); |
Swabey89 | 0:1b17fef4fd93 | 106 | } |
Swabey89 | 0:1b17fef4fd93 | 107 | else |
Swabey89 | 0:1b17fef4fd93 | 108 | { |
Swabey89 | 0:1b17fef4fd93 | 109 | fprintf(fp,"%s,%5.2f,%5.2f,%5.2f\r", timedata, temp, pressure, light); |
Swabey89 | 0:1b17fef4fd93 | 110 | fclose(fp); |
Swabey89 | 0:1b17fef4fd93 | 111 | } |
Swabey89 | 0:1b17fef4fd93 | 112 | |
Swabey89 | 0:1b17fef4fd93 | 113 | if(logging && sd_init) |
Swabey89 | 0:1b17fef4fd93 | 114 | { |
Swabey89 | 0:1b17fef4fd93 | 115 | printQueue.call(printf,"Log file %s updated with sample from position %d in buffer\r\nnewestIndex position %d\r\noldestIndex position %d\r\n\n", fileDir, buffind, newestIndex, oldestIndex); |
Swabey89 | 0:1b17fef4fd93 | 116 | } |
Swabey89 | 0:1b17fef4fd93 | 117 | } |
Swabey89 | 0:1b17fef4fd93 | 118 | else |
Swabey89 | 0:1b17fef4fd93 | 119 | { |
Swabey89 | 0:1b17fef4fd93 | 120 | samplesInBuffer.release(); |
Swabey89 | 0:1b17fef4fd93 | 121 | bufferLock.lock(); |
Swabey89 | 0:1b17fef4fd93 | 122 | oldestIndex = (oldestIndex?oldestIndex:BUFFERSIZE)-1; //Doesn't work properly - oldestindex will be increased by the conditional statement in the producer |
Swabey89 | 0:1b17fef4fd93 | 123 | bufferLock.unlock(); |
Swabey89 | 0:1b17fef4fd93 | 124 | } |
Swabey89 | 0:1b17fef4fd93 | 125 | } |
Swabey89 | 0:1b17fef4fd93 | 126 | |
Swabey89 | 0:1b17fef4fd93 | 127 | void SDmount(void) |
Swabey89 | 0:1b17fef4fd93 | 128 | { |
Swabey89 | 0:1b17fef4fd93 | 129 | SD_tout.attach(SD_toutISR,TOUT_TIME_DEF); |
Swabey89 | 0:1b17fef4fd93 | 130 | |
Swabey89 | 0:1b17fef4fd93 | 131 | if (sd_init) |
Swabey89 | 0:1b17fef4fd93 | 132 | { |
Swabey89 | 0:1b17fef4fd93 | 133 | fclose(fp); |
Swabey89 | 0:1b17fef4fd93 | 134 | sd.deinit(); |
Swabey89 | 0:1b17fef4fd93 | 135 | sd_init = false; |
Swabey89 | 0:1b17fef4fd93 | 136 | |
Swabey89 | 0:1b17fef4fd93 | 137 | printQueue.call(puts,"SD CARD UNMOUNTED\r\n"); |
Swabey89 | 0:1b17fef4fd93 | 138 | |
Swabey89 | 0:1b17fef4fd93 | 139 | LCDqueue.call(LCD_sdcardmount,"SD UNMOUNTED..", 0.05, greenLED); |
Swabey89 | 0:1b17fef4fd93 | 140 | |
Swabey89 | 0:1b17fef4fd93 | 141 | |
Swabey89 | 0:1b17fef4fd93 | 142 | } |
Swabey89 | 0:1b17fef4fd93 | 143 | else |
Swabey89 | 0:1b17fef4fd93 | 144 | { |
Swabey89 | 0:1b17fef4fd93 | 145 | SDcard(); |
Swabey89 | 0:1b17fef4fd93 | 146 | |
Swabey89 | 0:1b17fef4fd93 | 147 | if (sd_init) |
Swabey89 | 0:1b17fef4fd93 | 148 | { |
Swabey89 | 0:1b17fef4fd93 | 149 | LCDqueue.call(LCD_sdcardmount,"SD MOUNTED..", 0.05, greenLED); |
Swabey89 | 0:1b17fef4fd93 | 150 | } |
Swabey89 | 0:1b17fef4fd93 | 151 | else |
Swabey89 | 0:1b17fef4fd93 | 152 | { |
Swabey89 | 0:1b17fef4fd93 | 153 | LCDqueue.call(LCD_sdcardmount,"SD FAILED..", 0.05, redLED); //pass in LED to flash RED |
Swabey89 | 0:1b17fef4fd93 | 154 | } |
Swabey89 | 0:1b17fef4fd93 | 155 | |
Swabey89 | 0:1b17fef4fd93 | 156 | } |
Swabey89 | 0:1b17fef4fd93 | 157 | SD_tout.detach(); |
Swabey89 | 0:1b17fef4fd93 | 158 | } |
Swabey89 | 0:1b17fef4fd93 | 159 | |
Swabey89 | 0:1b17fef4fd93 | 160 | void SD_toutISR(void) |
Swabey89 | 0:1b17fef4fd93 | 161 | { |
Swabey89 | 0:1b17fef4fd93 | 162 | threadstates |= SD; |
Swabey89 | 0:1b17fef4fd93 | 163 | } |
Swabey89 | 0:1b17fef4fd93 | 164 |