findmy_main.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. bool show_mac;
  11. uint8_t interval;
  12. uint8_t mac[6];
  13. FindMyType type;
  14. } FindMyMainModel;
  15. static void findmy_main_draw_callback(Canvas* canvas, void* _model) {
  16. FindMyMainModel* model = _model;
  17. canvas_clear(canvas);
  18. canvas_set_bitmap_mode(canvas, true);
  19. canvas_set_font(canvas, FontPrimary);
  20. canvas_draw_str(canvas, 4, 11, "FindMy Flipper");
  21. const char* network_text = "";
  22. switch(model->type) {
  23. case FindMyTypeApple:
  24. network_text = "Apple Network";
  25. break;
  26. case FindMyTypeSamsung:
  27. network_text = "Samsung Network";
  28. break;
  29. case FindMyTypeTile:
  30. network_text = "Tile Network";
  31. break;
  32. default:
  33. break;
  34. }
  35. if(model->show_mac == false) {
  36. canvas_set_font(canvas, FontPrimary);
  37. canvas_draw_str(canvas, 4, 31, network_text);
  38. canvas_draw_icon(canvas, 6 + canvas_string_width(canvas, network_text), 24, &I_Lock_7x8);
  39. } else if(model->show_mac == true) {
  40. canvas_set_font(canvas, FontSecondary);
  41. char mac_str[23];
  42. snprintf(
  43. mac_str,
  44. sizeof(mac_str),
  45. "MAC: %02X:%02X:%02X:%02X:%02X:%02X",
  46. model->mac[0],
  47. model->mac[1],
  48. model->mac[2],
  49. model->mac[3],
  50. model->mac[4],
  51. model->mac[5]);
  52. canvas_draw_str(canvas, 4, 40, mac_str);
  53. canvas_draw_str(canvas, 4, 30, network_text);
  54. canvas_draw_icon(canvas, 6 + canvas_string_width(canvas, network_text), 23, &I_Lock_7x8);
  55. }
  56. canvas_set_font(canvas, FontSecondary);
  57. if(model->active) {
  58. canvas_draw_str(canvas, 4, 49, "Broadcast Active");
  59. canvas_draw_icon(canvas, 78, 41, &I_Ok_btn_9x9);
  60. } else {
  61. canvas_draw_str(canvas, 4, 49, "Broadcast Inactive");
  62. }
  63. canvas_set_font(canvas, FontSecondary);
  64. canvas_draw_str(canvas, 4, 21, "Press <- to run in background");
  65. canvas_set_font(canvas, FontSecondary);
  66. char interval_str[20];
  67. snprintf(interval_str, sizeof(interval_str), "Ping Interval: %ds", model->interval);
  68. canvas_draw_str(canvas, 4, 62, interval_str);
  69. canvas_set_font(canvas, FontSecondary);
  70. canvas_draw_str(canvas, 100, 61, "Config");
  71. canvas_draw_line(canvas, 100, 51, 127, 51);
  72. canvas_draw_line(canvas, 97, 53, 97, 63);
  73. canvas_draw_line(canvas, 97, 53, 99, 51);
  74. canvas_draw_line(canvas, 3, 52, 87, 52);
  75. }
  76. static bool findmy_main_input_callback(InputEvent* event, void* context) {
  77. furi_assert(context);
  78. FindMyMain* findmy_main = context;
  79. bool consumed = false;
  80. if(event->type == InputTypePress) {
  81. consumed = true;
  82. FindMyMainEvent cb_event;
  83. switch(event->key) {
  84. case InputKeyBack:
  85. cb_event = FindMyMainEventQuit;
  86. break;
  87. case InputKeyOk:
  88. cb_event = FindMyMainEventToggle;
  89. break;
  90. case InputKeyLeft:
  91. cb_event = FindMyMainEventBackground;
  92. break;
  93. case InputKeyRight:
  94. cb_event = FindMyMainEventConfig;
  95. break;
  96. case InputKeyUp:
  97. cb_event = FindMyMainEventIntervalUp;
  98. break;
  99. case InputKeyDown:
  100. cb_event = FindMyMainEventIntervalDown;
  101. break;
  102. default:
  103. return consumed;
  104. }
  105. findmy_main->callback(cb_event, findmy_main->context);
  106. }
  107. return consumed;
  108. }
  109. FindMyMain* findmy_main_alloc(FindMy* app) {
  110. FindMyMain* findmy_main = malloc(sizeof(FindMyMain));
  111. findmy_main->view = view_alloc();
  112. view_allocate_model(findmy_main->view, ViewModelTypeLocking, sizeof(FindMyMainModel));
  113. with_view_model(
  114. findmy_main->view,
  115. FindMyMainModel * model,
  116. {
  117. model->active = app->state.beacon_active;
  118. model->interval = app->state.broadcast_interval;
  119. model->show_mac = app->state.show_mac;
  120. memcpy(model->mac, app->state.mac, sizeof(model->mac));
  121. model->type = app->state.tag_type;
  122. },
  123. false);
  124. view_set_context(findmy_main->view, findmy_main);
  125. view_set_draw_callback(findmy_main->view, findmy_main_draw_callback);
  126. view_set_input_callback(findmy_main->view, findmy_main_input_callback);
  127. return findmy_main;
  128. }
  129. void findmy_main_free(FindMyMain* findmy_main) {
  130. furi_assert(findmy_main);
  131. view_free(findmy_main->view);
  132. free(findmy_main);
  133. }
  134. View* findmy_main_get_view(FindMyMain* findmy_main) {
  135. furi_assert(findmy_main);
  136. return findmy_main->view;
  137. }
  138. void findmy_main_set_callback(FindMyMain* findmy_main, FindMyMainCallback callback, void* context) {
  139. furi_assert(findmy_main);
  140. furi_assert(callback);
  141. findmy_main->callback = callback;
  142. findmy_main->context = context;
  143. }
  144. void findmy_main_update_active(FindMyMain* findmy_main, bool active) {
  145. furi_assert(findmy_main);
  146. with_view_model(
  147. findmy_main->view, FindMyMainModel * model, { model->active = active; }, true);
  148. }
  149. void findmy_main_toggle_mac(FindMyMain* findmy_main, bool show_mac) {
  150. furi_assert(findmy_main);
  151. with_view_model(
  152. findmy_main->view, FindMyMainModel * model, { model->show_mac = show_mac; }, true);
  153. }
  154. void findmy_main_update_mac(FindMyMain* findmy_main, uint8_t* mac) {
  155. with_view_model(
  156. findmy_main->view,
  157. FindMyMainModel * model,
  158. {
  159. memcpy(model->mac, mac, sizeof(model->mac));
  160. furi_hal_bt_reverse_mac_addr(model->mac);
  161. },
  162. true);
  163. }
  164. void findmy_main_update_interval(FindMyMain* findmy_main, uint8_t interval) {
  165. furi_assert(findmy_main);
  166. with_view_model(
  167. findmy_main->view, FindMyMainModel * model, { model->interval = interval; }, true);
  168. }
  169. void findmy_main_update_type(FindMyMain* findmy_main, FindMyType type) {
  170. furi_assert(findmy_main);
  171. with_view_model(
  172. findmy_main->view, FindMyMainModel * model, { model->type = type; }, true);
  173. }