From d30e3fa68d7192da22c1569f56f564b92896170d Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 4 Jun 2017 17:33:51 +0200 Subject: o Working decoder for Samsung remotes. --- include/daewoo_decoder.h | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 include/daewoo_decoder.h (limited to 'include/daewoo_decoder.h') diff --git a/include/daewoo_decoder.h b/include/daewoo_decoder.h new file mode 100644 index 0000000..b790a1a --- /dev/null +++ b/include/daewoo_decoder.h @@ -0,0 +1,91 @@ +#pragma + +#include "decoder.h" + +namespace radio_controller { + +class daewoo_decoder : public decoder { + + inline + bool between(uint16_t smallest, uint16_t biggest, uint16_t value) + { + return smallest <= value && value <= biggest; + } + + template + bool check_pulse(sample s) + { +// printf("between(%d, %d, %d) && between(%d, %d, %d)\n", +// int(PeriodTime * 0.8), int(PeriodTime * 1.2), s.period_us, +// int(PulseTime * 0.8), int(PulseTime * 1.2), s.pulse_us); + + return between(uint16_t(PeriodTime * 0.8), uint16_t(PeriodTime * 1.2), s.period_us) && + between(uint16_t(PulseTime * 0.8), uint16_t(PulseTime * 1.2), s.pulse_us); + } + + inline + bool start_bit(sample s) + { + return check_pulse<9000, 4500>(s); + } + + inline + bool one_bit(sample s) + { + return check_pulse<2250, 560>(s); + } + + inline + bool zero_bit(sample s) + { + return check_pulse<1125, 560>(s); + } + + __noinline + void dump_values(sample_iterator *it) { + while (it->next()) { + auto s = it->value(); + auto pct = int(s.pulse_us / double(s.period_us) * 100); + auto type = start_bit(s) ? "start" : one_bit(s) ? "1" : zero_bit(s) ? "0" : "?"; + printf("% 5d us % 5d us, %s\n", s.period_us, s.pulse_us, type); + } + } + +public: + + __noinline + decoding_result decode(sample_iterator *it) override + { + printf("Daewoo, size=%d\n", it->size()); + + dump_values(it); + it->reset(); + + sample s{}; + bit_string data; + + if (!it->next()) { + return {decoding_state::TOO_SHORT}; + } + s = it->value(); + if (!start_bit(s)) { + return {decoding_state::BAD_START}; + } + + for (int i = 0; i < 32 && it->next(); i++) { + s = it->value(); + + if (one_bit(s)) { + data.append(true); + } else if (zero_bit(s)) { + data.append(false); + } else { + return {decoding_state::SHORT_BODY}; + } + } + + return {decoding_state::OK, data}; + } +}; + +} // namespace radio_controller -- cgit v1.2.3