Infrared4Arduino
Nec1Decoder.cpp
Go to the documentation of this file.
1 #include "Nec1Decoder.h"
2 #include "IrReader.h"
3 #include <string.h>
4 #include <stdlib.h>
5 
6 //{38.4k,564}<1,-1|1,-3>(16,-8,D:8,S:8,F:8,~F:8,1,^108m,(16,-4,1,^108m)*) [D:0..255,S:0..255=255-D,F:0..255]
7 
8 static const char nec1DittoLiteral[] = "NEC1 ditto";
9 
10 int Nec1Decoder::decodeFlashGap(microseconds_t flash, microseconds_t gap) {
11  boolean result = getDuration(flash, 1);
12  if (!result)
13  return invalid;
14 
15  return getDuration(gap, 3) ? 1
16  : getDuration(gap, 1) ? 0
17  : invalid;
18 }
19 
20 boolean Nec1Decoder::tryDecode(const IrReader& irReader, Stream& stream) {
21  Nec1Decoder decoder(irReader);
22  return decoder.printDecode(stream);
23 }
24 
25 int Nec1Decoder::decodeParameter(const IrReader& irReader, unsigned int index) {
26  unsigned int sum = 0;
27  for (int i = 7; i >= 0; i--) {
28  int result = decodeFlashGap(irReader.getDuration(2 * i + index), irReader.getDuration(2 * i + 1 + index));
29  if (result == invalid)
30  return invalid;
31  sum = (sum << 1) + result;
32  }
33  return sum;
34 }
35 
37  unsigned int index = 0;
38  boolean success;
39  if (irReader.getDataLength() == 4U) {
40  success = getDuration(irReader.getDuration(index++), 16U);
41  if (!success)
42  return;
43  success = getDuration(irReader.getDuration(index++), 4U);
44  if (!success)
45  return;
46  success = getDuration(irReader.getDuration(index++), 1U);
47  if (!success)
48  return;
49  success = isEnding(irReader.getDuration(index));
50  if (!success)
51  return;
52  ditto = true;
53  setValid(true);
54  //strcpy_PF(decode, (uint_farptr_t) nec1DittoLiteral); // FIXME
55  strcpy(decode, nec1DittoLiteral); // FIXME
56  } else if (irReader.getDataLength() == 34U * 2U) {
57  success = getDuration(irReader.getDuration(index++), 16U);
58  if (!success)
59  return;
60  success = getDuration(irReader.getDuration(index++), 8U);
61  if (!success)
62  return;
63  D = decodeParameter(irReader, index);
64  if (D == invalid)
65  return;
66  index += 16;
67  S = decodeParameter(irReader, index);
68  if (S == invalid)
69  return;
70  index += 16;
71  F = decodeParameter(irReader, index);
72  if (F == invalid)
73  return;
74  index += 16;
75  int invF = decodeParameter(irReader, index);
76  if (invF < 0)
77  return;
78  if ((F ^ invF) != 0xFF)
79  return;
80  index += 16;
81 
82  success = getDuration(irReader.getDuration(index++), 1U);
83  if (!success)
84  return;
85  success = isEnding(irReader.getDuration(index));
86  if (!success)
87  return;
88  ditto = false;
89  setValid(true);
90  //strncpy_PF(decode, pgm_read_byte(nec1DittoLiteral), 4);
91  //strcpy_PF(decode, (uint_farptr_t) F("NEC1"));
92  strcpy(decode, "NEC1");
93  char junk[5];
94  sprintf(junk, " %d", D);
95  strcat(decode, junk);
96  if (S != 255 - D) {
97  sprintf(junk, " %d", S);
98  strcat(decode, junk);
99  }
100  sprintf(junk, " %d", F);
101  strcat(decode, junk);
102  }
103 }
uint16_t microseconds_t
Type for durations in micro seconds.
Definition: InfraredTypes.h:16
virtual microseconds_t getDuration(unsigned int index) const =0
Returns the index-th duration, if possible.
static boolean isEnding(microseconds_t duration)
Tests if the argument is large enough to be considered an ending of a decodable signal.
Definition: IrDecoder.h:57
virtual size_t getDataLength() const =0
Returns the number of collected durations.
static const char nec1DittoLiteral[]
Definition: Nec1Decoder.cpp:8
Abstract base class for all IR readers, capturing or receiving.
Definition: IrReader.h:30
boolean printDecode(Stream &stream) const
If valid, prints the decode to the stream.
Definition: IrDecoder.h:36
static const int invalid
Definition: IrDecoder.h:47
void setValid(bool valid_)
Definition: IrDecoder.h:48
Abstract base class for all decoder classes.
Definition: IrDecoder.h:9
A decoder class for NEC1 signals.
Definition: Nec1Decoder.h:10
static boolean tryDecode(const IrReader &irReader, Stream &stream)
Convenience function; constructs an Nec1Decoder and calls its printDecode.
Definition: Nec1Decoder.cpp:20