bad_kb_scene_config.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "../bad_kb_app_i.h"
  2. #include "furi_hal_power.h"
  3. enum VarItemListIndex {
  4. VarItemListIndexKeyboardLayout,
  5. VarItemListIndexConnection,
  6. };
  7. enum VarItemListIndexBt {
  8. VarItemListIndexBtRemember = VarItemListIndexConnection + 1,
  9. VarItemListIndexBtDeviceName,
  10. VarItemListIndexBtMacAddress,
  11. VarItemListIndexBtRandomizeMac,
  12. };
  13. enum VarItemListIndexUsb {
  14. VarItemListIndexUsbManufacturer = VarItemListIndexConnection + 1,
  15. VarItemListIndexUsbProductName,
  16. VarItemListIndexUsbVidPid,
  17. VarItemListIndexUsbRandomizeVidPid,
  18. };
  19. void bad_kb_scene_config_connection_callback(VariableItem* item) {
  20. BadKbApp* bad_kb = variable_item_get_context(item);
  21. bad_kb->is_bt = variable_item_get_current_value_index(item);
  22. variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB");
  23. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexConnection);
  24. }
  25. void bad_kb_scene_config_bt_remember_callback(VariableItem* item) {
  26. BadKbApp* bad_kb = variable_item_get_context(item);
  27. bad_kb->bt_remember = variable_item_get_current_value_index(item);
  28. variable_item_set_current_value_text(item, bad_kb->bt_remember ? "ON" : "OFF");
  29. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBtRemember);
  30. }
  31. void bad_kb_scene_config_var_item_list_callback(void* context, uint32_t index) {
  32. BadKbApp* bad_kb = context;
  33. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, index);
  34. }
  35. void bad_kb_scene_config_on_enter(void* context) {
  36. BadKbApp* bad_kb = context;
  37. VariableItemList* var_item_list = bad_kb->var_item_list;
  38. VariableItem* item;
  39. item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb);
  40. item = variable_item_list_add(
  41. var_item_list, "Connection", 2, bad_kb_scene_config_connection_callback, bad_kb);
  42. variable_item_set_current_value_index(item, bad_kb->is_bt);
  43. variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB");
  44. if(bad_kb->is_bt) {
  45. item = variable_item_list_add(
  46. var_item_list, "BT Remember", 2, bad_kb_scene_config_bt_remember_callback, bad_kb);
  47. variable_item_set_current_value_index(item, bad_kb->bt_remember);
  48. variable_item_set_current_value_text(item, bad_kb->bt_remember ? "ON" : "OFF");
  49. item = variable_item_list_add(var_item_list, "BT Device Name", 0, NULL, bad_kb);
  50. item = variable_item_list_add(var_item_list, "BT MAC Address", 0, NULL, bad_kb);
  51. if(bad_kb->bt_remember) {
  52. variable_item_set_locked(item, true, "Remember\nmust be Off!");
  53. }
  54. item = variable_item_list_add(var_item_list, "Randomize BT MAC", 0, NULL, bad_kb);
  55. if(bad_kb->bt_remember) {
  56. variable_item_set_locked(item, true, "Remember\nmust be Off!");
  57. }
  58. } else {
  59. item = variable_item_list_add(var_item_list, "USB Manufacturer", 0, NULL, bad_kb);
  60. item = variable_item_list_add(var_item_list, "USB Product Name", 0, NULL, bad_kb);
  61. item = variable_item_list_add(var_item_list, "USB VID and PID", 0, NULL, bad_kb);
  62. item = variable_item_list_add(var_item_list, "Randomize USB VID:PID", 0, NULL, bad_kb);
  63. }
  64. variable_item_list_set_enter_callback(
  65. var_item_list, bad_kb_scene_config_var_item_list_callback, bad_kb);
  66. variable_item_list_set_selected_item(
  67. var_item_list, scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfig));
  68. view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewVarItemList);
  69. }
  70. bool bad_kb_scene_config_on_event(void* context, SceneManagerEvent event) {
  71. BadKbApp* bad_kb = context;
  72. bool consumed = false;
  73. if(event.type == SceneManagerEventTypeCustom) {
  74. scene_manager_set_scene_state(bad_kb->scene_manager, BadKbSceneConfig, event.event);
  75. consumed = true;
  76. switch(event.event) {
  77. case VarItemListIndexKeyboardLayout:
  78. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout);
  79. break;
  80. case VarItemListIndexConnection:
  81. bad_kb_config_refresh(bad_kb);
  82. break;
  83. default:
  84. break;
  85. }
  86. if(bad_kb->is_bt) {
  87. switch(event.event) {
  88. case VarItemListIndexBtRemember:
  89. bad_kb_config_refresh(bad_kb);
  90. break;
  91. case VarItemListIndexBtDeviceName:
  92. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtName);
  93. break;
  94. case VarItemListIndexBtMacAddress:
  95. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtMac);
  96. break;
  97. case VarItemListIndexBtRandomizeMac:
  98. // Set user config and remember
  99. furi_hal_random_fill_buf(bad_kb->config.ble.mac, sizeof(bad_kb->config.ble.mac));
  100. // Apply to ID config so its temporarily overridden
  101. if(bad_kb->set_bt_id) {
  102. memcpy(
  103. bad_kb->id_config.ble.mac,
  104. bad_kb->config.ble.mac,
  105. sizeof(bad_kb->id_config.ble.mac));
  106. }
  107. bad_kb_config_refresh(bad_kb);
  108. break;
  109. default:
  110. break;
  111. }
  112. } else {
  113. switch(event.event) {
  114. case VarItemListIndexUsbManufacturer:
  115. scene_manager_set_scene_state(
  116. bad_kb->scene_manager, BadKbSceneConfigUsbName, true);
  117. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName);
  118. break;
  119. case VarItemListIndexUsbProductName:
  120. scene_manager_set_scene_state(
  121. bad_kb->scene_manager, BadKbSceneConfigUsbName, false);
  122. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName);
  123. break;
  124. case VarItemListIndexUsbVidPid:
  125. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbVidPid);
  126. break;
  127. case VarItemListIndexUsbRandomizeVidPid:
  128. furi_hal_random_fill_buf(
  129. (void*)bad_kb->usb_vidpid_buf, sizeof(bad_kb->usb_vidpid_buf));
  130. // Set user config and remember
  131. bad_kb->config.usb.vid = bad_kb->usb_vidpid_buf[0];
  132. bad_kb->config.usb.pid = bad_kb->usb_vidpid_buf[1];
  133. // Apply to ID config so its temporarily overridden
  134. if(bad_kb->set_usb_id) {
  135. bad_kb->id_config.usb.vid = bad_kb->config.usb.vid;
  136. bad_kb->id_config.usb.pid = bad_kb->config.usb.pid;
  137. }
  138. bad_kb_config_refresh(bad_kb);
  139. break;
  140. default:
  141. break;
  142. }
  143. }
  144. }
  145. return consumed;
  146. }
  147. void bad_kb_scene_config_on_exit(void* context) {
  148. BadKbApp* bad_kb = context;
  149. VariableItemList* var_item_list = bad_kb->var_item_list;
  150. variable_item_list_reset(var_item_list);
  151. }