type-code-common.c 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "type-code-common.h"
  2. #include <furi_hal_usb_hid.h>
  3. #include <furi/core/kernel.h>
  4. #include "../../services/convert/convert.h"
  5. static const uint8_t hid_number_keys[] = {
  6. HID_KEYBOARD_0, HID_KEYBOARD_1, HID_KEYBOARD_2, HID_KEYBOARD_3, HID_KEYBOARD_4,
  7. HID_KEYBOARD_5, HID_KEYBOARD_6, HID_KEYBOARD_7, HID_KEYBOARD_8, HID_KEYBOARD_9,
  8. HID_KEYBOARD_A, HID_KEYBOARD_B, HID_KEYBOARD_C, HID_KEYBOARD_D, HID_KEYBOARD_E,
  9. HID_KEYBOARD_F, HID_KEYBOARD_G, HID_KEYBOARD_H, HID_KEYBOARD_I, HID_KEYBOARD_J,
  10. HID_KEYBOARD_K, HID_KEYBOARD_L, HID_KEYBOARD_M, HID_KEYBOARD_N, HID_KEYBOARD_O,
  11. HID_KEYBOARD_P, HID_KEYBOARD_Q, HID_KEYBOARD_R, HID_KEYBOARD_S, HID_KEYBOARD_T,
  12. HID_KEYBOARD_U, HID_KEYBOARD_V, HID_KEYBOARD_W, HID_KEYBOARD_X, HID_KEYBOARD_Y,
  13. HID_KEYBOARD_Z};
  14. static uint32_t get_keystroke_delay(TokenAutomationFeature features) {
  15. if(features & TokenAutomationFeatureTypeSlower) {
  16. return 100;
  17. }
  18. return 30;
  19. }
  20. static uint32_t get_keypress_delay(TokenAutomationFeature features) {
  21. if(features & TokenAutomationFeatureTypeSlower) {
  22. return 60;
  23. }
  24. return 30;
  25. }
  26. static void totp_type_code_worker_press_key(
  27. uint16_t key,
  28. TOTP_AUTOMATION_KEY_HANDLER key_press_fn,
  29. TOTP_AUTOMATION_KEY_HANDLER key_release_fn,
  30. TokenAutomationFeature features) {
  31. (*key_press_fn)(key);
  32. furi_delay_ms(get_keypress_delay(features));
  33. (*key_release_fn)(key);
  34. }
  35. void totp_type_code_worker_execute_automation(
  36. TOTP_AUTOMATION_KEY_HANDLER key_press_fn,
  37. TOTP_AUTOMATION_KEY_HANDLER key_release_fn,
  38. const char* code_buffer,
  39. uint8_t code_buffer_size,
  40. TokenAutomationFeature features) {
  41. furi_delay_ms(500);
  42. uint8_t i = 0;
  43. char cb_char;
  44. while(i < code_buffer_size && (cb_char = code_buffer[i]) != 0) {
  45. uint8_t char_index = CONVERT_CHAR_TO_DIGIT(cb_char);
  46. if(char_index > 9) {
  47. char_index = cb_char - 0x41 + 10;
  48. }
  49. if(char_index > 35) break;
  50. uint16_t hid_kb_key = hid_number_keys[char_index];
  51. if(char_index > 9) {
  52. hid_kb_key |= KEY_MOD_LEFT_SHIFT;
  53. }
  54. totp_type_code_worker_press_key(hid_kb_key, key_press_fn, key_release_fn, features);
  55. furi_delay_ms(get_keystroke_delay(features));
  56. i++;
  57. }
  58. if(features & TokenAutomationFeatureEnterAtTheEnd) {
  59. furi_delay_ms(get_keystroke_delay(features));
  60. totp_type_code_worker_press_key(
  61. HID_KEYBOARD_RETURN, key_press_fn, key_release_fn, features);
  62. }
  63. if(features & TokenAutomationFeatureTabAtTheEnd) {
  64. furi_delay_ms(get_keystroke_delay(features));
  65. totp_type_code_worker_press_key(HID_KEYBOARD_TAB, key_press_fn, key_release_fn, features);
  66. }
  67. }