mag_scene_emulate.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "../mag_i.h"
  2. #include "../helpers/mag_helpers.h"
  3. #define TAG "MagSceneEmulate"
  4. void cat_trackstr(FuriString* str, uint8_t calls, uint8_t i, FuriString* trackstr) {
  5. furi_string_cat_printf(
  6. str,
  7. "%sTrack %d:%s%s\n",
  8. (calls == 0) ? "" : "\n", // if first line, don't prepend a "\n"
  9. (i + 1),
  10. furi_string_empty(trackstr) ? " " : "\n",
  11. furi_string_empty(trackstr) ? "< empty >" : furi_string_get_cstr(trackstr));
  12. }
  13. void mag_scene_emulate_on_enter(void* context) {
  14. Mag* mag = context;
  15. Widget* widget = mag->widget;
  16. FuriString* tmp_str;
  17. tmp_str = furi_string_alloc();
  18. // Use strlcpy instead perhaps, to truncate to screen width, then add ellipses if needed?
  19. furi_string_printf(tmp_str, "%s\r\n", mag->mag_dev->dev_name);
  20. // TODO: Display other relevant config settings (namely RFID vs GPIO)?
  21. widget_add_icon_element(widget, 1, 1, &I_mag_file_10px);
  22. widget_add_string_element(
  23. widget, 13, 2, AlignLeft, AlignTop, FontPrimary, furi_string_get_cstr(tmp_str));
  24. furi_string_reset(tmp_str);
  25. FURI_LOG_D(TAG, "%d", mag->state.reverse);
  26. // print relevant data
  27. uint8_t cat_count = 0;
  28. for(uint8_t i = 0; i < MAG_DEV_TRACKS; i++) {
  29. FuriString* trackstr = mag->mag_dev->dev_data.track[i].str;
  30. // still messy / dumb way to do this, but slightly cleaner than before.
  31. // will clean up more later
  32. switch(mag->state.track) {
  33. case MagTrackStateOne:
  34. if(i == 0) cat_trackstr(tmp_str, cat_count++, i, trackstr);
  35. break;
  36. case MagTrackStateTwo:
  37. if(i == 1) cat_trackstr(tmp_str, cat_count++, i, trackstr);
  38. break;
  39. case MagTrackStateThree:
  40. if(i == 2) cat_trackstr(tmp_str, cat_count++, i, trackstr);
  41. break;
  42. case MagTrackStateOneAndTwo:
  43. if((i == 0) | (i == 1)) cat_trackstr(tmp_str, cat_count++, i, trackstr);
  44. break;
  45. }
  46. }
  47. widget_add_text_scroll_element(widget, 0, 15, 128, 49, furi_string_get_cstr(tmp_str));
  48. widget_add_button_element(widget, GuiButtonTypeLeft, "Config", mag_widget_callback, mag);
  49. widget_add_button_element(widget, GuiButtonTypeRight, "Send", mag_widget_callback, mag);
  50. view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget);
  51. furi_string_free(tmp_str);
  52. }
  53. bool mag_scene_emulate_on_event(void* context, SceneManagerEvent event) {
  54. Mag* mag = context;
  55. SceneManager* scene_manager = mag->scene_manager;
  56. bool consumed = false;
  57. if(event.type == SceneManagerEventTypeCustom) {
  58. switch(event.event) {
  59. case GuiButtonTypeLeft:
  60. consumed = true;
  61. scene_manager_next_scene(scene_manager, MagSceneEmulateConfig);
  62. break;
  63. case GuiButtonTypeRight:
  64. consumed = true;
  65. notification_message(mag->notifications, &sequence_blink_start_cyan);
  66. mag_spoof(mag);
  67. notification_message(mag->notifications, &sequence_blink_stop);
  68. break;
  69. }
  70. }
  71. return consumed;
  72. }
  73. void mag_scene_emulate_on_exit(void* context) {
  74. Mag* mag = context;
  75. notification_message(mag->notifications, &sequence_blink_stop);
  76. widget_reset(mag->widget);
  77. }