/ src / files / files_fat32.h
files_fat32.h
 1  #pragma once
 2  
 3  #include <cstdint>
 4  #include <cstddef>
 5  
 6  #include "ff.h"
 7  
 8  #include "files_file_system.h"
 9  #include "usb/usb_listener.h"
10  
11  namespace files
12  {
13  	using Fat32File = FIL;
14  	using Fat32FileInfo = FILINFO;
15  	using Fat32Directory = DIR;
16  
17  	class Fat32 : public FileSystem<Fat32File, Fat32Directory, Fat32FileInfo>,
18  			public usb::Listener
19  	{
20  	public:
21  		Fat32();
22  		virtual ~Fat32() = default;
23  		Fat32(const Fat32&) = delete;
24  		Fat32& operator=(const Fat32&) = delete;
25  
26  		virtual bool Mount() override;
27  		virtual bool Unmount() override;
28  
29  		virtual bool FileOpen(Fat32File& file, const char* filePath, uint16_t mode) override;
30  		virtual bool FileRead(Fat32File& file, void* buffer, size_t amountToRead, size_t* amountRead) override;
31  		virtual bool FileWrite(Fat32File& file, const void* buffer, size_t bufferLength, size_t* amountWritten) override;
32  		virtual bool FileSeek(Fat32File& file, size_t offset) override;
33  		virtual bool FileClose(Fat32File& file) override;
34  
35  		virtual bool DirectoryOpen(Fat32Directory& dir, const char* directoryPath) override;
36  		virtual bool DirectoryRead(Fat32Directory& dir, Fat32FileInfo& info) override;
37  		virtual bool DirectoryClose(Fat32Directory& dir) override;
38  
39  		virtual bool FileStat(Fat32FileInfo& fileInfo, const char* path) override;
40  
41  		virtual inline const char* GetDriveLabel() override { return driveLabel; }
42  		virtual inline uint32_t GetDriveSerial() override { return driveSerial; }
43  
44  		virtual void UsbWillEnable(app_usbd_event_type_t event) override;
45  		virtual void UsbDidDisable(app_usbd_event_type_t event) override;
46  
47  		inline bool IsInitialized() { return initialized; }
48  
49  	private:
50  		FATFS fileSystem;
51  		uint8_t diskIndex = -1;
52  		bool registered = false;
53  		bool initialized = false;
54  		bool autoRemountAfterUsbDisconnect = true;
55  		uint32_t driveSerial = 0;
56  		char driveLabel[16] = { 0 };
57  		bool RegisterBlockDevice();
58  		bool Initialize();
59  		bool Uninitialize();
60  	};
61  } // namespace files