From 860f544ccff5df079b18b02c691b04c2bf9b8b55 Mon Sep 17 00:00:00 2001 From: nrs1g15 <nrs1g15@soton.ac.uk> Date: Tue, 30 Jul 2019 00:36:30 +0100 Subject: [PATCH] Added state machine and retries every 1s if begin fails --- sufst-controller/sd.cpp | 42 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/sufst-controller/sd.cpp b/sufst-controller/sd.cpp index a3e330d..9decb7a 100644 --- a/sufst-controller/sd.cpp +++ b/sufst-controller/sd.cpp @@ -6,6 +6,13 @@ #include "buffer.h" #include "SdFat.h" +enum SdState { + stopped = 0, + writing, +}; + +SdState sdState = stopped; + SdFat sd; SdFile file; @@ -17,30 +24,46 @@ CirBuffer sdCirBuffer; uint8_t sdBegin() { if (!sd.begin(SD_CS_PIN, SD_SCK_MHZ(10))) { + + sdState = stopped; + return 0; } if (sd.exists(SD_FILE_NAME)) { if (!file.open(SD_FILE_NAME, O_WRITE | O_APPEND)) { + + sdState = stopped; + return 0; } } else { if (!file.open(SD_FILE_NAME, O_WRITE | O_CREAT)) { + + sdState = stopped; + return 0; } } if (!cirBufferBegin(&sdCirBuffer, sdBuffer, SD_BUFFER_LEN, sizeof(uint8_t))) { + + sdState = stopped; + return 0; } + sdState = writing; + return 1; } void sdWrite(void *data, uint8_t len) { - cirBufferWriteBytes(&sdCirBuffer, data, len); + if (sdState == writing) { + cirBufferWriteBytes(&sdCirBuffer, data, len); + } } void sdProcess() @@ -48,11 +71,24 @@ void sdProcess() static uint8_t sdPayload[SD_WRITE_LEN]; static uint8_t sdWritesCntBeforeFlush = 0; - if (cirBufferAvailable(&sdCirBuffer) >= SD_WRITE_LEN) { + if (sdState != writing) { + uint32_t currentMs = millis(); + static uint32_t lastTryMs = 0; + + if ((currentMs - lastTryMs) >= SD_START_TRY_AGAIN_MS) { + sdBegin(); + + lastTryMs = millis(); + } + } + else if (cirBufferAvailable(&sdCirBuffer) >= SD_WRITE_LEN) { cirBufferReadBytes(&sdCirBuffer, sdPayload, SD_WRITE_LEN); - file.write(sdPayload, SD_WRITE_LEN); + if (!file.write(sdPayload, SD_WRITE_LEN)) { + + sdState = stopped; + } sdWritesCntBeforeFlush++; -- GitLab