Browse Source

[FL-2892] Gui: update statusbar attention icon and better crash handling (#1908)

* Gui: update statusbar attention icon
* Furi: snapshot registers on crash and restore in halt
* Furi: document check routines
あく 3 years ago
parent
commit
f8af0c1509

+ 2 - 2
applications/services/gui/gui.c

@@ -152,7 +152,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) {
     }
     }
     // Extra notification
     // Extra notification
     if(need_attention) {
     if(need_attention) {
-        width = icon_get_width(&I_Attention_5x8);
+        width = icon_get_width(&I_Hidden_window_9x8);
         // Prepare work area background
         // Prepare work area background
         canvas_frame_set(
         canvas_frame_set(
             gui->canvas,
             gui->canvas,
@@ -166,7 +166,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) {
         // Draw Icon
         // Draw Icon
         canvas_frame_set(
         canvas_frame_set(
             gui->canvas, x, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_WORKAREA_HEIGHT);
             gui->canvas, x, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_WORKAREA_HEIGHT);
-        canvas_draw_icon(gui->canvas, 0, 0, &I_Attention_5x8);
+        canvas_draw_icon(gui->canvas, 0, 0, &I_Hidden_window_9x8);
         // Recalculate next position
         // Recalculate next position
         left_used += (width + 2);
         left_used += (width + 2);
         x += (width + 2);
         x += (width + 2);

BIN
assets/icons/StatusBar/Alert_9x8.png


BIN
assets/icons/StatusBar/Hidden_window_9x8.png


+ 6 - 3
firmware/targets/f7/api_symbols.csv

@@ -1,5 +1,5 @@
 entry,status,name,type,params
 entry,status,name,type,params
-Version,+,3.6,,
+Version,+,4.0,,
 Header,+,applications/services/bt/bt_service/bt.h,,
 Header,+,applications/services/bt/bt_service/bt.h,,
 Header,+,applications/services/cli/cli.h,,
 Header,+,applications/services/cli/cli.h,,
 Header,+,applications/services/cli/cli_vcp.h,,
 Header,+,applications/services/cli/cli_vcp.h,,
@@ -260,6 +260,8 @@ Function,-,__eprintf,void,"const char*, const char*, unsigned int, const char*"
 Function,+,__errno,int*,
 Function,+,__errno,int*,
 Function,-,__fpclassifyd,int,double
 Function,-,__fpclassifyd,int,double
 Function,-,__fpclassifyf,int,float
 Function,-,__fpclassifyf,int,float
+Function,+,__furi_crash,void,
+Function,+,__furi_halt,void,
 Function,-,__getdelim,ssize_t,"char**, size_t*, int, FILE*"
 Function,-,__getdelim,ssize_t,"char**, size_t*, int, FILE*"
 Function,-,__getline,ssize_t,"char**, size_t*, FILE*"
 Function,-,__getline,ssize_t,"char**, size_t*, FILE*"
 Function,-,__isinfd,int,double
 Function,-,__isinfd,int,double
@@ -891,7 +893,6 @@ Function,-,ftello,off_t,FILE*
 Function,-,ftrylockfile,int,FILE*
 Function,-,ftrylockfile,int,FILE*
 Function,-,funlockfile,void,FILE*
 Function,-,funlockfile,void,FILE*
 Function,-,funopen,FILE*,"const void*, int (*)(void*, char*, int), int (*)(void*, const char*, int), fpos_t (*)(void*, fpos_t, int), int (*)(void*)"
 Function,-,funopen,FILE*,"const void*, int (*)(void*, char*, int), int (*)(void*, const char*, int), fpos_t (*)(void*, fpos_t, int), int (*)(void*)"
-Function,+,furi_crash,void,const char*
 Function,+,furi_delay_ms,void,uint32_t
 Function,+,furi_delay_ms,void,uint32_t
 Function,+,furi_delay_tick,void,uint32_t
 Function,+,furi_delay_tick,void,uint32_t
 Function,+,furi_delay_until_tick,FuriStatus,uint32_t
 Function,+,furi_delay_until_tick,FuriStatus,uint32_t
@@ -1308,7 +1309,6 @@ Function,+,furi_hal_version_uid,const uint8_t*,
 Function,+,furi_hal_version_uid_size,size_t,
 Function,+,furi_hal_version_uid_size,size_t,
 Function,-,furi_hal_vibro_init,void,
 Function,-,furi_hal_vibro_init,void,
 Function,+,furi_hal_vibro_on,void,_Bool
 Function,+,furi_hal_vibro_on,void,_Bool
-Function,+,furi_halt,void,const char*
 Function,-,furi_init,void,
 Function,-,furi_init,void,
 Function,+,furi_kernel_get_tick_frequency,uint32_t,
 Function,+,furi_kernel_get_tick_frequency,uint32_t,
 Function,+,furi_kernel_lock,int32_t,
 Function,+,furi_kernel_lock,int32_t,
@@ -2674,6 +2674,7 @@ Variable,+,A_iButton_14,const Icon,
 Variable,-,ITM_RxBuffer,volatile int32_t,
 Variable,-,ITM_RxBuffer,volatile int32_t,
 Variable,+,I_125_10px,const Icon,
 Variable,+,I_125_10px,const Icon,
 Variable,+,I_ActiveConnection_50x64,const Icon,
 Variable,+,I_ActiveConnection_50x64,const Icon,
+Variable,+,I_Alert_9x8,const Icon,
 Variable,+,I_ArrowC_1_36x36,const Icon,
 Variable,+,I_ArrowC_1_36x36,const Icon,
 Variable,+,I_ArrowDownEmpty_14x15,const Icon,
 Variable,+,I_ArrowDownEmpty_14x15,const Icon,
 Variable,+,I_ArrowDownFilled_14x15,const Icon,
 Variable,+,I_ArrowDownFilled_14x15,const Icon,
@@ -2741,6 +2742,7 @@ Variable,+,I_HeatHi_25x27,const Icon,
 Variable,+,I_HeatHi_hvr_25x27,const Icon,
 Variable,+,I_HeatHi_hvr_25x27,const Icon,
 Variable,+,I_HeatLo_25x27,const Icon,
 Variable,+,I_HeatLo_25x27,const Icon,
 Variable,+,I_HeatLo_hvr_25x27,const Icon,
 Variable,+,I_HeatLo_hvr_25x27,const Icon,
+Variable,+,I_Hidden_window_9x8,const Icon,
 Variable,+,I_InfraredArrowDown_4x8,const Icon,
 Variable,+,I_InfraredArrowDown_4x8,const Icon,
 Variable,+,I_InfraredArrowUp_4x8,const Icon,
 Variable,+,I_InfraredArrowUp_4x8,const Icon,
 Variable,+,I_InfraredLearnShort_128x31,const Icon,
 Variable,+,I_InfraredLearnShort_128x31,const Icon,
@@ -2841,6 +2843,7 @@ Variable,+,I_update_10px,const Icon,
 Variable,-,MSIRangeTable,const uint32_t[16],
 Variable,-,MSIRangeTable,const uint32_t[16],
 Variable,-,SmpsPrescalerTable,const uint32_t[4][6],
 Variable,-,SmpsPrescalerTable,const uint32_t[4][6],
 Variable,+,SystemCoreClock,uint32_t,
 Variable,+,SystemCoreClock,uint32_t,
+Variable,+,__furi_check_message,const char*,
 Variable,+,_ctype_,const char[],
 Variable,+,_ctype_,const char[],
 Variable,+,_global_impure_ptr,_reent*,
 Variable,+,_global_impure_ptr,_reent*,
 Variable,+,_impure_ptr,_reent*,
 Variable,+,_impure_ptr,_reent*,

+ 32 - 13
furi/core/check.c

@@ -11,6 +11,9 @@
 #include <stdio.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdlib.h>
 
 
+PLACE_IN_SECTION("MB_MEM2") const char* __furi_check_message = NULL;
+PLACE_IN_SECTION("MB_MEM2") uint32_t __furi_check_registers[12] = {0};
+
 extern size_t xPortGetTotalHeapSize(void);
 extern size_t xPortGetTotalHeapSize(void);
 extern size_t xPortGetFreeHeapSize(void);
 extern size_t xPortGetFreeHeapSize(void);
 extern size_t xPortGetMinimumEverFreeHeapSize(void);
 extern size_t xPortGetMinimumEverFreeHeapSize(void);
@@ -52,8 +55,10 @@ static void __furi_print_name(bool isr) {
     }
     }
 }
 }
 
 
-static FURI_NORETURN void __furi_halt() {
+static FURI_NORETURN void __furi_halt_mcu() {
+    register const void* r12 asm ("r12") = (void*)__furi_check_registers;
     asm volatile(
     asm volatile(
+        "ldm r12, {r0-r11} \n"
 #ifdef FURI_DEBUG
 #ifdef FURI_DEBUG
         "bkpt 0x00  \n"
         "bkpt 0x00  \n"
 #endif
 #endif
@@ -61,22 +66,29 @@ static FURI_NORETURN void __furi_halt() {
         "wfi        \n"
         "wfi        \n"
         "b loop%=   \n"
         "b loop%=   \n"
         :
         :
-        :
+        : "r" (r12)
         : "memory");
         : "memory");
     __builtin_unreachable();
     __builtin_unreachable();
 }
 }
 
 
-FURI_NORETURN void furi_crash(const char* message) {
+FURI_NORETURN void __furi_crash() {
+    register const void* r12 asm ("r12") = (void*)__furi_check_registers;
+    asm volatile(
+        "stm r12, {r0-r11} \n"
+        :
+        : "r" (r12)
+        : "memory");
+
     bool isr = FURI_IS_ISR();
     bool isr = FURI_IS_ISR();
     __disable_irq();
     __disable_irq();
 
 
-    if(message == NULL) {
-        message = "Fatal Error";
+    if(__furi_check_message == NULL) {
+        __furi_check_message = "Fatal Error";
     }
     }
 
 
     furi_hal_console_puts("\r\n\033[0;31m[CRASH]");
     furi_hal_console_puts("\r\n\033[0;31m[CRASH]");
     __furi_print_name(isr);
     __furi_print_name(isr);
-    furi_hal_console_puts(message);
+    furi_hal_console_puts(__furi_check_message);
 
 
     if(!isr) {
     if(!isr) {
         __furi_print_stack_info();
         __furi_print_stack_info();
@@ -86,9 +98,9 @@ FURI_NORETURN void furi_crash(const char* message) {
 #ifdef FURI_DEBUG
 #ifdef FURI_DEBUG
     furi_hal_console_puts("\r\nSystem halted. Connect debugger for more info\r\n");
     furi_hal_console_puts("\r\nSystem halted. Connect debugger for more info\r\n");
     furi_hal_console_puts("\033[0m\r\n");
     furi_hal_console_puts("\033[0m\r\n");
-    __furi_halt();
+    __furi_halt_mcu();
 #else
 #else
-    furi_hal_rtc_set_fault_data((uint32_t)message);
+    furi_hal_rtc_set_fault_data((uint32_t)__furi_check_message);
     furi_hal_console_puts("\r\nRebooting system.\r\n");
     furi_hal_console_puts("\r\nRebooting system.\r\n");
     furi_hal_console_puts("\033[0m\r\n");
     furi_hal_console_puts("\033[0m\r\n");
     furi_hal_power_reset();
     furi_hal_power_reset();
@@ -96,18 +108,25 @@ FURI_NORETURN void furi_crash(const char* message) {
     __builtin_unreachable();
     __builtin_unreachable();
 }
 }
 
 
-FURI_NORETURN void furi_halt(const char* message) {
+FURI_NORETURN void __furi_halt() {
+    register const void* r12 asm ("r12") = (void*)__furi_check_registers;
+    asm volatile(
+        "stm r12, {r0-r11} \n"
+        :
+        : "r" (r12)
+        : "memory");
+
     bool isr = FURI_IS_ISR();
     bool isr = FURI_IS_ISR();
     __disable_irq();
     __disable_irq();
 
 
-    if(message == NULL) {
-        message = "System halt requested.";
+    if(__furi_check_message == NULL) {
+        __furi_check_message = "System halt requested.";
     }
     }
 
 
     furi_hal_console_puts("\r\n\033[0;31m[HALT]");
     furi_hal_console_puts("\r\n\033[0;31m[HALT]");
     __furi_print_name(isr);
     __furi_print_name(isr);
-    furi_hal_console_puts(message);
+    furi_hal_console_puts(__furi_check_message);
     furi_hal_console_puts("\r\nSystem halted. Bye-bye!\r\n");
     furi_hal_console_puts("\r\nSystem halted. Bye-bye!\r\n");
     furi_hal_console_puts("\033[0m\r\n");
     furi_hal_console_puts("\033[0m\r\n");
-    __furi_halt();
+    __furi_halt_mcu();
 }
 }

+ 38 - 11
furi/core/check.h

@@ -8,25 +8,52 @@ extern "C" {
 #define FURI_NORETURN noreturn
 #define FURI_NORETURN noreturn
 #endif
 #endif
 
 
+/** Pointer to pass message to __furi_crash and __furi_halt */
+extern const char* __furi_check_message;
+
+/** Crash system */
+FURI_NORETURN void __furi_crash();
+
+/** Halt system */
+FURI_NORETURN void __furi_halt();
+
+/** Crash system with message. Show message after reboot. */
+#define furi_crash(message)             \
+    do {                                \
+        __furi_check_message = message; \
+        __furi_crash();                 \
+    } while(0)
+
+/** Halt system with message. */
+#define furi_halt(message)              \
+    do {                                \
+        __furi_check_message = message; \
+        __furi_halt();                  \
+    } while(0)
+
 /** Check condition and crash if check failed */
 /** Check condition and crash if check failed */
-#define furi_check(__e) ((__e) ? (void)0 : furi_crash("furi_check failed\r\n"))
+#define furi_check(__e)                             \
+    do {                                            \
+        if ((__e) == 0) {                           \
+            furi_crash("furi_check failed\r\n");    \
+        }                                           \
+    } while(0)
 
 
 /** Only in debug build: Assert condition and crash if assert failed  */
 /** Only in debug build: Assert condition and crash if assert failed  */
 #ifdef FURI_DEBUG
 #ifdef FURI_DEBUG
-#define furi_assert(__e) ((__e) ? (void)0 : furi_crash("furi_assert failed\r\n"))
+#define furi_assert(__e)                            \
+    do {                                            \
+        if ((__e) == 0) {                           \
+            furi_crash("furi_assert failed\r\n");   \
+        }                                           \
+    } while(0)
 #else
 #else
-#define furi_assert(__e) \
-    do {                 \
-        ((void)(__e));   \
+#define furi_assert(__e)    \
+    do {                    \
+        ((void)(__e));      \
     } while(0)
     } while(0)
 #endif
 #endif
 
 
-/** Crash system */
-FURI_NORETURN void furi_crash(const char* message);
-
-/** Halt system */
-FURI_NORETURN void furi_halt(const char* message);
-
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
 #endif
 #endif