Keyset update
[pierogi] / protocols / pirprotocol.h
1 #ifndef PIRPROTOCOL_H
2 #define PIRPROTOCOL_H
3
4 // The generic remote controller.
5
6 #include <QObject>
7 #include "pirkeynames.h"
8
9 #include <map>
10 #include <deque>
11
12 // We'll define a maximum number of repetitions, regardless of how long the
13 // user presses the button.  (This is just in case we miss the point at which
14 // he stops pressing it...)  500 should be plenty.
15 #define MAX_REPEAT_COUNT 500
16
17 typedef std::deque<bool> CommandSequence;
18
19 // As I've learned more about IR protocols, the concept of what a specific
20 // key is gets more and more complex.  To deal with this, I'm going to allow
21 // a key to have more than one command sequence associated with it.  (I need
22 // up to three codes for Sony keys, and as many as four to define an
23 // individual Pioneer key.)
24 class PIRKeyBits
25 {
26 public:
27   CommandSequence firstCode;
28   CommandSequence secondCode;
29   CommandSequence thirdCode;
30   CommandSequence fourthCode;
31 };
32
33 // I'll go ahead and use associative arrays to build up lists of keycodes.
34 typedef std::map<int, PIRKeyBits> KeycodeCollection;
35
36
37 // Right now, the only reason for this object to inherit from QObject is
38 // so it can participate in Qt-style threading.  Note that it has no
39 // event loop, and no access to the GUI, so don't go trying to communicate
40 // with the user here...
41 class PIRProtocol: public QObject
42 {
43   Q_OBJECT
44
45 public:
46   PIRProtocol(
47     QObject *guiObject,
48     unsigned int index,
49     unsigned int gSpace,
50     bool iclflag);
51
52   void addKey(
53     PIRKeyName key,
54     unsigned long data,
55     unsigned int size);
56
57   // A special addKey used for Sony's SIRC protocol:
58   void addSIRCKey(
59     PIRKeyName key,
60     unsigned int addressData,
61     unsigned int size,
62     unsigned int commandData);
63
64   void addSIRC20Key(
65     PIRKeyName key,
66     unsigned int secondaryAddressData,
67     unsigned int primaryAddressData,
68     unsigned int commandData);
69
70   void addSharpKey(
71     PIRKeyName key,
72     unsigned int addressData,
73     unsigned int commandData);
74
75   void addNECKey(
76     PIRKeyName key,
77     unsigned int addressData,
78     unsigned int commandData);
79
80   void addPioneerKey(
81     PIRKeyName key,
82     unsigned int firstAddress,
83     unsigned int firstCommand,
84     unsigned int secondAddress,
85     unsigned int secondCommand);
86
87 /*
88   void addRCAKey(
89     PIRKeyName key,
90     unsigned int addressData,
91     unsigned int commandData);
92 */
93
94   void addKaseikyoKey(
95     PIRKeyName key,
96     unsigned int addressData,
97     unsigned int commandData);
98
99   void addDishKey(
100     PIRKeyName key,
101     unsigned int firstCommand,
102     unsigned int secondCommand);
103
104   void addXMPKey(
105     PIRKeyName key,
106     unsigned int firstCommand,
107     unsigned int secondCommand);
108
109   void setCarrierFrequency(
110     unsigned int freq);
111
112   void setDutyCycle(
113     unsigned int dc);
114
115   void setMinimumRepetitions(
116     unsigned int minrep);
117
118   void setPreData(
119     unsigned long data,
120     unsigned int bits);
121
122   void setPostData(
123     unsigned long data,
124     unsigned int bits);
125
126 public slots:
127   virtual void startSendingCommand(
128     unsigned int threadableID,
129     PIRKeyName command) = 0;
130
131 signals:
132   void commandFailed(
133     const char *errString);
134
135 protected:
136   bool isCommandSupported(
137     PIRKeyName command);
138
139   void clearRepeatFlag();
140   bool checkRepeatFlag();
141
142   unsigned int carrierFrequency;
143   unsigned int dutyCycle;
144
145   void appendToBitSeq(
146     CommandSequence &bits,
147     unsigned int code,
148     int size);
149
150   KeycodeCollection keycodes;
151
152   // A sleep function for all protocols:
153   void sleepUntilRepeat(
154     int commandDuration);
155
156   // The "gap" parameter from LIRC.  If the commands are "variable-length",
157   // this indicates the amount of time between the last pulse of one
158   // command and the first pulse of the next.  If "constant-length", it is
159   // the time between the _first_ pulse of one command and the first pulse
160   // of the next.
161
162   void setGapSize(
163     int gapSize,
164     bool iclFlag);
165
166   bool isConstantLength;
167   int gap;
168
169   // More administrative data wrapped around the actual command:
170   CommandSequence preData;
171   CommandSequence postData;
172
173   // Some remotes require a minimum number of repetitions:
174   // Note: thinking about removing this -- don't know if it is needed
175   int minimumRepetitions;
176
177   unsigned int id;
178 };
179
180 #endif // PIRPROTOCOL_H