-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSdEnumerator.cpp
More file actions
88 lines (71 loc) · 2.31 KB
/
SdEnumerator.cpp
File metadata and controls
88 lines (71 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "SdEnumerator.h"
#include "Util.h"
SdEnumerator::SdEnumerator(const char* previousFileName, uint32_t spiSpeed, uint8_t csPin, uint64_t expectedFileSize) :
spiSpeed(spiSpeed),
csPin(csPin),
expectedFileSize(expectedFileSize)
{
strlcpy(currentFileName, previousFileName, array_size(currentFileName));
}
void SdEnumerator::setup() const {
pinMode(csPin, OUTPUT);
}
bool SdEnumerator::begin() {
return sd.begin(csPin, spiSpeed);
}
FsFile SdEnumerator::getNextImage() {
FsFile root = sd.open("/");
FsFile file;
char firstFileName[MaxFileNameLength];
uint32_t firstIndex = UINT_MAX;
char nextFileName[MaxFileNameLength];
uint32_t nextIndex = UINT_MAX;
while (file.openNext(&root)) {
if (!isSuitable(file)) {
file.close();
continue;
}
char candidateFileName[MaxFileNameLength];
file.getName(candidateFileName, array_size(candidateFileName));
if (firstIndex == UINT_MAX || strcmp(candidateFileName, firstFileName) < 0) {
strlcpy(firstFileName, candidateFileName, array_size(firstFileName));
firstIndex = file.dirIndex();
}
if (strcmp(candidateFileName, currentFileName) > 0 && (nextIndex == UINT_MAX || strcmp(candidateFileName, nextFileName) < 0)) {
strlcpy(nextFileName, candidateFileName, array_size(nextFileName));
nextIndex = file.dirIndex();
}
file.close();
}
if (nextIndex == UINT_MAX) {
nextIndex = firstIndex;
}
if (nextIndex != UINT_MAX) {
file.open(&root, nextIndex, O_RDONLY);
file.getName(currentFileName, array_size(currentFileName));
} else {
currentFileName[0] = '\0';
}
root.close();
return file;
}
FsFile SdEnumerator::getCurrentImage() {
FsFile root = sd.open("/");
FsFile file;
file.open(&root, currentFileName);
root.close();
if (!file.isOpen()) {
file = getNextImage();
}
return file;
}
FsFile SdEnumerator::getSystemImage(const char* fileName) {
FsFile system = sd.open("system");
FsFile file;
file.open(&system, fileName);
system.close();
return file;
}
bool SdEnumerator::isSuitable(FsFile& file) const {
return file.isOpen() && !file.isDir() && !file.isHidden() && file.fileSize() == expectedFileSize;
}