committed by
GitHub
parent
6d80144e12
commit
85e26636a3
@@ -0,0 +1,85 @@
|
||||
#include "Sdcard.h"
|
||||
|
||||
#include "Mutex.h"
|
||||
#include "TactilityCore.h"
|
||||
|
||||
namespace tt::hal::sdcard {
|
||||
|
||||
#define TAG "sdcard"
|
||||
|
||||
static Mutex mutex(MutexTypeRecursive);
|
||||
|
||||
typedef struct {
|
||||
const SdCard* sdcard;
|
||||
void* context;
|
||||
} MountData;
|
||||
|
||||
static MountData data = {
|
||||
.sdcard = nullptr,
|
||||
.context = nullptr
|
||||
};
|
||||
|
||||
static bool lock(uint32_t timeout_ticks) {
|
||||
return mutex.acquire(timeout_ticks) == TtStatusOk;
|
||||
}
|
||||
|
||||
static void unlock() {
|
||||
mutex.release();
|
||||
}
|
||||
|
||||
bool mount(const SdCard* sdcard) {
|
||||
TT_LOG_I(TAG, "Mounting");
|
||||
|
||||
if (data.sdcard != nullptr) {
|
||||
TT_LOG_E(TAG, "Failed to mount: already mounted");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lock(100)) {
|
||||
void* context = sdcard->mount(TT_SDCARD_MOUNT_POINT);
|
||||
data = (MountData) {
|
||||
.sdcard = sdcard,
|
||||
.context = context
|
||||
};
|
||||
unlock();
|
||||
return (data.context != nullptr);
|
||||
} else {
|
||||
TT_LOG_E(TAG, "Failed to lock");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
State get_state() {
|
||||
if (data.context == nullptr) {
|
||||
return StateUnmounted;
|
||||
} else if (data.sdcard->is_mounted(data.context)) {
|
||||
return StateMounted;
|
||||
} else {
|
||||
return StateError;
|
||||
}
|
||||
}
|
||||
|
||||
bool unmount(uint32_t timeout_ticks) {
|
||||
TT_LOG_I(TAG, "Unmounting");
|
||||
bool result = false;
|
||||
|
||||
if (lock(timeout_ticks)) {
|
||||
if (data.sdcard != nullptr) {
|
||||
data.sdcard->unmount(data.context);
|
||||
data = (MountData) {
|
||||
.sdcard = nullptr,
|
||||
.context = nullptr
|
||||
};
|
||||
result = true;
|
||||
} else {
|
||||
TT_LOG_E(TAG, "Can't unmount: nothing mounted");
|
||||
}
|
||||
unlock();
|
||||
} else {
|
||||
TT_LOG_E(TAG, "Failed to lock in %lu ticks", timeout_ticks);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
Reference in New Issue
Block a user