findmy_main.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "findmy_main.h"
  2. #include "../findmy_i.h"
  3. struct FindMyMain {
  4. View* view;
  5. FindMyMainCallback callback;
  6. void* context;
  7. };
  8. typedef struct {
  9. bool active;
  10. uint8_t interval;
  11. FindMyType type;
  12. } FindMyMainModel;
  13. static void findmy_main_draw_callback(Canvas* canvas, void* _model) {
  14. FindMyMainModel* model = _model;
  15. canvas_clear(canvas);
  16. canvas_set_bitmap_mode(canvas, true);
  17. canvas_set_font(canvas, FontPrimary);
  18. canvas_draw_str(canvas, 4, 11, "FindMy Flipper");
  19. canvas_set_font(canvas, FontSecondary);
  20. if(model->active) {
  21. canvas_draw_str(canvas, 4, 49, "Broadcast Active");
  22. canvas_draw_icon(canvas, 78, 42, &I_Ok_btn_9x9);
  23. } else {
  24. canvas_draw_str(canvas, 4, 49, "Broadcast Inactive");
  25. }
  26. canvas_set_font(canvas, FontSecondary);
  27. canvas_draw_str(canvas, 4, 21, "Press <- to run in background");
  28. canvas_set_font(canvas, FontSecondary);
  29. char interval_str[20];
  30. snprintf(interval_str, sizeof(interval_str), "Ping Interval: %ds", model->interval);
  31. canvas_draw_str(canvas, 4, 62, interval_str);
  32. canvas_set_font(canvas, FontPrimary);
  33. switch(model->type) {
  34. case FindMyTypeApple:
  35. canvas_draw_str(canvas, 4, 32, "Apple Network");
  36. canvas_draw_icon(canvas, 80, 24, &I_Lock_7x8);
  37. break;
  38. case FindMyTypeSamsung:
  39. canvas_draw_str(canvas, 4, 32, "Samsung Network");
  40. canvas_draw_icon(canvas, 97, 24, &I_Lock_7x8);
  41. break;
  42. default:
  43. break;
  44. }
  45. canvas_set_font(canvas, FontSecondary);
  46. canvas_draw_str(canvas, 100, 61, "Config");
  47. canvas_draw_line(canvas, 100, 51, 127, 51);
  48. canvas_draw_line(canvas, 97, 53, 97, 63);
  49. canvas_draw_line(canvas, 97, 53, 99, 51);
  50. canvas_draw_line(canvas, 3, 52, 87, 52);
  51. }
  52. static bool findmy_main_input_callback(InputEvent* event, void* context) {
  53. furi_assert(context);
  54. FindMyMain* findmy_main = context;
  55. bool consumed = false;
  56. if(event->type == InputTypePress) {
  57. consumed = true;
  58. FindMyMainEvent cb_event;
  59. switch(event->key) {
  60. case InputKeyBack:
  61. cb_event = FindMyMainEventQuit;
  62. break;
  63. case InputKeyOk:
  64. cb_event = FindMyMainEventToggle;
  65. break;
  66. case InputKeyLeft:
  67. cb_event = FindMyMainEventBackground;
  68. break;
  69. case InputKeyRight:
  70. cb_event = FindMyMainEventConfig;
  71. break;
  72. case InputKeyUp:
  73. cb_event = FindMyMainEventIntervalUp;
  74. break;
  75. case InputKeyDown:
  76. cb_event = FindMyMainEventIntervalDown;
  77. break;
  78. default:
  79. return consumed;
  80. }
  81. findmy_main->callback(cb_event, findmy_main->context);
  82. }
  83. return consumed;
  84. }
  85. FindMyMain* findmy_main_alloc(FindMy* app) {
  86. FindMyMain* findmy_main = malloc(sizeof(FindMyMain));
  87. findmy_main->view = view_alloc();
  88. view_allocate_model(findmy_main->view, ViewModelTypeLocking, sizeof(FindMyMainModel));
  89. with_view_model(
  90. findmy_main->view,
  91. FindMyMainModel * model,
  92. {
  93. model->active = app->state.beacon_active;
  94. model->interval = app->state.broadcast_interval;
  95. model->type = findmy_data_get_type(app->state.data);
  96. },
  97. false);
  98. view_set_context(findmy_main->view, findmy_main);
  99. view_set_draw_callback(findmy_main->view, findmy_main_draw_callback);
  100. view_set_input_callback(findmy_main->view, findmy_main_input_callback);
  101. return findmy_main;
  102. }
  103. void findmy_main_free(FindMyMain* findmy_main) {
  104. furi_assert(findmy_main);
  105. view_free(findmy_main->view);
  106. free(findmy_main);
  107. }
  108. View* findmy_main_get_view(FindMyMain* findmy_main) {
  109. furi_assert(findmy_main);
  110. return findmy_main->view;
  111. }
  112. void findmy_main_set_callback(FindMyMain* findmy_main, FindMyMainCallback callback, void* context) {
  113. furi_assert(findmy_main);
  114. furi_assert(callback);
  115. findmy_main->callback = callback;
  116. findmy_main->context = context;
  117. }
  118. void findmy_main_update_active(FindMyMain* findmy_main, bool active) {
  119. furi_assert(findmy_main);
  120. with_view_model(
  121. findmy_main->view, FindMyMainModel * model, { model->active = active; }, true);
  122. }
  123. void findmy_main_update_interval(FindMyMain* findmy_main, uint8_t interval) {
  124. furi_assert(findmy_main);
  125. with_view_model(
  126. findmy_main->view, FindMyMainModel * model, { model->interval = interval; }, true);
  127. }
  128. void findmy_main_update_type(FindMyMain* findmy_main, FindMyType type) {
  129. furi_assert(findmy_main);
  130. with_view_model(
  131. findmy_main->view, FindMyMainModel * model, { model->type = type; }, true);
  132. }