common.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "common.h"
  2. #include <furi/furi.h>
  3. #include <furi_hal.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 & TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER) {
  16. return 100;
  17. }
  18. return 30;
  19. }
  20. static uint32_t get_keypress_delay(TokenAutomationFeature features) {
  21. if(features & TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER) {
  22. return 60;
  23. }
  24. return 30;
  25. }
  26. static void totp_type_code_worker_press_key(
  27. uint8_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* string,
  39. uint8_t string_length,
  40. TokenAutomationFeature features) {
  41. furi_delay_ms(500);
  42. uint8_t i = 0;
  43. totp_type_code_worker_press_key(
  44. HID_KEYBOARD_CAPS_LOCK, key_press_fn, key_release_fn, features);
  45. while(i < string_length && string[i] != 0) {
  46. uint8_t char_index = CONVERT_CHAR_TO_DIGIT(string[i]);
  47. if(char_index > 9) {
  48. char_index = string[i] - 0x41 + 10;
  49. }
  50. if(char_index > 35) break;
  51. uint8_t hid_kb_key = hid_number_keys[char_index];
  52. totp_type_code_worker_press_key(hid_kb_key, key_press_fn, key_release_fn, features);
  53. furi_delay_ms(get_keystroke_delay(features));
  54. i++;
  55. }
  56. if(features & TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END) {
  57. furi_delay_ms(get_keystroke_delay(features));
  58. totp_type_code_worker_press_key(
  59. HID_KEYBOARD_RETURN, key_press_fn, key_release_fn, features);
  60. }
  61. if(features & TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END) {
  62. furi_delay_ms(get_keystroke_delay(features));
  63. totp_type_code_worker_press_key(HID_KEYBOARD_TAB, key_press_fn, key_release_fn, features);
  64. }
  65. totp_type_code_worker_press_key(
  66. HID_KEYBOARD_CAPS_LOCK, key_press_fn, key_release_fn, features);
  67. }