Skip to content

Commit cea6d8b

Browse files
committed
WIP: Define manager for file system state
1 parent 432cffe commit cea6d8b

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

lib/storage/storage.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <esp_partition.h>
1313
#include <iostream>
1414
#include <mutex>
15+
#include <thread>
1516

1617
#if defined(ARDUINO_USB_MODE)
1718
static_assert(ARDUINO_USB_MODE == 0, "USB must be in OTG mode");
@@ -26,6 +27,42 @@ static constexpr std::uint16_t blockSize = 512; // Should be 512
2627
static const esp_partition_t *partition = nullptr;
2728
static const char *const TAG = "STORAGE";
2829

30+
class FileSystemSwitcher
31+
{
32+
public:
33+
typedef decltype(FFat) FileSystem;
34+
std::shared_ptr<FileSystem> getFileSystem_locking()
35+
{
36+
std::unique_lock fs_state_lock{fileSystemState_mutex};
37+
if (!fileSystemIsActive)
38+
{
39+
stateChanged.wait(fs_state_lock, [this]() { return fileSystemIsActive; });
40+
}
41+
fs_state_lock.release();
42+
return {&FFat, [this](FileSystem *) { fileSystemState_mutex.unlock(); }};
43+
}
44+
void requestState(const bool fileSystemActive)
45+
{
46+
requestFileSystemActive = fileSystemActive;
47+
stateChangeRequested.notify_all();
48+
}
49+
50+
protected:
51+
bool isFileSystemActive() const
52+
{
53+
return fileSystemIsActive;
54+
}
55+
void refreshState();
56+
57+
private:
58+
std::condition_variable stateChangeRequested;
59+
std::condition_variable stateChanged;
60+
std::atomic<bool> requestFileSystemActive;
61+
std::thread stateMachine;
62+
std::mutex fileSystemState_mutex; //!< used to lock the actual state
63+
bool fileSystemIsActive; //!< describes the current state
64+
};
65+
2966
class ReadyCondition
3067
{
3168
public:

0 commit comments

Comments
 (0)