36 #ifndef _IR_PRONTO_HPP
37 #define _IR_PRONTO_HPP
47 static const uint16_t learnedToken = 0x0000U;
48 static const uint16_t learnedNonModulatedToken = 0x0100U;
49 static const uint16_t bitsInHexadecimal = 4U;
50 static const uint16_t digitsInProntoNumber = 4U;
51 static const uint16_t numbersInPreamble = 4U;
52 static const uint16_t hexMask = 0xFU;
53 static const uint32_t referenceFrequency = 4145146UL;
54 static const uint16_t fallbackFrequency = 64767U;
55 static const uint32_t microsecondsInSeconds = 1000000UL;
56 static const uint16_t PRONTO_DEFAULT_GAP = 45000;
60 return ((referenceFrequency / code) + 500) / 1000;
69 uint16_t timebase = (microsecondsInSeconds * data[1] + referenceFrequency / 2) / referenceFrequency;
75 case learnedNonModulatedToken:
81 uint16_t intros = 2 * data[2];
82 uint16_t repeats = 2 * data[3];
89 if (numbersInPreamble + intros + repeats != length) {
97 uint16_t durations[intros + repeats];
98 for (uint16_t i = 0; i < intros + repeats; i++) {
99 uint32_t duration = ((uint32_t) data[i + numbersInPreamble]) * timebase;
100 durations[i] = (uint16_t)((duration <= UINT16_MAX) ? duration : UINT16_MAX);
108 sendRaw(durations, intros - 1, khz);
123 sendRaw(durations + intros, repeats - 1, khz);
148 size_t len = strlen(str) / (digitsInProntoNumber + 1) + 1;
152 for (uint16_t i = 0; i < len; i++) {
153 long x = strtol(p, endptr, 16);
154 if (x == 0 && i >= numbersInPreamble) {
159 data[i] =
static_cast<uint16_t
>(x);
172 void IRsend::sendPronto_PF(uint_farptr_t str, int_fast8_t aNumberOfRepeats) {
173 size_t len = strlen_PF(str);
175 strcpy_PF(work, str);
180 void IRsend::sendPronto_P(
const char *str, int_fast8_t aNumberOfRepeats) {
181 size_t len = strlen_P(str);
192 size_t len = strlen_P(
reinterpret_cast<const char*
>(str));
194 strcpy_P(work,
reinterpret_cast<const char*
>(str));
199 return frequency > 0 ? frequency : fallbackFrequency;
211 return (
char) (x <= 9 ? (
'0' + x) : (
'A' + (x - 10)));
220 for (uint16_t i = 0; i < digitsInProntoNumber; i++) {
221 uint16_t shifts = bitsInHexadecimal * (digitsInProntoNumber - 1 - i);
228 dumpNumberHex(aSerial, (duration + timebase / 2) / timebase);
235 for (
size_t i = 0; i < length; i++) {
258 aSerial->println(F(
"Pronto Hex as string without repeat sequence"));
259 aSerial->print(F(
"char prontoData[] = \""));
260 dumpNumberHex(aSerial, aFrequencyHertz > 0 ? learnedToken : learnedNonModulatedToken);
264 uint16_t timebase =
toTimebase(aFrequencyHertz);
266 aSerial->println(F(
"\";"));
283 for (uint16_t i = 0; i < digitsInProntoNumber; i++) {
284 uint16_t shifts = bitsInHexadecimal * (digitsInProntoNumber - 1 - i);
285 size +=
dumpDigitHex(aString, (number >> shifts) & hexMask);
287 aString->concat(
' ');
296 static size_t dumpDurationHex(String *aString, uint32_t duration, uint16_t timebase) {
297 return dumpNumberHex(aString, (duration + timebase / 2) / timebase);
304 for (
size_t i = 0; i < length; i++) {
330 size +=
dumpNumberHex(aString, frequency > 0 ? learnedToken : learnedNonModulatedToken);
342 #endif // _IR_PRONTO_HPP