decoder-hid26.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "decoder-hid26.h"
  2. #include <api-hal.h>
  3. constexpr uint32_t clocks_in_us = 64;
  4. constexpr uint32_t jitter_time_us = 20;
  5. constexpr uint32_t min_time_us = 64;
  6. constexpr uint32_t max_time_us = 80;
  7. constexpr uint32_t min_time = (min_time_us - jitter_time_us) * clocks_in_us;
  8. constexpr uint32_t mid_time = ((max_time_us - min_time_us) / 2 + min_time_us) * clocks_in_us;
  9. constexpr uint32_t max_time = (max_time_us + jitter_time_us) * clocks_in_us;
  10. bool DecoderHID26::read(uint8_t* data, uint8_t data_size) {
  11. bool result = false;
  12. furi_assert(data_size >= 3);
  13. if(ready) {
  14. result = true;
  15. hid.decode(
  16. reinterpret_cast<const uint8_t*>(&stored_data), sizeof(uint32_t) * 3, data, data_size);
  17. ready = false;
  18. }
  19. return result;
  20. }
  21. void DecoderHID26::process_front(bool polarity, uint32_t time) {
  22. if(ready) return;
  23. if(polarity == true) {
  24. last_pulse_time = time;
  25. } else {
  26. last_pulse_time += time;
  27. if(last_pulse_time > min_time && last_pulse_time < max_time) {
  28. bool pulse;
  29. if(last_pulse_time < mid_time) {
  30. // 6 pulses
  31. pulse = false;
  32. } else {
  33. // 5 pulses
  34. pulse = true;
  35. }
  36. if(last_pulse == pulse) {
  37. pulse_count++;
  38. if(pulse) {
  39. if(pulse_count > 4) {
  40. pulse_count = 0;
  41. store_data(1);
  42. }
  43. } else {
  44. if(pulse_count > 5) {
  45. pulse_count = 0;
  46. store_data(0);
  47. }
  48. }
  49. } else {
  50. if(last_pulse) {
  51. if(pulse_count > 2) {
  52. store_data(1);
  53. }
  54. } else {
  55. if(pulse_count > 3) {
  56. store_data(0);
  57. }
  58. }
  59. pulse_count = 0;
  60. last_pulse = pulse;
  61. }
  62. }
  63. }
  64. }
  65. DecoderHID26::DecoderHID26() {
  66. reset_state();
  67. }
  68. void DecoderHID26::store_data(bool data) {
  69. stored_data[0] = (stored_data[0] << 1) | ((stored_data[1] >> 31) & 1);
  70. stored_data[1] = (stored_data[1] << 1) | ((stored_data[2] >> 31) & 1);
  71. stored_data[2] = (stored_data[2] << 1) | data;
  72. if(hid.can_be_decoded(reinterpret_cast<const uint8_t*>(&stored_data), sizeof(uint32_t) * 3)) {
  73. ready = true;
  74. }
  75. }
  76. void DecoderHID26::reset_state() {
  77. last_pulse = false;
  78. pulse_count = 0;
  79. ready = false;
  80. last_pulse_time = 0;
  81. }