pokemon_pins.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include <gui/modules/variable_item_list.h>
  2. #include <furi.h>
  3. #include "../pokemon_app.h"
  4. #include "pokemon_menu.h"
  5. struct named_pins {
  6. const char* text;
  7. const GpioPin* pin;
  8. };
  9. static const struct named_pins named_pins[] = {
  10. {"PA7", &gpio_ext_pa7},
  11. {"PA6", &gpio_ext_pa6},
  12. {"PA4", &gpio_ext_pa4},
  13. {"PB3", &gpio_ext_pb3},
  14. {"PB2", &gpio_ext_pb2},
  15. {"PC3", &gpio_ext_pc3},
  16. {"PC1", &gpio_ext_pc1},
  17. {"PC0", &gpio_ext_pc0},
  18. {},
  19. };
  20. #define NUM_PINS 8
  21. /* This must match gblink's enum order */
  22. static const char* named_groups[] = {
  23. "Original",
  24. "Malveke",
  25. "Custom",
  26. "",
  27. };
  28. struct itemlist_builder {
  29. VariableItem* named;
  30. VariableItem* serin;
  31. VariableItem* serout;
  32. VariableItem* clk;
  33. uint8_t named_index;
  34. uint8_t serin_index;
  35. uint8_t serout_index;
  36. uint8_t clk_index;
  37. };
  38. /* Just make it a global, whatever */
  39. static struct itemlist_builder builder = {0};
  40. static void select_pins_rebuild_list(PokemonFap* pokemon_fap);
  41. static void select_pins_set(PokemonFap* pokemon_fap) {
  42. pokemon_fap->pins.serin = named_pins[builder.serin_index].pin;
  43. pokemon_fap->pins.serout = named_pins[builder.serout_index].pin;
  44. pokemon_fap->pins.clk = named_pins[builder.clk_index].pin;
  45. }
  46. static void select_named_group_callback(VariableItem* item) {
  47. uint8_t index = variable_item_get_current_value_index(item);
  48. PokemonFap* pokemon_fap = variable_item_get_context(item);
  49. variable_item_set_current_value_text(item, named_groups[index]);
  50. builder.named_index = index;
  51. select_pins_rebuild_list(pokemon_fap);
  52. variable_item_list_set_selected_item(pokemon_fap->variable_item_list, 0);
  53. }
  54. static void select_pins_serin_callback(VariableItem* item) {
  55. uint8_t index = variable_item_get_current_value_index(item);
  56. PokemonFap* pokemon_fap = variable_item_get_context(item);
  57. variable_item_set_current_value_text(item, named_pins[index].text);
  58. builder.serin_index = index;
  59. select_pins_rebuild_list(pokemon_fap);
  60. variable_item_list_set_selected_item(pokemon_fap->variable_item_list, 1);
  61. }
  62. static void select_pins_serout_callback(VariableItem* item) {
  63. uint8_t index = variable_item_get_current_value_index(item);
  64. PokemonFap* pokemon_fap = variable_item_get_context(item);
  65. variable_item_set_current_value_text(item, named_pins[index].text);
  66. builder.serout_index = index;
  67. select_pins_rebuild_list(pokemon_fap);
  68. variable_item_list_set_selected_item(pokemon_fap->variable_item_list, 2);
  69. }
  70. static void select_pins_clk_callback(VariableItem* item) {
  71. uint8_t index = variable_item_get_current_value_index(item);
  72. PokemonFap* pokemon_fap = variable_item_get_context(item);
  73. variable_item_set_current_value_text(item, named_pins[index].text);
  74. builder.clk_index = index;
  75. select_pins_rebuild_list(pokemon_fap);
  76. variable_item_list_set_selected_item(pokemon_fap->variable_item_list, 3);
  77. }
  78. static void select_pins_rebuild_list(PokemonFap* pokemon_fap) {
  79. int num;
  80. /* HACK: TODO: It would be better to do this programmatically, but, I'm kind
  81. * of done working on this feature so its going to be hardcoded for now.
  82. */
  83. switch(builder.named_index) {
  84. case 0: // Original
  85. num = 1;
  86. builder.serin_index = 5;
  87. builder.serout_index = 3;
  88. builder.clk_index = 4;
  89. break;
  90. case 1: // MALVEKE
  91. num = 1;
  92. builder.serin_index = 1;
  93. builder.serout_index = 0;
  94. builder.clk_index = 3;
  95. break;
  96. default:
  97. num = NUM_PINS;
  98. break;
  99. }
  100. /* HACK: */
  101. pokemon_fap->malveke_detected = builder.named_index;
  102. select_pins_set(pokemon_fap);
  103. variable_item_list_reset(pokemon_fap->variable_item_list);
  104. builder.named = variable_item_list_add(
  105. pokemon_fap->variable_item_list, "Mode", 3, select_named_group_callback, pokemon_fap);
  106. builder.serin = variable_item_list_add(
  107. pokemon_fap->variable_item_list, "SI:", num, select_pins_serin_callback, pokemon_fap);
  108. builder.serout = variable_item_list_add(
  109. pokemon_fap->variable_item_list, "SO:", num, select_pins_serout_callback, pokemon_fap);
  110. builder.clk = variable_item_list_add(
  111. pokemon_fap->variable_item_list, "CLK:", num, select_pins_clk_callback, pokemon_fap);
  112. variable_item_set_current_value_index(builder.named, builder.named_index);
  113. variable_item_set_current_value_text(builder.named, named_groups[builder.named_index]);
  114. variable_item_set_current_value_index(builder.serin, (num == 1 ? 0 : builder.serin_index));
  115. variable_item_set_current_value_text(builder.serin, named_pins[builder.serin_index].text);
  116. variable_item_set_current_value_index(builder.serout, (num == 1 ? 0 : builder.serout_index));
  117. variable_item_set_current_value_text(builder.serout, named_pins[builder.serout_index].text);
  118. variable_item_set_current_value_index(builder.clk, (num == 1 ? 0 : builder.clk_index));
  119. variable_item_set_current_value_text(builder.clk, named_pins[builder.clk_index].text);
  120. }
  121. void select_pins_scene_on_exit(void* context) {
  122. PokemonFap* pokemon_fap = (PokemonFap*)context;
  123. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewMainMenu);
  124. view_dispatcher_remove_view(pokemon_fap->view_dispatcher, AppViewOpts);
  125. }
  126. void select_pins_scene_on_enter(void* context) {
  127. PokemonFap* pokemon_fap = (PokemonFap*)context;
  128. /* TODO: Figure out what defaults we should use for pins based on attached board! */
  129. /* HACK: */
  130. if(builder.named_index < 2) builder.named_index = pokemon_fap->malveke_detected;
  131. select_pins_rebuild_list(pokemon_fap);
  132. view_dispatcher_add_view(
  133. pokemon_fap->view_dispatcher,
  134. AppViewOpts,
  135. variable_item_list_get_view(pokemon_fap->variable_item_list));
  136. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewOpts);
  137. }