metakom_decoder.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #pragma once
  2. #include <stdint.h>
  3. #include <atomic>
  4. class MetakomDecoder {
  5. public:
  6. bool read(uint8_t* data, uint8_t data_size);
  7. void process_front(bool polarity, uint32_t time);
  8. MetakomDecoder();
  9. private:
  10. enum class BitState : uint8_t {
  11. WAIT_FRONT_HIGH,
  12. WAIT_FRONT_LOW,
  13. };
  14. BitState bit_state;
  15. enum class State : uint8_t {
  16. WAIT_PERIOD_SYNC,
  17. WAIT_START_BIT,
  18. WAIT_START_WORD,
  19. READ_WORD,
  20. READ_STOP_WORD,
  21. };
  22. State state;
  23. // high + low period time
  24. uint32_t period_time;
  25. uint32_t low_time_storage;
  26. static const uint8_t period_sample_count = 10;
  27. uint8_t period_sample_index;
  28. uint32_t period_sample_data[period_sample_count];
  29. // ready flag, key is readed and valid
  30. std::atomic<bool> ready;
  31. // max period, 230us x clock per us
  32. uint32_t max_period;
  33. uint8_t tmp_data;
  34. uint8_t tmp_counter;
  35. uint32_t key_data;
  36. uint8_t key_data_index;
  37. void reset_state();
  38. bool parity_check(uint8_t data);
  39. bool process_bit(bool polarity, uint32_t time, uint32_t* high_time, uint32_t* low_time);
  40. };