irda_decoder_sirc.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "common/irda_common_i.h"
  2. #include "irda.h"
  3. #include "irda_protocol_defs_i.h"
  4. #include <stdbool.h>
  5. #include <stdint.h>
  6. #include <furi.h>
  7. #include "../irda_i.h"
  8. IrdaMessage* irda_decoder_sirc_check_ready(void* ctx) {
  9. IrdaMessage* message = NULL;
  10. IrdaCommonDecoder* decoder = ctx;
  11. if (irda_decoder_sirc_interpret(decoder)) {
  12. message = &decoder->message;
  13. decoder->timings_cnt = 0;
  14. decoder->databit_cnt = 0;
  15. }
  16. return message;
  17. }
  18. bool irda_decoder_sirc_interpret(IrdaCommonDecoder* decoder) {
  19. furi_assert(decoder);
  20. uint32_t* data = (void*) &decoder->data[0];
  21. uint16_t address = 0;
  22. uint8_t command = 0;
  23. IrdaProtocol protocol = IrdaProtocolUnknown;
  24. if (decoder->databit_cnt == 12) {
  25. address = (*data >> 7) & 0x1F;
  26. command = *data & 0x7F;
  27. protocol = IrdaProtocolSIRC;
  28. } else if (decoder->databit_cnt == 15) {
  29. address = (*data >> 7) & 0xFF;
  30. command = *data & 0x7F;
  31. protocol = IrdaProtocolSIRC15;
  32. } else if (decoder->databit_cnt == 20) {
  33. address = (*data >> 7) & 0x1FFF;
  34. command = *data & 0x7F;
  35. protocol = IrdaProtocolSIRC20;
  36. } else {
  37. return false;
  38. }
  39. decoder->message.protocol = protocol;
  40. decoder->message.address = address;
  41. decoder->message.command = command;
  42. /* SIRC doesn't specify repeat detection */
  43. decoder->message.repeat = false;
  44. return true;
  45. }
  46. void* irda_decoder_sirc_alloc(void) {
  47. return irda_common_decoder_alloc(&protocol_sirc);
  48. }
  49. IrdaMessage* irda_decoder_sirc_decode(void* context, bool level, uint32_t duration) {
  50. IrdaCommonDecoder* decoder = context;
  51. IrdaMessage* message = NULL;
  52. if ((decoder->databit_cnt == 12) || (decoder->databit_cnt == 15)) {
  53. if (!level && (duration >= IRDA_SIRC_MIN_SILENCE)) {
  54. if (irda_decoder_sirc_interpret(decoder)) {
  55. message = &decoder->message;
  56. decoder->timings_cnt = 0;
  57. decoder->databit_cnt = 0;
  58. }
  59. }
  60. }
  61. if (!message) {
  62. message = irda_common_decode(decoder, level, duration);
  63. if (message) { /* 20 bit */
  64. decoder->timings_cnt = 0;
  65. decoder->databit_cnt = 0;
  66. }
  67. }
  68. return message;
  69. }
  70. void irda_decoder_sirc_free(void* decoder) {
  71. irda_common_decoder_free(decoder);
  72. }
  73. void irda_decoder_sirc_reset(void* decoder) {
  74. irda_common_decoder_reset(decoder);
  75. }