Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 062fd7c

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /