Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BMP280
SDCard.cpp
- Committer:
- mwthewsey
- Date:
- 2018-01-09
- Revision:
- 12:03589f1d5c30
- Parent:
- 11:b538e73841ae
- Child:
- 13:41c394fa932c
File content as of revision 12:03589f1d5c30:
#include "mbed.h"
#include "Sampling.h"
#include "SDCard.h"
#include "SDBlockDevice.h"
#include "FATFileSystem.h"
#include "LCD.h"
DigitalOut GreenLED(PB_11);
DigitalOut SDCardStatusLED(LED3);
InterruptIn SD_WP(PE_10);
InterruptIn UserButton(USER_BUTTON);
SDBlockDevice sd(PB_5, D12, D13, D10);
enum SDCardStates {INSERTED,REMOVED,DISMOUNTREQUEST};
bool SDCardPresent;
bool SDCardMounted;
unsigned short SDinternalIndex;
FILE* fp; //File pointer type
SDCardStates SDCurrentState;
Thread SDCardThread;
FATFileSystem fs;
void SDCardInit(void)
{
SDCardThread.start(&SDCardCode); //Start thread running
SD_WP.rise(&SDCardRemovedISR); //SD removed
SD_WP.fall(&SDCardInsertedISR); //SD inserted
UserButton.fall(&SDCardButtonISR); //Button released
if (SD_WP == 1) {
SDCardPresent = false;
SDCurrentState = REMOVED;
SDCardMounted = false;
} else {
SDCardPresent = true;
SDCurrentState = INSERTED;
SDCardMounted = false;
}
}
//-----------------------------------------------------------------//
//ISRs
void SDCardRemovedISR(void)
{
SDCardPresent = false;
SDCurrentState = REMOVED;
SDCardThread.signal_set(1);
}
void SDCardInsertedISR(void)
{
SDCardPresent = true;
SDCurrentState = INSERTED;
SDCardThread.signal_set(1);
}
void SDCardButtonISR(void)
{
SDCurrentState = DISMOUNTREQUEST;
SDCardThread.signal_set(1);
}
//-----------------------------------------------------------------//
void SDCardCode(void)
{
//set bool state. if sd card is in or not. (if sd card is already in)
if (SD_WP) {
SDCurrentState = REMOVED;
} else {
SDCurrentState = INSERTED;
}
while(true) {
Thread::signal_wait(1); //Wait untill signal set
if (SDCurrentState == REMOVED) {
if (SDCardMounted) {
//print error message file currupt
lcd.SendMessage("SD CARD REMOVED! FILE CORRUPT",true);
}
SDCardStatusLED = 0;
GreenLED = 0;
} else if (SDCurrentState == INSERTED) {
Thread::wait(1000); //wait 1 seccond to allow the SD card to be pluged in.
if ( sd.init() != 0) { //Initalises the SDCard and checks if it succeeded
//SDInit failed. Reinsert the SDCard
}
//Create a filing system for SD Card
FATFileSystem fs("sd", &sd);////////////////////////////////////////////////////moved to init. dont know if this works.
//Open to WRITE
fp = fopen("/sd/test.csv","w");
if (fp == NULL) {
lcd.SendMessage("CANNOT OPEN FILE/sd/test.csv",true);
//error
}
SDCardMounted = true;
Sampling(false); //Stop sampling
SDinternalIndex = currentIndex; //InternalIndex for incrementing out data
TakeKeys(true); //Take keys
for (short i = 0; i < BUFFERSIZE; i++) { //For loop of length buffersize
tm T = ReturnDateTimeStruct(timeReadings[SDinternalIndex]);
//InternalIndex was set as newest. We will now decrement to display oldest to newest
fprintf(fp," %4d/%2d/%2d,%2d:%2d:%2d,%2.2f,%2.2f,%2.2f\n",T.tm_year,T.tm_mon,T.tm_mday,T.tm_hour,T.tm_min,T.tm_sec,tempReadings[SDinternalIndex],presReadings[SDinternalIndex],LDRReadings[SDinternalIndex]);
SDinternalIndex = IndexDecrement(SDinternalIndex); //Decrement internal index
}
TakeKeys(false); //Return keys
Sampling(true); //Start sampling
fclose(fp);
SDCardStatusLED = 1;
} else if (SDCurrentState == DISMOUNTREQUEST) {
sd.deinit();
SDCardMounted = false;
lcd.SendMessage("REMOVE SD CARD",true);
GreenLED = 1;
}
}
}