42 #ifndef _IR_DISTANCE_HPP
43 #define _IR_DISTANCE_HPP
48 #define DURATION_ARRAY_SIZE 50
65 unsigned int aOneSpaceMicros,
unsigned int aZeroMarkMicros,
unsigned int aZeroSpaceMicros, uint32_t *aDecodedRawDataArray,
66 unsigned int aNumberOfBits,
bool aMSBfirst,
unsigned int aRepeatSpaceMillis, uint_fast8_t aNumberOfRepeats) {
71 mark(aHeaderMarkMicros);
72 space(aHeaderSpaceMicros);
75 uint_fast8_t tNumberOf32BitChunks = ((aNumberOfBits - 1) / 32) + 1;
77 while (tNumberOfCommands > 0) {
79 for (uint_fast8_t i = 0; i < tNumberOf32BitChunks; ++i) {
80 uint8_t tNumberOfBitsForOneSend;
81 if (aNumberOfBits > 32) {
82 tNumberOfBitsForOneSend = 32;
84 tNumberOfBitsForOneSend = aNumberOfBits;
87 tNumberOfBitsForOneSend, aMSBfirst, (i == (tNumberOf32BitChunks - 1)));
94 if (tNumberOfCommands > 0) {
95 delay(aRepeatSpaceMillis);
102 void printDurations(uint8_t aArray[], uint8_t aMaxIndex) {
103 for (uint_fast8_t i = 0; i <= aMaxIndex; i++) {
111 Serial.print(F(
":"));
113 Serial.print(F(
" | "));
114 Serial.print(aArray[i]);
125 uint16_t tWeightedSum = 0;
126 for (uint_fast8_t i = 0; i <= aMaxIndex; i++) {
127 uint8_t tCurrentDurations = aArray[i];
128 if (tCurrentDurations != 0) {
130 tSum += tCurrentDurations;
131 tWeightedSum += (tCurrentDurations * i);
134 if ((tCurrentDurations == 0 || i == aMaxIndex) && tSum != 0) {
136 uint8_t tAggregateIndex = (tWeightedSum + (tSum / 2)) / tSum;
137 aArray[tAggregateIndex] = tSum;
139 if (*aShortIndex == 0) {
140 *aShortIndex = tAggregateIndex;
141 }
else if (*aLongIndex == 0) {
142 *aLongIndex = tAggregateIndex;
179 memset(tDurationArray, 0,
sizeof(tDurationArray));
181 uint8_t tMaxDurationIndex = 0;
187 if (tDurationTicks <
sizeof(tDurationArray)) {
188 tDurationArray[tDurationTicks]++;
189 if (tMaxDurationIndex < tDurationTicks) {
190 tMaxDurationIndex = tDurationTicks;
198 uint8_t tMarkTicksShort = 0;
199 uint8_t tMarkTicksLong = 0;
200 bool tSuccess =
aggregateArrayCounts(tDurationArray, tMaxDurationIndex, &tMarkTicksShort, &tMarkTicksLong);
202 Serial.println(F(
"Mark:"));
203 printDurations(tDurationArray, tMaxDurationIndex);
208 IR_DEBUG_PRINTLN(F(
"Mark aggregation failed, more than 2 distinct mark duration values found"));
212 memset(tDurationArray, 0,
sizeof(tDurationArray));
217 tMaxDurationIndex = 0;
220 if (tDurationTicks <
sizeof(tDurationArray)) {
221 tDurationArray[tDurationTicks]++;
222 if (tMaxDurationIndex < tDurationTicks) {
223 tMaxDurationIndex = tDurationTicks;
231 uint8_t tSpaceTicksShort = 0;
232 uint8_t tSpaceTicksLong = 0;
233 tSuccess =
aggregateArrayCounts(tDurationArray, tMaxDurationIndex, &tSpaceTicksShort, &tSpaceTicksLong);
235 Serial.println(F(
"Space:"));
236 printDurations(tDurationArray, tMaxDurationIndex);
241 IR_DEBUG_PRINTLN(F(
"Space aggregation failed, more than 2 distinct space duration values found"));
279 uint8_t tStartIndex = 3;
280 uint8_t tNumberOfAdditionalLong = (tNumberOfBits - 1) / 32;
285 if (tSpaceTicksLong > 0) {
298 for (uint_fast8_t i = 0; i <= tNumberOfAdditionalLong; ++i) {
299 uint8_t tNumberOfBitsForOneDecode = tNumberOfBits;
300 if (tNumberOfBitsForOneDecode > 32) {
301 tNumberOfBitsForOneDecode = 32;
305 #
if defined(DISTANCE_DO_MSB_DECODING)
324 if (tMarkTicksLong == 0) {
326 IR_DEBUG_PRINTLN(F(
"Only 1 distinct duration value for each space and mark found"));
331 #if defined(SUPPORT_PULSE_WIDTH_DECODING) // The only known pulse width protocol is Sony
339 for (uint_fast8_t i = 0; i <= tNumberOfAdditionalLong; ++i) {
340 uint8_t tNumberOfBitsForOneDecode = tNumberOfBits;
341 if (tNumberOfBitsForOneDecode > 32) {
342 tNumberOfBitsForOneDecode = 32;
360 #if defined(DISTANCE_DO_MSB_DECODING)
370 #endif // _IR_DISTANCE_HPP