summaryrefslogtreecommitdiff
path: root/include/decoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/decoder.h')
-rw-r--r--include/decoder.h77
1 files changed, 69 insertions, 8 deletions
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<typename T>
-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<typename T>
class decoder {
public:
- virtual void decode(iterator<sample> *it) = 0;
+ virtual decoding_result decode(sample_iterator *it) = 0;
};
} // namespace radio_controller