pulse_joiner.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "pulse_joiner.h"
  2. #include <furi.h>
  3. #define PULSE_MAX_COUNT 6
  4. typedef struct {
  5. bool polarity;
  6. uint16_t time;
  7. } Pulse;
  8. struct PulseJoiner {
  9. size_t pulse_index;
  10. Pulse pulses[PULSE_MAX_COUNT];
  11. };
  12. PulseJoiner* pulse_joiner_alloc() {
  13. PulseJoiner* pulse_joiner = malloc(sizeof(PulseJoiner));
  14. pulse_joiner->pulse_index = 0;
  15. for(uint8_t i = 0; i < PULSE_MAX_COUNT; i++) {
  16. pulse_joiner->pulses[i].polarity = false;
  17. pulse_joiner->pulses[i].time = 0;
  18. }
  19. return pulse_joiner;
  20. }
  21. void pulse_joiner_free(PulseJoiner* pulse_joiner) {
  22. free(pulse_joiner);
  23. }
  24. bool pulse_joiner_push_pulse(PulseJoiner* pulse_joiner, bool polarity, size_t period, size_t pulse) {
  25. bool result = false;
  26. furi_check((pulse_joiner->pulse_index + 1) < PULSE_MAX_COUNT);
  27. if(polarity == false && pulse_joiner->pulse_index == 0) {
  28. // first negative pulse is omitted
  29. } else {
  30. pulse_joiner->pulses[pulse_joiner->pulse_index].polarity = polarity;
  31. pulse_joiner->pulses[pulse_joiner->pulse_index].time = pulse;
  32. pulse_joiner->pulse_index++;
  33. }
  34. if(period > pulse) {
  35. pulse_joiner->pulses[pulse_joiner->pulse_index].polarity = !polarity;
  36. pulse_joiner->pulses[pulse_joiner->pulse_index].time = period - pulse;
  37. pulse_joiner->pulse_index++;
  38. }
  39. if(pulse_joiner->pulse_index >= 4) {
  40. // we know that first pulse is always high
  41. // so we wait 2 edges, hi2low and next low2hi
  42. uint8_t edges_count = 0;
  43. bool last_polarity = pulse_joiner->pulses[0].polarity;
  44. for(uint8_t i = 1; i < pulse_joiner->pulse_index; i++) {
  45. if(pulse_joiner->pulses[i].polarity != last_polarity) {
  46. edges_count++;
  47. last_polarity = pulse_joiner->pulses[i].polarity;
  48. }
  49. }
  50. if(edges_count >= 2) {
  51. result = true;
  52. }
  53. }
  54. return result;
  55. }
  56. void pulse_joiner_pop_pulse(PulseJoiner* pulse_joiner, size_t* period, size_t* pulse) {
  57. furi_check(pulse_joiner->pulse_index <= (PULSE_MAX_COUNT + 1));
  58. uint16_t tmp_period = 0;
  59. uint16_t tmp_pulse = 0;
  60. uint8_t edges_count = 0;
  61. bool last_polarity = pulse_joiner->pulses[0].polarity;
  62. uint8_t next_fist_pulse = 0;
  63. for(uint8_t i = 0; i < PULSE_MAX_COUNT; i++) {
  64. // count edges
  65. if(pulse_joiner->pulses[i].polarity != last_polarity) {
  66. edges_count++;
  67. last_polarity = pulse_joiner->pulses[i].polarity;
  68. }
  69. // wait for 2 edges
  70. if(edges_count == 2) {
  71. next_fist_pulse = i;
  72. break;
  73. }
  74. // sum pulse time
  75. if(pulse_joiner->pulses[i].polarity) {
  76. tmp_period += pulse_joiner->pulses[i].time;
  77. tmp_pulse += pulse_joiner->pulses[i].time;
  78. } else {
  79. tmp_period += pulse_joiner->pulses[i].time;
  80. }
  81. pulse_joiner->pulse_index--;
  82. }
  83. *period = tmp_period;
  84. *pulse = tmp_pulse;
  85. // remove counted periods and shift data
  86. for(uint8_t i = 0; i < PULSE_MAX_COUNT; i++) {
  87. if((next_fist_pulse + i) < PULSE_MAX_COUNT) {
  88. pulse_joiner->pulses[i].polarity = pulse_joiner->pulses[next_fist_pulse + i].polarity;
  89. pulse_joiner->pulses[i].time = pulse_joiner->pulses[next_fist_pulse + i].time;
  90. } else {
  91. break;
  92. }
  93. }
  94. }