* Lib: adjust default contrast for ERC displays * Furi: various improvements in check module * Format Sources * FurHal: ble early hardfault detection --------- Co-authored-by: hedger <hedger@users.noreply.github.com>
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <furi_hal.h>
 | 
						|
#include <furi.h>
 | 
						|
 | 
						|
#include <gui/gui.h>
 | 
						|
#include <gui/view_dispatcher.h>
 | 
						|
#include <gui/modules/submenu.h>
 | 
						|
 | 
						|
#define TAG "CrashTest"
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    Gui* gui;
 | 
						|
    ViewDispatcher* view_dispatcher;
 | 
						|
    Submenu* submenu;
 | 
						|
} CrashTest;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
    CrashTestViewSubmenu,
 | 
						|
} CrashTestView;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
    CrashTestSubmenuCheck,
 | 
						|
    CrashTestSubmenuCheckMessage,
 | 
						|
    CrashTestSubmenuAssert,
 | 
						|
    CrashTestSubmenuAssertMessage,
 | 
						|
    CrashTestSubmenuCrash,
 | 
						|
    CrashTestSubmenuHalt,
 | 
						|
} CrashTestSubmenu;
 | 
						|
 | 
						|
static void crash_test_submenu_callback(void* context, uint32_t index) {
 | 
						|
    CrashTest* instance = (CrashTest*)context;
 | 
						|
    UNUSED(instance);
 | 
						|
 | 
						|
    switch(index) {
 | 
						|
    case CrashTestSubmenuCheck:
 | 
						|
        furi_check(false);
 | 
						|
        break;
 | 
						|
    case CrashTestSubmenuCheckMessage:
 | 
						|
        furi_check(false, "Crash test: furi_check with message");
 | 
						|
        break;
 | 
						|
    case CrashTestSubmenuAssert:
 | 
						|
        furi_assert(false);
 | 
						|
        break;
 | 
						|
    case CrashTestSubmenuAssertMessage:
 | 
						|
        furi_assert(false, "Crash test: furi_assert with message");
 | 
						|
        break;
 | 
						|
    case CrashTestSubmenuCrash:
 | 
						|
        furi_crash("Crash test: furi_crash");
 | 
						|
        break;
 | 
						|
    case CrashTestSubmenuHalt:
 | 
						|
        furi_halt("Crash test: furi_halt");
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        furi_crash("Programming error");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static uint32_t crash_test_exit_callback(void* context) {
 | 
						|
    UNUSED(context);
 | 
						|
    return VIEW_NONE;
 | 
						|
}
 | 
						|
 | 
						|
CrashTest* crash_test_alloc() {
 | 
						|
    CrashTest* instance = malloc(sizeof(CrashTest));
 | 
						|
 | 
						|
    View* view = NULL;
 | 
						|
 | 
						|
    instance->gui = furi_record_open(RECORD_GUI);
 | 
						|
    instance->view_dispatcher = view_dispatcher_alloc();
 | 
						|
    view_dispatcher_enable_queue(instance->view_dispatcher);
 | 
						|
    view_dispatcher_attach_to_gui(
 | 
						|
        instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen);
 | 
						|
 | 
						|
    // Menu
 | 
						|
    instance->submenu = submenu_alloc();
 | 
						|
    view = submenu_get_view(instance->submenu);
 | 
						|
    view_set_previous_callback(view, crash_test_exit_callback);
 | 
						|
    view_dispatcher_add_view(instance->view_dispatcher, CrashTestViewSubmenu, view);
 | 
						|
    submenu_add_item(
 | 
						|
        instance->submenu, "Check", CrashTestSubmenuCheck, crash_test_submenu_callback, instance);
 | 
						|
    submenu_add_item(
 | 
						|
        instance->submenu,
 | 
						|
        "Check with message",
 | 
						|
        CrashTestSubmenuCheckMessage,
 | 
						|
        crash_test_submenu_callback,
 | 
						|
        instance);
 | 
						|
    submenu_add_item(
 | 
						|
        instance->submenu, "Assert", CrashTestSubmenuAssert, crash_test_submenu_callback, instance);
 | 
						|
    submenu_add_item(
 | 
						|
        instance->submenu,
 | 
						|
        "Assert with message",
 | 
						|
        CrashTestSubmenuAssertMessage,
 | 
						|
        crash_test_submenu_callback,
 | 
						|
        instance);
 | 
						|
    submenu_add_item(
 | 
						|
        instance->submenu, "Crash", CrashTestSubmenuCrash, crash_test_submenu_callback, instance);
 | 
						|
    submenu_add_item(
 | 
						|
        instance->submenu, "Halt", CrashTestSubmenuHalt, crash_test_submenu_callback, instance);
 | 
						|
 | 
						|
    return instance;
 | 
						|
}
 | 
						|
 | 
						|
void crash_test_free(CrashTest* instance) {
 | 
						|
    view_dispatcher_remove_view(instance->view_dispatcher, CrashTestViewSubmenu);
 | 
						|
    submenu_free(instance->submenu);
 | 
						|
 | 
						|
    view_dispatcher_free(instance->view_dispatcher);
 | 
						|
    furi_record_close(RECORD_GUI);
 | 
						|
 | 
						|
    free(instance);
 | 
						|
}
 | 
						|
 | 
						|
int32_t crash_test_run(CrashTest* instance) {
 | 
						|
    view_dispatcher_switch_to_view(instance->view_dispatcher, CrashTestViewSubmenu);
 | 
						|
    view_dispatcher_run(instance->view_dispatcher);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
int32_t crash_test_app(void* p) {
 | 
						|
    UNUSED(p);
 | 
						|
 | 
						|
    CrashTest* instance = crash_test_alloc();
 | 
						|
 | 
						|
    int32_t ret = crash_test_run(instance);
 | 
						|
 | 
						|
    crash_test_free(instance);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 |