- Update `Configuration` to use C++ vector instead of C arrays - Rename `Desktop` app to `Launcher` - Fix for hard-coded app start of `Launcher` and `CrashDiagnostics` apps. - Ensure `Launcher` icons are clickable, even if they're not loading. - Don't show error scenario for SD card in statusbar when SD card status is unknown (this happens during Mutex timeout due to LVGL rendering delays) - Cleanup deprecated `Mutex` methods. - `hal::getConfiguration()` now returns a pointer instead of a reference, just like `tt:getConfiguration()`
109 lines
2.1 KiB
C++
109 lines
2.1 KiB
C++
#ifdef ESP_PLATFORM
|
|
|
|
#include <Log.h>
|
|
#include "Usb.h"
|
|
#include "UsbTusb.h"
|
|
#include "TactilityHeadless.h"
|
|
#include "hal/SpiSdCard.h"
|
|
|
|
namespace tt::hal::usb {
|
|
|
|
#define TAG "usb"
|
|
|
|
#define BOOT_FLAG 42
|
|
|
|
struct BootMode {
|
|
uint32_t flag = 0;
|
|
};
|
|
|
|
static Mode currentMode = ModeDefault;
|
|
static RTC_NOINIT_ATTR BootMode bootMode;
|
|
|
|
sdmmc_card_t* _Nullable getCard() {
|
|
auto sdcard = getConfiguration()->sdcard;
|
|
if (sdcard == nullptr) {
|
|
TT_LOG_W(TAG, "No SD card configuration found");
|
|
return nullptr;
|
|
}
|
|
|
|
if (!sdcard->isMounted()) {
|
|
TT_LOG_W(TAG, "SD card not mounted");
|
|
return nullptr;
|
|
}
|
|
|
|
auto spi_sdcard = std::static_pointer_cast<SpiSdCard>(sdcard);
|
|
if (spi_sdcard == nullptr) {
|
|
TT_LOG_W(TAG, "SD card interface is not supported (must be SpiSdCard)");
|
|
return nullptr;
|
|
}
|
|
|
|
auto* card = spi_sdcard->getCard();
|
|
if (card == nullptr) {
|
|
TT_LOG_W(TAG, "SD card has no card object available");
|
|
return nullptr;
|
|
}
|
|
|
|
return card;
|
|
}
|
|
|
|
static bool canStartNewMode() {
|
|
return isSupported() && (currentMode == ModeDefault || currentMode == ModeNone);
|
|
}
|
|
|
|
bool isSupported() {
|
|
return tusbIsSupported();
|
|
}
|
|
|
|
bool startMassStorageWithSdmmc() {
|
|
if (!canStartNewMode()) {
|
|
TT_LOG_E(TAG, "Can't start");
|
|
return false;
|
|
}
|
|
|
|
auto result = tusbStartMassStorageWithSdmmc();
|
|
if (result != ESP_OK) {
|
|
TT_LOG_E(TAG, "Failed to init mass storage: %s", esp_err_to_name(result));
|
|
return false;
|
|
} else {
|
|
currentMode = ModeMassStorageSdmmc;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
void stop() {
|
|
if (canStartNewMode()) {
|
|
return;
|
|
}
|
|
|
|
tusbStop();
|
|
|
|
currentMode = ModeNone;
|
|
}
|
|
|
|
Mode getMode() {
|
|
return currentMode;
|
|
}
|
|
|
|
bool canRebootIntoMassStorageSdmmc() {
|
|
return tusbIsSupported() && getCard() != nullptr;
|
|
}
|
|
|
|
void rebootIntoMassStorageSdmmc() {
|
|
if (tusbIsSupported()) {
|
|
bootMode.flag = BOOT_FLAG;
|
|
esp_restart();
|
|
}
|
|
}
|
|
|
|
bool isUsbBootMode() {
|
|
return bootMode.flag == BOOT_FLAG;
|
|
}
|
|
|
|
void resetUsbBootMode() {
|
|
bootMode.flag = 0;
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|