1 #include "pirprotocol.h"
9 #include "pirexception.h"
11 // A flag for communicating with the main thread:
12 extern bool stopRepeatingFlag;
13 extern QMutex stopRepeatingMutex;
15 // Total of all running commands
16 extern bool commandInFlight;
17 extern QMutex commandIFMutex;
19 // From what I understand (mostly from reading LIRC config files), NEC
20 // protocol based remotes mostly use a frequency of 38000 units and a
21 // duty cycle of 50%. They'll be set to these defaults here, and overridden
22 // as needed by child classes.
24 PIRProtocol::PIRProtocol(
29 : carrierFrequency(38000),
31 isConstantLength(iclflag),
33 minimumRepetitions(0),
36 qRegisterMetaType<PIRKeyName>("PIRKeyName");
40 SIGNAL(buttonPressed(unsigned int, PIRKeyName)),
42 SLOT(startSendingCommand(unsigned int, PIRKeyName)),
43 Qt::QueuedConnection);
47 SIGNAL(commandFailed(const char *)),
49 SLOT(receivedExternalWarning(const char *)),
50 Qt::QueuedConnection);
54 void PIRProtocol::addKey(
56 unsigned long command,
59 // First, if key already exists, clear it out:
61 KeycodeCollection::iterator i = keycodes.find(key);
62 if (i != keycodes.end())
65 pkb->firstCode.clear();
69 pkb = &(keycodes[key]);
72 appendToBitSeq(pkb->firstCode, command, size);
76 void PIRProtocol::addSIRCKey(
78 unsigned int addressData,
80 unsigned int commandData)
82 // First, if key already exists, clear it out:
84 KeycodeCollection::iterator i = keycodes.find(key);
85 if (i != keycodes.end())
88 pkb->firstCode.clear();
89 pkb->secondCode.clear();
90 pkb->thirdCode.clear();
94 pkb = &(keycodes[key]);
97 // First, append the address data:
98 appendToBitSeq(pkb->firstCode, addressData, size);
100 // Next, the command data. The size is always 7 bits:
101 appendToBitSeq(pkb->secondCode, commandData, 7);
105 void PIRProtocol::addSIRC20Key(
107 unsigned int secondaryAddressData,
108 unsigned int primaryAddressData,
109 unsigned int commandData)
111 // First, if key already exists, clear it out:
113 KeycodeCollection::iterator i = keycodes.find(key);
114 if (i != keycodes.end())
117 pkb->firstCode.clear();
118 pkb->secondCode.clear();
119 pkb->thirdCode.clear();
123 pkb = &(keycodes[key]);
126 // First, append the secondary address data:
127 appendToBitSeq(pkb->firstCode, secondaryAddressData, 8);
129 // Next, the primary address data:
130 appendToBitSeq(pkb->secondCode, primaryAddressData, 5);
132 // Next, the command data. The size is always 7 bits:
133 appendToBitSeq(pkb->thirdCode, commandData, 7);
137 void PIRProtocol::addSharpKey(
139 unsigned int addressData,
140 unsigned int commandData)
142 // First, if key already exists, clear it out:
144 KeycodeCollection::iterator i = keycodes.find(key);
145 if (i != keycodes.end())
148 pkb->firstCode.clear();
149 pkb->secondCode.clear();
153 pkb = &(keycodes[key]);
156 // Sharp commands are all 5 bit address, 8 bit command:
157 appendToBitSeq(pkb->firstCode, addressData, 5);
158 appendToBitSeq(pkb->secondCode, commandData, 8);
162 void PIRProtocol::addNECKey(
164 unsigned int addressData,
165 unsigned int commandData)
168 KeycodeCollection::iterator i = keycodes.find(key);
169 if (i != keycodes.end())
172 pkb->firstCode.clear();
173 pkb->secondCode.clear();
174 pkb->thirdCode.clear();
175 pkb->fourthCode.clear();
179 pkb = &(keycodes[key]);
182 // NEC commands should always be 8 bits address, 8 bits command:
183 appendToBitSeq(pkb->firstCode, addressData, 8);
184 appendToBitSeq(pkb->secondCode, commandData, 8);
188 void PIRProtocol::addPanOldKey(
190 unsigned int addressData,
191 unsigned int commandData)
194 KeycodeCollection::iterator i = keycodes.find(key);
195 if (i != keycodes.end())
198 pkb->firstCode.clear();
199 pkb->secondCode.clear();
200 pkb->thirdCode.clear();
201 pkb->fourthCode.clear();
205 pkb = &(keycodes[key]);
208 // The "Old Panasonic" commands have 5 bits address, 6 bits command:
209 appendToBitSeq(pkb->firstCode, addressData, 5);
210 appendToBitSeq(pkb->secondCode, commandData, 6);
214 // Most Pioneer keys use the NEC key format, but some are pairs of
215 // NEC keys sent together:
216 void PIRProtocol::addPioneerKey(
218 unsigned int firstAddress,
219 unsigned int firstCommand,
220 unsigned int secondAddress,
221 unsigned int secondCommand)
224 KeycodeCollection::iterator i = keycodes.find(key);
225 if (i != keycodes.end())
228 pkb->firstCode.clear();
229 pkb->secondCode.clear();
230 pkb->thirdCode.clear();
231 pkb->fourthCode.clear();
235 pkb = &(keycodes[key]);
238 // All four codes should be 8 bits in length:
239 appendToBitSeq(pkb->firstCode, firstAddress, 8);
240 appendToBitSeq(pkb->secondCode, firstCommand, 8);
241 appendToBitSeq(pkb->thirdCode, secondAddress, 8);
242 appendToBitSeq(pkb->fourthCode, secondCommand, 8);
247 void PIRProtocol::addRCAKey(
249 unsigned int addressData,
250 unsigned int commandData)
253 KeycodeCollection::iterator i = keycodes.find(key);
254 if (i != keycodes.end())
257 pkb->firstcode.clear();
258 pkb->secondCode.clear();
262 pkb = &(keycodes[key]);
265 // Address is 4 bits, command is 8 bits:
266 appendToBitSeq(pkb->firstCode, addressData, 4);
267 appendToBitSeq(pkb->secondCode, commandData, 8);
272 void PIRProtocol::addKaseikyoKey(
274 unsigned int addressData,
275 unsigned int commandData)
278 KeycodeCollection::iterator i = keycodes.find(key);
279 if (i != keycodes.end())
282 pkb->firstCode.clear();
283 pkb->secondCode.clear();
287 pkb = &(keycodes[key]);
290 appendToBitSeq(pkb->firstCode, addressData, 12);
291 appendToBitSeq(pkb->secondCode, commandData, 8);
295 void PIRProtocol::addDishKey(
297 unsigned int firstCommand,
298 unsigned int secondCommand)
301 KeycodeCollection::iterator i = keycodes.find(key);
302 if (i != keycodes.end())
305 pkb->firstCode.clear();
306 pkb->secondCode.clear();
310 pkb = &(keycodes[key]);
313 appendToBitSeq(pkb->firstCode, firstCommand, 6);
314 appendToBitSeq(pkb->secondCode, secondCommand, 5);
318 void PIRProtocol::addXMPKey(
320 unsigned int firstCommand,
321 unsigned int secondCommand)
324 KeycodeCollection::iterator i = keycodes.find(key);
325 if (i != keycodes.end())
328 pkb->firstCode.clear();
329 pkb->secondCode.clear();
333 pkb = &(keycodes[key]);
336 appendToBitSeq(pkb->firstCode, firstCommand, 8);
337 appendToBitSeq(pkb->secondCode, secondCommand, 8);
341 void PIRProtocol::setCarrierFrequency(
344 carrierFrequency = freq;
348 void PIRProtocol::setDutyCycle(
355 void PIRProtocol::setMinimumRepetitions(
358 minimumRepetitions = minrep;
362 void PIRProtocol::setPreData(
366 // If the container is not empty, first clear it out:
367 if (!preData.empty())
372 appendToBitSeq(preData, data, bits);
376 void PIRProtocol::setPostData(
380 // If the container is not empty, first clear it out:
381 if (!postData.empty())
386 appendToBitSeq(postData, data, bits);
390 bool PIRProtocol::isCommandSupported(
393 return (keycodes.find(command) != keycodes.end());
397 void PIRProtocol::appendToBitSeq(
398 CommandSequence &sequence,
404 // This is bad, but just return silently for now...
408 // For each bit in the char, append a 1 or a 0 into the sequence.
409 // Starting with the largest bit, move forward one bit at a time:
410 unsigned int currentBit = 1 << (size - 1);
414 if (bits & currentBit)
416 sequence.push_back(1);
420 sequence.push_back(0);
423 currentBit = currentBit >> 1;
425 while (currentBit > 0);
429 void PIRProtocol::clearRepeatFlag()
431 QMutexLocker locker(&stopRepeatingMutex);
432 stopRepeatingFlag = false;
436 bool PIRProtocol::checkRepeatFlag()
438 QMutexLocker locker(&stopRepeatingMutex);
439 return stopRepeatingFlag;
443 // Note that the following routine blindly sleeps for the amount of time
444 // specified by the LIRC config file. The extra overhead of processing
445 // each command will mean that repeated commands will overshoot the config
446 // time by some amount. We could improve accuracy by waiting a little less
447 // than the specified time, if we could get a good handle on how long the
448 // overhead is delaying the command...
449 #define PIEROGI_OVERHEAD_HACK 13260
451 void PIRProtocol::sleepUntilRepeat(
456 // If the LIRC config file specifies the flag "CONST_LENGTH", that means
457 // the "gap" value is the exact amount of time to wait between kicking off
458 // each command. If not, then the "gap" needs to be added on to the total
459 // time of the previous command to see how long to sleep.
461 if (isConstantLength)
463 microseconds = (gap - commandDuration) - PIEROGI_OVERHEAD_HACK;
467 microseconds = gap - PIEROGI_OVERHEAD_HACK;
471 // Don't even bother sleeping if there's only a few microseconds:
472 if (microseconds < 1000)
477 // For now, I'm going to enforce a minimum sleep of 10 ms, so that we
478 // don't get runaway commands:
479 if (microseconds < 10000)
481 microseconds = 10000;
485 sleeptime.tv_sec = 0;
486 sleeptime.tv_nsec = microseconds * 1000;
488 timespec remainingtime;
490 if (nanosleep(&sleeptime, &remainingtime) == -1)
492 std::stringstream ss;
493 ss << "Problem while sleeping.\n";
494 ss << "Trying to sleep for: " << microseconds << "\n";
495 ss << "Nanosleep returned error: " << strerror(errno) << "\n";
496 throw PIRException(ss.str());
501 void PIRProtocol::setGapSize(
506 isConstantLength = iclFlag;