#include "assets_icons.h" #include "cmsis_os2.h" #include "dolphin/helpers/dolphin_state.h" #include "furi/check.h" #include "furi/record.h" #include #include #include #include "dolphin/dolphin.h" #include "math.h" #define MOODS_TOTAL 3 #define BUTTHURT_MAX 3 static const Icon* portrait_happy[BUTTHURT_MAX] = { &I_passport_happy1_46x49, &I_passport_happy2_46x49, &I_passport_happy3_46x49}; static const Icon* portrait_ok[BUTTHURT_MAX] = { &I_passport_okay1_46x49, &I_passport_okay2_46x49, &I_passport_okay3_46x49}; static const Icon* portrait_bad[BUTTHURT_MAX] = { &I_passport_bad1_46x49, &I_passport_bad2_46x49, &I_passport_bad3_46x49}; static const Icon** portraits[MOODS_TOTAL] = {portrait_happy, portrait_ok, portrait_bad}; static void input_callback(InputEvent* input, void* ctx) { osSemaphoreId_t semaphore = ctx; if((input->type == InputTypeShort) && (input->key == InputKeyBack)) { osSemaphoreRelease(semaphore); } } static void render_callback(Canvas* canvas, void* ctx) { DolphinStats* stats = ctx; char level_str[20]; char mood_str[32]; uint8_t mood = 0; if(stats->butthurt <= 4) { mood = 0; snprintf(mood_str, 20, "Mood: Happy"); } else if(stats->butthurt <= 9) { mood = 1; snprintf(mood_str, 20, "Mood: Ok"); } else { mood = 2; snprintf(mood_str, 20, "Mood: Angry"); } uint32_t xp_progress = 0; uint32_t xp_to_levelup = dolphin_state_xp_to_levelup(stats->icounter); uint32_t xp_for_current_level = xp_to_levelup + dolphin_state_xp_above_last_levelup(stats->icounter); if(stats->level == 3) { xp_progress = 0; } else { xp_progress = xp_to_levelup * 64 / xp_for_current_level; } // multipass canvas_draw_icon(canvas, 0, 0, &I_passport_left_6x46); canvas_draw_icon(canvas, 0, 46, &I_passport_bottom_128x18); canvas_draw_line(canvas, 6, 0, 125, 0); canvas_draw_line(canvas, 127, 2, 127, 47); canvas_draw_dot(canvas, 126, 1); // portrait furi_assert((stats->level > 0) && (stats->level <= 3)); canvas_draw_icon(canvas, 9, 5, portraits[mood][stats->level - 1]); canvas_draw_line(canvas, 58, 16, 123, 16); canvas_draw_line(canvas, 58, 30, 123, 30); canvas_draw_line(canvas, 58, 44, 123, 44); const char* my_name = furi_hal_version_get_name_ptr(); snprintf(level_str, 20, "Level: %hu", stats->level); canvas_draw_str(canvas, 58, 12, my_name ? my_name : "Unknown"); canvas_draw_str(canvas, 58, 26, mood_str); canvas_draw_str(canvas, 58, 40, level_str); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 123 - xp_progress, 47, xp_progress + 1, 6); canvas_set_color(canvas, ColorBlack); canvas_draw_line(canvas, 123, 47, 123, 52); } int32_t passport_app(void* p) { osSemaphoreId_t semaphore = osSemaphoreNew(1, 0, NULL); furi_assert(semaphore); ViewPort* view_port = view_port_alloc(); Dolphin* dolphin = furi_record_open("dolphin"); DolphinStats stats = dolphin_stats(dolphin); furi_record_close("dolphin"); view_port_draw_callback_set(view_port, render_callback, &stats); view_port_input_callback_set(view_port, input_callback, semaphore); Gui* gui = furi_record_open("gui"); gui_add_view_port(gui, view_port, GuiLayerFullscreen); view_port_update(view_port); osStatus_t status = osSemaphoreAcquire(semaphore, osWaitForever); furi_assert(status == osOK); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_record_close("gui"); osSemaphoreDelete(semaphore); return 0; }