1212#include < esp_partition.h>
1313#include < iostream>
1414#include < mutex>
15+ #include < thread>
1516
1617#if defined(ARDUINO_USB_MODE)
1718static_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
2627static const esp_partition_t *partition = nullptr ;
2728static 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+
2966class ReadyCondition
3067{
3168 public:
0 commit comments