irda_encoder_nec.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include <stdint.h>
  2. #include "../irda_i.h"
  3. static const IrdaEncoderTimings encoder_timings = {
  4. .bit1_mark = IRDA_NEC_BIT1_MARK,
  5. .bit1_space = IRDA_NEC_BIT1_SPACE,
  6. .bit0_mark =IRDA_NEC_BIT0_MARK,
  7. .bit0_space = IRDA_NEC_BIT0_SPACE,
  8. .duty_cycle = IRDA_NEC_DUTY_CYCLE,
  9. .carrier_frequency = IRDA_NEC_CARRIER_FREQUENCY,
  10. };
  11. static void irda_encode_nec_preamble(void) {
  12. irda_encode_mark(&encoder_timings, IRDA_NEC_PREAMBULE_MARK);
  13. irda_encode_space(&encoder_timings, IRDA_NEC_PREAMBULE_SPACE);
  14. }
  15. static void irda_encode_nec_repeat(void) {
  16. irda_encode_space(&encoder_timings, IRDA_NEC_REPEAT_PAUSE);
  17. irda_encode_mark(&encoder_timings, IRDA_NEC_REPEAT_MARK);
  18. irda_encode_space(&encoder_timings, IRDA_NEC_REPEAT_SPACE);
  19. irda_encode_bit(&encoder_timings, 1);
  20. }
  21. void irda_encoder_nec_encode(uint32_t addr, uint32_t cmd, bool repeat) {
  22. uint8_t address = addr & 0xFF;
  23. uint8_t command = cmd & 0xFF;
  24. uint8_t address_inverse = (uint8_t) ~address;
  25. uint8_t command_inverse = (uint8_t) ~command;
  26. if (!repeat) {
  27. irda_encode_nec_preamble();
  28. irda_encode_byte(&encoder_timings, address);
  29. irda_encode_byte(&encoder_timings, address_inverse);
  30. irda_encode_byte(&encoder_timings, command);
  31. irda_encode_byte(&encoder_timings, command_inverse);
  32. irda_encode_bit(&encoder_timings, 1);
  33. } else {
  34. irda_encode_nec_repeat();
  35. }
  36. }