Welcome to the first commit of the first version of my very first app.
[pierogi] / necprotocol.h
1 #ifndef NECPROTOCOL_H
2 #define NECPROTOCOL_H
3
4 #include "pirprotocol.h"
5 #include "pirdevice.h"
6
7 //
8 // The "NEC" Protocol is, more or less, followed by the majority of
9 // remotes defined in the LIRC config files, which means it is probably
10 // followed by most of the remotes out there.
11 //
12 // Remotes using this protocol seem to use a frequency of 38000 Hz, lead off
13 // each command with a signal that should be unique to the manufacturer,
14 // and mostly define 0s and 1s by the length of time between pulses...
15 //
16
17 class NECProtocol: public PIRProtocol
18 {
19 public:
20   // An NEC protocol will always have differing times for "zero" and "one".
21   // Also, all protocols have some space set between commands.  However,
22   // some protocols specify a fixed delay between the end of one
23   // command and the start of the next, and others specify each command be
24   // started at a precise interval (so the spacing between the end of one
25   // and the start of another may vary).
26   NECProtocol(
27     QObject *guiObject,
28     unsigned int index,
29     unsigned int zPulse,
30     unsigned int zSpace,
31     unsigned int oPulse,
32     unsigned int oSpace,
33     unsigned int gapSpace,
34     bool iclflag);
35
36   void setHeaderPair(
37     unsigned int pulse,
38     unsigned int space);
39
40   void setTrailerPulse(
41     unsigned int pulse);
42
43   void setRepeatPair(
44     unsigned int pulse,
45     unsigned int space);
46
47   void setPreData(
48     unsigned long data,
49     unsigned int bits);
50
51   void setPostData(
52     unsigned long data,
53     unsigned int bits);
54
55   void setRepeatNeedsHeader(
56     bool flag);
57
58 public slots:
59   void startSendingCommand(
60     unsigned int threadableID,
61     PIRKeyName command);
62
63 private:
64   // First, define what is used to represent 0 and 1:
65   unsigned int zeroPulse;
66   unsigned int zeroSpace;
67   unsigned int onePulse;
68   unsigned int oneSpace;
69
70   // A tailing on-request, not followed by a specific off time:
71   unsigned int trailerPulse;
72   bool hasTrailerPulse;
73
74   // Each remote key has a unique command sequence:
75 //  KeyCommandMap commands;
76
77   // Some administrative data that most NEC Protocol remotes have:
78   unsigned int headerPulse;
79   unsigned int headerSpace;
80   bool hasHeaderPair;
81
82   // More administrative data wrapped around the actual command:
83   CommandSequence preData;
84   CommandSequence postData;
85
86   // A pulse that means "repeat the last command":
87   unsigned int repeatPulse;
88   unsigned int repeatSpace;
89   bool hasRepeatPair;
90   bool repeatNeedsHeader; // Put the header ahead of the repeat pulse
91
92   int generateStandardCommand(
93     const CommandSequence &bits,
94     PIRDevice &device);
95
96   int generateRepeatCommand(
97     PIRDevice &device);
98
99   int pushBits(
100     const CommandSequence &bits,
101     PIRDevice &device);
102 };
103
104 #endif // NECPROTOCOL_H