Ken Van Hoeylandt 29ea47a7ba
Improvements for Files app and statusbar icon (#35)
- 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
2024-02-07 23:11:39 +01:00

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;
}