scene_sub_menu.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "flipper.h"
  2. #include "app_state.h"
  3. #include "scene_sub_menu.h"
  4. #include "scenes.h"
  5. #include "module_lights.h"
  6. #define START_ITEM 0
  7. #define RUN_MODE_ITEM 1
  8. #define DATA_MODE_ITEM 2
  9. #define DATA_PIN_ITEM 3
  10. static char* GPIO_ONLY = "GPIO mode\nonly!";
  11. static char* run_mode_names[] = {"demo", "GPIO"};
  12. static char* run_mode_start_text[] = {"Start the simulation", "Start the receiver"};
  13. static char* data_mode_names[] = {"normal", "inverted"};
  14. static char* data_pin_names[] = {"A7", "A4", "B2", "C1", "C0"};
  15. void lwc_run_mode_change_callback(VariableItem* item) {
  16. App* app = variable_item_get_context(item);
  17. ProtoConfig* config = lwc_get_protocol_config(app->state);
  18. uint8_t index = variable_item_get_current_value_index(item);
  19. config->run_mode = (LWCRunMode)(index);
  20. variable_item_set_current_value_text(item, run_mode_names[index]);
  21. VariableItem* start_item = variable_item_list_get(app->sub_menu, START_ITEM);
  22. variable_item_set_item_label(start_item, run_mode_start_text[index]);
  23. VariableItem* data_item = variable_item_list_get(app->sub_menu, DATA_MODE_ITEM);
  24. variable_item_set_locked(data_item, (LWCRunMode)(index) == Demo, GPIO_ONLY);
  25. VariableItem* data_pin_item = variable_item_list_get(app->sub_menu, DATA_PIN_ITEM);
  26. variable_item_set_locked(data_pin_item, (LWCRunMode)(index) == Demo, GPIO_ONLY);
  27. }
  28. void lwc_data_mode_change_callback(VariableItem* item) {
  29. App* app = variable_item_get_context(item);
  30. ProtoConfig* config = lwc_get_protocol_config(app->state);
  31. uint8_t index = variable_item_get_current_value_index(item);
  32. config->data_mode = (LWCDataMode)(index);
  33. variable_item_set_current_value_text(item, data_mode_names[index]);
  34. }
  35. void lwc_data_pin_change_callback(VariableItem* item) {
  36. App* app = variable_item_get_context(item);
  37. ProtoConfig* config = lwc_get_protocol_config(app->state);
  38. uint8_t index = variable_item_get_current_value_index(item);
  39. config->data_pin = (LWCDataPin)(index);
  40. variable_item_set_current_value_text(item, data_pin_names[index]);
  41. }
  42. void lwc_enter_item_callback(void* context, uint32_t index) {
  43. App* app = context;
  44. if(index == START_ITEM) {
  45. store_proto_config(app->state);
  46. lwc_app_backlight_on_persist(app);
  47. scene_manager_next_scene(app->scene_manager, lwc_get_start_scene_for_protocol(app->state));
  48. }
  49. }
  50. void lwc_sub_menu_scene_on_enter(void* context) {
  51. App* app = context;
  52. lwc_app_backlight_on_reset(app);
  53. ProtoConfig* config = lwc_get_protocol_config(app->state);
  54. variable_item_list_add(app->sub_menu, run_mode_start_text[config->run_mode], 0, NULL, app);
  55. variable_item_list_set_header(app->sub_menu, get_protocol_name(app->state->lwc_type));
  56. variable_item_list_set_enter_callback(app->sub_menu, lwc_enter_item_callback, app);
  57. VariableItem* run_mode = variable_item_list_add(
  58. app->sub_menu, "Run mode", __lwc_number_of_run_modes, lwc_run_mode_change_callback, app);
  59. variable_item_set_current_value_index(run_mode, config->run_mode);
  60. variable_item_set_current_value_text(run_mode, run_mode_names[config->run_mode]);
  61. VariableItem* data_mode = variable_item_list_add(
  62. app->sub_menu, "GPIO data", __lwc_number_of_data_modes, lwc_data_mode_change_callback, app);
  63. variable_item_set_current_value_index(data_mode, config->data_mode);
  64. variable_item_set_current_value_text(data_mode, data_mode_names[config->data_mode]);
  65. variable_item_set_locked(data_mode, config->run_mode == Demo, GPIO_ONLY);
  66. VariableItem* data_pin = variable_item_list_add(
  67. app->sub_menu, "Data pin", __lwc_number_of_data_pins, lwc_data_pin_change_callback, app);
  68. variable_item_set_current_value_index(data_pin, config->data_pin);
  69. variable_item_set_current_value_text(data_pin, data_pin_names[config->data_pin]);
  70. variable_item_set_locked(data_pin, config->run_mode == Demo, GPIO_ONLY);
  71. view_dispatcher_switch_to_view(app->view_dispatcher, LWCSubMenuView);
  72. }
  73. /** main menu event handler - switches scene based on the event */
  74. bool lwc_sub_menu_scene_on_event(void* context, SceneManagerEvent event) {
  75. UNUSED(context);
  76. UNUSED(event);
  77. return false;
  78. }
  79. void lwc_sub_menu_scene_on_exit(void* context) {
  80. App* app = context;
  81. variable_item_list_reset(app->sub_menu);
  82. }