ir_Nikai.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright 2009 Ken Shirriff
  2. // Copyright 2017 David Conran
  3. #include <algorithm>
  4. #include "IRrecv.h"
  5. #include "IRsend.h"
  6. #include "IRutils.h"
  7. // NN NN IIIII KK KK AAA IIIII
  8. // NNN NN III KK KK AAAAA III
  9. // NN N NN III KKKK AA AA III
  10. // NN NNN III KK KK AAAAAAA III
  11. // NN NN IIIII KK KK AA AA IIIII
  12. // Constants
  13. // Ref:
  14. // https://github.com/markszabo/IRremoteESP8266/issues/309
  15. const uint16_t kNikaiTick = 500;
  16. const uint16_t kNikaiHdrMarkTicks = 8;
  17. const uint16_t kNikaiHdrMark = kNikaiHdrMarkTicks * kNikaiTick;
  18. const uint16_t kNikaiHdrSpaceTicks = 8;
  19. const uint16_t kNikaiHdrSpace = kNikaiHdrSpaceTicks * kNikaiTick;
  20. const uint16_t kNikaiBitMarkTicks = 1;
  21. const uint16_t kNikaiBitMark = kNikaiBitMarkTicks * kNikaiTick;
  22. const uint16_t kNikaiOneSpaceTicks = 2;
  23. const uint16_t kNikaiOneSpace = kNikaiOneSpaceTicks * kNikaiTick;
  24. const uint16_t kNikaiZeroSpaceTicks = 4;
  25. const uint16_t kNikaiZeroSpace = kNikaiZeroSpaceTicks * kNikaiTick;
  26. const uint16_t kNikaiMinGapTicks = 17;
  27. const uint16_t kNikaiMinGap = kNikaiMinGapTicks * kNikaiTick;
  28. #if SEND_NIKAI
  29. // Send a Nikai TV formatted message.
  30. //
  31. // Args:
  32. // data: The message to be sent.
  33. // nbits: The bit size of the message being sent. typically kNikaiBits.
  34. // repeat: The number of times the message is to be repeated.
  35. //
  36. // Status: STABLE / Working.
  37. //
  38. // Ref: https://github.com/markszabo/IRremoteESP8266/issues/309
  39. void IRsend::sendNikai(uint64_t data, uint16_t nbits, uint16_t repeat) {
  40. sendGeneric(kNikaiHdrMark, kNikaiHdrSpace, kNikaiBitMark, kNikaiOneSpace,
  41. kNikaiBitMark, kNikaiZeroSpace, kNikaiBitMark, kNikaiMinGap, data,
  42. nbits, 38, true, repeat, 33);
  43. }
  44. #endif
  45. #if DECODE_NIKAI
  46. // Decode the supplied Nikai message.
  47. //
  48. // Args:
  49. // results: Ptr to the data to decode and where to store the decode result.
  50. // nbits: Nr. of bits to expect in the data portion.
  51. // Typically kNikaiBits.
  52. // strict: Flag to indicate if we strictly adhere to the specification.
  53. // Returns:
  54. // boolean: True if it can decode it, false if it can't.
  55. //
  56. // Status: STABLE / Working.
  57. //
  58. bool IRrecv::decodeNikai(decode_results *results, uint16_t nbits, bool strict) {
  59. if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
  60. return false; // Can't possibly be a valid Nikai message.
  61. if (strict && nbits != kNikaiBits)
  62. return false; // We expect Nikai to be a certain sized message.
  63. uint64_t data = 0;
  64. uint16_t offset = kStartOffset;
  65. // Header
  66. if (!matchMark(results->rawbuf[offset], kNikaiHdrMark)) return false;
  67. // Calculate how long the common tick time is based on the header mark.
  68. uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kNikaiHdrMarkTicks;
  69. if (!matchSpace(results->rawbuf[offset], kNikaiHdrSpace)) return false;
  70. // Calculate how long the common tick time is based on the header space.
  71. uint32_t s_tick = results->rawbuf[offset++] * kRawTick / kNikaiHdrSpaceTicks;
  72. // Data
  73. match_result_t data_result =
  74. matchData(&(results->rawbuf[offset]), nbits, kNikaiBitMarkTicks * m_tick,
  75. kNikaiOneSpaceTicks * s_tick, kNikaiBitMarkTicks * m_tick,
  76. kNikaiZeroSpaceTicks * s_tick);
  77. if (data_result.success == false) return false;
  78. data = data_result.data;
  79. offset += data_result.used;
  80. // Footer
  81. if (!matchMark(results->rawbuf[offset++], kNikaiBitMarkTicks * m_tick))
  82. return false;
  83. if (offset < results->rawlen &&
  84. !matchAtLeast(results->rawbuf[offset], kNikaiMinGapTicks * s_tick))
  85. return false;
  86. // Compliance
  87. // Success
  88. results->bits = nbits;
  89. results->value = data;
  90. results->decode_type = NIKAI;
  91. results->command = 0;
  92. results->address = 0;
  93. return true;
  94. }
  95. #endif