mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-17 12:02:15 +03:00
Re-add original SD FAT info access methods (#6092)
Fixes #6081 The SD rewrite blanked out some of the internal FAT info.. Restore the function calls and return proper values. Because size() is used in many printf()s, we can't just change its return type to uint64. Instead, when size is > size-max warn. Add SD.size64 which can be used by new apps who care about >4GB cards. Prints a warning if debugging enabled
This commit is contained in:
committed by
GitHub
parent
82adc95d64
commit
b5560759ec
@ -24,6 +24,8 @@
|
||||
#include <memory>
|
||||
#include <Arduino.h>
|
||||
|
||||
class SDClass;
|
||||
|
||||
namespace fs {
|
||||
|
||||
class File;
|
||||
@ -208,8 +210,10 @@ public:
|
||||
|
||||
bool gc();
|
||||
|
||||
friend class ::SDClass; // More of a frenemy, but SD needs internal implementation to get private FAT bits
|
||||
protected:
|
||||
FSImplPtr _impl;
|
||||
FSImplPtr getImpl() { return _impl; }
|
||||
};
|
||||
|
||||
} // namespace fs
|
||||
|
@ -84,19 +84,23 @@ public:
|
||||
}
|
||||
|
||||
uint8_t type() {
|
||||
return 0;//card.type();
|
||||
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
|
||||
return sd->type();
|
||||
}
|
||||
|
||||
uint8_t fatType() {
|
||||
return 0;//volume.fatType();
|
||||
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
|
||||
return sd->fatType();
|
||||
}
|
||||
|
||||
size_t blocksPerCluster() {
|
||||
return 0;//volume.blocksPerCluster();
|
||||
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
|
||||
return sd->blocksPerCluster();
|
||||
}
|
||||
|
||||
size_t totalClusters() {
|
||||
return 0;//volume.clusterCount();
|
||||
sdfs::SDFSImpl* sd = static_cast<sdfs::SDFSImpl*>(SDFS.getImpl().get());
|
||||
return sd->totalClusters();
|
||||
}
|
||||
|
||||
size_t blockSize() {
|
||||
@ -104,15 +108,25 @@ public:
|
||||
}
|
||||
|
||||
size_t totalBlocks() {
|
||||
return 0;//(totalClusters() / blocksPerCluster());
|
||||
return (totalClusters() / blocksPerCluster());
|
||||
}
|
||||
|
||||
size_t clusterSize() {
|
||||
return 0;//blocksPerCluster() * blockSize();
|
||||
return blocksPerCluster() * blockSize();
|
||||
}
|
||||
|
||||
size_t size() {
|
||||
return 0;//(clusterSize() * totalClusters());
|
||||
uint64_t sz = size64();
|
||||
#ifdef DEBUG_ESP_PORT
|
||||
if (sz > (uint64_t)SIZE_MAX) {
|
||||
DEBUG_ESP_PORT.printf_P(PSTR("WARNING: SD card size overflow (%lld>= 4GB). Please update source to use size64().\n"), sz);
|
||||
}
|
||||
#endif
|
||||
return (size_t)sz;
|
||||
}
|
||||
|
||||
uint64_t size64() {
|
||||
return ((uint64_t)clusterSize() * (uint64_t)totalClusters());
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -159,6 +159,30 @@ public:
|
||||
|
||||
bool format() override;
|
||||
|
||||
// The following are not common FS interfaces, but are needed only to
|
||||
// support the older SD.h exports
|
||||
uint8_t type() {
|
||||
return _fs.card()->type();
|
||||
}
|
||||
uint8_t fatType() {
|
||||
return _fs.vol()->fatType();
|
||||
}
|
||||
size_t blocksPerCluster() {
|
||||
return _fs.vol()->blocksPerCluster();
|
||||
}
|
||||
size_t totalClusters() {
|
||||
return _fs.vol()->clusterCount();
|
||||
}
|
||||
size_t totalBlocks() {
|
||||
return (totalClusters() / blocksPerCluster());
|
||||
}
|
||||
size_t clusterSize() {
|
||||
return blocksPerCluster() * 512; // 512b block size
|
||||
}
|
||||
size_t size() {
|
||||
return (clusterSize() * totalClusters());
|
||||
}
|
||||
|
||||
protected:
|
||||
friend class SDFileImpl;
|
||||
friend class SDFSDirImpl;
|
||||
|
Reference in New Issue
Block a user