36 #ifndef _IR_PRONTO_HPP
37 #define _IR_PRONTO_HPP
51 static const uint16_t learnedToken = 0x0000U;
52 static const uint16_t learnedNonModulatedToken = 0x0100U;
53 static const uint16_t bitsInHexadecimal = 4U;
54 static const uint16_t digitsInProntoNumber = 4U;
55 static const uint16_t numbersInPreamble = 4U;
56 static const uint16_t hexMask = 0xFU;
57 static const uint32_t referenceFrequency = 4145146UL;
58 static const uint16_t fallbackFrequency = 64767U;
59 static const uint32_t microsecondsInSeconds = 1000000UL;
60 static const uint16_t PRONTO_DEFAULT_GAP = 45000;
64 return ((referenceFrequency / code) + 500) / 1000;
73 uint16_t timebase = (microsecondsInSeconds * data[1] + referenceFrequency / 2) / referenceFrequency;
79 case learnedNonModulatedToken:
85 uint16_t intros = 2 * data[2];
86 uint16_t repeats = 2 * data[3];
87 #if defined(LOCAL_DEBUG)
88 Serial.print(F(
"sendPronto intros="));
90 Serial.print(F(
" repeats="));
91 Serial.println(repeats);
93 if (numbersInPreamble + intros + repeats != length) {
101 uint16_t durations[intros + repeats];
102 for (uint16_t i = 0; i < intros + repeats; i++) {
103 uint32_t duration = ((uint32_t) data[i + numbersInPreamble]) * timebase;
104 durations[i] = (uint16_t)((duration <= UINT16_MAX) ? duration : UINT16_MAX);
112 sendRaw(durations, intros - 1, khz);
127 sendRaw(durations + intros, repeats - 1, khz);
152 size_t len = strlen(str) / (digitsInProntoNumber + 1) + 1;
156 for (uint16_t i = 0; i < len; i++) {
157 long x = strtol(p, endptr, 16);
158 if (x == 0 && i >= numbersInPreamble) {
163 data[i] =
static_cast<uint16_t
>(x);
176 void IRsend::sendPronto_PF(uint_farptr_t str, int_fast8_t aNumberOfRepeats) {
177 size_t len = strlen_PF(str);
179 strcpy_PF(work, str);
184 void IRsend::sendPronto_P(
const char *str, int_fast8_t aNumberOfRepeats) {
185 size_t len = strlen_P(str);
196 size_t len = strlen_P(
reinterpret_cast<const char*
>(str));
198 strcpy_P(work,
reinterpret_cast<const char*
>(str));
203 return frequency > 0 ? frequency : fallbackFrequency;
215 return (
char) (x <= 9 ? (
'0' + x) : (
'A' + (x - 10)));
224 for (uint16_t i = 0; i < digitsInProntoNumber; i++) {
225 uint16_t shifts = bitsInHexadecimal * (digitsInProntoNumber - 1 - i);
232 dumpNumberHex(aSerial, (duration + timebase / 2) / timebase);
239 for (
size_t i = 0; i < length; i++) {
262 aSerial->println(F(
"Pronto Hex as string without repeat sequence"));
263 aSerial->print(F(
"char prontoData[] = \""));
264 dumpNumberHex(aSerial, aFrequencyHertz > 0 ? learnedToken : learnedNonModulatedToken);
268 uint16_t timebase =
toTimebase(aFrequencyHertz);
270 aSerial->println(F(
"\";"));
287 for (uint16_t i = 0; i < digitsInProntoNumber; i++) {
288 uint16_t shifts = bitsInHexadecimal * (digitsInProntoNumber - 1 - i);
289 size +=
dumpDigitHex(aString, (number >> shifts) & hexMask);
291 aString->concat(
' ');
300 static size_t dumpDurationHex(String *aString, uint32_t duration, uint16_t timebase) {
301 return dumpNumberHex(aString, (duration + timebase / 2) / timebase);
308 for (
size_t i = 0; i < length; i++) {
334 size +=
dumpNumberHex(aString, frequency > 0 ? learnedToken : learnedNonModulatedToken);
344 #if defined(LOCAL_DEBUG)
347 #endif // _IR_PRONTO_HPP