SD card functionality

Dependents:   ELEC350_Project2 SDcard

Committer:
Swabey89
Date:
Thu Jan 03 10:32:41 2019 +0000
Revision:
16:23b3be671415
Parent:
15:e1f62dd17e3c
Child:
17:c9ac3fc764b9
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 9:113f4934b907 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 15:e1f62dd17e3c 17 printQueue.call(printf,"WARNING:SD CARD INITIALISATION FAILED\n\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 15:e1f62dd17e3c 32 printQueue.call(printf,"\nSD CARD INITIALISED\n\r");
Swabey89 7:393fa8184388 33
Swabey89 8:ee8f65745141 34 //Open to WRITE
Swabey89 8:ee8f65745141 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 8:ee8f65745141 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 16:23b3be671415 51 printQueue.call(printf,"WARNING: COULD NOT OPEN FILE FOR WRITE\r\n\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 16:23b3be671415 63 printQueue.call(printf,"FILE OPEN FOR WRITING\r\n\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 15:e1f62dd17e3c 123 static time_t seconds;
Swabey89 15:e1f62dd17e3c 124 char fileDate[30];
Swabey89 15:e1f62dd17e3c 125 timeLock.lock();
Swabey89 15:e1f62dd17e3c 126 seconds = time(NULL);
Swabey89 15:e1f62dd17e3c 127 timeData = localtime(&seconds);
Swabey89 15:e1f62dd17e3c 128
Swabey89 15:e1f62dd17e3c 129 //set_time(mktime(timeData));
Swabey89 15:e1f62dd17e3c 130
Swabey89 15:e1f62dd17e3c 131 strftime(fileDate, 30, "sd/log_%d_%m_%y.csv", timeData);
Swabey89 15:e1f62dd17e3c 132 timeLock.unlock();
Swabey89 15:e1f62dd17e3c 133
Swabey89 16:23b3be671415 134 fp = fopen(fileDate,"a");
Swabey89 15:e1f62dd17e3c 135
Swabey89 15:e1f62dd17e3c 136 if (fp == NULL)
Swabey89 15:e1f62dd17e3c 137 {
Swabey89 15:e1f62dd17e3c 138 /*
Swabey89 15:e1f62dd17e3c 139 printlock.lock();
Swabey89 15:e1f62dd17e3c 140 pc->printf("WARNING: FILE COULD NOT BE OPENED\r\n\n");
Swabey89 15:e1f62dd17e3c 141 sd_init = false;
Swabey89 15:e1f62dd17e3c 142 printlock.unlock();
Swabey89 15:e1f62dd17e3c 143 */
Swabey89 15:e1f62dd17e3c 144 printQueue.call(printf,"WARNING: FILE COULD NOT BE OPENED\r\n\n");
Swabey89 15:e1f62dd17e3c 145 sd_init = false;
Swabey89 15:e1f62dd17e3c 146 samplesInBuffer.release();
Swabey89 16:23b3be671415 147 oldestIndex = (oldestIndex?oldestIndex:BUFFERSIZE)-1; //Doesn't work properly - oldestindex will be increased by the conditional statement in the producer
Swabey89 15:e1f62dd17e3c 148 }
Swabey89 15:e1f62dd17e3c 149 else
Swabey89 15:e1f62dd17e3c 150 {
Swabey89 15:e1f62dd17e3c 151 fprintf(fp,"%s,%5.2f,%5.2f,%5.2f\r", timedata, temp, pressure, light);
Swabey89 15:e1f62dd17e3c 152 fclose(fp);
Swabey89 15:e1f62dd17e3c 153 }
Swabey89 15:e1f62dd17e3c 154
Swabey89 16:23b3be671415 155 if(logging && sd_init)
Swabey89 15:e1f62dd17e3c 156 {
Swabey89 15:e1f62dd17e3c 157 /*
Swabey89 15:e1f62dd17e3c 158 printlock.lock();
Swabey89 15:e1f62dd17e3c 159 pc->printf("Log file %s updated with sample from position %d in buffer\r\n",fileDate,oldestIndex);
Swabey89 15:e1f62dd17e3c 160 pc->printf("newestIndex position %d\r\n",newestIndex);
Swabey89 15:e1f62dd17e3c 161 pc->printf("oldestIndex position %d\r\n\n",oldestIndex);
Swabey89 15:e1f62dd17e3c 162 printlock.unlock();
Swabey89 15:e1f62dd17e3c 163 */
Swabey89 16:23b3be671415 164 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 165 //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 166 }
Swabey89 15:e1f62dd17e3c 167 }
Swabey89 16:23b3be671415 168 else
Swabey89 16:23b3be671415 169 {
Swabey89 16:23b3be671415 170 samplesInBuffer.release();
Swabey89 16:23b3be671415 171 oldestIndex = (oldestIndex?oldestIndex:BUFFERSIZE)-1; //Doesn't work properly - oldestindex will be increased by the conditional statement in the producer
Swabey89 16:23b3be671415 172 }
Swabey89 15:e1f62dd17e3c 173 }
Swabey89 15:e1f62dd17e3c 174
Swabey89 15:e1f62dd17e3c 175 /*
Swabey89 15:e1f62dd17e3c 176 void SDaddSample(void)
Swabey89 15:e1f62dd17e3c 177 {
Swabey89 15:e1f62dd17e3c 178
Swabey89 15:e1f62dd17e3c 179 static time_t seconds;
Swabey89 15:e1f62dd17e3c 180 char fileDate[30];
Swabey89 15:e1f62dd17e3c 181 timeLock.lock();
Swabey89 15:e1f62dd17e3c 182 seconds = time(NULL);
Swabey89 15:e1f62dd17e3c 183 timeData = localtime(&seconds);
Swabey89 15:e1f62dd17e3c 184
Swabey89 15:e1f62dd17e3c 185 //set_time(mktime(timeData));
Swabey89 15:e1f62dd17e3c 186
Swabey89 15:e1f62dd17e3c 187 strftime(fileDate, 30, "sd/log_%d_%m_%y.csv", timeData);
Swabey89 15:e1f62dd17e3c 188 timeLock.unlock();
Swabey89 15:e1f62dd17e3c 189
Swabey89 15:e1f62dd17e3c 190 fp = fopen(fileDate,"a"); //issue if file already open?
Swabey89 15:e1f62dd17e3c 191
Swabey89 15:e1f62dd17e3c 192 bufferLock.lock();
Swabey89 15:e1f62dd17e3c 193
Swabey89 15:e1f62dd17e3c 194 if (fp == NULL)
Swabey89 15:e1f62dd17e3c 195 {
Swabey89 15:e1f62dd17e3c 196 printlock.lock();
Swabey89 15:e1f62dd17e3c 197 pc->printf("WARNING: FILE COULD NOT BE OPENED\r\n\n");
Swabey89 15:e1f62dd17e3c 198 sd_init = false;
Swabey89 15:e1f62dd17e3c 199 printlock.unlock();
Swabey89 15:e1f62dd17e3c 200 samplesInBuffer.release();
Swabey89 15:e1f62dd17e3c 201 }
Swabey89 15:e1f62dd17e3c 202 else
Swabey89 15:e1f62dd17e3c 203 {
Swabey89 15:e1f62dd17e3c 204 //oldestIndex = (oldestIndex+1) % BUFFERSIZE;
Swabey89 15:e1f62dd17e3c 205 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 206 }
Swabey89 15:e1f62dd17e3c 207
Swabey89 15:e1f62dd17e3c 208 if(logging)
Swabey89 15:e1f62dd17e3c 209 {
Swabey89 15:e1f62dd17e3c 210 printlock.lock();
Swabey89 15:e1f62dd17e3c 211 pc->printf("Log file %s updated with sample from position %d in buffer\r\n",fileDate,oldestIndex);
Swabey89 15:e1f62dd17e3c 212 pc->printf("newestIndex position %d\r\n",newestIndex);
Swabey89 15:e1f62dd17e3c 213 pc->printf("oldestIndex position %d\r\n\n",oldestIndex);
Swabey89 15:e1f62dd17e3c 214 printlock.unlock();
Swabey89 15:e1f62dd17e3c 215 }
Swabey89 15:e1f62dd17e3c 216
Swabey89 15:e1f62dd17e3c 217 fclose(fp);
Swabey89 15:e1f62dd17e3c 218 bufferLock.unlock();
Swabey89 15:e1f62dd17e3c 219 }
Swabey89 15:e1f62dd17e3c 220
Swabey89 15:e1f62dd17e3c 221 */
Swabey89 10:f2b8e3b587d5 222
Swabey89 10:f2b8e3b587d5 223 //UNUSED
Swabey89 15:e1f62dd17e3c 224 /*
Swabey89 1:c3af0c26ded2 225 void SDalive(void)
Swabey89 1:c3af0c26ded2 226 {
Swabey89 3:c6e5dd2faa22 227 //Signal that the SD thread is still alive
Swabey89 2:9a5eea2adbf8 228 //puts("SD THREAD ALIVE\n");
Swabey89 7:393fa8184388 229 }
Swabey89 15:e1f62dd17e3c 230 */
Swabey89 7:393fa8184388 231
Swabey89 9:113f4934b907 232 void SDmount(void)
Swabey89 9:113f4934b907 233 {
Swabey89 15:e1f62dd17e3c 234 //while(true)
Swabey89 15:e1f62dd17e3c 235 //{
Swabey89 15:e1f62dd17e3c 236 //Thread::signal_wait(SIGNAL_SD);
Swabey89 13:5f786448e883 237
Swabey89 14:8e92eb9fc088 238 SD_tout.attach(SD_toutISR,TOUT_TIME_SDMOUNT);
Swabey89 13:5f786448e883 239
Swabey89 9:113f4934b907 240 if (sd_init)
Swabey89 9:113f4934b907 241 {
Swabey89 9:113f4934b907 242 fclose(fp);
Swabey89 9:113f4934b907 243 sd.deinit();
Swabey89 14:8e92eb9fc088 244 sd_init = false;
Swabey89 15:e1f62dd17e3c 245 /*
Swabey89 10:f2b8e3b587d5 246 printlock.lock();
Swabey89 9:113f4934b907 247 pc->printf("SD CARD UNMOUNTED\n\r");
Swabey89 10:f2b8e3b587d5 248 printlock.unlock();
Swabey89 15:e1f62dd17e3c 249 */
Swabey89 15:e1f62dd17e3c 250 printQueue.call(printf,"SD CARD UNMOUNTED\n\r");
Swabey89 10:f2b8e3b587d5 251
Swabey89 15:e1f62dd17e3c 252 //LCDlock.lock();
Swabey89 15:e1f62dd17e3c 253 //lcd.cls();
Swabey89 15:e1f62dd17e3c 254 //lcd.printf("SD UNMOUNTED..");
Swabey89 15:e1f62dd17e3c 255 //LCDqueue.call(LCD_text,"SD UNMOUNTED..");
Swabey89 15:e1f62dd17e3c 256 //Thread::wait(5000); //Dont like this
Swabey89 15:e1f62dd17e3c 257
Swabey89 15:e1f62dd17e3c 258 //for(int i=0;i<20;i++)
Swabey89 15:e1f62dd17e3c 259 //{
Swabey89 15:e1f62dd17e3c 260 // greenLED = 1;
Swabey89 15:e1f62dd17e3c 261 //wait(0.5);
Swabey89 15:e1f62dd17e3c 262 //greenLED = 0;
Swabey89 15:e1f62dd17e3c 263 //wait(0.5);
Swabey89 15:e1f62dd17e3c 264 //}
Swabey89 15:e1f62dd17e3c 265 //LCDlock.unlock();
Swabey89 15:e1f62dd17e3c 266
Swabey89 15:e1f62dd17e3c 267 LCDqueue.call(LCD_sdcardmount,"SD UNMOUNTED..", 0.05);
Swabey89 15:e1f62dd17e3c 268
Swabey89 9:113f4934b907 269
Swabey89 9:113f4934b907 270 }
Swabey89 9:113f4934b907 271 else
Swabey89 9:113f4934b907 272 {
Swabey89 9:113f4934b907 273 SDcard();
Swabey89 15:e1f62dd17e3c 274 //LCDlock.lock();
Swabey89 15:e1f62dd17e3c 275 //lcd.cls();
Swabey89 10:f2b8e3b587d5 276 if (sd_init)
Swabey89 10:f2b8e3b587d5 277 {
Swabey89 15:e1f62dd17e3c 278 //lcd.printf("SD MOUNTED..");
Swabey89 15:e1f62dd17e3c 279 //LCDqueue.call(LCD_text,"SD MOUNTED..");
Swabey89 15:e1f62dd17e3c 280 LCDqueue.call(LCD_sdcardmount,"SD MOUNTED..", 0.05);
Swabey89 10:f2b8e3b587d5 281 }
Swabey89 10:f2b8e3b587d5 282 else
Swabey89 10:f2b8e3b587d5 283 {
Swabey89 15:e1f62dd17e3c 284 //lcd.printf("SD FAILED..");
Swabey89 15:e1f62dd17e3c 285 LCDqueue.call(LCD_sdcardmount,"SD FAILED..", 0.05); //pass in LED to flash RED
Swabey89 10:f2b8e3b587d5 286 }
Swabey89 15:e1f62dd17e3c 287
Swabey89 15:e1f62dd17e3c 288 /*
Swabey89 15:e1f62dd17e3c 289 for(int i=0;i<20;i++)
Swabey89 15:e1f62dd17e3c 290 {
Swabey89 15:e1f62dd17e3c 291 greenLED = 1;
Swabey89 15:e1f62dd17e3c 292 wait(0.5);
Swabey89 15:e1f62dd17e3c 293 greenLED = 0;
Swabey89 15:e1f62dd17e3c 294 wait(0.5);
Swabey89 15:e1f62dd17e3c 295 }
Swabey89 15:e1f62dd17e3c 296 */
Swabey89 15:e1f62dd17e3c 297
Swabey89 15:e1f62dd17e3c 298
Swabey89 15:e1f62dd17e3c 299
Swabey89 15:e1f62dd17e3c 300 //Thread::wait(5000); //Dont like this
Swabey89 15:e1f62dd17e3c 301 //LCDlock.unlock();
Swabey89 9:113f4934b907 302 }
Swabey89 13:5f786448e883 303 SD_tout.detach();
Swabey89 15:e1f62dd17e3c 304 //}
Swabey89 9:113f4934b907 305 }
Swabey89 9:113f4934b907 306