bad_kb_scene_config.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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. VarItemListIndexBtPairing,
  10. VarItemListIndexBtDeviceName,
  11. VarItemListIndexBtMacAddress,
  12. VarItemListIndexBtRandomizeMac,
  13. };
  14. enum VarItemListIndexUsb {
  15. VarItemListIndexUsbManufacturer = VarItemListIndexConnection + 1,
  16. VarItemListIndexUsbProductName,
  17. VarItemListIndexUsbVidPid,
  18. VarItemListIndexUsbRandomizeVidPid,
  19. };
  20. void bad_kb_scene_config_connection_callback(VariableItem* item) {
  21. BadKbApp* bad_kb = variable_item_get_context(item);
  22. bad_kb->is_bt = variable_item_get_current_value_index(item);
  23. variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB");
  24. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexConnection);
  25. }
  26. void bad_kb_scene_config_bt_remember_callback(VariableItem* item) {
  27. BadKbApp* bad_kb = variable_item_get_context(item);
  28. bool value = variable_item_get_current_value_index(item);
  29. // Set user config and remember
  30. bad_kb->config.ble.bonding = value;
  31. // Apply to ID config so its temporarily overridden (currently can't set bonding with BT_ID anyway)
  32. if(bad_kb->set_bt_id) {
  33. bad_kb->id_config.ble.bonding = value;
  34. }
  35. variable_item_set_current_value_text(item, value ? "ON" : "OFF");
  36. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBtRemember);
  37. }
  38. const char* const bt_pairing_names[GapPairingCount] = {
  39. "YesNo",
  40. "PIN Type",
  41. "PIN Y/N",
  42. };
  43. void bad_kb_scene_config_bt_pairing_callback(VariableItem* item) {
  44. BadKbApp* bad_kb = variable_item_get_context(item);
  45. uint8_t index = variable_item_get_current_value_index(item);
  46. // Set user config and remember
  47. bad_kb->config.ble.pairing = index;
  48. // Apply to ID config so its temporarily overridden (currently can't set pairing with BT_ID anyway)
  49. if(bad_kb->set_bt_id) {
  50. bad_kb->id_config.ble.pairing = index;
  51. }
  52. variable_item_set_current_value_text(item, bt_pairing_names[index]);
  53. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBtPairing);
  54. }
  55. void bad_kb_scene_config_var_item_list_callback(void* context, uint32_t index) {
  56. BadKbApp* bad_kb = context;
  57. view_dispatcher_send_custom_event(bad_kb->view_dispatcher, index);
  58. }
  59. void bad_kb_scene_config_on_enter(void* context) {
  60. BadKbApp* bad_kb = context;
  61. VariableItemList* var_item_list = bad_kb->var_item_list;
  62. VariableItem* item;
  63. item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb);
  64. item = variable_item_list_add(
  65. var_item_list, "Connection", 2, bad_kb_scene_config_connection_callback, bad_kb);
  66. variable_item_set_current_value_index(item, bad_kb->is_bt);
  67. variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB");
  68. if(bad_kb->is_bt) {
  69. BadKbConfig* cfg = bad_kb->set_bt_id ? &bad_kb->id_config : &bad_kb->config;
  70. item = variable_item_list_add(
  71. var_item_list, "BT Remember", 2, bad_kb_scene_config_bt_remember_callback, bad_kb);
  72. variable_item_set_current_value_index(item, cfg->ble.bonding);
  73. variable_item_set_current_value_text(item, cfg->ble.bonding ? "ON" : "OFF");
  74. item = variable_item_list_add(
  75. var_item_list,
  76. "BT Pairing",
  77. GapPairingCount,
  78. bad_kb_scene_config_bt_pairing_callback,
  79. bad_kb);
  80. variable_item_set_current_value_index(item, cfg->ble.pairing);
  81. variable_item_set_current_value_text(item, bt_pairing_names[cfg->ble.pairing]);
  82. item = variable_item_list_add(var_item_list, "BT Device Name", 0, NULL, bad_kb);
  83. item = variable_item_list_add(var_item_list, "BT MAC Address", 0, NULL, bad_kb);
  84. if(cfg->ble.bonding) {
  85. variable_item_set_locked(item, true, "Remember\nmust be Off!");
  86. }
  87. item = variable_item_list_add(var_item_list, "Randomize BT MAC", 0, NULL, bad_kb);
  88. if(cfg->ble.bonding) {
  89. variable_item_set_locked(item, true, "Remember\nmust be Off!");
  90. }
  91. } else {
  92. item = variable_item_list_add(var_item_list, "USB Manufacturer", 0, NULL, bad_kb);
  93. item = variable_item_list_add(var_item_list, "USB Product Name", 0, NULL, bad_kb);
  94. item = variable_item_list_add(var_item_list, "USB VID and PID", 0, NULL, bad_kb);
  95. item = variable_item_list_add(var_item_list, "Randomize USB VID:PID", 0, NULL, bad_kb);
  96. }
  97. variable_item_list_set_enter_callback(
  98. var_item_list, bad_kb_scene_config_var_item_list_callback, bad_kb);
  99. variable_item_list_set_selected_item(
  100. var_item_list, scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfig));
  101. view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewVarItemList);
  102. }
  103. bool bad_kb_scene_config_on_event(void* context, SceneManagerEvent event) {
  104. BadKbApp* bad_kb = context;
  105. bool consumed = false;
  106. if(event.type == SceneManagerEventTypeCustom) {
  107. scene_manager_set_scene_state(bad_kb->scene_manager, BadKbSceneConfig, event.event);
  108. consumed = true;
  109. switch(event.event) {
  110. case VarItemListIndexKeyboardLayout:
  111. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout);
  112. break;
  113. case VarItemListIndexConnection:
  114. bad_kb_config_refresh(bad_kb);
  115. break;
  116. default:
  117. break;
  118. }
  119. if(bad_kb->is_bt) {
  120. switch(event.event) {
  121. case VarItemListIndexBtRemember:
  122. bad_kb_config_refresh(bad_kb);
  123. break;
  124. case VarItemListIndexBtPairing:
  125. bad_kb_config_refresh(bad_kb);
  126. break;
  127. case VarItemListIndexBtDeviceName:
  128. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtName);
  129. break;
  130. case VarItemListIndexBtMacAddress:
  131. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtMac);
  132. break;
  133. case VarItemListIndexBtRandomizeMac:
  134. // Set user config and remember
  135. furi_hal_random_fill_buf(bad_kb->config.ble.mac, sizeof(bad_kb->config.ble.mac));
  136. // Apply to ID config so its temporarily overridden
  137. if(bad_kb->set_bt_id) {
  138. memcpy(
  139. bad_kb->id_config.ble.mac,
  140. bad_kb->config.ble.mac,
  141. sizeof(bad_kb->id_config.ble.mac));
  142. }
  143. bad_kb_config_refresh(bad_kb);
  144. break;
  145. default:
  146. break;
  147. }
  148. } else {
  149. switch(event.event) {
  150. case VarItemListIndexUsbManufacturer:
  151. scene_manager_set_scene_state(
  152. bad_kb->scene_manager, BadKbSceneConfigUsbName, true);
  153. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName);
  154. break;
  155. case VarItemListIndexUsbProductName:
  156. scene_manager_set_scene_state(
  157. bad_kb->scene_manager, BadKbSceneConfigUsbName, false);
  158. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName);
  159. break;
  160. case VarItemListIndexUsbVidPid:
  161. scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbVidPid);
  162. break;
  163. case VarItemListIndexUsbRandomizeVidPid:
  164. furi_hal_random_fill_buf(
  165. (void*)bad_kb->usb_vidpid_buf, sizeof(bad_kb->usb_vidpid_buf));
  166. // Set user config and remember
  167. bad_kb->config.usb.vid = bad_kb->usb_vidpid_buf[0];
  168. bad_kb->config.usb.pid = bad_kb->usb_vidpid_buf[1];
  169. // Apply to ID config so its temporarily overridden
  170. if(bad_kb->set_usb_id) {
  171. bad_kb->id_config.usb.vid = bad_kb->config.usb.vid;
  172. bad_kb->id_config.usb.pid = bad_kb->config.usb.pid;
  173. }
  174. bad_kb_config_refresh(bad_kb);
  175. break;
  176. default:
  177. break;
  178. }
  179. }
  180. }
  181. return consumed;
  182. }
  183. void bad_kb_scene_config_on_exit(void* context) {
  184. BadKbApp* bad_kb = context;
  185. VariableItemList* var_item_list = bad_kb->var_item_list;
  186. variable_item_list_reset(var_item_list);
  187. }