34 #ifndef _IR_PRONTO_HPP
35 #define _IR_PRONTO_HPP
37 #if defined(DEBUG) && !defined(LOCAL_DEBUG)
49 static const uint16_t learnedToken = 0x0000U;
50 static const uint16_t learnedNonModulatedToken = 0x0100U;
51 static const unsigned int bitsInHexadecimal = 4U;
52 static const unsigned int digitsInProntoNumber = 4U;
53 static const unsigned int numbersInPreamble = 4U;
54 static const unsigned int hexMask = 0xFU;
55 static const uint32_t referenceFrequency = 4145146UL;
56 static const uint16_t fallbackFrequency = 64767U;
57 static const uint32_t microsecondsInSeconds = 1000000UL;
58 static const uint16_t PRONTO_DEFAULT_GAP = 45000;
62 return ((referenceFrequency / code) + 500) / 1000;
70 void IRsend::sendPronto(
const uint16_t *data,
unsigned int length, int_fast8_t aNumberOfRepeats) {
71 unsigned int timebase = (microsecondsInSeconds * data[1] + referenceFrequency / 2) / referenceFrequency;
77 case learnedNonModulatedToken:
83 unsigned int intros = 2 * data[2];
84 unsigned int repeats = 2 * data[3];
85 #if defined(LOCAL_DEBUG)
86 Serial.print(F(
"sendPronto intros="));
88 Serial.print(F(
" repeats="));
89 Serial.println(repeats);
91 if (numbersInPreamble + intros + repeats != length) {
99 uint16_t durations[intros + repeats];
100 for (
unsigned int i = 0; i < intros + repeats; i++) {
101 uint32_t duration = ((uint32_t) data[i + numbersInPreamble]) * timebase;
102 durations[i] = (
unsigned int) ((duration <= UINT16_MAX) ? duration : UINT16_MAX);
110 sendRaw(durations, intros - 1, khz);
125 sendRaw(durations + intros, repeats - 1, khz);
150 size_t len = strlen(str) / (digitsInProntoNumber + 1) + 1;
154 for (
unsigned int i = 0; i < len; i++) {
155 long x = strtol(p, endptr, 16);
156 if (x == 0 && i >= numbersInPreamble) {
161 data[i] =
static_cast<uint16_t
>(x);
174 void IRsend::sendPronto_PF(uint_farptr_t str, int_fast8_t aNumberOfRepeats) {
175 size_t len = strlen_PF(str);
177 strncpy_PF(work, str, len);
182 void IRsend::sendPronto_P(
const char *str, int_fast8_t aNumberOfRepeats) {
183 size_t len = strlen_P(str);
185 strncpy_P(work, str, len);
191 size_t len = strlen_P(
reinterpret_cast<const char*
>(str));
193 strncpy_P(work,
reinterpret_cast<const char*
>(str), len);
198 return frequency > 0 ? frequency : fallbackFrequency;
210 return (
char) (x <= 9 ? (
'0' + x) : (
'A' + (x - 10)));
213 static void dumpDigit(Print *aSerial,
unsigned int number) {
218 for (
unsigned int i = 0; i < digitsInProntoNumber; i++) {
219 unsigned int shifts = bitsInHexadecimal * (digitsInProntoNumber - 1 - i);
220 dumpDigit(aSerial, (number >> shifts) & hexMask);
225 static void dumpDuration(Print *aSerial, uint32_t duration, uint16_t timebase) {
226 dumpNumber(aSerial, (duration + timebase / 2) / timebase);
233 for (
size_t i = 0; i < length; i++) {
255 aSerial->println(F(
"Pronto Hex as string"));
256 aSerial->print(F(
"char prontoData[] = \""));
257 dumpNumber(aSerial, aFrequencyHertz > 0 ? learnedToken : learnedNonModulatedToken);
261 unsigned int timebase =
toTimebase(aFrequencyHertz);
263 aSerial->println(
"\";");
271 static bool dumpDigit(String *aString,
unsigned int number) {
280 for (
unsigned int i = 0; i < digitsInProntoNumber; i++) {
281 unsigned int shifts = bitsInHexadecimal * (digitsInProntoNumber - 1 - i);
282 size +=
dumpDigit(aString, (number >> shifts) & hexMask);
284 aString->concat(
' ');
293 static size_t dumpDuration(String *aString, uint32_t duration, uint16_t timebase) {
294 return dumpNumber(aString, (duration + timebase / 2) / timebase);
301 for (
size_t i = 0; i < length; i++) {
313 size +=
dumpDuration(aString, PRONTO_DEFAULT_GAP, timebase);
325 unsigned int timebase =
toTimebase(frequency);
327 size +=
dumpNumber(aString, frequency > 0 ? learnedToken : learnedNonModulatedToken);
338 #if defined(LOCAL_DEBUG)
341 #endif // _IR_PRONTO_HPP