infrared_encoder_sirc.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "furi/check.h"
  2. #include "infrared.h"
  3. #include "common/infrared_common_i.h"
  4. #include <stdint.h>
  5. #include "../infrared_i.h"
  6. #include "infrared_protocol_defs_i.h"
  7. #include <furi.h>
  8. void infrared_encoder_sirc_reset(void* encoder_ptr, const InfraredMessage* message) {
  9. furi_assert(encoder_ptr);
  10. furi_assert(message);
  11. InfraredCommonEncoder* encoder = encoder_ptr;
  12. infrared_common_encoder_reset(encoder);
  13. uint32_t* data = (void*)encoder->data;
  14. if(message->protocol == InfraredProtocolSIRC) {
  15. *data = (message->command & 0x7F);
  16. *data |= (message->address & 0x1F) << 7;
  17. encoder->bits_to_encode = 12;
  18. } else if(message->protocol == InfraredProtocolSIRC15) {
  19. *data = (message->command & 0x7F);
  20. *data |= (message->address & 0xFF) << 7;
  21. encoder->bits_to_encode = 15;
  22. } else if(message->protocol == InfraredProtocolSIRC20) {
  23. *data = (message->command & 0x7F);
  24. *data |= (message->address & 0x1FFF) << 7;
  25. encoder->bits_to_encode = 20;
  26. } else {
  27. furi_assert(0);
  28. }
  29. }
  30. InfraredStatus infrared_encoder_sirc_encode_repeat(
  31. InfraredCommonEncoder* encoder,
  32. uint32_t* duration,
  33. bool* level) {
  34. furi_assert(encoder);
  35. furi_assert(encoder->timings_encoded == (1u + 2 + encoder->bits_to_encode * 2 - 1));
  36. furi_assert(encoder->timings_sum < INFRARED_SIRC_REPEAT_PERIOD);
  37. *duration = INFRARED_SIRC_REPEAT_PERIOD - encoder->timings_sum;
  38. *level = false;
  39. encoder->timings_sum = 0;
  40. encoder->timings_encoded = 1;
  41. encoder->bits_encoded = 0;
  42. encoder->state = InfraredCommonEncoderStatePreamble;
  43. return InfraredStatusOk;
  44. }
  45. void* infrared_encoder_sirc_alloc(void) {
  46. return infrared_common_encoder_alloc(&protocol_sirc);
  47. }
  48. void infrared_encoder_sirc_free(void* encoder_ptr) {
  49. infrared_common_encoder_free(encoder_ptr);
  50. }
  51. InfraredStatus infrared_encoder_sirc_encode(void* encoder_ptr, uint32_t* duration, bool* level) {
  52. InfraredCommonEncoder* encoder = encoder_ptr;
  53. InfraredStatus status = infrared_common_encode(encoder, duration, level);
  54. if((status == InfraredStatusOk) && (encoder->bits_encoded == encoder->bits_to_encode)) {
  55. furi_assert(!*level);
  56. status = InfraredStatusDone;
  57. encoder->state = InfraredCommonEncoderStateEncodeRepeat;
  58. }
  59. return status;
  60. }