Arduino FatFS
StreamIO.h
1 #pragma once
2 #include "IO.h"
3 
4 namespace fatfs {
5 
16 template <class T>
17 class 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