passport.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include <furi.h>
  2. #include <gui/gui.h>
  3. #include <api-hal-version.h>
  4. typedef enum {
  5. EventTypeTick,
  6. EventTypeKey,
  7. } EventType;
  8. typedef struct {
  9. union {
  10. InputEvent input;
  11. } value;
  12. EventType type;
  13. } AppEvent;
  14. typedef struct {
  15. } State;
  16. static void input_callback(InputEvent* input_event, void* ctx) {
  17. osMessageQueueId_t event_queue = ctx;
  18. AppEvent event;
  19. event.type = EventTypeKey;
  20. event.value.input = *input_event;
  21. osMessageQueuePut(event_queue, &event, 0, osWaitForever);
  22. }
  23. static void render_callback(Canvas* canvas, void* ctx) {
  24. State* state = (State*)acquire_mutex((ValueMutex*)ctx, 25);
  25. /*
  26. char level[20];
  27. uint32_t current_level = dolphin_state_get_level(dolphin->state);
  28. uint32_t prev_cap = dolphin_state_xp_to_levelup(dolphin->state, current_level - 1, false);
  29. uint32_t exp = (dolphin_state_xp_to_levelup(dolphin->state, current_level, true) * 63) /
  30. (dolphin_state_xp_to_levelup(dolphin->state, current_level, false) - prev_cap);
  31. */
  32. canvas_clear(canvas);
  33. // multipass
  34. canvas_draw_icon_name(canvas, 0, 0, I_PassportLeft_6x47);
  35. canvas_draw_icon_name(canvas, 0, 47, I_PassportBottom_128x17);
  36. canvas_draw_line(canvas, 6, 0, 125, 0);
  37. canvas_draw_line(canvas, 127, 2, 127, 47);
  38. canvas_draw_dot(canvas, 126, 1);
  39. //portrait frame
  40. canvas_draw_line(canvas, 9, 6, 9, 53);
  41. canvas_draw_line(canvas, 10, 5, 52, 5);
  42. canvas_draw_line(canvas, 55, 8, 55, 53);
  43. canvas_draw_line(canvas, 10, 54, 54, 54);
  44. canvas_draw_line(canvas, 53, 5, 55, 7);
  45. // portrait
  46. canvas_draw_icon_name(canvas, 14, 11, I_DolphinOkay_41x43);
  47. canvas_draw_line(canvas, 59, 18, 124, 18);
  48. canvas_draw_line(canvas, 59, 31, 124, 31);
  49. canvas_draw_line(canvas, 59, 44, 124, 44);
  50. canvas_draw_str(canvas, 59, 15, api_hal_version_get_name_ptr());
  51. canvas_draw_str(canvas, 59, 28, "Mood: OK");
  52. /*
  53. snprintf(level, 20, "Level: %ld", current_level);
  54. canvas_draw_str(canvas, 59, 41, level);
  55. canvas_set_color(canvas, ColorWhite);
  56. canvas_draw_box(canvas, 123 - exp, 48, exp + 1, 6);
  57. canvas_set_color(canvas, ColorBlack);
  58. canvas_draw_line(canvas, 123 - exp, 48, 123 - exp, 54);
  59. */
  60. release_mutex((ValueMutex*)ctx, state);
  61. }
  62. int32_t passport(void* p) {
  63. State _state;
  64. ValueMutex state_mutex;
  65. osMessageQueueId_t event_queue = osMessageQueueNew(1, sizeof(AppEvent), NULL);
  66. furi_check(event_queue);
  67. if(!init_mutex(&state_mutex, &_state, sizeof(State))) {
  68. printf("cannot create mutex\r\n");
  69. return 0;
  70. }
  71. ViewPort* view_port = view_port_alloc();
  72. view_port_draw_callback_set(view_port, render_callback, &state_mutex);
  73. view_port_input_callback_set(view_port, input_callback, event_queue);
  74. Gui* gui = furi_record_open("gui");
  75. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  76. AppEvent event;
  77. while(1) {
  78. State* state = (State*)acquire_mutex_block(&state_mutex);
  79. osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, 25);
  80. if(event_status == osOK) {
  81. if(event.type == EventTypeKey && event.value.input.type == InputTypeShort) {
  82. release_mutex(&state_mutex, state);
  83. break;
  84. }
  85. }
  86. view_port_update(view_port);
  87. release_mutex(&state_mutex, state);
  88. }
  89. gui_remove_view_port(gui, view_port);
  90. view_port_free(view_port);
  91. furi_record_close("gui");
  92. delete_mutex(&state_mutex);
  93. osMessageQueueDelete(event_queue);
  94. return 0;
  95. }