Infrared4Arduino
Nec1Renderer.cpp
Go to the documentation of this file.
1 #include "Nec1Renderer.h"
2 
3 // NOTE: writing intro[i++] = ... produces wrong result, compiler bug?
4 // (Adding a print statement immediately after, and it works :-~)
5 // So let's write intro[i] = ...; i++ at least for now.
6 
7 const microseconds_t Nec1Renderer::repeatData[repeatLength] = { 9024, 2256, 564, 65535 };
8 const IrSequence Nec1Renderer::repeat(repeatData, repeatLength, false);
10 
11 const IrSignal *Nec1Renderer::newIrSignal(unsigned int D, unsigned int S, unsigned int F) {
12  microseconds_t *introData = new microseconds_t[introLength];
13  unsigned int i = 0;
14  uint32_t sum = 9024 + 4512 + 564;
15  introData[i] = 9024; i++;
16  introData[i] = 4512; i++;
17  lsbByte(introData, i, sum, D);
18  lsbByte(introData, i, sum, S);
19  lsbByte(introData, i, sum, F);
20  lsbByte(introData, i, sum, 255-F);
21  introData[i] = 564; i++;
22  introData[i] = (microseconds_t) (108000 - sum); i++;
23  IrSequence *introPtr = new IrSequence(introData, introLength, true);
24  return new IrSignal(*introPtr, repeat, emptyIrSequence, frequency);
25 }
26 
27 void Nec1Renderer::lsbByte(microseconds_t *intro, unsigned int& i, uint32_t& sum, unsigned int X) {
28  for (unsigned int index = 0; index < 8; index++) {
29  process(intro, i, sum, X & 1);
30  X >>= 1;
31  }
32 }
33 
34 void inline Nec1Renderer::process(microseconds_t *intro, unsigned int& i, uint32_t& sum, unsigned int data) {
35  intro[i++] = 564;
36  intro[i++] = data ? 1692 : 564;
37  sum += data ? 564+1692 : 564+564;
38 }
static const IrSequence emptyIrSequence
Definition: Nec1Renderer.cpp:9
uint16_t microseconds_t
Type for durations in micro seconds.
Definition: InfraredTypes.h:16
This class models an IR signal with intro-, repeat-, and ending sequences.
Definition: IrSignal.h:11
This class consists of a vector of durations.
Definition: IrSequence.h:12
static const IrSignal * newIrSignal(unsigned int D, unsigned int S, unsigned int F)
Generates am IrSignal from the NEC1 parameters.