Basic working SD card.'
This commit is contained in:
@@ -228,6 +228,115 @@ fs::FS& SDManager::fs()
|
||||
}
|
||||
|
||||
|
||||
StorageCardType SDManager::cardType() const
|
||||
{
|
||||
if (mounted && backend != nullptr)
|
||||
{
|
||||
return backend->cardType();
|
||||
}
|
||||
return StorageCardType::None;
|
||||
}
|
||||
|
||||
|
||||
const char* SDManager::cardTypeName() const
|
||||
{
|
||||
return cardTypeName(cardType());
|
||||
}
|
||||
|
||||
|
||||
uint64_t SDManager::totalBytes() const
|
||||
{
|
||||
if (mounted && backend != nullptr)
|
||||
{
|
||||
return backend->totalBytes();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint64_t SDManager::usedBytes() const
|
||||
{
|
||||
if (mounted && backend != nullptr)
|
||||
{
|
||||
return backend->usedBytes();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint64_t SDManager::freeBytes() const
|
||||
{
|
||||
uint64_t total = totalBytes();
|
||||
uint64_t used = usedBytes();
|
||||
return (total > used) ? (total - used) : 0;
|
||||
}
|
||||
|
||||
|
||||
uint32_t SDManager::measureWriteSpeed()
|
||||
{
|
||||
if (!mounted || backend == nullptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
fs::FS& files = backend->fs();
|
||||
|
||||
const char* scratchPath = STORAGE_SPEED_MEASURE_PATH;
|
||||
const size_t bufferSize = 16 * 1024;
|
||||
|
||||
// Remove any leftover from a previous crashed run.
|
||||
files.remove(scratchPath);
|
||||
|
||||
uint8_t* buffer = (uint8_t*)malloc(bufferSize);
|
||||
if (buffer == nullptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(buffer, 0xA5, bufferSize);
|
||||
|
||||
File file = files.open(scratchPath, FILE_WRITE);
|
||||
if (!file)
|
||||
{
|
||||
free(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t remaining = STORAGE_SPEED_MEASURE_BYTES;
|
||||
uint32_t startUs = micros();
|
||||
|
||||
while (remaining > 0)
|
||||
{
|
||||
size_t toWrite = (remaining < bufferSize) ? remaining : bufferSize;
|
||||
size_t written = file.write(buffer, toWrite);
|
||||
|
||||
if (written == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
remaining -= written;
|
||||
}
|
||||
|
||||
file.close();
|
||||
|
||||
uint32_t elapsedUs = micros() - startUs;
|
||||
Serial.print("Elapsed microseconds: ");
|
||||
Serial.println(elapsedUs);
|
||||
|
||||
files.remove(scratchPath);
|
||||
free(buffer);
|
||||
|
||||
if (remaining != 0 || elapsedUs == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t writtenBytes = (uint64_t)STORAGE_SPEED_MEASURE_BYTES - remaining;
|
||||
return (uint32_t)((writtenBytes * 1000000ULL) / elapsedUs);
|
||||
}
|
||||
|
||||
|
||||
const char* SDManager::cardTypeName(StorageCardType type)
|
||||
{
|
||||
switch (type)
|
||||
|
||||
Reference in New Issue
Block a user