ir_Carrier.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2018 David Conran
  2. #include "IRrecv.h"
  3. #include "IRsend.h"
  4. #include "IRutils.h"
  5. // CCCCC AAA RRRRRR RRRRRR IIIII EEEEEEE RRRRRR
  6. // CC C AAAAA RR RR RR RR III EE RR RR
  7. // CC AA AA RRRRRR RRRRRR III EEEEE RRRRRR
  8. // CC C AAAAAAA RR RR RR RR III EE RR RR
  9. // CCCCC AA AA RR RR RR RR IIIII EEEEEEE RR RR
  10. // Suits Carrier/Surrey HVAC models:
  11. // 42QG5A55970 (remote)
  12. // 619EGX0090E0 / 619EGX0120E0 / 619EGX0180E0 / 619EGX0220E0 (indoor units)
  13. // 53NGK009/012 (inverter)
  14. // Constants
  15. // Ref:
  16. // https://github.com/markszabo/IRremoteESP8266/issues/385
  17. const uint16_t kCarrierAcHdrMark = 8532;
  18. const uint16_t kCarrierAcHdrSpace = 4228;
  19. const uint16_t kCarrierAcBitMark = 628;
  20. const uint16_t kCarrierAcOneSpace = 1320;
  21. const uint16_t kCarrierAcZeroSpace = 532;
  22. const uint16_t kCarrierAcGap = 20000;
  23. #if SEND_CARRIER_AC
  24. // Send a Carrier HVAC formatted message.
  25. //
  26. // Args:
  27. // data: The message to be sent.
  28. // nbits: The bit size of the message being sent. typically kCarrierAcBits.
  29. // repeat: The number of times the message is to be repeated.
  30. //
  31. // Status: BETA / Appears to work on real devices.
  32. //
  33. void IRsend::sendCarrierAC(uint64_t data, uint16_t nbits, uint16_t repeat) {
  34. for (uint16_t r = 0; r <= repeat; r++) {
  35. uint64_t temp_data = data;
  36. // Carrier sends the data block three times. normal + inverted + normal.
  37. for (uint16_t i = 0; i < 3; i++) {
  38. sendGeneric(kCarrierAcHdrMark, kCarrierAcHdrSpace, kCarrierAcBitMark,
  39. kCarrierAcOneSpace, kCarrierAcBitMark, kCarrierAcZeroSpace,
  40. kCarrierAcBitMark, kCarrierAcGap, temp_data, nbits, 38, true,
  41. 0, kDutyDefault);
  42. temp_data = invertBits(temp_data, nbits);
  43. }
  44. }
  45. }
  46. #endif
  47. #if DECODE_CARRIER_AC
  48. // Decode the supplied Carrier HVAC message.
  49. // Carrier HVAC messages contain only 32 bits, but it is sent three(3) times.
  50. // i.e. normal + inverted + normal
  51. // Args:
  52. // results: Ptr to the data to decode and where to store the decode result.
  53. // nbits: Nr. of bits to expect in the data portion.
  54. // Typically kCarrierAcBits.
  55. // strict: Flag to indicate if we strictly adhere to the specification.
  56. // Returns:
  57. // boolean: True if it can decode it, false if it can't.
  58. //
  59. // Status: ALPHA / Untested.
  60. //
  61. bool IRrecv::decodeCarrierAC(decode_results *results, uint16_t nbits,
  62. bool strict) {
  63. if (results->rawlen < ((2 * nbits + kHeader + kFooter) * 3) - 1)
  64. return false; // Can't possibly be a valid Carrier message.
  65. if (strict && nbits != kCarrierAcBits)
  66. return false; // We expect Carrier to be 32 bits of message.
  67. uint64_t data = 0;
  68. uint64_t prev_data = 0;
  69. uint16_t offset = kStartOffset;
  70. for (uint8_t i = 0; i < 3; i++) {
  71. prev_data = data;
  72. // Header
  73. if (!matchMark(results->rawbuf[offset++], kCarrierAcHdrMark)) return false;
  74. if (!matchSpace(results->rawbuf[offset++], kCarrierAcHdrSpace))
  75. return false;
  76. // Data
  77. match_result_t data_result =
  78. matchData(&(results->rawbuf[offset]), nbits, kCarrierAcBitMark,
  79. kCarrierAcOneSpace, kCarrierAcBitMark, kCarrierAcZeroSpace);
  80. if (data_result.success == false) return false;
  81. data = data_result.data;
  82. offset += data_result.used;
  83. // Footer
  84. if (!matchMark(results->rawbuf[offset++], kCarrierAcBitMark)) return false;
  85. if (offset < results->rawlen &&
  86. !matchAtLeast(results->rawbuf[offset++], kCarrierAcGap))
  87. return false;
  88. // Compliance.
  89. if (strict) {
  90. // Check if the data is an inverted copy of the previous data.
  91. if (i > 0 && prev_data != invertBits(data, nbits)) return false;
  92. }
  93. }
  94. // Success
  95. results->bits = nbits;
  96. results->value = data;
  97. results->decode_type = CARRIER_AC;
  98. results->address = data >> 16;
  99. results->command = data & 0xFFFF;
  100. return true;
  101. }
  102. #endif