#ifndef __NEOMEMORYDISKDRIVER_H__ #define __NEOMEMORYDISKDRIVER_H__ #ifdef __cplusplus #include "icsneo/disk/diskreaddriver.h" #include "icsneo/disk/diskwritedriver.h" #include #include namespace icsneo { namespace Disk { /** * A disk driver which uses the neoMemory command to read from or write to the disk * * This can only make requests per sector, so it will be very slow, but is likely supported by any device with a disk */ class NeoMemoryDiskDriver : public ReadDriver, public WriteDriver { public: std::pair getBlockSizeBounds() const override { static_assert(SectorSize <= std::numeric_limits::max(), "Incorrect sector size"); static_assert(SectorSize >= std::numeric_limits::min(), "Incorrect sector size"); return { static_cast(SectorSize), static_cast(SectorSize) }; } private: static constexpr const uint8_t MemoryTypeSD = 0x01; // Logical Disk static constexpr const std::chrono::seconds CacheTime = std::chrono::seconds(1); std::array cache; uint64_t cachePos = 0; std::chrono::time_point cachedAt; Access getPossibleAccess() const override { return Access::VSA; } optional readLogicalDiskAligned(Communication& com, device_eventhandler_t report, uint64_t pos, uint8_t* into, uint64_t amount, std::chrono::milliseconds timeout) override; optional writeLogicalDiskAligned(Communication& com, device_eventhandler_t report, uint64_t pos, const uint8_t* atomicBuf, const uint8_t* from, uint64_t amount, std::chrono::milliseconds timeout) override; }; } // namespace Disk } // namespace icsneo #endif // __cplusplus #endif // __NEOMEMORYDISKDRIVER_H__