Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
4.2 kB · 125 lines
C
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126#pragma once
#include <Print.h>#include <common/FsApiConstants.h> // for oflag_t#include <freertos/semphr.h>
#include <memory>#include <string>#include <vector>
class HalFile;
enum class UsbDriveState : uint8_t { Unsupported, WaitingForHost, Connected, Ejected, Disconnected, IoError,};
class HalStorage { public: HalStorage(); bool begin(); bool ready() const; // Stop the SD card for deep sleep: unmount, stop the SDMMC host, and release // the bus pads (no-op on SPI boards). Call only after all file users have // stopped; open HalFiles become invalid. A deep-sleep wake resets the MCU and // mounts storage again through begin(). void prepareForDeepSleep(); // USB Drive exclusively owns the SD card while active. Callers must stop // all filesystem work before beginUsbDrive(), then reboot after endUsbDrive(). bool beginUsbDrive(); bool disconnectUsbDriveHost(); void endUsbDrive(); UsbDriveState usbDriveState() const; bool usbDriveHostSuspended() const; std::vector<String> listFiles(const char* path = "/", int maxFiles = 200); // Read the entire file at `path` into a String. Returns empty string on failure. String readFile(const char* path); // Low-memory helpers: // Stream the file contents to a `Print` (e.g. `Serial`, or any `Print`-derived object). // Returns true on success, false on failure. bool readFileToStream(const char* path, Print& out, size_t chunkSize = 256); // Read up to `bufferSize-1` bytes into `buffer`, null-terminating it. Returns bytes read. size_t readFileToBuffer(const char* path, char* buffer, size_t bufferSize, size_t maxBytes = 0); // Write a string to `path` on the SD card. Overwrites existing file. // Returns true on success. bool writeFile(const char* path, const String& content); // Ensure a directory exists, creating it if necessary. Returns true on success. bool ensureDirectoryExists(const char* path);
HalFile open(const char* path, const oflag_t oflag = O_RDONLY); bool mkdir(const char* path, const bool pFlag = true); bool exists(const char* path); bool remove(const char* path); bool rename(const char* oldPath, const char* newPath); bool rmdir(const char* path);
bool openFileForRead(const char* moduleName, const char* path, HalFile& file); bool openFileForRead(const char* moduleName, const std::string& path, HalFile& file); bool openFileForRead(const char* moduleName, const String& path, HalFile& file); bool openFileForWrite(const char* moduleName, const char* path, HalFile& file); bool openFileForWrite(const char* moduleName, const std::string& path, HalFile& file); bool openFileForWrite(const char* moduleName, const String& path, HalFile& file); bool removeDir(const char* path);
static HalStorage& getInstance() { return instance; }
class StorageLock; // private class, used internally
private: static HalStorage instance;
bool initialized = false; SemaphoreHandle_t storageMutex = nullptr;};
#define Storage HalStorage::getInstance()
class HalFile : public Print { friend class HalStorage; class Impl; std::unique_ptr<Impl> impl; explicit HalFile(std::unique_ptr<Impl> impl);
public: HalFile(); ~HalFile(); HalFile(HalFile&&); HalFile& operator=(HalFile&&); HalFile(const HalFile&) = delete; HalFile& operator=(const HalFile&) = delete;
void flush(); size_t getName(char* name, size_t len); size_t size(); size_t fileSize(); uint64_t fileSize64(); uint32_t modificationTime(); bool seek(size_t pos); bool seek64(uint64_t pos); bool seekCur(int64_t offset); bool seekSet(size_t offset); int available() const; size_t position() const; int read(void* buf, size_t count); int read(); // read a single byte size_t write(const uint8_t* buf, size_t count) override; size_t write(const void* buf, size_t count); size_t write(uint8_t b) override; bool rename(const char* newPath); bool isDirectory() const; void rewindDirectory(); bool close(); HalFile openNextFile(); bool isOpen() const; operator bool() const;};
// Downstream code must use Storage instead of SdMan#ifdef SdMan#undef SdMan#endif