irda_common_i.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #pragma once
  2. #include <stdint.h>
  3. #include "irda.h"
  4. #include "irda_i.h"
  5. #define MATCH_BIT_TIMING(x, v, delta) ( ((x) < (v + delta)) \
  6. && ((x) > (v - delta)))
  7. #define MATCH_PREAMBLE_TIMING(x, v, delta) ( ((x) < ((v) * (1 + (delta)))) \
  8. && ((x) > ((v) * (1 - (delta)))))
  9. typedef struct IrdaCommonDecoder IrdaCommonDecoder;
  10. typedef struct IrdaCommonEncoder IrdaCommonEncoder;
  11. typedef IrdaStatus (*IrdaCommonDecode)(IrdaCommonDecoder*);
  12. typedef bool (*IrdaCommonInterpret)(IrdaCommonDecoder*);
  13. typedef IrdaStatus (*IrdaCommonEncode)(IrdaCommonEncoder* encoder, uint32_t* out, bool* polarity);
  14. typedef struct {
  15. IrdaTimings timings;
  16. bool manchester_inverse_level;
  17. uint32_t databit_len;
  18. IrdaCommonDecode decode;
  19. IrdaCommonDecode decode_repeat;
  20. IrdaCommonInterpret interpret;
  21. IrdaCommonEncode encode;
  22. IrdaCommonEncode encode_repeat;
  23. } IrdaCommonProtocolSpec;
  24. typedef enum {
  25. IrdaCommonDecoderStateWaitPreamble,
  26. IrdaCommonDecoderStateDecode,
  27. IrdaCommonDecoderStateProcessRepeat,
  28. } IrdaCommonStateDecoder;
  29. typedef enum {
  30. IrdaCommonEncoderStateSpace,
  31. IrdaCommonEncoderStatePreamble,
  32. IrdaCommonEncoderStateEncode,
  33. IrdaCommonEncoderStateEncodeRepeat,
  34. } IrdaCommonStateEncoder;
  35. struct IrdaCommonDecoder {
  36. const IrdaCommonProtocolSpec* protocol;
  37. IrdaCommonStateDecoder state;
  38. IrdaMessage message;
  39. uint32_t timings[6];
  40. uint8_t timings_cnt;
  41. void* context;
  42. bool switch_detect;
  43. uint32_t level;
  44. uint16_t databit_cnt;
  45. uint8_t data[];
  46. };
  47. struct IrdaCommonEncoder {
  48. const IrdaCommonProtocolSpec* protocol;
  49. IrdaCommonStateEncoder state;
  50. bool switch_detect;
  51. uint32_t bits_encoded;
  52. uint32_t timings_encoded;
  53. void* context;
  54. uint8_t data[];
  55. };
  56. static inline void shift_left_array(uint32_t *array, uint32_t len, uint32_t shift) {
  57. for (int i = 0; i < len; ++i)
  58. array[i] = array[i + shift];
  59. }
  60. IrdaMessage* irda_common_decode(IrdaCommonDecoder *decoder, bool level, uint32_t duration);
  61. IrdaStatus irda_common_decode_pdwm(IrdaCommonDecoder* decoder);
  62. IrdaStatus irda_common_decode_manchester(IrdaCommonDecoder* decoder);
  63. void irda_common_decoder_set_context(void* decoder, void* context);
  64. void* irda_common_decoder_alloc(const IrdaCommonProtocolSpec *protocol);
  65. void irda_common_decoder_free(void* decoder);
  66. void irda_common_decoder_reset(void* decoder);
  67. IrdaStatus irda_common_encode(IrdaCommonEncoder* encoder, uint32_t* duration, bool* polarity);
  68. IrdaStatus irda_common_encode_pdwm(IrdaCommonEncoder* encoder, uint32_t* duration, bool* polarity);
  69. IrdaStatus irda_common_encode_manchester(IrdaCommonEncoder* encoder, uint32_t* duration, bool* polarity);
  70. void irda_common_encoder_set_context(void* decoder, void* context);
  71. void* irda_common_encoder_alloc(const IrdaCommonProtocolSpec* protocol);
  72. void irda_common_encoder_free(IrdaCommonEncoder* encoder);
  73. void irda_common_encoder_reset(IrdaCommonEncoder* encoder);