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/decoder.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 8 deletions(-) (limited to 'include/decoder.h') diff --git a/include/decoder.h b/include/decoder.h index 2a8c58e..55e7d96 100644 --- a/include/decoder.h +++ b/include/decoder.h @@ -2,25 +2,86 @@ namespace radio_controller { -template -class iterator { +struct sample { + uint16_t period_us; + uint16_t pulse_us; +}; + +class sample_iterator { public: + virtual int size() = 0; + + virtual void reset() = 0; + virtual bool next() = 0; virtual bool has_next() const = 0; - virtual const T &value() const = 0; + virtual const sample &value() const = 0; }; -struct sample { - uint16_t period_us; - uint16_t pulse_us; +class bit_string final { + uint32_t a_ = 0; + uint32_t b_ = 0; + int size_ = 0; + +public: + int size() const { + return size_; + } + + uint32_t u32(int i) + { + switch (i) { + case 0: + return a_; + case 1: + return b_; + default: + return 0; + } + } + + __noinline + void append(bool value) + { + if (size_ < 32) { + if (value) { + a_ |= 1 << size_; + } + } else if (size_ < 64) { + if (value) { + b_ |= 1 << size_ - 32; + } + } else { + return; + } + size_++; + } +}; + +enum class decoding_state { + OK, + TOO_SHORT, + BAD_START, + SHORT_BODY +}; + +class decoding_result { +public: + decoding_state state; + bit_string data; + + decoding_result(decoding_state state) : state(state), data() + {} + + decoding_result(decoding_state state, bit_string data) : state(state), data(data) + {} }; -//template class decoder { public: - virtual void decode(iterator *it) = 0; + virtual decoding_result decode(sample_iterator *it) = 0; }; } // namespace radio_controller -- cgit v1.2.3