irda_samsung.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <furi.h>
  2. #include <api-hal.h>
  3. #include "irda_samsung.h"
  4. #include "irda_protocols.h"
  5. void ir_samsung_preambula(void) {
  6. irda_pwm_set(SAMSUNG_DUTY_CYCLE, SAMSUNG_CARRIER_FREQUENCY);
  7. delay_us(4500);
  8. irda_pwm_stop();
  9. delay_us(4500);
  10. }
  11. void ir_samsung_send_bit(bool bit) {
  12. irda_pwm_set(SAMSUNG_DUTY_CYCLE, SAMSUNG_CARRIER_FREQUENCY);
  13. delay_us(560);
  14. irda_pwm_stop();
  15. if(bit) {
  16. delay_us(1590);
  17. } else {
  18. delay_us(560);
  19. }
  20. }
  21. void ir_samsung_send_byte(uint8_t data) {
  22. for(uint8_t i = 0; i < 8; i++) {
  23. ir_samsung_send_bit((data & (1 << (i))) != 0);
  24. }
  25. }
  26. void ir_samsung_send(uint16_t addr, uint16_t data) {
  27. uint8_t samsung_packet[4] = {
  28. (uint8_t)addr, (uint8_t)(addr >> 8), (uint8_t)data, (uint8_t)(data >> 8)};
  29. osKernelLock();
  30. __disable_irq();
  31. ir_samsung_preambula();
  32. ir_samsung_send_byte(samsung_packet[0]);
  33. ir_samsung_send_byte(samsung_packet[1]);
  34. ir_samsung_send_byte(samsung_packet[2]);
  35. ir_samsung_send_byte(samsung_packet[3]);
  36. ir_samsung_send_bit(0);
  37. __enable_irq();
  38. osKernelUnlock();
  39. }