scene_sub_menu.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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* run_mode_names[] = {"demo", "GPIO"};
  11. static char* data_mode_names[] = {"normal", "inverted"};
  12. static char* data_pin_names[] = {"A7", "A4", "B2", "C1", "C0"};
  13. #ifdef FW_ORIGIN_Momentum
  14. static char* GPIO_ONLY = "GPIO mode\nonly!";
  15. static char* run_mode_start_text[] = {"Start the simulation", "Start the receiver"};
  16. #else
  17. static char* start_mode_text = "Start in selected mode";
  18. #endif
  19. void lwc_run_mode_change_callback(VariableItem* item) {
  20. App* app = variable_item_get_context(item);
  21. ProtoConfig* config = lwc_get_protocol_config(app->state);
  22. uint8_t index = variable_item_get_current_value_index(item);
  23. config->run_mode = (LWCRunMode)(index);
  24. variable_item_set_current_value_text(item, run_mode_names[index]);
  25. #ifdef FW_ORIGIN_Momentum
  26. VariableItem* start = variable_item_list_get(app->sub_menu, START_ITEM);
  27. VariableItem* data_mode = variable_item_list_get(app->sub_menu, DATA_MODE_ITEM);
  28. VariableItem* data_pin = variable_item_list_get(app->sub_menu, DATA_PIN_ITEM);
  29. variable_item_set_locked(data_mode, (LWCRunMode)(index) == Demo, GPIO_ONLY);
  30. variable_item_set_locked(data_pin, (LWCRunMode)(index) == Demo, GPIO_ONLY);
  31. variable_item_set_item_label(start, run_mode_start_text[index]);
  32. #endif
  33. }
  34. void lwc_data_mode_change_callback(VariableItem* item) {
  35. App* app = variable_item_get_context(item);
  36. ProtoConfig* config = lwc_get_protocol_config(app->state);
  37. uint8_t index = variable_item_get_current_value_index(item);
  38. config->data_mode = (LWCDataMode)(index);
  39. variable_item_set_current_value_text(item, data_mode_names[index]);
  40. }
  41. void lwc_data_pin_change_callback(VariableItem* item) {
  42. App* app = variable_item_get_context(item);
  43. ProtoConfig* config = lwc_get_protocol_config(app->state);
  44. uint8_t index = variable_item_get_current_value_index(item);
  45. config->data_pin = (LWCDataPin)(index);
  46. variable_item_set_current_value_text(item, data_pin_names[index]);
  47. }
  48. void lwc_enter_item_callback(void* context, uint32_t index) {
  49. App* app = context;
  50. if(index == START_ITEM) {
  51. store_proto_config(app->state);
  52. lwc_app_backlight_on_persist(app);
  53. scene_manager_next_scene(app->scene_manager, lwc_get_start_scene_for_protocol(app->state));
  54. }
  55. }
  56. void lwc_sub_menu_scene_on_enter(void* context) {
  57. App* app = context;
  58. lwc_app_backlight_on_reset(app);
  59. ProtoConfig* config = lwc_get_protocol_config(app->state);
  60. #ifdef FW_ORIGIN_Momentum
  61. variable_item_list_add(app->sub_menu, run_mode_start_text[config->run_mode], 0, NULL, app);
  62. #else
  63. variable_item_list_add(app->sub_menu, start_mode_text, 0, NULL, app);
  64. #endif
  65. variable_item_list_set_enter_callback(app->sub_menu, lwc_enter_item_callback, app);
  66. VariableItem* run_mode = variable_item_list_add(
  67. app->sub_menu, "Run mode", __lwc_number_of_run_modes, lwc_run_mode_change_callback, app);
  68. variable_item_set_current_value_index(run_mode, config->run_mode);
  69. variable_item_set_current_value_text(run_mode, run_mode_names[config->run_mode]);
  70. VariableItem* data_mode = variable_item_list_add(
  71. app->sub_menu, "GPIO data", __lwc_number_of_data_modes, lwc_data_mode_change_callback, app);
  72. variable_item_set_current_value_index(data_mode, config->data_mode);
  73. variable_item_set_current_value_text(data_mode, data_mode_names[config->data_mode]);
  74. VariableItem* data_pin = variable_item_list_add(
  75. app->sub_menu, "Data pin", __lwc_number_of_data_pins, lwc_data_pin_change_callback, app);
  76. variable_item_set_current_value_index(data_pin, config->data_pin);
  77. variable_item_set_current_value_text(data_pin, data_pin_names[config->data_pin]);
  78. #ifdef FW_ORIGIN_Momentum
  79. variable_item_set_locked(data_mode, config->run_mode == Demo, GPIO_ONLY);
  80. variable_item_set_locked(data_pin, config->run_mode == Demo, GPIO_ONLY);
  81. variable_item_list_set_header(app->sub_menu, get_protocol_name(app->state->lwc_type));
  82. #endif
  83. view_dispatcher_switch_to_view(app->view_dispatcher, LWCSubMenuView);
  84. }
  85. /** main menu event handler - switches scene based on the event */
  86. bool lwc_sub_menu_scene_on_event(void* context, SceneManagerEvent event) {
  87. UNUSED(context);
  88. UNUSED(event);
  89. return false;
  90. }
  91. void lwc_sub_menu_scene_on_exit(void* context) {
  92. App* app = context;
  93. variable_item_list_reset(app->sub_menu);
  94. }