| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #include "pulse_glue.h"
- struct PulseGlue {
- int32_t hi_period;
- int32_t low_period;
- int32_t next_hi_period;
- };
- PulseGlue* pulse_glue_alloc() {
- PulseGlue* pulse_glue = malloc(sizeof(PulseGlue));
- pulse_glue_reset(pulse_glue);
- return pulse_glue;
- }
- void pulse_glue_free(PulseGlue* pulse_glue) {
- free(pulse_glue);
- }
- void pulse_glue_reset(PulseGlue* pulse_glue) {
- pulse_glue->hi_period = 0;
- pulse_glue->low_period = 0;
- pulse_glue->next_hi_period = 0;
- }
- bool pulse_glue_push(PulseGlue* pulse_glue, bool polarity, uint32_t length) {
- bool pop_ready = false;
- if(polarity) {
- if(pulse_glue->low_period == 0) {
- // stage 1, accumulate hi period
- pulse_glue->hi_period += length;
- } else {
- // stage 3, accumulate next hi period and be ready for pulse_glue_pop
- pulse_glue->next_hi_period = length;
- // data is ready
- pop_ready = true;
- }
- } else {
- if(pulse_glue->hi_period != 0) {
- // stage 2, accumulate low period
- pulse_glue->low_period += length;
- }
- }
- return pop_ready;
- }
- void pulse_glue_pop(PulseGlue* pulse_glue, uint32_t* length, uint32_t* period) {
- *length = pulse_glue->hi_period + pulse_glue->low_period;
- *period = pulse_glue->hi_period;
- pulse_glue->hi_period = pulse_glue->next_hi_period;
- pulse_glue->low_period = 0;
- pulse_glue->next_hi_period = 0;
- }
|