SD card functionality

Dependents:   ELEC350_Project2 SDcard

Committer:
Swabey89
Date:
Thu Jan 03 12:18:25 2019 +0000
Revision:
17:c9ac3fc764b9
Parent:
16:23b3be671415
Updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Swabey89 0:0fc2cf27ff9e 1 #include "SDCard.hpp"
Swabey89 7:393fa8184388 2 #include <string>
Swabey89 3:c6e5dd2faa22 3
Swabey89 1:c3af0c26ded2 4 void SDcard(void)
Swabey89 0:0fc2cf27ff9e 5 {
Swabey89 14:8e92eb9fc088 6 SD_tout.attach(SD_toutISR,TOUT_TIME_DEF);
Swabey89 13:5f786448e883 7
Swabey89 17:c9ac3fc764b9 8 //static time_t seconds; //static reqiured?
Swabey89 0:0fc2cf27ff9e 9
Swabey89 2:9a5eea2adbf8 10 //Initialise the SD card
Swabey89 8:ee8f65745141 11 if (sd.init() != 0) {
Swabey89 15:e1f62dd17e3c 12 /*
Swabey89 10:f2b8e3b587d5 13 printlock.lock();
Swabey89 8:ee8f65745141 14 pc->printf("WARNING:SD CARD INITIALISATION FAILED\n\r");
Swabey89 10:f2b8e3b587d5 15 printlock.unlock();
Swabey89 15:e1f62dd17e3c 16 */
Swabey89 17:c9ac3fc764b9 17 printQueue.call(puts,"WARNING:SD CARD INITIALISATION FAILED\r");
Swabey89 8:ee8f65745141 18 sd_init = false;
Swabey89 8:ee8f65745141 19 //lcd.cls();
Swabey89 8:ee8f65745141 20 //lcd.printf("CANNOT INIT SD");
Swabey89 8:ee8f65745141 21 //errorCode(FATAL);
Swabey89 2:9a5eea2adbf8 22 }
Swabey89 8:ee8f65745141 23 else
Swabey89 8:ee8f65745141 24 {
Swabey89 8:ee8f65745141 25 //Create a filing system for SD Card
Swabey89 8:ee8f65745141 26 fs = new FATFileSystem("sd", &sd);
Swabey89 15:e1f62dd17e3c 27 /*
Swabey89 10:f2b8e3b587d5 28 printlock.lock();
Swabey89 13:5f786448e883 29 pc->printf("\nSD CARD INITIALISED\n\r");
Swabey89 10:f2b8e3b587d5 30 printlock.unlock();
Swabey89 15:e1f62dd17e3c 31 */
Swabey89 17:c9ac3fc764b9 32 printQueue.call(puts,"\nSD CARD INITIALISED\r\n");
Swabey89 7:393fa8184388 33
Swabey89 8:ee8f65745141 34 //Open to WRITE
Swabey89 17:c9ac3fc764b9 35 //char fileDate[30];
Swabey89 10:f2b8e3b587d5 36 timeLock.lock();
Swabey89 8:ee8f65745141 37 seconds = time(NULL);
Swabey89 8:ee8f65745141 38 timeData = localtime(&seconds);
Swabey89 17:c9ac3fc764b9 39 //set_time(mktime(timeData));
Swabey89 8:ee8f65745141 40 strftime(fileDate, 30, "sd/log_%d_%m_%y.csv", timeData);
Swabey89 10:f2b8e3b587d5 41 timeLock.unlock();
Swabey89 8:ee8f65745141 42 fp = fopen(fileDate,"a");
Swabey89 8:ee8f65745141 43
Swabey89 8:ee8f65745141 44 if (fp == NULL)
Swabey89 8:ee8f65745141 45 {
Swabey89 15:e1f62dd17e3c 46 /*
Swabey89 10:f2b8e3b587d5 47 printlock.lock();
Swabey89 8:ee8f65745141 48 pc->printf("WARNING: COULD NOT OPEN FILE FOR WRITE\n\r");
Swabey89 10:f2b8e3b587d5 49 printlock.unlock();
Swabey89 15:e1f62dd17e3c 50 */
Swabey89 17:c9ac3fc764b9 51 printQueue.call(puts,"WARNING: COULD NOT OPEN FILE FOR WRITE\r\n");
Swabey89 8:ee8f65745141 52 //lcd.cls();
Swabey89 8:ee8f65745141 53 //lcd.printf("CANNOT OPEN FILE\n\n");
Swabey89 8:ee8f65745141 54 //errorCode(FATAL);
Swabey89 8:ee8f65745141 55 }
Swabey89 8:ee8f65745141 56 else
Swabey89 8:ee8f65745141 57 {
Swabey89 15:e1f62dd17e3c 58 /*
Swabey89 10:f2b8e3b587d5 59 printlock.lock();
Swabey89 10:f2b8e3b587d5 60 pc->printf("FILE OPEN FOR WRITING\n\n\n\r");
Swabey89 10:f2b8e3b587d5 61 printlock.unlock();
Swabey89 15:e1f62dd17e3c 62 */
Swabey89 17:c9ac3fc764b9 63 printQueue.call(puts,"FILE OPEN FOR WRITING\r\n");
Swabey89 8:ee8f65745141 64 sd_init = true;
Swabey89 8:ee8f65745141 65 }
Swabey89 8:ee8f65745141 66 fclose(fp);
Swabey89 8:ee8f65745141 67 }
Swabey89 13:5f786448e883 68 SD_tout.detach();
Swabey89 1:c3af0c26ded2 69 }
Swabey89 1:c3af0c26ded2 70
Swabey89 1:c3af0c26ded2 71 void SDread(int n)
Swabey89 15:e1f62dd17e3c 72 {
Swabey89 15:e1f62dd17e3c 73 //printlock.lock();
Swabey89 15:e1f62dd17e3c 74 bufferLock.lock();
Swabey89 14:8e92eb9fc088 75 SD_tout.attach(SD_toutISR,TOUT_TIME_SDREAD);
Swabey89 12:3198f0b7b36f 76 //Read n samples from the SD card
Swabey89 12:3198f0b7b36f 77 unsigned int i=0;
Swabey89 12:3198f0b7b36f 78 unsigned int j = newestIndex;
Swabey89 15:e1f62dd17e3c 79 if (n==-1) {n = (BUFFERSIZE-Nspaces);}
Swabey89 15:e1f62dd17e3c 80
Swabey89 12:3198f0b7b36f 81 while (i < n) //ONLY USE SPACE AVAILABLE - KEEP IN MIND LAST READ WAS BEFORE IT WAS DECREMENTED
Swabey89 15:e1f62dd17e3c 82 {
Swabey89 15:e1f62dd17e3c 83 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 15:e1f62dd17e3c 84 //pc->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 12:3198f0b7b36f 85 j = (j?j:BUFFERSIZE)-1;
Swabey89 12:3198f0b7b36f 86 i++;
Swabey89 12:3198f0b7b36f 87 }
Swabey89 12:3198f0b7b36f 88 bufferLock.unlock();
Swabey89 15:e1f62dd17e3c 89 printQueue.call(printf,"%d records read\r\n\n", i);
Swabey89 15:e1f62dd17e3c 90 //printf("%d records read\r\n\n", i);
Swabey89 15:e1f62dd17e3c 91 //printlock.unlock();
Swabey89 15:e1f62dd17e3c 92 SD_tout.detach();
Swabey89 2:9a5eea2adbf8 93 }
Swabey89 2:9a5eea2adbf8 94
Swabey89 12:3198f0b7b36f 95 void SDdelete(int n) //MUST RELEASE SPACE AVAILABLE
Swabey89 2:9a5eea2adbf8 96 {
Swabey89 15:e1f62dd17e3c 97 bufferLock.lock();
Swabey89 14:8e92eb9fc088 98 SD_tout.attach(SD_toutISR,TOUT_TIME_DEF);
Swabey89 3:c6e5dd2faa22 99 //Delete n samples from the SD card
Swabey89 12:3198f0b7b36f 100 unsigned int i = 0;
Swabey89 12:3198f0b7b36f 101 if (n==-1) {n = (BUFFERSIZE-Nspaces);}
Swabey89 12:3198f0b7b36f 102 while (i < n)
Swabey89 11:89960c1f2234 103 {
Swabey89 12:3198f0b7b36f 104 spaceAvailable.release();
Swabey89 12:3198f0b7b36f 105 i++;
Swabey89 11:89960c1f2234 106 }
Swabey89 12:3198f0b7b36f 107 bufferLock.unlock();
Swabey89 15:e1f62dd17e3c 108 Nspaces += i;
Swabey89 15:e1f62dd17e3c 109 /*
Swabey89 12:3198f0b7b36f 110 printlock.lock();
Swabey89 12:3198f0b7b36f 111 pc->printf("Deleted %d records\r\n\n\n", i);
Swabey89 12:3198f0b7b36f 112 printlock.unlock();
Swabey89 15:e1f62dd17e3c 113 */
Swabey89 15:e1f62dd17e3c 114 printQueue.call(printf,"Deleted %d records\r\n\n\n", i);
Swabey89 13:5f786448e883 115 SD_tout.detach();
Swabey89 1:c3af0c26ded2 116 }
Swabey89 1:c3af0c26ded2 117
Swabey89 10:f2b8e3b587d5 118
Swabey89 15:e1f62dd17e3c 119 void SDaddSample(string timedata, double temp, double pressure, float light, int buffind)
Swabey89 15:e1f62dd17e3c 120 {
Swabey89 15:e1f62dd17e3c 121 if(sd_init)
Swabey89 15:e1f62dd17e3c 122 {
Swabey89 17:c9ac3fc764b9 123 //static time_t seconds;
Swabey89 17:c9ac3fc764b9 124 //char fileDate[20];
Swabey89 15:e1f62dd17e3c 125 timeLock.lock();
Swabey89 15:e1f62dd17e3c 126 seconds = time(NULL);
Swabey89 17:c9ac3fc764b9 127 timeData = localtime(&seconds);
Swabey89 17:c9ac3fc764b9 128 //set_time(mktime(timeData));
Swabey89 17:c9ac3fc764b9 129 strftime(fileDate, 20, "sd/log_%d_%m_%y.csv", timeData);
Swabey89 15:e1f62dd17e3c 130 timeLock.unlock();
Swabey89 15:e1f62dd17e3c 131
Swabey89 16:23b3be671415 132 fp = fopen(fileDate,"a");
Swabey89 15:e1f62dd17e3c 133
Swabey89 15:e1f62dd17e3c 134 if (fp == NULL)
Swabey89 15:e1f62dd17e3c 135 {
Swabey89 15:e1f62dd17e3c 136 /*
Swabey89 15:e1f62dd17e3c 137 printlock.lock();
Swabey89 15:e1f62dd17e3c 138 pc->printf("WARNING: FILE COULD NOT BE OPENED\r\n\n");
Swabey89 15:e1f62dd17e3c 139 sd_init = false;
Swabey89 15:e1f62dd17e3c 140 printlock.unlock();
Swabey89 15:e1f62dd17e3c 141 */
Swabey89 17:c9ac3fc764b9 142 printQueue.call(puts,"WARNING: FILE COULD NOT BE OPENED\r\n");
Swabey89 15:e1f62dd17e3c 143 sd_init = false;
Swabey89 15:e1f62dd17e3c 144 samplesInBuffer.release();
Swabey89 16:23b3be671415 145 oldestIndex = (oldestIndex?oldestIndex:BUFFERSIZE)-1; //Doesn't work properly - oldestindex will be increased by the conditional statement in the producer
Swabey89 15:e1f62dd17e3c 146 }
Swabey89 15:e1f62dd17e3c 147 else
Swabey89 15:e1f62dd17e3c 148 {
Swabey89 15:e1f62dd17e3c 149 fprintf(fp,"%s,%5.2f,%5.2f,%5.2f\r", timedata, temp, pressure, light);
Swabey89 15:e1f62dd17e3c 150 fclose(fp);
Swabey89 15:e1f62dd17e3c 151 }
Swabey89 15:e1f62dd17e3c 152
Swabey89 16:23b3be671415 153 if(logging && sd_init)
Swabey89 15:e1f62dd17e3c 154 {
Swabey89 15:e1f62dd17e3c 155 /*
Swabey89 15:e1f62dd17e3c 156 printlock.lock();
Swabey89 15:e1f62dd17e3c 157 pc->printf("Log file %s updated with sample from position %d in buffer\r\n",fileDate,oldestIndex);
Swabey89 15:e1f62dd17e3c 158 pc->printf("newestIndex position %d\r\n",newestIndex);
Swabey89 15:e1f62dd17e3c 159 pc->printf("oldestIndex position %d\r\n\n",oldestIndex);
Swabey89 15:e1f62dd17e3c 160 printlock.unlock();
Swabey89 15:e1f62dd17e3c 161 */
Swabey89 16:23b3be671415 162 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", fileDate, buffind, newestIndex, oldestIndex);
Swabey89 16:23b3be671415 163 //printQueue.call(printf,"Log file updated with sample from position %d in buffer\r\nnewestIndex position %d\r\noldestIndex position %d\r\n\n", buffind, newestIndex, oldestIndex);
Swabey89 15:e1f62dd17e3c 164 }
Swabey89 15:e1f62dd17e3c 165 }
Swabey89 16:23b3be671415 166 else
Swabey89 16:23b3be671415 167 {
Swabey89 16:23b3be671415 168 samplesInBuffer.release();
Swabey89 16:23b3be671415 169 oldestIndex = (oldestIndex?oldestIndex:BUFFERSIZE)-1; //Doesn't work properly - oldestindex will be increased by the conditional statement in the producer
Swabey89 16:23b3be671415 170 }
Swabey89 15:e1f62dd17e3c 171 }
Swabey89 15:e1f62dd17e3c 172
Swabey89 15:e1f62dd17e3c 173 /*
Swabey89 15:e1f62dd17e3c 174 void SDaddSample(void)
Swabey89 15:e1f62dd17e3c 175 {
Swabey89 15:e1f62dd17e3c 176
Swabey89 15:e1f62dd17e3c 177 static time_t seconds;
Swabey89 15:e1f62dd17e3c 178 char fileDate[30];
Swabey89 15:e1f62dd17e3c 179 timeLock.lock();
Swabey89 15:e1f62dd17e3c 180 seconds = time(NULL);
Swabey89 15:e1f62dd17e3c 181 timeData = localtime(&seconds);
Swabey89 15:e1f62dd17e3c 182
Swabey89 15:e1f62dd17e3c 183 //set_time(mktime(timeData));
Swabey89 15:e1f62dd17e3c 184
Swabey89 15:e1f62dd17e3c 185 strftime(fileDate, 30, "sd/log_%d_%m_%y.csv", timeData);
Swabey89 15:e1f62dd17e3c 186 timeLock.unlock();
Swabey89 15:e1f62dd17e3c 187
Swabey89 15:e1f62dd17e3c 188 fp = fopen(fileDate,"a"); //issue if file already open?
Swabey89 15:e1f62dd17e3c 189
Swabey89 15:e1f62dd17e3c 190 bufferLock.lock();
Swabey89 15:e1f62dd17e3c 191
Swabey89 15:e1f62dd17e3c 192 if (fp == NULL)
Swabey89 15:e1f62dd17e3c 193 {
Swabey89 15:e1f62dd17e3c 194 printlock.lock();
Swabey89 15:e1f62dd17e3c 195 pc->printf("WARNING: FILE COULD NOT BE OPENED\r\n\n");
Swabey89 15:e1f62dd17e3c 196 sd_init = false;
Swabey89 15:e1f62dd17e3c 197 printlock.unlock();
Swabey89 15:e1f62dd17e3c 198 samplesInBuffer.release();
Swabey89 15:e1f62dd17e3c 199 }
Swabey89 15:e1f62dd17e3c 200 else
Swabey89 15:e1f62dd17e3c 201 {
Swabey89 15:e1f62dd17e3c 202 //oldestIndex = (oldestIndex+1) % BUFFERSIZE;
Swabey89 15:e1f62dd17e3c 203 fprintf(fp,"%s,%5.2f,%5.2f,%5.2f\r", buffer[oldestIndex].getTime(), buffer[oldestIndex].gettemp(), buffer[oldestIndex].getpress(), buffer[oldestIndex].getlight());
Swabey89 15:e1f62dd17e3c 204 }
Swabey89 15:e1f62dd17e3c 205
Swabey89 15:e1f62dd17e3c 206 if(logging)
Swabey89 15:e1f62dd17e3c 207 {
Swabey89 15:e1f62dd17e3c 208 printlock.lock();
Swabey89 15:e1f62dd17e3c 209 pc->printf("Log file %s updated with sample from position %d in buffer\r\n",fileDate,oldestIndex);
Swabey89 15:e1f62dd17e3c 210 pc->printf("newestIndex position %d\r\n",newestIndex);
Swabey89 15:e1f62dd17e3c 211 pc->printf("oldestIndex position %d\r\n\n",oldestIndex);
Swabey89 15:e1f62dd17e3c 212 printlock.unlock();
Swabey89 15:e1f62dd17e3c 213 }
Swabey89 15:e1f62dd17e3c 214
Swabey89 15:e1f62dd17e3c 215 fclose(fp);
Swabey89 15:e1f62dd17e3c 216 bufferLock.unlock();
Swabey89 15:e1f62dd17e3c 217 }
Swabey89 15:e1f62dd17e3c 218
Swabey89 15:e1f62dd17e3c 219 */
Swabey89 10:f2b8e3b587d5 220
Swabey89 10:f2b8e3b587d5 221 //UNUSED
Swabey89 15:e1f62dd17e3c 222 /*
Swabey89 1:c3af0c26ded2 223 void SDalive(void)
Swabey89 1:c3af0c26ded2 224 {
Swabey89 3:c6e5dd2faa22 225 //Signal that the SD thread is still alive
Swabey89 2:9a5eea2adbf8 226 //puts("SD THREAD ALIVE\n");
Swabey89 7:393fa8184388 227 }
Swabey89 15:e1f62dd17e3c 228 */
Swabey89 7:393fa8184388 229
Swabey89 9:113f4934b907 230 void SDmount(void)
Swabey89 9:113f4934b907 231 {
Swabey89 15:e1f62dd17e3c 232 //while(true)
Swabey89 15:e1f62dd17e3c 233 //{
Swabey89 15:e1f62dd17e3c 234 //Thread::signal_wait(SIGNAL_SD);
Swabey89 13:5f786448e883 235
Swabey89 14:8e92eb9fc088 236 SD_tout.attach(SD_toutISR,TOUT_TIME_SDMOUNT);
Swabey89 13:5f786448e883 237
Swabey89 9:113f4934b907 238 if (sd_init)
Swabey89 9:113f4934b907 239 {
Swabey89 9:113f4934b907 240 fclose(fp);
Swabey89 9:113f4934b907 241 sd.deinit();
Swabey89 14:8e92eb9fc088 242 sd_init = false;
Swabey89 15:e1f62dd17e3c 243 /*
Swabey89 10:f2b8e3b587d5 244 printlock.lock();
Swabey89 9:113f4934b907 245 pc->printf("SD CARD UNMOUNTED\n\r");
Swabey89 10:f2b8e3b587d5 246 printlock.unlock();
Swabey89 15:e1f62dd17e3c 247 */
Swabey89 17:c9ac3fc764b9 248 printQueue.call(puts,"SD CARD UNMOUNTED\r\n");
Swabey89 10:f2b8e3b587d5 249
Swabey89 15:e1f62dd17e3c 250 //LCDlock.lock();
Swabey89 15:e1f62dd17e3c 251 //lcd.cls();
Swabey89 15:e1f62dd17e3c 252 //lcd.printf("SD UNMOUNTED..");
Swabey89 15:e1f62dd17e3c 253 //LCDqueue.call(LCD_text,"SD UNMOUNTED..");
Swabey89 15:e1f62dd17e3c 254 //Thread::wait(5000); //Dont like this
Swabey89 15:e1f62dd17e3c 255
Swabey89 15:e1f62dd17e3c 256 //for(int i=0;i<20;i++)
Swabey89 15:e1f62dd17e3c 257 //{
Swabey89 15:e1f62dd17e3c 258 // greenLED = 1;
Swabey89 15:e1f62dd17e3c 259 //wait(0.5);
Swabey89 15:e1f62dd17e3c 260 //greenLED = 0;
Swabey89 15:e1f62dd17e3c 261 //wait(0.5);
Swabey89 15:e1f62dd17e3c 262 //}
Swabey89 15:e1f62dd17e3c 263 //LCDlock.unlock();
Swabey89 15:e1f62dd17e3c 264
Swabey89 15:e1f62dd17e3c 265 LCDqueue.call(LCD_sdcardmount,"SD UNMOUNTED..", 0.05);
Swabey89 15:e1f62dd17e3c 266
Swabey89 9:113f4934b907 267
Swabey89 9:113f4934b907 268 }
Swabey89 9:113f4934b907 269 else
Swabey89 9:113f4934b907 270 {
Swabey89 9:113f4934b907 271 SDcard();
Swabey89 15:e1f62dd17e3c 272 //LCDlock.lock();
Swabey89 15:e1f62dd17e3c 273 //lcd.cls();
Swabey89 10:f2b8e3b587d5 274 if (sd_init)
Swabey89 10:f2b8e3b587d5 275 {
Swabey89 15:e1f62dd17e3c 276 //lcd.printf("SD MOUNTED..");
Swabey89 15:e1f62dd17e3c 277 //LCDqueue.call(LCD_text,"SD MOUNTED..");
Swabey89 15:e1f62dd17e3c 278 LCDqueue.call(LCD_sdcardmount,"SD MOUNTED..", 0.05);
Swabey89 10:f2b8e3b587d5 279 }
Swabey89 10:f2b8e3b587d5 280 else
Swabey89 10:f2b8e3b587d5 281 {
Swabey89 15:e1f62dd17e3c 282 //lcd.printf("SD FAILED..");
Swabey89 15:e1f62dd17e3c 283 LCDqueue.call(LCD_sdcardmount,"SD FAILED..", 0.05); //pass in LED to flash RED
Swabey89 10:f2b8e3b587d5 284 }
Swabey89 15:e1f62dd17e3c 285
Swabey89 15:e1f62dd17e3c 286 /*
Swabey89 15:e1f62dd17e3c 287 for(int i=0;i<20;i++)
Swabey89 15:e1f62dd17e3c 288 {
Swabey89 15:e1f62dd17e3c 289 greenLED = 1;
Swabey89 15:e1f62dd17e3c 290 wait(0.5);
Swabey89 15:e1f62dd17e3c 291 greenLED = 0;
Swabey89 15:e1f62dd17e3c 292 wait(0.5);
Swabey89 15:e1f62dd17e3c 293 }
Swabey89 15:e1f62dd17e3c 294 */
Swabey89 15:e1f62dd17e3c 295
Swabey89 15:e1f62dd17e3c 296
Swabey89 15:e1f62dd17e3c 297
Swabey89 15:e1f62dd17e3c 298 //Thread::wait(5000); //Dont like this
Swabey89 15:e1f62dd17e3c 299 //LCDlock.unlock();
Swabey89 9:113f4934b907 300 }
Swabey89 13:5f786448e883 301 SD_tout.detach();
Swabey89 15:e1f62dd17e3c 302 //}
Swabey89 9:113f4934b907 303 }
Swabey89 9:113f4934b907 304