findmy_main.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. const char* network_text = "";
  34. switch(model->type) {
  35. case FindMyTypeApple:
  36. network_text = "Apple Network";
  37. break;
  38. case FindMyTypeSamsung:
  39. network_text = "Samsung Network";
  40. break;
  41. case FindMyTypeTile:
  42. network_text = "Tile Network";
  43. break;
  44. default:
  45. break;
  46. }
  47. canvas_draw_str(canvas, 4, 32, network_text);
  48. canvas_draw_icon(canvas, 6 + canvas_string_width(canvas, network_text), 24, &I_Lock_7x8);
  49. canvas_set_font(canvas, FontSecondary);
  50. canvas_draw_str(canvas, 100, 61, "Config");
  51. canvas_draw_line(canvas, 100, 51, 127, 51);
  52. canvas_draw_line(canvas, 97, 53, 97, 63);
  53. canvas_draw_line(canvas, 97, 53, 99, 51);
  54. canvas_draw_line(canvas, 3, 52, 87, 52);
  55. }
  56. static bool findmy_main_input_callback(InputEvent* event, void* context) {
  57. furi_assert(context);
  58. FindMyMain* findmy_main = context;
  59. bool consumed = false;
  60. if(event->type == InputTypePress) {
  61. consumed = true;
  62. FindMyMainEvent cb_event;
  63. switch(event->key) {
  64. case InputKeyBack:
  65. cb_event = FindMyMainEventQuit;
  66. break;
  67. case InputKeyOk:
  68. cb_event = FindMyMainEventToggle;
  69. break;
  70. case InputKeyLeft:
  71. cb_event = FindMyMainEventBackground;
  72. break;
  73. case InputKeyRight:
  74. cb_event = FindMyMainEventConfig;
  75. break;
  76. case InputKeyUp:
  77. cb_event = FindMyMainEventIntervalUp;
  78. break;
  79. case InputKeyDown:
  80. cb_event = FindMyMainEventIntervalDown;
  81. break;
  82. default:
  83. return consumed;
  84. }
  85. findmy_main->callback(cb_event, findmy_main->context);
  86. }
  87. return consumed;
  88. }
  89. FindMyMain* findmy_main_alloc(FindMy* app) {
  90. FindMyMain* findmy_main = malloc(sizeof(FindMyMain));
  91. findmy_main->view = view_alloc();
  92. view_allocate_model(findmy_main->view, ViewModelTypeLocking, sizeof(FindMyMainModel));
  93. with_view_model(
  94. findmy_main->view,
  95. FindMyMainModel * model,
  96. {
  97. model->active = app->state.beacon_active;
  98. model->interval = app->state.broadcast_interval;
  99. model->type = app->state.tag_type;
  100. },
  101. false);
  102. view_set_context(findmy_main->view, findmy_main);
  103. view_set_draw_callback(findmy_main->view, findmy_main_draw_callback);
  104. view_set_input_callback(findmy_main->view, findmy_main_input_callback);
  105. return findmy_main;
  106. }
  107. void findmy_main_free(FindMyMain* findmy_main) {
  108. furi_assert(findmy_main);
  109. view_free(findmy_main->view);
  110. free(findmy_main);
  111. }
  112. View* findmy_main_get_view(FindMyMain* findmy_main) {
  113. furi_assert(findmy_main);
  114. return findmy_main->view;
  115. }
  116. void findmy_main_set_callback(FindMyMain* findmy_main, FindMyMainCallback callback, void* context) {
  117. furi_assert(findmy_main);
  118. furi_assert(callback);
  119. findmy_main->callback = callback;
  120. findmy_main->context = context;
  121. }
  122. void findmy_main_update_active(FindMyMain* findmy_main, bool active) {
  123. furi_assert(findmy_main);
  124. with_view_model(
  125. findmy_main->view, FindMyMainModel * model, { model->active = active; }, true);
  126. }
  127. void findmy_main_update_interval(FindMyMain* findmy_main, uint8_t interval) {
  128. furi_assert(findmy_main);
  129. with_view_model(
  130. findmy_main->view, FindMyMainModel * model, { model->interval = interval; }, true);
  131. }
  132. void findmy_main_update_type(FindMyMain* findmy_main, FindMyType type) {
  133. furi_assert(findmy_main);
  134. with_view_model(
  135. findmy_main->view, FindMyMainModel * model, { model->type = type; }, true);
  136. }