mag_scene_settings.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "../mag_i.h"
  2. #include "../mag_state.h"
  3. #include "../helpers/mag_helpers.h"
  4. #define TAG "MagSceneEmulateConfig"
  5. static const char* gpio[] = {
  6. [MagPinA7] = "2 (A7)",
  7. [MagPinA6] = "3 (A6)",
  8. [MagPinA4] = "4 (A4)",
  9. [MagPinB3] = "5 (B3)",
  10. [MagPinB2] = "6 (B2)",
  11. [MagPinC3] = "7 (C3)",
  12. [MagPinC1] = "15 (C1)",
  13. [MagPinC0] = "16 (C0)",
  14. };
  15. const uint8_t GPIO_COUNT = COUNT_OF(gpio);
  16. static void mag_scene_settings_set_gpio(VariableItem* item, MagPin* pin_out) {
  17. MagPin pin = variable_item_get_current_value_index(item);
  18. variable_item_set_current_value_text(item, gpio[pin]);
  19. *pin_out = pin;
  20. }
  21. static void mag_scene_settings_set_gpio_input(VariableItem* item) {
  22. Mag* mag = variable_item_get_context(item);
  23. mag_scene_settings_set_gpio(item, &mag->state.pin_input);
  24. };
  25. static void mag_scene_settings_set_gpio_output(VariableItem* item) {
  26. Mag* mag = variable_item_get_context(item);
  27. mag_scene_settings_set_gpio(item, &mag->state.pin_output);
  28. };
  29. static void mag_scene_settings_set_gpio_enable(VariableItem* item) {
  30. Mag* mag = variable_item_get_context(item);
  31. mag_scene_settings_set_gpio(item, &mag->state.pin_enable);
  32. };
  33. static void mag_pin_variable_item_list_add(
  34. Mag* mag,
  35. const char* label,
  36. MagPin pin,
  37. VariableItemChangeCallback change_callback) {
  38. VariableItem* item =
  39. variable_item_list_add(mag->variable_item_list, label, GPIO_COUNT, change_callback, mag);
  40. variable_item_set_current_value_index(item, pin);
  41. variable_item_set_current_value_text(item, gpio[pin]);
  42. }
  43. // static const char* uart_pins[] = {[DapUartTypeUSART1] = "13,14", [DapUartTypeLPUART1] = "15,16"};
  44. // static const char* uart_swap[] = {[DapUartTXRXNormal] = "No", [DapUartTXRXSwap] = "Yes"};
  45. void mag_scene_settings_on_enter(void* context) {
  46. Mag* mag = context;
  47. mag_pin_variable_item_list_add(
  48. mag, "Input pin:", mag->state.pin_input, mag_scene_settings_set_gpio_input);
  49. mag_pin_variable_item_list_add(
  50. mag, "Output pin:", mag->state.pin_output, mag_scene_settings_set_gpio_output);
  51. mag_pin_variable_item_list_add(
  52. mag, "Enable pin:", mag->state.pin_enable, mag_scene_settings_set_gpio_enable);
  53. view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList);
  54. }
  55. void mag_scene_invalid_dialog(Mag* mag) {
  56. SceneManager* scene_manager = mag->scene_manager;
  57. DialogMessage* message = dialog_message_alloc();
  58. dialog_message_set_header(message, "Invalid Pin Configuration!", 64, 0, AlignCenter, AlignTop);
  59. dialog_message_set_buttons(message, "Modify", NULL, "Reset");
  60. dialog_message_set_text(
  61. message,
  62. "Pins cannot overlap\nChange, or reset to defaults.",
  63. 64,
  64. 32,
  65. AlignCenter,
  66. AlignCenter);
  67. DialogMessageButton res = dialog_message_show(furi_record_open(RECORD_DIALOGS), message);
  68. dialog_message_free(message);
  69. furi_record_close(RECORD_DIALOGS);
  70. if(res == DialogMessageButtonRight) {
  71. mag_state_gpio_reset(&mag->state);
  72. scene_manager_previous_scene(scene_manager);
  73. }
  74. }
  75. bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
  76. Mag* mag = context;
  77. SceneManager* scene_manager = mag->scene_manager;
  78. bool consumed = false;
  79. if(event.type == SceneManagerEventTypeBack) {
  80. consumed = true;
  81. if(!mag_state_gpio_is_valid(&mag->state)) {
  82. mag_scene_invalid_dialog(mag);
  83. } else {
  84. scene_manager_previous_scene(scene_manager);
  85. }
  86. }
  87. return consumed;
  88. }
  89. void mag_scene_settings_on_exit(void* context) {
  90. Mag* mag = context;
  91. variable_item_list_reset(mag->variable_item_list);
  92. mag_state_save(&mag->state);
  93. }