irda_encoder.c 954 B

12345678910111213141516171819202122232425262728293031323334
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include <api-hal-irda.h>
  4. #include <api-hal-delay.h>
  5. #include "irda_i.h"
  6. void irda_encode_mark(const IrdaEncoderTimings *timings, uint32_t duration) {
  7. api_hal_irda_pwm_set(timings->duty_cycle, timings->carrier_frequency);
  8. delay_us(duration);
  9. }
  10. void irda_encode_space(const IrdaEncoderTimings *timings, uint32_t duration) {
  11. (void) timings;
  12. api_hal_irda_pwm_stop();
  13. delay_us(duration);
  14. }
  15. void irda_encode_bit(const IrdaEncoderTimings *timings, bool bit) {
  16. if (bit) {
  17. irda_encode_mark(timings, timings->bit1_mark);
  18. irda_encode_space(timings, timings->bit1_space);
  19. } else {
  20. irda_encode_mark(timings, timings->bit0_mark);
  21. irda_encode_space(timings, timings->bit0_space);
  22. }
  23. }
  24. void irda_encode_byte(const IrdaEncoderTimings *timings, uint8_t data) {
  25. for(uint8_t i = 0; i < 8; i++) {
  26. irda_encode_bit(timings, !!(data & (1 << i)));
  27. }
  28. }