#include "pwmclass.h" #include "GsmDecoder.h" GsmDecoder::GsmDecoder(FIFO & f) noexcept : OneWay(), fifo(f), gsm() { } static constexpr int INPUT_BIT_RANGE = 16; static constexpr unsigned SIGMA_MASK = (1u << (INPUT_BIT_RANGE + 0)) - 1u; static constexpr unsigned SIGNED_OFFEST = (1u << (INPUT_BIT_RANGE - 1)); // Předpokládá se na vstupu signed int o šířce INPUT_BIT_RANGE // přičemž 0 na vstupu odpovídá MAXPWM / 2 na výstupu. Vypadá to divně, ale funguje. static unsigned pwm_sd (const int input) { static unsigned sigma = 0; // podstatné je, že proměnná je statická const unsigned sample = (input + SIGNED_OFFEST) * MAXPWM; sigma &= SIGMA_MASK; // v podstatě se odečte hodnota PWM sigma += sample; // integrace prostým součtem return sigma >> INPUT_BIT_RANGE; } unsigned GsmDecoder::Send(uint16_t * dptr, const unsigned len) { PText source; if (fifo.Read(source)) { gsm_frame tmp; memcpy (tmp, source.get(), sizeof(gsm_frame)); gsm.decode(tmp, tmpbuf); for (unsigned n=0u, k=0u; k> 1; } return 0; }