Преглед изворни кода

[FL-2083] Bring Passport back (#868)

* [FL-2083] Bring Passport back
* Move Passport to Settings
* Hide icounter editing

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
Albert Kharisov пре 4 година
родитељ
комит
604d80aed4

+ 5 - 1
applications/applications.c

@@ -33,6 +33,7 @@ extern int32_t keypad_test_app(void* p);
 extern int32_t lfrfid_app(void* p);
 extern int32_t lfrfid_debug_app(void* p);
 extern int32_t nfc_app(void* p);
+extern int32_t passport_app(void* p);
 extern int32_t scened_app(void* p);
 extern int32_t storage_test_app(void* p);
 extern int32_t subghz_app(void* p);
@@ -151,7 +152,6 @@ const FlipperApplication FLIPPER_APPS[] = {
 #ifdef APP_BAD_USB
     {.app = bad_usb_app, .name = "Bad USB", .stack_size = 2048, .icon = &A_BadUsb_14},
 #endif
-
 };
 
 const size_t FLIPPER_APPS_COUNT = sizeof(FLIPPER_APPS) / sizeof(FlipperApplication);
@@ -303,6 +303,10 @@ const FlipperApplication FLIPPER_SETTINGS_APPS[] = {
     {.app = desktop_settings_app, .name = "Desktop", .stack_size = 1024, .icon = NULL},
 #endif
 
+#ifdef APP_PASSPORT
+    {.app = passport_app, .name = "Passport", .stack_size = 1024, .icon = NULL},
+#endif
+
 #ifdef APP_ABOUT
     {.app = about_settings_app, .name = "About", .stack_size = 1024, .icon = NULL},
 #endif

+ 12 - 0
applications/applications.mk

@@ -32,6 +32,7 @@ APP_LF_RFID	= 1
 APP_NFC		= 1
 APP_SUBGHZ	= 1
 APP_ABOUT	= 1
+APP_PASSPORT = 1
 
 # Plugins
 APP_MUSIC_PLAYER = 1
@@ -100,6 +101,13 @@ SRV_GUI		= 1
 endif
 
 
+APP_PASSPORT ?= 0
+ifeq ($(APP_PASSPORT), 1)
+CFLAGS		+= -DAPP_PASSPORT
+SRV_GUI		= 1
+endif
+
+
 APP_LF_RFID ?= 0
 ifeq ($(APP_LF_RFID), 1)
 CFLAGS		+= -DAPP_LF_RFID
@@ -223,6 +231,10 @@ endif
 SRV_DOLPHIN ?= 0
 ifeq ($(SRV_DOLPHIN), 1)
 CFLAGS		+= -DSRV_DOLPHIN
+SRV_DOLPHIN_STATE_DEBUG ?= 0
+ifeq ($(SRV_DOLPHIN_STATE_DEBUG), 1)
+CFLAGS		+= -DSRV_DOLPHIN_STATE_DEBUG
+endif
 endif
 
 

+ 6 - 0
applications/desktop/views/desktop_debug.c

@@ -112,12 +112,18 @@ bool desktop_debug_input(InputEvent* event, void* context) {
     DesktopViewStatsScreens current = 0;
     with_view_model(
         debug_view->view, (DesktopDebugViewModel * model) {
+#if SRV_DOLPHIN_STATE_DEBUG == 1
             if(event->key == InputKeyDown) {
                 model->screen = (model->screen + 1) % DesktopViewStatsTotalCount;
             } else if(event->key == InputKeyUp) {
                 model->screen = ((model->screen - 1) + DesktopViewStatsTotalCount) %
                                 DesktopViewStatsTotalCount;
             }
+#else
+            if((event->key == InputKeyDown) || (event->key == InputKeyUp)) {
+                model->screen = !model->screen;
+            }
+#endif
             current = model->screen;
             return true;
         });

+ 12 - 0
applications/dolphin/helpers/dolphin_state.c

@@ -102,6 +102,18 @@ uint8_t dolphin_get_level(uint32_t icounter) {
     }
 }
 
+uint32_t dolphin_state_xp_above_last_levelup(uint32_t icounter) {
+    uint32_t threshold = 0;
+    if(icounter <= LEVEL2_THRESHOLD) {
+        threshold = 0;
+    } else if(icounter <= LEVEL3_THRESHOLD) {
+        threshold = LEVEL2_THRESHOLD + 1;
+    } else {
+        threshold = LEVEL3_THRESHOLD + 1;
+    }
+    return icounter - threshold;
+}
+
 uint32_t dolphin_state_xp_to_levelup(uint32_t icounter) {
     uint32_t threshold = 0;
     if(icounter <= LEVEL2_THRESHOLD) {

+ 2 - 0
applications/dolphin/helpers/dolphin_state.h

@@ -42,6 +42,8 @@ void dolphin_state_butthurted(DolphinState* dolphin_state);
 
 uint32_t dolphin_state_xp_to_levelup(uint32_t icounter);
 
+uint32_t dolphin_state_xp_above_last_levelup(uint32_t icounter);
+
 bool dolphin_state_is_levelup(uint32_t icounter);
 
 void dolphin_state_increase_level(DolphinState* dolphin_state);

+ 115 - 0
applications/dolphin/passport/passport.c

@@ -0,0 +1,115 @@
+#include "assets_icons.h"
+#include "cmsis_os2.h"
+#include "dolphin/helpers/dolphin_state.h"
+#include "furi/check.h"
+#include "furi/record.h"
+#include <furi.h>
+#include <gui/gui.h>
+#include <furi-hal-version.h>
+#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;
+}

Разлика између датотеке није приказан због своје велике величине
+ 3 - 3
assets/compiled/assets_icons.c


+ 85 - 74
assets/compiled/assets_icons.h

@@ -1,8 +1,8 @@
 #pragma once
 #include <gui/icon.h>
 
-extern const Icon I_Certification2_119x30;
 extern const Icon I_Certification1_103x23;
+extern const Icon I_Certification2_119x30;
 extern const Icon A_BadBattery_128x51;
 extern const Icon A_BoxActive_128x51;
 extern const Icon A_Box_128x51;
@@ -36,20 +36,20 @@ extern const Icon A_Level3HijackActive_128x51;
 extern const Icon A_Level3Hijack_128x51;
 extern const Icon A_Level3LabActive_128x51;
 extern const Icon A_Level3Lab_128x51;
-extern const Icon I_LevelUp2_04;
-extern const Icon I_LevelUp2_03;
 extern const Icon I_LevelUp2_07;
-extern const Icon I_LevelUp2_05;
-extern const Icon I_LevelUp2_02;
 extern const Icon I_LevelUp2_06;
+extern const Icon I_LevelUp2_04;
+extern const Icon I_LevelUp2_05;
 extern const Icon I_LevelUp2_01;
+extern const Icon I_LevelUp2_02;
+extern const Icon I_LevelUp2_03;
+extern const Icon I_LevelUp3_05;
+extern const Icon I_LevelUp3_04;
+extern const Icon I_LevelUp3_06;
 extern const Icon I_LevelUp3_07;
+extern const Icon I_LevelUp3_03;
 extern const Icon I_LevelUp3_02;
-extern const Icon I_LevelUp3_04;
-extern const Icon I_LevelUp3_05;
 extern const Icon I_LevelUp3_01;
-extern const Icon I_LevelUp3_03;
-extern const Icon I_LevelUp3_06;
 extern const Icon A_LevelUpPending_128x51;
 extern const Icon A_NoSdCard_128x51;
 extern const Icon A_SleepActive_128x52;
@@ -58,79 +58,79 @@ extern const Icon A_TvActive_128x52;
 extern const Icon A_Tv_128x52;
 extern const Icon A_WavesActive_128x52;
 extern const Icon A_Waves_128x52;
+extern const Icon I_dir_10px;
+extern const Icon I_Nfc_10px;
 extern const Icon I_sub1_10px;
 extern const Icon I_ir_10px;
-extern const Icon I_unknown_10px;
 extern const Icon I_ibutt_10px;
-extern const Icon I_Nfc_10px;
+extern const Icon I_unknown_10px;
 extern const Icon I_ble_10px;
 extern const Icon I_125_10px;
-extern const Icon I_dir_10px;
 extern const Icon I_BLE_Pairing_128x64;
-extern const Icon I_EviWaiting1_18x21;
-extern const Icon I_EviSmile2_18x21;
-extern const Icon I_Error_18x18;
-extern const Icon I_Percent_10x14;
-extern const Icon I_EviSmile1_18x21;
-extern const Icon I_EviWaiting2_18x21;
 extern const Icon I_UsbTree_48x22;
-extern const Icon I_Smile_18x18;
+extern const Icon I_EviWaiting2_18x21;
 extern const Icon I_Clock_18x18;
-extern const Icon I_ButtonDown_7x4;
-extern const Icon I_ButtonCenter_7x7;
+extern const Icon I_Smile_18x18;
+extern const Icon I_EviSmile1_18x21;
+extern const Icon I_Percent_10x14;
+extern const Icon I_Error_18x18;
+extern const Icon I_EviWaiting1_18x21;
+extern const Icon I_EviSmile2_18x21;
+extern const Icon I_ButtonRightSmall_3x5;
 extern const Icon I_ButtonLeft_4x7;
-extern const Icon I_ButtonUp_7x4;
-extern const Icon I_DFU_128x50;
 extern const Icon I_ButtonLeftSmall_3x5;
-extern const Icon I_ButtonRightSmall_3x5;
-extern const Icon I_ButtonRight_4x7;
+extern const Icon I_DFU_128x50;
 extern const Icon I_Warning_30x23;
+extern const Icon I_ButtonDown_7x4;
+extern const Icon I_ButtonRight_4x7;
+extern const Icon I_ButtonCenter_7x7;
+extern const Icon I_ButtonUp_7x4;
+extern const Icon I_DolphinOkay_41x43;
+extern const Icon I_DolphinFirstStart4_67x53;
 extern const Icon I_DolphinFirstStart2_59x51;
 extern const Icon I_DolphinFirstStart5_54x49;
+extern const Icon I_DolphinFirstStart0_70x53;
 extern const Icon I_DolphinFirstStart6_58x54;
-extern const Icon I_Flipper_young_80x60;
-extern const Icon I_DolphinFirstStart8_56x51;
 extern const Icon I_DolphinFirstStart1_59x53;
-extern const Icon I_DolphinOkay_41x43;
-extern const Icon I_DolphinFirstStart3_57x48;
+extern const Icon I_DolphinFirstStart8_56x51;
 extern const Icon I_DolphinFirstStart7_61x51;
-extern const Icon I_DolphinFirstStart0_70x53;
-extern const Icon I_DolphinFirstStart4_67x53;
-extern const Icon I_ArrowUpEmpty_14x15;
+extern const Icon I_Flipper_young_80x60;
+extern const Icon I_DolphinFirstStart3_57x48;
 extern const Icon I_ArrowUpFilled_14x15;
-extern const Icon I_ArrowDownFilled_14x15;
+extern const Icon I_ArrowUpEmpty_14x15;
 extern const Icon I_ArrowDownEmpty_14x15;
+extern const Icon I_ArrowDownFilled_14x15;
 extern const Icon I_PassportBottom_128x17;
-extern const Icon I_DoorLeft_70x55;
-extern const Icon I_DoorRight_70x55;
 extern const Icon I_DoorLocked_10x56;
+extern const Icon I_DoorLeft_70x55;
 extern const Icon I_PassportLeft_6x47;
+extern const Icon I_DoorRight_70x55;
 extern const Icon I_LockPopup_100x49;
-extern const Icon I_Down_hvr_25x27;
-extern const Icon I_Vol_down_hvr_25x27;
-extern const Icon I_Down_25x27;
-extern const Icon I_Fill_marker_7x7;
-extern const Icon I_Vol_down_25x27;
-extern const Icon I_Vol_up_25x27;
+extern const Icon I_Mute_25x27;
+extern const Icon I_IrdaArrowUp_4x8;
 extern const Icon I_Up_hvr_25x27;
-extern const Icon I_Vol_up_hvr_25x27;
-extern const Icon I_IrdaLearnShort_128x31;
-extern const Icon I_IrdaSend_128x64;
 extern const Icon I_DolphinReadingSuccess_59x63;
 extern const Icon I_Mute_hvr_25x27;
-extern const Icon I_Back_15x10;
-extern const Icon I_Up_25x27;
-extern const Icon I_IrdaArrowUp_4x8;
-extern const Icon I_Mute_25x27;
-extern const Icon I_Power_25x27;
-extern const Icon I_IrdaSendShort_128x34;
+extern const Icon I_Vol_down_25x27;
+extern const Icon I_Down_25x27;
+extern const Icon I_Power_hvr_25x27;
+extern const Icon I_IrdaLearnShort_128x31;
 extern const Icon I_IrdaArrowDown_4x8;
+extern const Icon I_Vol_down_hvr_25x27;
 extern const Icon I_IrdaLearn_128x64;
-extern const Icon I_Power_hvr_25x27;
+extern const Icon I_Down_hvr_25x27;
+extern const Icon I_Fill_marker_7x7;
+extern const Icon I_Power_25x27;
+extern const Icon I_Vol_up_25x27;
+extern const Icon I_Up_25x27;
+extern const Icon I_Back_15x10;
+extern const Icon I_IrdaSend_128x64;
+extern const Icon I_IrdaSendShort_128x34;
+extern const Icon I_Vol_up_hvr_25x27;
+extern const Icon I_KeySave_24x11;
+extern const Icon I_KeyBackspaceSelected_16x9;
 extern const Icon I_KeySaveSelected_24x11;
 extern const Icon I_KeyBackspace_16x9;
-extern const Icon I_KeyBackspaceSelected_16x9;
-extern const Icon I_KeySave_24x11;
 extern const Icon A_125khz_14;
 extern const Icon A_BadUsb_14;
 extern const Icon A_Bluetooth_14;
@@ -150,43 +150,54 @@ extern const Icon A_U2F_14;
 extern const Icon A_iButton_14;
 extern const Icon I_Detailed_chip_17x13;
 extern const Icon I_Medium_chip_22x21;
-extern const Icon I_BatteryBody_52x28;
-extern const Icon I_FaceCharging_29x14;
+extern const Icon I_passport_happy1_46x49;
+extern const Icon I_passport_bad3_46x49;
+extern const Icon I_passport_okay2_46x49;
+extern const Icon I_passport_bad2_46x49;
+extern const Icon I_passport_okay3_46x49;
+extern const Icon I_passport_bottom_128x18;
+extern const Icon I_passport_bad1_46x49;
+extern const Icon I_passport_happy3_46x49;
+extern const Icon I_passport_happy2_46x49;
+extern const Icon I_passport_okay1_46x49;
+extern const Icon I_passport_left_6x46;
 extern const Icon I_Health_16x16;
+extern const Icon I_FaceCharging_29x14;
+extern const Icon I_BatteryBody_52x28;
+extern const Icon I_Voltage_16x16;
 extern const Icon I_Temperature_16x16;
+extern const Icon I_FaceNopower_29x14;
+extern const Icon I_FaceNormal_29x14;
 extern const Icon I_Battery_16x16;
 extern const Icon I_FaceConfused_29x14;
-extern const Icon I_FaceNormal_29x14;
-extern const Icon I_Voltage_16x16;
-extern const Icon I_FaceNopower_29x14;
-extern const Icon I_RFIDDolphinSend_97x61;
 extern const Icon I_RFIDDolphinSuccess_108x57;
-extern const Icon I_RFIDDolphinReceive_97x61;
 extern const Icon I_RFIDBigChip_37x36;
+extern const Icon I_RFIDDolphinSend_97x61;
+extern const Icon I_RFIDDolphinReceive_97x61;
 extern const Icon I_SDQuestion_35x43;
 extern const Icon I_SDError_43x35;
 extern const Icon I_Cry_dolph_55x52;
-extern const Icon I_Background_128x11;
+extern const Icon I_BadUsb_9x8;
+extern const Icon I_PlaceholderR_30x13;
 extern const Icon I_Lock_8x8;
 extern const Icon I_Battery_26x8;
-extern const Icon I_Battery_19x8;
-extern const Icon I_USBConnected_15x8;
-extern const Icon I_BadUsb_9x8;
-extern const Icon I_BT_Pair_9x8;
 extern const Icon I_PlaceholderL_11x13;
+extern const Icon I_Battery_19x8;
+extern const Icon I_SDcardMounted_11x8;
 extern const Icon I_SDcardFail_11x8;
+extern const Icon I_USBConnected_15x8;
 extern const Icon I_Bluetooth_5x8;
-extern const Icon I_PlaceholderR_30x13;
-extern const Icon I_SDcardMounted_11x8;
-extern const Icon I_Quest_7x8;
-extern const Icon I_Lock_7x8;
+extern const Icon I_BT_Pair_9x8;
+extern const Icon I_Background_128x11;
 extern const Icon I_Scanning_123x52;
-extern const Icon I_MHz_25x11;
+extern const Icon I_Quest_7x8;
 extern const Icon I_Unlock_7x8;
-extern const Icon I_iButtonKey_49x44;
+extern const Icon I_MHz_25x11;
+extern const Icon I_Lock_7x8;
+extern const Icon I_DolphinMafia_115x62;
 extern const Icon I_DolphinExcited_64x63;
-extern const Icon I_DolphinWait_61x59;
+extern const Icon I_iButtonDolphinSuccess_109x60;
 extern const Icon I_iButtonDolphinVerySuccess_108x52;
-extern const Icon I_DolphinMafia_115x62;
+extern const Icon I_iButtonKey_49x44;
 extern const Icon I_DolphinNice_96x59;
-extern const Icon I_iButtonDolphinSuccess_109x60;
+extern const Icon I_DolphinWait_61x59;

BIN
assets/icons/Passport/passport_bad1_46x49.png


BIN
assets/icons/Passport/passport_bad2_46x49.png


BIN
assets/icons/Passport/passport_bad3_46x49.png


BIN
assets/icons/Passport/passport_bottom_128x18.png


BIN
assets/icons/Passport/passport_happy1_46x49.png


BIN
assets/icons/Passport/passport_happy2_46x49.png


BIN
assets/icons/Passport/passport_happy3_46x49.png


BIN
assets/icons/Passport/passport_left_6x46.png


BIN
assets/icons/Passport/passport_okay1_46x49.png


BIN
assets/icons/Passport/passport_okay2_46x49.png


BIN
assets/icons/Passport/passport_okay3_46x49.png


Неке датотеке нису приказане због велике количине промена