- Created `tt_get_platform()` to use with more complex platform checks aside from the `ESP_PLATFORM` preprocessor directive - Expand PC/sim memory to 256k so we can load the max amount of entries in Files without memory issues. I decided to skip the LVGL buffer entirely so it's easier to catch memory leaks. - Simplified logic in `files_data.c` - Implement statusbar as a proper widget - Implement statusbar widget for wifi service - Implement statusbar widget for sdcard mounting/unmounting
92 lines
2.1 KiB
C
92 lines
2.1 KiB
C
#include "sdcard.h"
|
|
|
|
#include "mutex.h"
|
|
#include "tactility_core.h"
|
|
#include "ui/statusbar.h"
|
|
|
|
#define TAG "sdcard"
|
|
|
|
static Mutex* mutex = NULL;
|
|
static int8_t statusbar_icon = -1;
|
|
|
|
typedef struct {
|
|
const SdCard* sdcard;
|
|
void* context;
|
|
} MountData;
|
|
|
|
static MountData data = {
|
|
.sdcard = NULL,
|
|
.context = NULL
|
|
};
|
|
|
|
static void sdcard_ensure_initialized() {
|
|
if (mutex == NULL) {
|
|
mutex = tt_mutex_alloc(MutexTypeRecursive);
|
|
statusbar_icon = tt_statusbar_icon_add("A:/assets/sdcard_unmounted.png");
|
|
}
|
|
}
|
|
|
|
static bool sdcard_lock(uint32_t timeout_ticks) {
|
|
sdcard_ensure_initialized();
|
|
return tt_mutex_acquire(mutex, timeout_ticks) == TtStatusOk;
|
|
}
|
|
|
|
static void sdcard_unlock() {
|
|
tt_mutex_release(mutex);
|
|
}
|
|
|
|
bool tt_sdcard_mount(const SdCard* sdcard) {
|
|
TT_LOG_I(TAG, "Mounting");
|
|
|
|
if (data.sdcard != NULL) {
|
|
TT_LOG_E(TAG, "Failed to mount: already mounted");
|
|
return false;
|
|
}
|
|
|
|
if (sdcard_lock(100)) {
|
|
void* context = sdcard->mount(TT_SDCARD_MOUNT_POINT);
|
|
data = (MountData) {
|
|
.context = context,
|
|
.sdcard = sdcard
|
|
};
|
|
sdcard_unlock();
|
|
if (data.context != NULL) {
|
|
tt_statusbar_icon_set_image(statusbar_icon, "A:/assets/sdcard_mounted.png");
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
TT_LOG_E(TAG, "Failed to lock");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool tt_sdcard_is_mounted() {
|
|
return data.context != NULL;
|
|
}
|
|
|
|
bool tt_sdcard_unmount(uint32_t timeout_ticks) {
|
|
TT_LOG_I(TAG, "Unmounting");
|
|
bool result = false;
|
|
|
|
if (sdcard_lock(timeout_ticks)) {
|
|
if (data.sdcard != NULL) {
|
|
data.sdcard->unmount(data.context);
|
|
data = (MountData) {
|
|
.context = NULL,
|
|
.sdcard = NULL
|
|
};
|
|
result = true;
|
|
tt_statusbar_icon_set_image(statusbar_icon, "A:/assets/sdcard_unmounted.png");
|
|
} else {
|
|
TT_LOG_E(TAG, "Can't unmount: nothing mounted");
|
|
}
|
|
sdcard_unlock();
|
|
} else {
|
|
TT_LOG_E(TAG, "Failed to lock in %lu ticks", timeout_ticks);
|
|
}
|
|
|
|
return result;
|
|
}
|