pulse_joiner.cpp 2.4 KB

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