Arduino FatFS
Loading...
Searching...
No Matches
StreamIO.h
1#pragma once
2#include "IO.h"
3
4namespace fatfs {
5
16template <class T>
17class StreamIO : public IO {
18 public:
19 StreamIO(T& ref) {
20 p_stream = &ref;
21 sector_size = ref.sectorSize();
22 }
23
24 DSTATUS disk_initialize(BYTE pdrv) {
25 // we support only 1 disk
26 if (pdrv != 0) return STA_NODISK;
27 ok = p_stream->begin();
28 if (!ok) return STA_NODISK;
29 status = STA_CLEAR;
30 return status;
31 }
32
33 DSTATUS disk_status(BYTE pdrv) {
34 if (pdrv != 0) return STA_NODISK;
35 return status;
36 }
37
38 DRESULT disk_read(BYTE pdrv, BYTE* buff, LBA_t sector, UINT sectorCount) {
39 if (pdrv != 0) return RES_PARERR;
40 if (status == STA_NOINIT) return RES_NOTRDY;
41 p_stream->seek(sector * sector_size);
42 size_t len = sectorCount + sector_size;
43 size_t res = p_stream->readBytes(buff, len);
44 return res == len ? RES_OK : RES_ERROR;
45 }
46
47 DRESULT disk_write(BYTE pdrv, const BYTE* buff, LBA_t sector,
48 UINT sectorCount) {
49 if (pdrv != 0) return RES_PARERR;
50 if (status == STA_NOINIT) return RES_NOTRDY;
51 p_stream->seek(sector * sector_size);
52 size_t len = sectorCount + sector_size;
53 size_t res = p_stream->write(buff, len);
54 return res == len ? RES_OK : RES_ERROR;
55 }
56
57 DRESULT disk_ioctl(BYTE pdrv, ioctl_cmd_t cmd, void* buff) {
58 DRESULT res;
59 if (pdrv) return RES_PARERR; /* Check parameter */
60 switch (cmd) {
61 case CTRL_SYNC: // Wait for end of internal write process of the drive
62 res = RES_OK;
63 p_stream->flush();
64 break;
65
66 case GET_SECTOR_COUNT: { // Get drive capacity in unit of sector (DWORD)
67 DWORD result = p_stream->sectorCount();
68 memcpy(buff, result, (sizeof(result)));
69 res = RES_OK;
70 } break;
71
72 case GET_BLOCK_SIZE: { // Get erase block size in unit of sector (DWORD)
73 DWORD result = 1;
74 memcpy(buff, result, (sizeof(result)));
75 res = RES_OK;
76 } break;
77
78 case CTRL_TRIM: { // Erase a block of sectors (used when _USE_ERASE == 1)
79 DWORD range[2];
80 // determine range
81 memcpy(range, buff, sizeof(range));
82 // clear memory
83 p_stream->eraseSector(range[0], range[1]);
84 res = RES_OK; /* FatFs does not check result of this command */
85 } break;
86
87 default:
88 res = RES_PARERR;
89 break;
90 }
91 return res;
92 }
93
94 protected:
95 T* p_stream = nullptr;
96 bool ok = false;
97 int sector_size = 512;
98 DSTATUS status = STA_NOINIT;
99};
100
101}
FatFS interface definition.
Definition IO.h:74
template class which expects a Stream class which provides the following additional methods
Definition StreamIO.h:17