あく f68c3b2a65
[FL-3264] Various stop mode fixes (#2584)
* BleGlue: log hci_cmd_resp invocation
* BleGlue: increase BleHciDriver stack size
* ble hid app: increase stack
* ble: comment unnecessary hci reset
* BleGlue: stricter checks in communication with core2, cleanup code
* Furi: enter insomnia when executing from RAM
---------
Co-authored-by: gornekich <n.gorbadey@gmail.com>
2023-04-18 21:38:35 +10:00

78 lines
1.9 KiB
C

#include <furi.h>
#include <furi_hal.h>
#include <flipper.h>
#include <alt_boot.h>
#include <semphr.h>
#include <update_util/update_operation.h>
#define TAG "Main"
int32_t init_task(void* context) {
UNUSED(context);
// Flipper FURI HAL
furi_hal_init();
// Init flipper
flipper_init();
return 0;
}
int main() {
// Initialize FURI layer
furi_init();
// Flipper critical FURI HAL
furi_hal_init_early();
FuriThread* main_thread = furi_thread_alloc_ex("Init", 4096, init_task, NULL);
#ifdef FURI_RAM_EXEC
// Prevent entering sleep mode when executed from RAM
furi_hal_power_insomnia_enter();
furi_thread_start(main_thread);
#else
furi_hal_light_sequence("RGB");
// Delay is for button sampling
furi_delay_ms(100);
FuriHalRtcBootMode boot_mode = furi_hal_rtc_get_boot_mode();
if(boot_mode == FuriHalRtcBootModeDfu || !furi_hal_gpio_read(&gpio_button_left)) {
furi_hal_light_sequence("rgb WB");
furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
flipper_boot_dfu_exec();
furi_hal_power_reset();
} else if(boot_mode == FuriHalRtcBootModeUpdate) {
furi_hal_light_sequence("rgb BR");
// Do update
flipper_boot_update_exec();
// if things go nice, we shouldn't reach this point.
// But if we do, abandon to avoid bootloops
furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal);
furi_hal_power_reset();
} else if(!furi_hal_gpio_read(&gpio_button_up)) {
furi_hal_light_sequence("rgb WR");
flipper_boot_recovery_exec();
furi_hal_power_reset();
} else {
furi_hal_light_sequence("rgb G");
furi_thread_start(main_thread);
}
#endif
// Run Kernel
furi_run();
furi_crash("Kernel is Dead");
}
void Error_Handler(void) {
furi_crash("ErrorHandler");
}
void abort() {
furi_crash("AbortHandler");
}