Skip to content

Commit 062fd7c

Browse files
committed
Add File::availableForWrite API
1 parent b8a78d4 commit 062fd7c

File tree

7 files changed

+67
-17
lines changed

7 files changed

+67
-17
lines changed

src/File.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ size_t File::write(const uint8_t *buf, size_t size) {
7373
return t;
7474
}
7575

76+
int File::availableForWrite() {
77+
if (_file) {
78+
return _file->availableForWrite();
79+
}
80+
return 0;
81+
}
82+
7683
int File::peek() {
7784
if (! _file) {
7885
return 0;

src/SD.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ namespace SDLib {
3535
File(void); // 'empty' constructor
3636
virtual size_t write(uint8_t);
3737
virtual size_t write(const uint8_t *buf, size_t size);
38+
virtual int availableForWrite();
3839
virtual int read();
3940
virtual int peek();
4041
virtual int available();

src/utility/Sd2Card.cpp

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -608,10 +608,11 @@ uint8_t Sd2Card::waitStartBlock(void) {
608608
609609
\param[in] blockNumber Logical block to be written.
610610
\param[in] src Pointer to the location of the data to be written.
611+
\param[in] sync If the write should be synchronous.
611612
\return The value one, true, is returned for success and
612613
the value zero, false, is returned for failure.
613614
*/
614-
uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) {
615+
uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src, uint8_t sync) {
615616
#if SD_PROTECT_BLOCK_ZERO
616617
// don't allow write to first block
617618
if (blockNumber == 0) {
@@ -631,16 +632,17 @@ uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) {
631632
if (!writeData(DATA_START_BLOCK, src)) {
632633
goto fail;
633634
}
634-
635-
// wait for flash programming to complete
636-
if (!waitNotBusy(SD_WRITE_TIMEOUT)) {
637-
error(SD_CARD_ERROR_WRITE_TIMEOUT);
638-
goto fail;
639-
}
640-
// response is r2 so get and check two bytes for nonzero
641-
if (cardCommand(CMD13, 0) || spiRec()) {
642-
error(SD_CARD_ERROR_WRITE_PROGRAMMING);
643-
goto fail;
635+
if (sync) {
636+
// wait for flash programming to complete
637+
if (!waitNotBusy(SD_WRITE_TIMEOUT)) {
638+
error(SD_CARD_ERROR_WRITE_TIMEOUT);
639+
goto fail;
640+
}
641+
// response is r2 so get and check two bytes for nonzero
642+
if (cardCommand(CMD13, 0) || spiRec()) {
643+
error(SD_CARD_ERROR_WRITE_PROGRAMMING);
644+
goto fail;
645+
}
644646
}
645647
chipSelectHigh();
646648
return true;
@@ -760,3 +762,16 @@ uint8_t Sd2Card::writeStop(void) {
760762
chipSelectHigh();
761763
return false;
762764
}
765+
//------------------------------------------------------------------------------
766+
/** Check if the SD card is busy
767+
768+
\return The value one, true, is returned when is busy and
769+
the value zero, false, is returned for when is NOT busy.
770+
*/
771+
uint8_t Sd2Card::isBusy(void) {
772+
chipSelectLow();
773+
byte b = spiRec();
774+
chipSelectHigh();
775+
776+
return (b != 0XFF);
777+
}

src/utility/Sd2Card.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,11 @@ class Sd2Card {
236236
uint8_t type(void) const {
237237
return type_;
238238
}
239-
uint8_t writeBlock(uint32_t blockNumber, const uint8_t* src);
239+
uint8_t writeBlock(uint32_t blockNumber, const uint8_t* src, uint8_t sync);
240240
uint8_t writeData(const uint8_t* src);
241241
uint8_t writeStart(uint32_t blockNumber, uint32_t eraseCount);
242242
uint8_t writeStop(void);
243+
uint8_t isBusy(void);
243244
private:
244245
uint32_t block_;
245246
uint8_t chipSelectPin_;

src/utility/SdFat.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ class SdFile : public Print {
320320
void write_P(PGM_P str);
321321
void writeln_P(PGM_P str);
322322
#endif
323+
int availableForWrite(void);
323324
//------------------------------------------------------------------------------
324325
#if ALLOW_DEPRECATED_FUNCTIONS
325326
// Deprecated functions - suppress cpplint warnings with NOLINT comment
@@ -610,8 +611,11 @@ class SdVolume {
610611
uint16_t count, uint8_t* dst) {
611612
return sdCard_->readData(block, offset, count, dst);
612613
}
613-
uint8_t writeBlock(uint32_t block, const uint8_t* dst) {
614-
return sdCard_->writeBlock(block, dst);
614+
uint8_t writeBlock(uint32_t block, const uint8_t* dst, uint8_t sync) {
615+
return sdCard_->writeBlock(block, dst, sync);
616+
}
617+
uint8_t isBusy(void) {
618+
return sdCard_->isBusy();
615619
}
616620
};
617621
#endif // SdFat_h

src/utility/SdFile.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1383,7 +1383,7 @@ size_t SdFile::write(const void* buf, uint16_t nbyte) {
13831383
if (SdVolume::cacheBlockNumber_ == block) {
13841384
SdVolume::cacheBlockNumber_ = 0XFFFFFFFF;
13851385
}
1386-
if (!vol_->writeBlock(block, src)) {
1386+
if (!vol_->writeBlock(block, src, 0)) {
13871387
goto writeErrorReturn;
13881388
}
13891389
src += 512;
@@ -1473,3 +1473,25 @@ void SdFile::writeln_P(PGM_P str) {
14731473
println();
14741474
}
14751475
#endif
1476+
//------------------------------------------------------------------------------
1477+
int SdFile::availableForWrite() {
1478+
if (!isFile() || !(flags_ & O_WRITE)) {
1479+
return 0;
1480+
}
1481+
1482+
// seek to end of file if append flag
1483+
if ((flags_ & O_APPEND) && curPosition_ != fileSize_) {
1484+
if (!seekEnd()) {
1485+
return 0;
1486+
}
1487+
}
1488+
1489+
if (vol_->isBusy()) {
1490+
return 0;
1491+
}
1492+
1493+
uint16_t blockOffset = curPosition_ & 0X1FF;
1494+
uint16_t n = 512 - blockOffset;
1495+
1496+
return n;
1497+
}

src/utility/SdVolume.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ uint8_t SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) {
110110
//------------------------------------------------------------------------------
111111
uint8_t SdVolume::cacheFlush(void) {
112112
if (cacheDirty_) {
113-
if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) {
113+
if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data, 1)) {
114114
return false;
115115
}
116116
// mirror FAT tables
117117
if (cacheMirrorBlock_) {
118-
if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) {
118+
if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data, 1)) {
119119
return false;
120120
}
121121
cacheMirrorBlock_ = 0;

0 commit comments

Comments
 (0)