]> cloudbase.mooo.com Git - irmp.git/blame - irmp.c
Rename ARM_OPENCM3 -> LIBOPENCM3, redefine IRMP_BIT as bitmask
[irmp.git] / irmp.c
Content-type: text/html ]> cloudbase.mooo.com Git - irmp.git/blame - irmp.c


500 - Internal Server Error

Malformed UTF-8 character (fatal) at (eval 6) line 1, <$fd> line 9000.
CommitLineData
4225a882 1/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2 * irmp.c - infrared multi-protocol decoder, supports several remote control protocols\r
3 *\r
7365350c 4 * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
4225a882 5 *\r
30d1689d 6 * $Id: irmp.c,v 1.192 2017/02/17 09:13:06 fm Exp $\r
cb8474cc 7 *\r
622f5f59 8 * Supported AVR mikrocontrollers:\r
7644ac04 9 *\r
21a4e0ee 10 * ATtiny87, ATtiny167\r
476267f4 11 * ATtiny45, ATtiny85\r
2ac088b2 12 * ATtiny44, ATtiny84\r
7644ac04 13 * ATmega8, ATmega16, ATmega32\r
14 * ATmega162\r
e664a9f3 15 * ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284, ATmega1284P\r
7644ac04 16 * ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
17 *\r
4225a882 18 * This program is free software; you can redistribute it and/or modify\r
19 * it under the terms of the GNU General Public License as published by\r
20 * the Free Software Foundation; either version 2 of the License, or\r
21 * (at your option) any later version.\r
22 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
23 */\r
24\r
f5ca0147 25#include "irmp.h"\r
4225a882 26\r
89e8cafb 27#if IRMP_SUPPORT_GRUNDIG_PROTOCOL == 1 || IRMP_SUPPORT_NOKIA_PROTOCOL == 1 || IRMP_SUPPORT_IR60_PROTOCOL == 1\r
08f2dd9d 28# define IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL 1\r
d155e9ab 29#else\r
08f2dd9d 30# define IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL 0\r
d155e9ab 31#endif\r
32\r
12948cf3 33#if IRMP_SUPPORT_SIEMENS_PROTOCOL == 1 || IRMP_SUPPORT_RUWIDO_PROTOCOL == 1\r
08f2dd9d 34# define IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL 1\r
12948cf3 35#else\r
08f2dd9d 36# define IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL 0\r
12948cf3 37#endif\r
38\r
deba2a0a 39#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || \\r
c2b70f0b 40 IRMP_SUPPORT_S100_PROTOCOL == 1 || \\r
deba2a0a 41 IRMP_SUPPORT_RC6_PROTOCOL == 1 || \\r
42 IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1 || \\r
43 IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1 || \\r
2fb27bfe 44 IRMP_SUPPORT_IR60_PROTOCOL == 1 || \\r
b85cb27d 45 IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1 || \\r
0715cf5e 46 IRMP_SUPPORT_MERLIN_PROTOCOL == 1 || \\r
b85cb27d 47 IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
08f2dd9d 48# define IRMP_SUPPORT_MANCHESTER 1\r
77f488bb 49#else\r
08f2dd9d 50# define IRMP_SUPPORT_MANCHESTER 0\r
77f488bb 51#endif\r
52\r
93570cd9 53#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
08f2dd9d 54# define IRMP_SUPPORT_SERIAL 1\r
deba2a0a 55#else\r
08f2dd9d 56# define IRMP_SUPPORT_SERIAL 0\r
deba2a0a 57#endif\r
58\r
0834784c 59#define IRMP_KEY_REPETITION_LEN (uint_fast16_t)(F_INTERRUPTS * 150.0e-3 + 0.5) // autodetect key repetition within 150 msec\r
4225a882 60\r
fef942f6 61#define MIN_TOLERANCE_00 1.0 // -0%\r
62#define MAX_TOLERANCE_00 1.0 // +0%\r
63\r
95b27043 64#define MIN_TOLERANCE_02 0.98 // -2%\r
65#define MAX_TOLERANCE_02 1.02 // +2%\r
66\r
67#define MIN_TOLERANCE_03 0.97 // -3%\r
68#define MAX_TOLERANCE_03 1.03 // +3%\r
69\r
fef942f6 70#define MIN_TOLERANCE_05 0.95 // -5%\r
71#define MAX_TOLERANCE_05 1.05 // +5%\r
72\r
4225a882 73#define MIN_TOLERANCE_10 0.9 // -10%\r
74#define MAX_TOLERANCE_10 1.1 // +10%\r
75\r
fef942f6 76#define MIN_TOLERANCE_15 0.85 // -15%\r
77#define MAX_TOLERANCE_15 1.15 // +15%\r
78\r
4225a882 79#define MIN_TOLERANCE_20 0.8 // -20%\r
80#define MAX_TOLERANCE_20 1.2 // +20%\r
81\r
82#define MIN_TOLERANCE_30 0.7 // -30%\r
83#define MAX_TOLERANCE_30 1.3 // +30%\r
84\r
85#define MIN_TOLERANCE_40 0.6 // -40%\r
86#define MAX_TOLERANCE_40 1.4 // +40%\r
87\r
88#define MIN_TOLERANCE_50 0.5 // -50%\r
89#define MAX_TOLERANCE_50 1.5 // +50%\r
90\r
91#define MIN_TOLERANCE_60 0.4 // -60%\r
92#define MAX_TOLERANCE_60 1.6 // +60%\r
93\r
9405f84a 94#define MIN_TOLERANCE_70 0.3 // -70%\r
95#define MAX_TOLERANCE_70 1.7 // +70%\r
96\r
0834784c 97#define SIRCS_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIRCS_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
98#define SIRCS_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIRCS_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
99#define SIRCS_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIRCS_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
deba2a0a 100#if IRMP_SUPPORT_NETBOX_PROTOCOL // only 5% to avoid conflict with NETBOX:\r
0834784c 101# define SIRCS_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIRCS_START_BIT_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5))\r
deba2a0a 102#else // only 5% + 1 to avoid conflict with RC6:\r
0834784c 103# define SIRCS_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIRCS_START_BIT_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
deba2a0a 104#endif\r
0834784c 105#define SIRCS_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIRCS_1_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
106#define SIRCS_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIRCS_1_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
107#define SIRCS_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIRCS_0_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
108#define SIRCS_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIRCS_0_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
109#define SIRCS_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIRCS_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
110#define SIRCS_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIRCS_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
111\r
112#define NEC_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NEC_START_BIT_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
113#define NEC_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NEC_START_BIT_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
114#define NEC_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NEC_START_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
115#define NEC_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NEC_START_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
116#define NEC_REPEAT_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NEC_REPEAT_START_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
117#define NEC_REPEAT_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NEC_REPEAT_START_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
118#define NEC_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NEC_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
119#define NEC_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NEC_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
120#define NEC_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NEC_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
121#define NEC_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NEC_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
122#define NEC_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NEC_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
123#define NEC_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NEC_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
6db2522c 124// autodetect nec repetition frame within 50 msec:\r
125// NEC seems to send the first repetition frame after 40ms, further repetition frames after 100 ms\r
126#if 0\r
0834784c 127#define NEC_FRAME_REPEAT_PAUSE_LEN_MAX (uint_fast16_t)(F_INTERRUPTS * NEC_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)\r
6db2522c 128#else\r
0834784c 129#define NEC_FRAME_REPEAT_PAUSE_LEN_MAX (uint_fast16_t)(F_INTERRUPTS * 100.0e-3 * MAX_TOLERANCE_20 + 0.5)\r
6db2522c 130#endif\r
fef942f6 131\r
0834784c 132#define SAMSUNG_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
133#define SAMSUNG_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
134#define SAMSUNG_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
135#define SAMSUNG_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
136#define SAMSUNG_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
137#define SAMSUNG_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
138#define SAMSUNG_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
139#define SAMSUNG_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
140#define SAMSUNG_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
141#define SAMSUNG_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
142\r
30d1689d 143#define SAMSUNGAH_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
144#define SAMSUNGAH_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
145#define SAMSUNGAH_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
146#define SAMSUNGAH_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
147#define SAMSUNGAH_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
148#define SAMSUNGAH_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
149#define SAMSUNGAH_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
150#define SAMSUNGAH_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
151#define SAMSUNGAH_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
152#define SAMSUNGAH_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SAMSUNGAH_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
153\r
0834784c 154#define MATSUSHITA_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
155#define MATSUSHITA_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
156#define MATSUSHITA_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
157#define MATSUSHITA_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
158#define MATSUSHITA_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
159#define MATSUSHITA_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
160#define MATSUSHITA_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_1_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
161#define MATSUSHITA_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_1_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
162#define MATSUSHITA_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
163#define MATSUSHITA_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MATSUSHITA_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
164\r
165#define KASEIKYO_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
166#define KASEIKYO_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
167#define KASEIKYO_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
168#define KASEIKYO_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
95b27043 169#define KASEIKYO_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
170#define KASEIKYO_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
171#define KASEIKYO_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
172#define KASEIKYO_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
173#define KASEIKYO_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
174#define KASEIKYO_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
175\r
7365350c 176#define MITSU_HEAVY_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
177#define MITSU_HEAVY_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
178#define MITSU_HEAVY_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
179#define MITSU_HEAVY_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
180#define MITSU_HEAVY_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
181#define MITSU_HEAVY_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
182#define MITSU_HEAVY_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
183#define MITSU_HEAVY_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
184#define MITSU_HEAVY_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
185#define MITSU_HEAVY_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
186\r
4bcf310e 187#define VINCENT_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * VINCENT_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
188#define VINCENT_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * VINCENT_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
189#define VINCENT_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * VINCENT_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
190#define VINCENT_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * VINCENT_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
191#define VINCENT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * VINCENT_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
192#define VINCENT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * VINCENT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
193#define VINCENT_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * VINCENT_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
194#define VINCENT_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * VINCENT_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
195#define VINCENT_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * VINCENT_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
196#define VINCENT_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * VINCENT_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
197\r
95b27043 198#define PANASONIC_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
199#define PANASONIC_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
200#define PANASONIC_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
201#define PANASONIC_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
202#define PANASONIC_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
203#define PANASONIC_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
204#define PANASONIC_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
205#define PANASONIC_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
206#define PANASONIC_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
207#define PANASONIC_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
0834784c 208\r
209#define RECS80_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
210#define RECS80_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
211#define RECS80_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
212#define RECS80_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
213#define RECS80_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
214#define RECS80_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
215#define RECS80_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
216#define RECS80_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
217#define RECS80_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
218#define RECS80_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
fef942f6 219\r
3a7e26e1 220\r
221#if IRMP_SUPPORT_BOSE_PROTOCOL == 1 // BOSE conflicts with RC5, so keep tolerance for RC5 minimal here:\r
0834784c 222#define RC5_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
223#define RC5_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
3a7e26e1 224#else\r
0834784c 225#define RC5_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
226#define RC5_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
3a7e26e1 227#endif\r
31c1f035 228\r
0834784c 229#define RC5_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
230#define RC5_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
fef942f6 231\r
c2b70f0b 232#if IRMP_SUPPORT_BOSE_PROTOCOL == 1 // BOSE conflicts with S100, so keep tolerance for S100 minimal here:\r
233#define S100_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
234#define S100_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
235#else\r
236#define S100_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
237#define S100_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
238#endif\r
239\r
240#define S100_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
241#define S100_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
242\r
0834784c 243#define DENON_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * DENON_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
244#define DENON_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * DENON_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
245#define DENON_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
246#define DENON_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
08f2dd9d 247// RUWIDO (see t-home-mediareceiver-15kHz.txt) conflicts here with DENON\r
0834784c 248#define DENON_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * DENON_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
249#define DENON_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * DENON_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
250#define DENON_AUTO_REPETITION_PAUSE_LEN ((uint_fast16_t)(F_INTERRUPTS * DENON_AUTO_REPETITION_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
251\r
252#define THOMSON_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * THOMSON_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
253#define THOMSON_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * THOMSON_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
254#define THOMSON_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * THOMSON_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
255#define THOMSON_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * THOMSON_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
256#define THOMSON_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * THOMSON_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
257#define THOMSON_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * THOMSON_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
258\r
259#define RC6_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC6_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
260#define RC6_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC6_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
261#define RC6_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC6_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
262#define RC6_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC6_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
263#define RC6_TOGGLE_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC6_TOGGLE_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
264#define RC6_TOGGLE_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC6_TOGGLE_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
265#define RC6_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC6_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
266#define RC6_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC6_BIT_TIME * MAX_TOLERANCE_60 + 0.5) + 1) // pulses: 300 - 800\r
267#define RC6_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC6_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
268#define RC6_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC6_BIT_TIME * MAX_TOLERANCE_20 + 0.5) + 1) // pauses: 300 - 600\r
269\r
270#define RECS80EXT_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
271#define RECS80EXT_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
272#define RECS80EXT_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
273#define RECS80EXT_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
274#define RECS80EXT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
275#define RECS80EXT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
276#define RECS80EXT_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
277#define RECS80EXT_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
278#define RECS80EXT_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
279#define RECS80EXT_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RECS80EXT_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
280\r
281#define NUBERT_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NUBERT_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
282#define NUBERT_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NUBERT_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
283#define NUBERT_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NUBERT_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
284#define NUBERT_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NUBERT_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
285#define NUBERT_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NUBERT_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
286#define NUBERT_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NUBERT_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
287#define NUBERT_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NUBERT_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
288#define NUBERT_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NUBERT_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
289#define NUBERT_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NUBERT_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
290#define NUBERT_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NUBERT_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
291#define NUBERT_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NUBERT_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
292#define NUBERT_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NUBERT_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
293\r
0715cf5e 294#define FAN_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
295#define FAN_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
296#define FAN_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
297#define FAN_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
298#define FAN_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
299#define FAN_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
300#define FAN_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
301#define FAN_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
302#define FAN_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
303#define FAN_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
304#define FAN_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
305#define FAN_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
306\r
0834784c 307#define SPEAKER_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
308#define SPEAKER_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
309#define SPEAKER_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
310#define SPEAKER_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
311#define SPEAKER_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
312#define SPEAKER_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
313#define SPEAKER_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
314#define SPEAKER_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
315#define SPEAKER_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
316#define SPEAKER_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
317#define SPEAKER_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
318#define SPEAKER_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
319\r
320#define BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT1_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
321#define BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT1_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
322#define BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
323#define BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
324#define BANG_OLUFSEN_START_BIT2_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT2_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
325#define BANG_OLUFSEN_START_BIT2_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT2_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
326#define BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT2_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
327#define BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT2_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
328#define BANG_OLUFSEN_START_BIT3_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT3_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
329#define BANG_OLUFSEN_START_BIT3_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT3_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
330#define BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT3_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
2eab5ec9 331#define BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX ((PAUSE_LEN)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT3_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1) // value must be below IRMP_TIMEOUT\r
0834784c 332#define BANG_OLUFSEN_START_BIT4_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT4_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
333#define BANG_OLUFSEN_START_BIT4_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT4_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
334#define BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT4_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
335#define BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT4_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
336#define BANG_OLUFSEN_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
337#define BANG_OLUFSEN_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
338#define BANG_OLUFSEN_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
339#define BANG_OLUFSEN_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
340#define BANG_OLUFSEN_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
341#define BANG_OLUFSEN_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
342#define BANG_OLUFSEN_R_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_R_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
343#define BANG_OLUFSEN_R_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_R_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
344#define BANG_OLUFSEN_TRAILER_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_TRAILER_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
345#define BANG_OLUFSEN_TRAILER_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BANG_OLUFSEN_TRAILER_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
346\r
347#define IR60_TIMEOUT_LEN ((uint_fast8_t)(F_INTERRUPTS * IR60_TIMEOUT_TIME * 0.5))\r
348#define GRUNDIG_NOKIA_IR60_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * GRUNDIG_NOKIA_IR60_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
349#define GRUNDIG_NOKIA_IR60_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * GRUNDIG_NOKIA_IR60_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
350#define GRUNDIG_NOKIA_IR60_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * GRUNDIG_NOKIA_IR60_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
351#define GRUNDIG_NOKIA_IR60_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * GRUNDIG_NOKIA_IR60_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
352#define GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * GRUNDIG_NOKIA_IR60_PRE_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) + 1)\r
353#define GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * GRUNDIG_NOKIA_IR60_PRE_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
354\r
355#define SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
356#define SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
357#define SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
358#define SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
359#define SIEMENS_OR_RUWIDO_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
360#define SIEMENS_OR_RUWIDO_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
361#define SIEMENS_OR_RUWIDO_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
362#define SIEMENS_OR_RUWIDO_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
363\r
364#define FDC_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FDC_START_BIT_PULSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1) // 5%: avoid conflict with NETBOX\r
365#define FDC_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FDC_START_BIT_PULSE_TIME * MAX_TOLERANCE_05 + 0.5))\r
366#define FDC_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FDC_START_BIT_PAUSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
367#define FDC_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FDC_START_BIT_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5))\r
368#define FDC_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FDC_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
369#define FDC_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FDC_PULSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
370#define FDC_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FDC_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
371#define FDC_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FDC_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
6f750020 372#if 0\r
0834784c 373#define FDC_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * FDC_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) // could be negative: 255\r
6f750020 374#else\r
375#define FDC_0_PAUSE_LEN_MIN (1) // simply use 1\r
376#endif\r
0834784c 377#define FDC_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * FDC_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
378\r
379#define RCCAR_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCCAR_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
380#define RCCAR_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCCAR_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
381#define RCCAR_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCCAR_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
382#define RCCAR_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCCAR_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
383#define RCCAR_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCCAR_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
384#define RCCAR_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCCAR_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
385#define RCCAR_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCCAR_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
386#define RCCAR_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCCAR_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
387#define RCCAR_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
388#define RCCAR_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
389\r
390#define JVC_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
391#define JVC_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
392#define JVC_REPEAT_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * (JVC_FRAME_REPEAT_PAUSE_TIME - IRMP_TIMEOUT_TIME) * MIN_TOLERANCE_40 + 0.5) - 1) // HACK!\r
393#define JVC_REPEAT_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * (JVC_FRAME_REPEAT_PAUSE_TIME - IRMP_TIMEOUT_TIME) * MAX_TOLERANCE_70 + 0.5) - 1) // HACK!\r
394#define JVC_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * JVC_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
395#define JVC_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * JVC_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
396#define JVC_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
397#define JVC_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
398#define JVC_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
399#define JVC_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
770a1a9d 400// autodetect JVC repetition frame within 50 msec:\r
0834784c 401#define JVC_FRAME_REPEAT_PAUSE_LEN_MAX (uint_fast16_t)(F_INTERRUPTS * JVC_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)\r
402\r
403#define NIKON_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NIKON_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
404#define NIKON_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NIKON_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
405#define NIKON_START_BIT_PAUSE_LEN_MIN ((uint_fast16_t)(F_INTERRUPTS * NIKON_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
406#define NIKON_START_BIT_PAUSE_LEN_MAX ((uint_fast16_t)(F_INTERRUPTS * NIKON_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
407#define NIKON_REPEAT_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NIKON_REPEAT_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
408#define NIKON_REPEAT_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NIKON_REPEAT_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
409#define NIKON_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NIKON_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
410#define NIKON_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NIKON_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
411#define NIKON_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NIKON_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
412#define NIKON_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NIKON_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
413#define NIKON_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NIKON_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
414#define NIKON_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NIKON_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
415#define NIKON_FRAME_REPEAT_PAUSE_LEN_MAX (uint_fast16_t)(F_INTERRUPTS * NIKON_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)\r
416\r
417#define KATHREIN_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
418#define KATHREIN_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
419#define KATHREIN_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
420#define KATHREIN_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
421#define KATHREIN_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_1_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
422#define KATHREIN_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_1_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
423#define KATHREIN_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
424#define KATHREIN_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
425#define KATHREIN_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_0_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
426#define KATHREIN_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_0_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
427#define KATHREIN_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
428#define KATHREIN_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
429#define KATHREIN_SYNC_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_SYNC_BIT_PAUSE_LEN_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
430#define KATHREIN_SYNC_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KATHREIN_SYNC_BIT_PAUSE_LEN_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
431\r
432#define NETBOX_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NETBOX_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
433#define NETBOX_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NETBOX_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
434#define NETBOX_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * NETBOX_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
435#define NETBOX_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * NETBOX_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
436#define NETBOX_PULSE_LEN ((uint_fast8_t)(F_INTERRUPTS * NETBOX_PULSE_TIME))\r
437#define NETBOX_PAUSE_LEN ((uint_fast8_t)(F_INTERRUPTS * NETBOX_PAUSE_TIME))\r
438#define NETBOX_PULSE_REST_LEN ((uint_fast8_t)(F_INTERRUPTS * NETBOX_PULSE_TIME / 4))\r
439#define NETBOX_PAUSE_REST_LEN ((uint_fast8_t)(F_INTERRUPTS * NETBOX_PAUSE_TIME / 4))\r
440\r
441#define LEGO_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * LEGO_START_BIT_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
442#define LEGO_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * LEGO_START_BIT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
443#define LEGO_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * LEGO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
444#define LEGO_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * LEGO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
445#define LEGO_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * LEGO_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
446#define LEGO_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * LEGO_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
447#define LEGO_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * LEGO_1_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
448#define LEGO_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * LEGO_1_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
449#define LEGO_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
450#define LEGO_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
451\r
452#define BOSE_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BOSE_START_BIT_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
453#define BOSE_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BOSE_START_BIT_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
454#define BOSE_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BOSE_START_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
455#define BOSE_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BOSE_START_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
456#define BOSE_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BOSE_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
457#define BOSE_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BOSE_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
458#define BOSE_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BOSE_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
459#define BOSE_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BOSE_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
460#define BOSE_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * BOSE_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
461#define BOSE_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * BOSE_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
462#define BOSE_FRAME_REPEAT_PAUSE_LEN_MAX (uint_fast16_t)(F_INTERRUPTS * 100.0e-3 * MAX_TOLERANCE_20 + 0.5)\r
463\r
464#define A1TVBOX_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
465#define A1TVBOX_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
466#define A1TVBOX_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
467#define A1TVBOX_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
468#define A1TVBOX_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
469#define A1TVBOX_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
470#define A1TVBOX_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
471#define A1TVBOX_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
472\r
0715cf5e 473#define MERLIN_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
474#define MERLIN_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
475#define MERLIN_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
476#define MERLIN_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
477#define MERLIN_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
478#define MERLIN_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
479#define MERLIN_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
480#define MERLIN_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
481\r
0834784c 482#define ORTEK_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
483#define ORTEK_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
484#define ORTEK_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
485#define ORTEK_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
486#define ORTEK_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
487#define ORTEK_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
488#define ORTEK_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
489#define ORTEK_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
490\r
491#define TELEFUNKEN_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
492#define TELEFUNKEN_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
493#define TELEFUNKEN_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * (TELEFUNKEN_START_BIT_PAUSE_TIME) * MIN_TOLERANCE_10 + 0.5) - 1)\r
494#define TELEFUNKEN_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * (TELEFUNKEN_START_BIT_PAUSE_TIME) * MAX_TOLERANCE_10 + 0.5) - 1)\r
495#define TELEFUNKEN_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
496#define TELEFUNKEN_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
497#define TELEFUNKEN_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
498#define TELEFUNKEN_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
499#define TELEFUNKEN_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
500#define TELEFUNKEN_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * TELEFUNKEN_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
b85cb27d 501// autodetect TELEFUNKEN repetition frame within 50 msec:\r
0834784c 502// #define TELEFUNKEN_FRAME_REPEAT_PAUSE_LEN_MAX (uint_fast16_t)(F_INTERRUPTS * TELEFUNKEN_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)\r
503\r
504#define ROOMBA_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
505#define ROOMBA_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
506#define ROOMBA_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
507#define ROOMBA_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
508#define ROOMBA_1_PAUSE_LEN_EXACT ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_1_PAUSE_TIME + 0.5))\r
509#define ROOMBA_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
510#define ROOMBA_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
511#define ROOMBA_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
512#define ROOMBA_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
513#define ROOMBA_0_PAUSE_LEN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_0_PAUSE_TIME))\r
514#define ROOMBA_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
515#define ROOMBA_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
516#define ROOMBA_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
517#define ROOMBA_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ROOMBA_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
518\r
519#define RCMM32_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_START_BIT_PULSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
520#define RCMM32_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_START_BIT_PULSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
521#define RCMM32_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_START_BIT_PAUSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
522#define RCMM32_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_START_BIT_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
523#define RCMM32_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_PULSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
524#define RCMM32_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_PULSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
525#define RCMM32_BIT_00_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_00_PAUSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
526#define RCMM32_BIT_00_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_00_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
527#define RCMM32_BIT_01_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_01_PAUSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
528#define RCMM32_BIT_01_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_01_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
529#define RCMM32_BIT_10_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_10_PAUSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
530#define RCMM32_BIT_10_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_10_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
531#define RCMM32_BIT_11_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RCMM32_11_PAUSE_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
532#define RCMM32_BIT_11_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RCMM32_11_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
533\r
003c1008 534#define PENTAX_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
535#define PENTAX_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PENTAX_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
536#define PENTAX_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
537#define PENTAX_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PENTAX_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
538#define PENTAX_1_PAUSE_LEN_EXACT ((uint_fast8_t)(F_INTERRUPTS * PENTAX_1_PAUSE_TIME + 0.5))\r
539#define PENTAX_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
540#define PENTAX_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PENTAX_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
541#define PENTAX_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
542#define PENTAX_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PENTAX_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
543#define PENTAX_0_PAUSE_LEN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_0_PAUSE_TIME))\r
544#define PENTAX_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
545#define PENTAX_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PENTAX_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
546#define PENTAX_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PENTAX_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
547#define PENTAX_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PENTAX_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
548\r
43c535be 549#define ACP24_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ACP24_START_BIT_PULSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)\r
550#define ACP24_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ACP24_START_BIT_PULSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)\r
551#define ACP24_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ACP24_START_BIT_PAUSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)\r
552#define ACP24_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ACP24_START_BIT_PAUSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)\r
553#define ACP24_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ACP24_PULSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)\r
554#define ACP24_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ACP24_PULSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)\r
555#define ACP24_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ACP24_1_PAUSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)\r
556#define ACP24_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ACP24_1_PAUSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)\r
557#define ACP24_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * ACP24_0_PAUSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)\r
558#define ACP24_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * ACP24_0_PAUSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)\r
559\r
0834784c 560#define RADIO1_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
561#define RADIO1_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RADIO1_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
562#define RADIO1_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
563#define RADIO1_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RADIO1_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
564#define RADIO1_1_PAUSE_LEN_EXACT ((uint_fast8_t)(F_INTERRUPTS * RADIO1_1_PAUSE_TIME + 0.5))\r
565#define RADIO1_1_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
566#define RADIO1_1_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RADIO1_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
567#define RADIO1_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
568#define RADIO1_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RADIO1_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
569#define RADIO1_0_PAUSE_LEN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_0_PAUSE_TIME))\r
570#define RADIO1_0_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
571#define RADIO1_0_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RADIO1_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
572#define RADIO1_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RADIO1_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
573#define RADIO1_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RADIO1_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
574\r
575#define AUTO_FRAME_REPETITION_LEN (uint_fast16_t)(F_INTERRUPTS * AUTO_FRAME_REPETITION_TIME + 0.5) // use uint_fast16_t!\r
4225a882 576\r
48664931 577#ifdef ANALYZE\r
08f2dd9d 578# define ANALYZE_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
579# define ANALYZE_ONLY_NORMAL_PUTCHAR(a) { if (! silent && !verbose) { putchar (a); } }\r
580# define ANALYZE_PRINTF(...) { if (verbose) { printf (__VA_ARGS__); } }\r
775fabfa 581# define ANALYZE_ONLY_NORMAL_PRINTF(...) { if (! silent && !verbose) { printf (__VA_ARGS__); } }\r
08f2dd9d 582# define ANALYZE_NEWLINE() { if (verbose) { putchar ('\n'); } }\r
7644ac04 583static int silent;\r
584static int time_counter;\r
585static int verbose;\r
645fbc69 586\r
587/******************************* not every PIC compiler knows variadic macros :-(\r
4225a882 588#else\r
08f2dd9d 589# define ANALYZE_PUTCHAR(a)\r
590# define ANALYZE_ONLY_NORMAL_PUTCHAR(a)\r
4b9953bf 591# define ANALYZE_PRINTF(...)\r
592# define ANALYZE_ONLY_NORMAL_PRINTF(...)\r
4a7dc859 593# endif\r
08f2dd9d 594# define ANALYZE_NEWLINE()\r
645fbc69 595*********************************/\r
4225a882 596#endif\r
597\r
7644ac04 598#if IRMP_USE_CALLBACK == 1\r
0834784c 599static void (*irmp_callback_ptr) (uint_fast8_t);\r
7644ac04 600#endif // IRMP_USE_CALLBACK == 1\r
601\r
40ca4604 602#define PARITY_CHECK_OK 1\r
603#define PARITY_CHECK_FAILED 0\r
604\r
1f54e86c 605/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
606 * Protocol names\r
607 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
608 */\r
775fabfa 609#if defined(UNIX_OR_WINDOWS) || IRMP_PROTOCOL_NAMES == 1\r
622f5f59 610static const char proto_unknown[] PROGMEM = "UNKNOWN";\r
611static const char proto_sircs[] PROGMEM = "SIRCS";\r
612static const char proto_nec[] PROGMEM = "NEC";\r
613static const char proto_samsung[] PROGMEM = "SAMSUNG";\r
614static const char proto_matsushita[] PROGMEM = "MATSUSH";\r
615static const char proto_kaseikyo[] PROGMEM = "KASEIKYO";\r
616static const char proto_recs80[] PROGMEM = "RECS80";\r
617static const char proto_rc5[] PROGMEM = "RC5";\r
618static const char proto_denon[] PROGMEM = "DENON";\r
619static const char proto_rc6[] PROGMEM = "RC6";\r
620static const char proto_samsung32[] PROGMEM = "SAMSG32";\r
621static const char proto_apple[] PROGMEM = "APPLE";\r
622static const char proto_recs80ext[] PROGMEM = "RECS80EX";\r
623static const char proto_nubert[] PROGMEM = "NUBERT";\r
624static const char proto_bang_olufsen[] PROGMEM = "BANG OLU";\r
625static const char proto_grundig[] PROGMEM = "GRUNDIG";\r
626static const char proto_nokia[] PROGMEM = "NOKIA";\r
627static const char proto_siemens[] PROGMEM = "SIEMENS";\r
628static const char proto_fdc[] PROGMEM = "FDC";\r
629static const char proto_rccar[] PROGMEM = "RCCAR";\r
630static const char proto_jvc[] PROGMEM = "JVC";\r
631static const char proto_rc6a[] PROGMEM = "RC6A";\r
632static const char proto_nikon[] PROGMEM = "NIKON";\r
633static const char proto_ruwido[] PROGMEM = "RUWIDO";\r
634static const char proto_ir60[] PROGMEM = "IR60";\r
635static const char proto_kathrein[] PROGMEM = "KATHREIN";\r
636static const char proto_netbox[] PROGMEM = "NETBOX";\r
637static const char proto_nec16[] PROGMEM = "NEC16";\r
638static const char proto_nec42[] PROGMEM = "NEC42";\r
639static const char proto_lego[] PROGMEM = "LEGO";\r
640static const char proto_thomson[] PROGMEM = "THOMSON";\r
641static const char proto_bose[] PROGMEM = "BOSE";\r
642static const char proto_a1tvbox[] PROGMEM = "A1TVBOX";\r
643static const char proto_ortek[] PROGMEM = "ORTEK";\r
644static const char proto_telefunken[] PROGMEM = "TELEFUNKEN";\r
645static const char proto_roomba[] PROGMEM = "ROOMBA";\r
646static const char proto_rcmm32[] PROGMEM = "RCMM32";\r
647static const char proto_rcmm24[] PROGMEM = "RCMM24";\r
648static const char proto_rcmm12[] PROGMEM = "RCMM12";\r
649static const char proto_speaker[] PROGMEM = "SPEAKER";\r
650static const char proto_lgair[] PROGMEM = "LGAIR";\r
651static const char proto_samsung48[] PROGMEM = "SAMSG48";\r
003c1008 652static const char proto_merlin[] PROGMEM = "MERLIN";\r
653static const char proto_pentax[] PROGMEM = "PENTAX";\r
0715cf5e 654static const char proto_fan[] PROGMEM = "FAN";\r
c2b70f0b 655static const char proto_s100[] PROGMEM = "S100";\r
43c535be 656static const char proto_acp24[] PROGMEM = "ACP24";\r
3d2da98a 657static const char proto_technics[] PROGMEM = "TECHNICS";\r
95b27043 658static const char proto_panasonic[] PROGMEM = "PANASONIC";\r
7365350c 659static const char proto_mitsu_heavy[] PROGMEM = "MITSU_HEAVY";\r
4bcf310e 660static const char proto_vincent[] PROGMEM = "VINCENT";\r
30d1689d 661static const char proto_samsungah[] PROGMEM = "SAMSUNGAH";\r
8aaafe9d 662\r
622f5f59 663static const char proto_radio1[] PROGMEM = "RADIO1";\r
664\r
665const char * const\r
666irmp_protocol_names[IRMP_N_PROTOCOLS + 1] PROGMEM =\r
1f54e86c 667{\r
622f5f59 668 proto_unknown,\r
669 proto_sircs,\r
670 proto_nec,\r
671 proto_samsung,\r
672 proto_matsushita,\r
673 proto_kaseikyo,\r
674 proto_recs80,\r
675 proto_rc5,\r
676 proto_denon,\r
677 proto_rc6,\r
678 proto_samsung32,\r
679 proto_apple,\r
680 proto_recs80ext,\r
681 proto_nubert,\r
682 proto_bang_olufsen,\r
683 proto_grundig,\r
684 proto_nokia,\r
685 proto_siemens,\r
686 proto_fdc,\r
687 proto_rccar,\r
688 proto_jvc,\r
689 proto_rc6a,\r
690 proto_nikon,\r
691 proto_ruwido,\r
692 proto_ir60,\r
693 proto_kathrein,\r
694 proto_netbox,\r
695 proto_nec16,\r
696 proto_nec42,\r
697 proto_lego,\r
698 proto_thomson,\r
699 proto_bose,\r
700 proto_a1tvbox,\r
701 proto_ortek,\r
702 proto_telefunken,\r
703 proto_roomba,\r
704 proto_rcmm32,\r
705 proto_rcmm24,\r
706 proto_rcmm12,\r
707 proto_speaker,\r
708 proto_lgair,\r
709 proto_samsung48,\r
003c1008 710 proto_merlin,\r
711 proto_pentax,\r
0715cf5e 712 proto_fan,\r
c2b70f0b 713 proto_s100,\r
43c535be 714 proto_acp24,\r
3d2da98a 715 proto_technics,\r
95b27043 716 proto_panasonic,\r
7365350c 717 proto_mitsu_heavy,\r
4bcf310e 718 proto_vincent,\r
30d1689d 719 proto_samsungah,\r
622f5f59 720 proto_radio1\r
1f54e86c 721};\r
40ca4604 722\r
1f54e86c 723#endif\r
724\r
725/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
726 * Logging\r
727 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
728 */\r
9045767c 729#if IRMP_LOGGING == 1 // logging via UART\r
6c3c57e6 730\r
6f153888 731#if defined(ARM_STM32F4XX)\r
9045767c 732# define STM32_GPIO_CLOCK RCC_AHB1Periph_GPIOA // UART2 on PA2\r
6f153888 733# define STM32_UART_CLOCK RCC_APB1Periph_USART2\r
734# define STM32_GPIO_PORT GPIOA\r
735# define STM32_GPIO_PIN GPIO_Pin_2\r
736# define STM32_GPIO_SOURCE GPIO_PinSource2\r
737# define STM32_UART_AF GPIO_AF_USART2\r
738# define STM32_UART_COM USART2\r
9045767c 739# define STM32_UART_BAUD 115200 // 115200 Baud\r
6f153888 740# include "stm32f4xx_usart.h"\r
9045767c 741#elif defined(ARM_STM32F10X)\r
742# define STM32_UART_COM USART3 // UART3 on PB10\r
df24bb50 743#elif defined(ARDUINO) // Arduino Serial implementation\r
95b27043 744# if defined(USB_SERIAL)\r
745# include "usb_serial.h"\r
746# else\r
747# error USB_SERIAL not defined in ARDUINO Environment\r
748# endif\r
6f153888 749#else\r
9045767c 750# if IRMP_EXT_LOGGING == 1 // use external logging\r
6f153888 751# include "irmpextlog.h"\r
9045767c 752# else // normal UART log (IRMP_EXT_LOGGING == 0)\r
6f153888 753# define BAUD 9600L\r
754# ifndef UNIX_OR_WINDOWS\r
755# include <util/setbaud.h>\r
756# endif\r
879b06c2 757\r
758#ifdef UBRR0H\r
759\r
760#define UART0_UBRRH UBRR0H\r
761#define UART0_UBRRL UBRR0L\r
762#define UART0_UCSRA UCSR0A\r
763#define UART0_UCSRB UCSR0B\r
764#define UART0_UCSRC UCSR0C\r
765#define UART0_UDRE_BIT_VALUE (1<<UDRE0)\r
766#define UART0_UCSZ1_BIT_VALUE (1<<UCSZ01)\r
767#define UART0_UCSZ0_BIT_VALUE (1<<UCSZ00)\r
768#ifdef URSEL0\r
769#define UART0_URSEL_BIT_VALUE (1<<URSEL0)\r
770#else\r
771#define UART0_URSEL_BIT_VALUE (0)\r
772#endif\r
773#define UART0_TXEN_BIT_VALUE (1<<TXEN0)\r
e92413eb 774#define UART0_UDR UDR0\r
c7a47e89 775#define UART0_U2X U2X0\r
0834784c 776\r
879b06c2 777#else\r
4225a882 778\r
879b06c2 779#define UART0_UBRRH UBRRH\r
780#define UART0_UBRRL UBRRL\r
781#define UART0_UCSRA UCSRA\r
782#define UART0_UCSRB UCSRB\r
783#define UART0_UCSRC UCSRC\r
784#define UART0_UDRE_BIT_VALUE (1<<UDRE)\r
785#define UART0_UCSZ1_BIT_VALUE (1<<UCSZ1)\r
786#define UART0_UCSZ0_BIT_VALUE (1<<UCSZ0)\r
787#ifdef URSEL\r
788#define UART0_URSEL_BIT_VALUE (1<<URSEL)\r
789#else\r
790#define UART0_URSEL_BIT_VALUE (0)\r
791#endif\r
792#define UART0_TXEN_BIT_VALUE (1<<TXEN)\r
e92413eb 793#define UART0_UDR UDR\r
c7a47e89 794#define UART0_U2X U2X\r
4225a882 795\r
6c3c57e6 796#endif //UBRR0H\r
797#endif //IRMP_EXT_LOGGING\r
6f153888 798#endif //ARM_STM32F4XX\r
4225a882 799\r
4225a882 800/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
801 * Initialize UART\r
802 * @details Initializes UART\r
803 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
804 */\r
805void\r
806irmp_uart_init (void)\r
807{\r
775fabfa 808#ifndef UNIX_OR_WINDOWS\r
6f153888 809#if defined(ARM_STM32F4XX)\r
810 GPIO_InitTypeDef GPIO_InitStructure;\r
811 USART_InitTypeDef USART_InitStructure;\r
812\r
813 // Clock enable vom TX Pin\r
814 RCC_AHB1PeriphClockCmd(STM32_GPIO_CLOCK, ENABLE);\r
815\r
816 // Clock enable der UART\r
817 RCC_APB1PeriphClockCmd(STM32_UART_CLOCK, ENABLE);\r
818\r
819 // UART Alternative-Funktion mit dem IO-Pin verbinden\r
820 GPIO_PinAFConfig(STM32_GPIO_PORT,STM32_GPIO_SOURCE,STM32_UART_AF);\r
821\r
822 // UART als Alternative-Funktion mit PushPull\r
823 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
824 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;\r
825 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
826 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;\r
827\r
828 // TX-Pin\r
829 GPIO_InitStructure.GPIO_Pin = STM32_GPIO_PIN;\r
830 GPIO_Init(STM32_GPIO_PORT, &GPIO_InitStructure);\r
831\r
832 // Oversampling\r
833 USART_OverSampling8Cmd(STM32_UART_COM, ENABLE);\r
834\r
ea29682a 835 // init baud rate, 8 data bits, 1 stop bit, no parity, no RTS+CTS\r
6f153888 836 USART_InitStructure.USART_BaudRate = STM32_UART_BAUD;\r
837 USART_InitStructure.USART_WordLength = USART_WordLength_8b;\r
838 USART_InitStructure.USART_StopBits = USART_StopBits_1;\r
839 USART_InitStructure.USART_Parity = USART_Parity_No;\r
840 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;\r
841 USART_InitStructure.USART_Mode = USART_Mode_Tx;\r
842 USART_Init(STM32_UART_COM, &USART_InitStructure);\r
843\r
844 // UART enable\r
845 USART_Cmd(STM32_UART_COM, ENABLE);\r
846\r
9045767c 847#elif defined(ARM_STM32F10X)\r
848 GPIO_InitTypeDef GPIO_InitStructure;\r
849 USART_InitTypeDef USART_InitStructure;\r
850\r
851 // Clock enable vom TX Pin\r
852 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // UART3 an PB10\r
853\r
854 // Clock enable der UART\r
855 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);\r
856\r
857 // UART als Alternative-Funktion mit PushPull\r
858 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;\r
859 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
860\r
861 // TX-Pin\r
862 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;\r
863 GPIO_Init(GPIOB, &GPIO_InitStructure);\r
864\r
865 // Oversampling\r
866 USART_OverSampling8Cmd(STM32_UART_COM, ENABLE);\r
867\r
ea29682a 868 // init baud rate, 8 data bits, 1 stop bit, no parity, no RTS+CTS\r
9045767c 869 USART_InitStructure.USART_BaudRate = 115200;\r
870 USART_InitStructure.USART_WordLength = USART_WordLength_8b;\r
871 USART_InitStructure.USART_StopBits = USART_StopBits_1;\r
872 USART_InitStructure.USART_Parity = USART_Parity_No;\r
873 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;\r
874 USART_InitStructure.USART_Mode = USART_Mode_Tx;\r
875 USART_Init(STM32_UART_COM, &USART_InitStructure);\r
876\r
877 // UART enable\r
327b855b 878 USART_Cmd(STM32_UART_COM, ENABLE);\r
30d1689d 879\r
95b27043 880#elif defined(ARDUINO)\r
881 // we use the Arduino Serial Imlementation\r
882 // you have to call Serial.begin(SER_BAUD); in Arduino setup() function\r
883\r
458a6d64 884#elif defined (__AVR_XMEGA__)\r
885\r
95b27043 886 PMIC.CTRL |= PMIC_HILVLEN_bm;\r
887\r
888 USARTC1.BAUDCTRLB = 0;\r
889 USARTC1.BAUDCTRLA = F_CPU / 153600 - 1;\r
ea29682a 890 USARTC1.CTRLA = USART_RXCINTLVL_HI_gc; // high INT level (receive)\r
891 USARTC1.CTRLB = USART_TXEN_bm | USART_RXEN_bm; // activated RX and TX\r
892 USARTC1.CTRLC = USART_CHSIZE_8BIT_gc; // 8 Bit\r
893 PORTC.DIR |= (1<<7); // TXD is output\r
95b27043 894 PORTC.DIR &= ~(1<<6);\r
458a6d64 895\r
327b855b 896#else\r
9045767c 897\r
6c3c57e6 898#if (IRMP_EXT_LOGGING == 0) // use UART\r
879b06c2 899 UART0_UBRRH = UBRRH_VALUE; // set baud rate\r
900 UART0_UBRRL = UBRRL_VALUE;\r
901\r
902#if USE_2X\r
c7a47e89 903 UART0_UCSRA |= (1<<UART0_U2X);\r
879b06c2 904#else\r
c7a47e89 905 UART0_UCSRA &= ~(1<<UART0_U2X);\r
879b06c2 906#endif\r
907\r
908 UART0_UCSRC = UART0_UCSZ1_BIT_VALUE | UART0_UCSZ0_BIT_VALUE | UART0_URSEL_BIT_VALUE;\r
909 UART0_UCSRB |= UART0_TXEN_BIT_VALUE; // enable UART TX\r
6c3c57e6 910#else // other log method\r
0834784c 911 initextlog();\r
6c3c57e6 912#endif //IRMP_EXT_LOGGING\r
6f153888 913#endif //ARM_STM32F4XX\r
775fabfa 914#endif // UNIX_OR_WINDOWS\r
4225a882 915}\r
916\r
917/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
918 * Send character\r
919 * @details Sends character\r
920 * @param ch character to be transmitted\r
921 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
922 */\r
923void\r
924irmp_uart_putc (unsigned char ch)\r
925{\r
775fabfa 926#ifndef UNIX_OR_WINDOWS\r
9045767c 927#if defined(ARM_STM32F4XX) || defined(ARM_STM32F10X)\r
6f153888 928 // warten bis altes Byte gesendet wurde\r
929 while (USART_GetFlagStatus(STM32_UART_COM, USART_FLAG_TXE) == RESET)\r
930 {\r
df24bb50 931 ;\r
6f153888 932 }\r
933\r
934 USART_SendData(STM32_UART_COM, ch);\r
935\r
936 if (ch == '\n')\r
937 {\r
df24bb50 938 while (USART_GetFlagStatus(STM32_UART_COM, USART_FLAG_TXE) == RESET);\r
939 USART_SendData(STM32_UART_COM, '\r');\r
6f153888 940 }\r
941\r
95b27043 942#elif defined(ARDUINO)\r
943 // we use the Arduino Serial Imlementation\r
944 usb_serial_putchar(ch);\r
945\r
6f153888 946#else\r
6c3c57e6 947#if (IRMP_EXT_LOGGING == 0)\r
30d1689d 948\r
949# if defined (__AVR_XMEGA__)\r
950 while (!(USARTC1.STATUS & USART_DREIF_bm))\r
951 {\r
952 ;\r
953 }\r
954\r
955 USARTC1.DATA = ch;\r
956\r
957# else // AVR_MEGA\r
879b06c2 958 while (!(UART0_UCSRA & UART0_UDRE_BIT_VALUE))\r
4225a882 959 {\r
df24bb50 960 ;\r
4225a882 961 }\r
962\r
879b06c2 963 UART0_UDR = ch;\r
30d1689d 964\r
965# endif // __AVR_XMEGA__\r
966\r
6c3c57e6 967#else\r
6f153888 968\r
969 sendextlog(ch); // use external log\r
970\r
30d1689d 971#endif // IRMP_EXT_LOGGING\r
972#endif // ARM_STM32F4XX\r
775fabfa 973#else\r
974 fputc (ch, stderr);\r
975#endif // UNIX_OR_WINDOWS\r
4225a882 976}\r
977\r
978/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
979 * Log IR signal\r
980 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
981 */\r
d155e9ab 982\r
983#define STARTCYCLES 2 // min count of zeros before start of logging\r
984#define ENDBITS 1000 // number of sequenced highbits to detect end\r
985#define DATALEN 700 // log buffer size\r
4225a882 986\r
775fabfa 987static void\r
0834784c 988irmp_log (uint_fast8_t val)\r
775fabfa 989{\r
0834784c 990 static uint8_t buf[DATALEN]; // logging buffer\r
991 static uint_fast16_t buf_idx; // index\r
992 static uint_fast8_t startcycles; // current number of start-zeros\r
993 static uint_fast16_t cnt; // counts sequenced highbits - to detect end\r
994 static uint_fast8_t last_val = 1;\r
775fabfa 995\r
996 if (! val && (startcycles < STARTCYCLES) && !buf_idx) // prevent that single random zeros init logging\r
997 {\r
df24bb50 998 startcycles++;\r
775fabfa 999 }\r
1000 else\r
1001 {\r
df24bb50 1002 startcycles = 0;\r
1003\r
1004 if (! val || buf_idx != 0) // start or continue logging on "0", "1" cannot init logging\r
1005 {\r
1006 if (last_val == val)\r
1007 {\r
1008 cnt++;\r
1009\r
1010 if (val && cnt > ENDBITS) // if high received then look at log-stop condition\r
1011 { // if stop condition is true, output on uart\r
1012 uint_fast8_t i8;\r
1013 uint_fast16_t i;\r
1014 uint_fast16_t j;\r
1015 uint_fast8_t v = '1';\r
1016 uint_fast16_t d;\r
1017\r
1018 for (i8 = 0; i8 < STARTCYCLES; i8++)\r
1019 {\r
1020 irmp_uart_putc ('0'); // the ignored starting zeros\r
1021 }\r
1022\r
1023 for (i = 0; i < buf_idx; i++)\r
1024 {\r
1025 d = buf[i];\r
1026\r
1027 if (d == 0xff)\r
1028 {\r
1029 i++;\r
1030 d = buf[i];\r
1031 i++;\r
1032 d |= ((uint_fast16_t) buf[i] << 8);\r
1033 }\r
1034\r
1035 for (j = 0; j < d; j++)\r
1036 {\r
1037 irmp_uart_putc (v);\r
1038 }\r
1039\r
1040 v = (v == '1') ? '0' : '1';\r
1041 }\r
1042\r
1043 for (i8 = 0; i8 < 20; i8++)\r
1044 {\r
1045 irmp_uart_putc ('1');\r
1046 }\r
1047\r
1048 irmp_uart_putc ('\n');\r
1049 buf_idx = 0;\r
1050 last_val = 1;\r
1051 cnt = 0;\r
1052 }\r
1053 }\r
1054 else if (buf_idx < DATALEN - 3)\r
1055 {\r
1056 if (cnt >= 0xff)\r
1057 {\r
1058 buf[buf_idx++] = 0xff;\r
1059 buf[buf_idx++] = (cnt & 0xff);\r
1060 buf[buf_idx] = (cnt >> 8);\r
1061 }\r
1062 else\r
1063 {\r
1064 buf[buf_idx] = cnt;\r
1065 }\r
1066\r
1067 buf_idx++;\r
1068 cnt = 1;\r
1069 last_val = val;\r
1070 }\r
1071 }\r
775fabfa 1072 }\r
1073}\r
1074\r
4225a882 1075#else\r
d155e9ab 1076#define irmp_log(val)\r
6c3c57e6 1077#endif //IRMP_LOGGING\r
4225a882 1078\r
1079typedef struct\r
1080{\r
0834784c 1081 uint_fast8_t protocol; // ir protocol\r
1082 uint_fast8_t pulse_1_len_min; // minimum length of pulse with bit value 1\r
1083 uint_fast8_t pulse_1_len_max; // maximum length of pulse with bit value 1\r
1084 uint_fast8_t pause_1_len_min; // minimum length of pause with bit value 1\r
1085 uint_fast8_t pause_1_len_max; // maximum length of pause with bit value 1\r
1086 uint_fast8_t pulse_0_len_min; // minimum length of pulse with bit value 0\r
1087 uint_fast8_t pulse_0_len_max; // maximum length of pulse with bit value 0\r
1088 uint_fast8_t pause_0_len_min; // minimum length of pause with bit value 0\r
1089 uint_fast8_t pause_0_len_max; // maximum length of pause with bit value 0\r
1090 uint_fast8_t address_offset; // address offset\r
1091 uint_fast8_t address_end; // end of address\r
1092 uint_fast8_t command_offset; // command offset\r
1093 uint_fast8_t command_end; // end of command\r
1094 uint_fast8_t complete_len; // complete length of frame\r
1095 uint_fast8_t stop_bit; // flag: frame has stop bit\r
1096 uint_fast8_t lsb_first; // flag: LSB first\r
1097 uint_fast8_t flags; // some flags\r
4225a882 1098} IRMP_PARAMETER;\r
1099\r
1100#if IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
1101\r
63b94f48 1102static const PROGMEM IRMP_PARAMETER sircs_param =\r
4225a882 1103{\r
d155e9ab 1104 IRMP_SIRCS_PROTOCOL, // protocol: ir protocol\r
1105 SIRCS_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1106 SIRCS_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1107 SIRCS_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1108 SIRCS_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1109 SIRCS_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1110 SIRCS_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1111 SIRCS_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1112 SIRCS_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1113 SIRCS_ADDRESS_OFFSET, // address_offset: address offset\r
1114 SIRCS_ADDRESS_OFFSET + SIRCS_ADDRESS_LEN, // address_end: end of address\r
1115 SIRCS_COMMAND_OFFSET, // command_offset: command offset\r
1116 SIRCS_COMMAND_OFFSET + SIRCS_COMMAND_LEN, // command_end: end of command\r
1117 SIRCS_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1118 SIRCS_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1119 SIRCS_LSB, // lsb_first: flag: LSB first\r
1120 SIRCS_FLAGS // flags: some flags\r
4225a882 1121};\r
1122\r
1123#endif\r
1124\r
1125#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
1126\r
63b94f48 1127static const PROGMEM IRMP_PARAMETER nec_param =\r
4225a882 1128{\r
d155e9ab 1129 IRMP_NEC_PROTOCOL, // protocol: ir protocol\r
1130 NEC_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1131 NEC_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1132 NEC_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1133 NEC_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1134 NEC_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1135 NEC_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1136 NEC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1137 NEC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1138 NEC_ADDRESS_OFFSET, // address_offset: address offset\r
1139 NEC_ADDRESS_OFFSET + NEC_ADDRESS_LEN, // address_end: end of address\r
1140 NEC_COMMAND_OFFSET, // command_offset: command offset\r
1141 NEC_COMMAND_OFFSET + NEC_COMMAND_LEN, // command_end: end of command\r
1142 NEC_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1143 NEC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1144 NEC_LSB, // lsb_first: flag: LSB first\r
1145 NEC_FLAGS // flags: some flags\r
4225a882 1146};\r
1147\r
63b94f48 1148static const PROGMEM IRMP_PARAMETER nec_rep_param =\r
46dd89b7 1149{\r
d155e9ab 1150 IRMP_NEC_PROTOCOL, // protocol: ir protocol\r
1151 NEC_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1152 NEC_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1153 NEC_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1154 NEC_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1155 NEC_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1156 NEC_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1157 NEC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1158 NEC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1159 0, // address_offset: address offset\r
1160 0, // address_end: end of address\r
1161 0, // command_offset: command offset\r
1162 0, // command_end: end of command\r
1163 0, // complete_len: complete length of frame\r
1164 NEC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1165 NEC_LSB, // lsb_first: flag: LSB first\r
1166 NEC_FLAGS // flags: some flags\r
46dd89b7 1167};\r
1168\r
4225a882 1169#endif\r
1170\r
35213800 1171#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
fc80d688 1172\r
63b94f48 1173static const PROGMEM IRMP_PARAMETER nec42_param =\r
fc80d688 1174{\r
35213800 1175 IRMP_NEC42_PROTOCOL, // protocol: ir protocol\r
fc80d688 1176 NEC_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1177 NEC_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1178 NEC_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1179 NEC_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1180 NEC_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1181 NEC_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1182 NEC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1183 NEC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
35213800 1184 NEC42_ADDRESS_OFFSET, // address_offset: address offset\r
7644ac04 1185 NEC42_ADDRESS_OFFSET + NEC42_ADDRESS_LEN, // address_end: end of address\r
35213800 1186 NEC42_COMMAND_OFFSET, // command_offset: command offset\r
7644ac04 1187 NEC42_COMMAND_OFFSET + NEC42_COMMAND_LEN, // command_end: end of command\r
35213800 1188 NEC42_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1189 NEC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1190 NEC_LSB, // lsb_first: flag: LSB first\r
1191 NEC_FLAGS // flags: some flags\r
fc80d688 1192};\r
1193\r
1194#endif\r
1195\r
69da6090 1196#if IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
1197\r
1198static const PROGMEM IRMP_PARAMETER lgair_param =\r
1199{\r
1200 IRMP_LGAIR_PROTOCOL, // protocol: ir protocol\r
1201 NEC_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1202 NEC_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1203 NEC_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1204 NEC_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1205 NEC_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1206 NEC_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1207 NEC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1208 NEC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1209 LGAIR_ADDRESS_OFFSET, // address_offset: address offset\r
1210 LGAIR_ADDRESS_OFFSET + LGAIR_ADDRESS_LEN, // address_end: end of address\r
1211 LGAIR_COMMAND_OFFSET, // command_offset: command offset\r
1212 LGAIR_COMMAND_OFFSET + LGAIR_COMMAND_LEN, // command_end: end of command\r
1213 LGAIR_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1214 NEC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1215 NEC_LSB, // lsb_first: flag: LSB first\r
1216 NEC_FLAGS // flags: some flags\r
1217};\r
1218\r
1219#endif\r
1220\r
4225a882 1221#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
1222\r
63b94f48 1223static const PROGMEM IRMP_PARAMETER samsung_param =\r
4225a882 1224{\r
d155e9ab 1225 IRMP_SAMSUNG_PROTOCOL, // protocol: ir protocol\r
1226 SAMSUNG_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1227 SAMSUNG_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1228 SAMSUNG_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1229 SAMSUNG_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1230 SAMSUNG_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1231 SAMSUNG_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1232 SAMSUNG_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1233 SAMSUNG_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1234 SAMSUNG_ADDRESS_OFFSET, // address_offset: address offset\r
1235 SAMSUNG_ADDRESS_OFFSET + SAMSUNG_ADDRESS_LEN, // address_end: end of address\r
1236 SAMSUNG_COMMAND_OFFSET, // command_offset: command offset\r
1237 SAMSUNG_COMMAND_OFFSET + SAMSUNG_COMMAND_LEN, // command_end: end of command\r
1238 SAMSUNG_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1239 SAMSUNG_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1240 SAMSUNG_LSB, // lsb_first: flag: LSB first\r
1241 SAMSUNG_FLAGS // flags: some flags\r
4225a882 1242};\r
1243\r
1244#endif\r
1245\r
30d1689d 1246#if IRMP_SUPPORT_SAMSUNGAH_PROTOCOL == 1\r
1247\r
1248static const PROGMEM IRMP_PARAMETER samsungah_param =\r
1249{\r
1250 IRMP_SAMSUNGAH_PROTOCOL, // protocol: ir protocol\r
1251 SAMSUNGAH_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1252 SAMSUNGAH_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1253 SAMSUNGAH_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1254 SAMSUNGAH_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1255 SAMSUNGAH_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1256 SAMSUNGAH_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1257 SAMSUNGAH_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1258 SAMSUNGAH_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1259 SAMSUNGAH_ADDRESS_OFFSET, // address_offset: address offset\r
1260 SAMSUNGAH_ADDRESS_OFFSET + SAMSUNGAH_ADDRESS_LEN, // address_end: end of address\r
1261 SAMSUNGAH_COMMAND_OFFSET, // command_offset: command offset\r
1262 SAMSUNGAH_COMMAND_OFFSET + SAMSUNGAH_COMMAND_LEN, // command_end: end of command\r
1263 SAMSUNGAH_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1264 SAMSUNGAH_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1265 SAMSUNGAH_LSB, // lsb_first: flag: LSB first\r
1266 SAMSUNGAH_FLAGS // flags: some flags\r
1267};\r
1268\r
1269#endif\r
1270\r
b85cb27d 1271#if IRMP_SUPPORT_TELEFUNKEN_PROTOCOL == 1\r
1272\r
1273static const PROGMEM IRMP_PARAMETER telefunken_param =\r
1274{\r
1275 IRMP_TELEFUNKEN_PROTOCOL, // protocol: ir protocol\r
1276 TELEFUNKEN_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1277 TELEFUNKEN_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1278 TELEFUNKEN_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1279 TELEFUNKEN_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1280 TELEFUNKEN_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1281 TELEFUNKEN_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1282 TELEFUNKEN_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1283 TELEFUNKEN_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1284 TELEFUNKEN_ADDRESS_OFFSET, // address_offset: address offset\r
1285 TELEFUNKEN_ADDRESS_OFFSET + TELEFUNKEN_ADDRESS_LEN, // address_end: end of address\r
1286 TELEFUNKEN_COMMAND_OFFSET, // command_offset: command offset\r
1287 TELEFUNKEN_COMMAND_OFFSET + TELEFUNKEN_COMMAND_LEN, // command_end: end of command\r
1288 TELEFUNKEN_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1289 TELEFUNKEN_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1290 TELEFUNKEN_LSB, // lsb_first: flag: LSB first\r
1291 TELEFUNKEN_FLAGS // flags: some flags\r
1292};\r
1293\r
1294#endif\r
1295\r
4225a882 1296#if IRMP_SUPPORT_MATSUSHITA_PROTOCOL == 1\r
1297\r
63b94f48 1298static const PROGMEM IRMP_PARAMETER matsushita_param =\r
4225a882 1299{\r
d155e9ab 1300 IRMP_MATSUSHITA_PROTOCOL, // protocol: ir protocol\r
1301 MATSUSHITA_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1302 MATSUSHITA_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1303 MATSUSHITA_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1304 MATSUSHITA_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1305 MATSUSHITA_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1306 MATSUSHITA_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1307 MATSUSHITA_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1308 MATSUSHITA_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1309 MATSUSHITA_ADDRESS_OFFSET, // address_offset: address offset\r
1310 MATSUSHITA_ADDRESS_OFFSET + MATSUSHITA_ADDRESS_LEN, // address_end: end of address\r
1311 MATSUSHITA_COMMAND_OFFSET, // command_offset: command offset\r
1312 MATSUSHITA_COMMAND_OFFSET + MATSUSHITA_COMMAND_LEN, // command_end: end of command\r
1313 MATSUSHITA_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1314 MATSUSHITA_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1315 MATSUSHITA_LSB, // lsb_first: flag: LSB first\r
1316 MATSUSHITA_FLAGS // flags: some flags\r
4225a882 1317};\r
1318\r
1319#endif\r
1320\r
1321#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
1322\r
63b94f48 1323static const PROGMEM IRMP_PARAMETER kaseikyo_param =\r
4225a882 1324{\r
d155e9ab 1325 IRMP_KASEIKYO_PROTOCOL, // protocol: ir protocol\r
1326 KASEIKYO_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1327 KASEIKYO_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1328 KASEIKYO_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1329 KASEIKYO_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1330 KASEIKYO_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1331 KASEIKYO_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1332 KASEIKYO_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1333 KASEIKYO_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1334 KASEIKYO_ADDRESS_OFFSET, // address_offset: address offset\r
1335 KASEIKYO_ADDRESS_OFFSET + KASEIKYO_ADDRESS_LEN, // address_end: end of address\r
1336 KASEIKYO_COMMAND_OFFSET, // command_offset: command offset\r
1337 KASEIKYO_COMMAND_OFFSET + KASEIKYO_COMMAND_LEN, // command_end: end of command\r
1338 KASEIKYO_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1339 KASEIKYO_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1340 KASEIKYO_LSB, // lsb_first: flag: LSB first\r
1341 KASEIKYO_FLAGS // flags: some flags\r
4225a882 1342};\r
1343\r
1344#endif\r
1345\r
95b27043 1346#if IRMP_SUPPORT_PANASONIC_PROTOCOL == 1\r
1347\r
1348static const PROGMEM IRMP_PARAMETER panasonic_param =\r
1349{\r
1350 IRMP_PANASONIC_PROTOCOL, // protocol: ir protocol\r
1351 PANASONIC_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1352 PANASONIC_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1353 PANASONIC_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1354 PANASONIC_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1355 PANASONIC_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1356 PANASONIC_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1357 PANASONIC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1358 PANASONIC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1359 PANASONIC_ADDRESS_OFFSET, // address_offset: address offset\r
1360 PANASONIC_ADDRESS_OFFSET + PANASONIC_ADDRESS_LEN, // address_end: end of address\r
1361 PANASONIC_COMMAND_OFFSET, // command_offset: command offset\r
1362 PANASONIC_COMMAND_OFFSET + PANASONIC_COMMAND_LEN, // command_end: end of command\r
1363 PANASONIC_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1364 PANASONIC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1365 PANASONIC_LSB, // lsb_first: flag: LSB first\r
1366 PANASONIC_FLAGS // flags: some flags\r
1367};\r
1368\r
1369#endif\r
1370\r
7365350c 1371#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
1372\r
1373static const PROGMEM IRMP_PARAMETER mitsu_heavy_param =\r
1374{\r
1375 IRMP_MITSU_HEAVY_PROTOCOL, // protocol: ir protocol\r
1376 MITSU_HEAVY_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1377 MITSU_HEAVY_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1378 MITSU_HEAVY_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1379 MITSU_HEAVY_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1380 MITSU_HEAVY_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1381 MITSU_HEAVY_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1382 MITSU_HEAVY_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1383 MITSU_HEAVY_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1384 MITSU_HEAVY_ADDRESS_OFFSET, // address_offset: address offset\r
1385 MITSU_HEAVY_ADDRESS_OFFSET + MITSU_HEAVY_ADDRESS_LEN, // address_end: end of address\r
1386 MITSU_HEAVY_COMMAND_OFFSET, // command_offset: command offset\r
1387 MITSU_HEAVY_COMMAND_OFFSET + MITSU_HEAVY_COMMAND_LEN, // command_end: end of command\r
1388 MITSU_HEAVY_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1389 MITSU_HEAVY_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1390 MITSU_HEAVY_LSB, // lsb_first: flag: LSB first\r
1391 MITSU_HEAVY_FLAGS // flags: some flags\r
1392};\r
1393\r
1394#endif\r
1395\r
4bcf310e 1396#if IRMP_SUPPORT_VINCENT_PROTOCOL == 1\r
1397\r
1398static const PROGMEM IRMP_PARAMETER vincent_param =\r
1399{\r
1400 IRMP_VINCENT_PROTOCOL, // protocol: ir protocol\r
1401 VINCENT_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1402 VINCENT_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1403 VINCENT_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1404 VINCENT_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1405 VINCENT_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1406 VINCENT_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1407 VINCENT_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1408 VINCENT_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1409 VINCENT_ADDRESS_OFFSET, // address_offset: address offset\r
1410 VINCENT_ADDRESS_OFFSET + VINCENT_ADDRESS_LEN, // address_end: end of address\r
1411 VINCENT_COMMAND_OFFSET, // command_offset: command offset\r
1412 VINCENT_COMMAND_OFFSET + VINCENT_COMMAND_LEN, // command_end: end of command\r
1413 VINCENT_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1414 VINCENT_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1415 VINCENT_LSB, // lsb_first: flag: LSB first\r
1416 VINCENT_FLAGS // flags: some flags\r
1417};\r
1418\r
1419#endif\r
1420\r
4225a882 1421#if IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
1422\r
63b94f48 1423static const PROGMEM IRMP_PARAMETER recs80_param =\r
4225a882 1424{\r
d155e9ab 1425 IRMP_RECS80_PROTOCOL, // protocol: ir protocol\r
1426 RECS80_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1427 RECS80_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1428 RECS80_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1429 RECS80_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1430 RECS80_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1431 RECS80_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1432 RECS80_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1433 RECS80_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1434 RECS80_ADDRESS_OFFSET, // address_offset: address offset\r
1435 RECS80_ADDRESS_OFFSET + RECS80_ADDRESS_LEN, // address_end: end of address\r
1436 RECS80_COMMAND_OFFSET, // command_offset: command offset\r
1437 RECS80_COMMAND_OFFSET + RECS80_COMMAND_LEN, // command_end: end of command\r
1438 RECS80_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1439 RECS80_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1440 RECS80_LSB, // lsb_first: flag: LSB first\r
1441 RECS80_FLAGS // flags: some flags\r
4225a882 1442};\r
1443\r
1444#endif\r
1445\r
1446#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
1447\r
63b94f48 1448static const PROGMEM IRMP_PARAMETER rc5_param =\r
4225a882 1449{\r
d155e9ab 1450 IRMP_RC5_PROTOCOL, // protocol: ir protocol\r
1aee56bc 1451 RC5_BIT_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1452 RC5_BIT_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1453 RC5_BIT_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1454 RC5_BIT_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
31c1f035 1455 0, // pulse_0_len_min: here: not used\r
1456 0, // pulse_0_len_max: here: not used\r
1457 0, // pause_0_len_min: here: not used\r
1458 0, // pause_0_len_max: here: not used\r
d155e9ab 1459 RC5_ADDRESS_OFFSET, // address_offset: address offset\r
1460 RC5_ADDRESS_OFFSET + RC5_ADDRESS_LEN, // address_end: end of address\r
1461 RC5_COMMAND_OFFSET, // command_offset: command offset\r
1462 RC5_COMMAND_OFFSET + RC5_COMMAND_LEN, // command_end: end of command\r
1463 RC5_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1464 RC5_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1465 RC5_LSB, // lsb_first: flag: LSB first\r
1466 RC5_FLAGS // flags: some flags\r
4225a882 1467};\r
1468\r
1469#endif\r
1470\r
c2b70f0b 1471#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
1472\r
1473static const PROGMEM IRMP_PARAMETER s100_param =\r
1474{\r
1475 IRMP_S100_PROTOCOL, // protocol: ir protocol\r
1476 S100_BIT_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1477 S100_BIT_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1478 S100_BIT_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1479 S100_BIT_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
1480 0, // pulse_0_len_min: here: not used\r
1481 0, // pulse_0_len_max: here: not used\r
1482 0, // pause_0_len_min: here: not used\r
1483 0, // pause_0_len_max: here: not used\r
1484 S100_ADDRESS_OFFSET, // address_offset: address offset\r
1485 S100_ADDRESS_OFFSET + S100_ADDRESS_LEN, // address_end: end of address\r
1486 S100_COMMAND_OFFSET, // command_offset: command offset\r
1487 S100_COMMAND_OFFSET + S100_COMMAND_LEN, // command_end: end of command\r
1488 S100_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1489 S100_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1490 S100_LSB, // lsb_first: flag: LSB first\r
1491 S100_FLAGS // flags: some flags\r
1492};\r
1493\r
1494#endif\r
1495\r
4225a882 1496#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
1497\r
63b94f48 1498static const PROGMEM IRMP_PARAMETER denon_param =\r
4225a882 1499{\r
d155e9ab 1500 IRMP_DENON_PROTOCOL, // protocol: ir protocol\r
1501 DENON_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1502 DENON_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1503 DENON_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1504 DENON_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1505 DENON_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1506 DENON_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1507 DENON_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1508 DENON_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1509 DENON_ADDRESS_OFFSET, // address_offset: address offset\r
1510 DENON_ADDRESS_OFFSET + DENON_ADDRESS_LEN, // address_end: end of address\r
1511 DENON_COMMAND_OFFSET, // command_offset: command offset\r
1512 DENON_COMMAND_OFFSET + DENON_COMMAND_LEN, // command_end: end of command\r
1513 DENON_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1514 DENON_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1515 DENON_LSB, // lsb_first: flag: LSB first\r
1516 DENON_FLAGS // flags: some flags\r
4225a882 1517};\r
1518\r
1519#endif\r
1520\r
1521#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
1522\r
63b94f48 1523static const PROGMEM IRMP_PARAMETER rc6_param =\r
4225a882 1524{\r
d155e9ab 1525 IRMP_RC6_PROTOCOL, // protocol: ir protocol\r
1aee56bc 1526\r
1527 RC6_BIT_PULSE_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1528 RC6_BIT_PULSE_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1529 RC6_BIT_PAUSE_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1530 RC6_BIT_PAUSE_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
31c1f035 1531 0, // pulse_0_len_min: here: not used\r
1532 0, // pulse_0_len_max: here: not used\r
1533 0, // pause_0_len_min: here: not used\r
1534 0, // pause_0_len_max: here: not used\r
d155e9ab 1535 RC6_ADDRESS_OFFSET, // address_offset: address offset\r
1536 RC6_ADDRESS_OFFSET + RC6_ADDRESS_LEN, // address_end: end of address\r
1537 RC6_COMMAND_OFFSET, // command_offset: command offset\r
1538 RC6_COMMAND_OFFSET + RC6_COMMAND_LEN, // command_end: end of command\r
1539 RC6_COMPLETE_DATA_LEN_SHORT, // complete_len: complete length of frame\r
1540 RC6_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1541 RC6_LSB, // lsb_first: flag: LSB first\r
1542 RC6_FLAGS // flags: some flags\r
4225a882 1543};\r
1544\r
1545#endif\r
1546\r
1547#if IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
1548\r
63b94f48 1549static const PROGMEM IRMP_PARAMETER recs80ext_param =\r
4225a882 1550{\r
d155e9ab 1551 IRMP_RECS80EXT_PROTOCOL, // protocol: ir protocol\r
1552 RECS80EXT_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1553 RECS80EXT_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1554 RECS80EXT_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1555 RECS80EXT_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1556 RECS80EXT_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1557 RECS80EXT_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1558 RECS80EXT_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1559 RECS80EXT_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1560 RECS80EXT_ADDRESS_OFFSET, // address_offset: address offset\r
1561 RECS80EXT_ADDRESS_OFFSET + RECS80EXT_ADDRESS_LEN, // address_end: end of address\r
1562 RECS80EXT_COMMAND_OFFSET, // command_offset: command offset\r
1563 RECS80EXT_COMMAND_OFFSET + RECS80EXT_COMMAND_LEN, // command_end: end of command\r
1564 RECS80EXT_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1565 RECS80EXT_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1566 RECS80EXT_LSB, // lsb_first: flag: LSB first\r
1567 RECS80EXT_FLAGS // flags: some flags\r
4225a882 1568};\r
1569\r
1570#endif\r
1571\r
504d9df9 1572#if IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
4225a882 1573\r
63b94f48 1574static const PROGMEM IRMP_PARAMETER nubert_param =\r
4225a882 1575{\r
d155e9ab 1576 IRMP_NUBERT_PROTOCOL, // protocol: ir protocol\r
1577 NUBERT_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1578 NUBERT_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1579 NUBERT_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1580 NUBERT_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1581 NUBERT_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1582 NUBERT_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1583 NUBERT_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1584 NUBERT_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1585 NUBERT_ADDRESS_OFFSET, // address_offset: address offset\r
1586 NUBERT_ADDRESS_OFFSET + NUBERT_ADDRESS_LEN, // address_end: end of address\r
1587 NUBERT_COMMAND_OFFSET, // command_offset: command offset\r
1588 NUBERT_COMMAND_OFFSET + NUBERT_COMMAND_LEN, // command_end: end of command\r
1589 NUBERT_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1590 NUBERT_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1591 NUBERT_LSB, // lsb_first: flag: LSB first\r
1592 NUBERT_FLAGS // flags: some flags\r
4225a882 1593};\r
1594\r
1595#endif\r
1596\r
0715cf5e 1597#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
1598\r
1599static const PROGMEM IRMP_PARAMETER fan_param =\r
1600{\r
1601 IRMP_FAN_PROTOCOL, // protocol: ir protocol\r
1602 FAN_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1603 FAN_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1604 FAN_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1605 FAN_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1606 FAN_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1607 FAN_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1608 FAN_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1609 FAN_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1610 FAN_ADDRESS_OFFSET, // address_offset: address offset\r
1611 FAN_ADDRESS_OFFSET + FAN_ADDRESS_LEN, // address_end: end of address\r
1612 FAN_COMMAND_OFFSET, // command_offset: command offset\r
1613 FAN_COMMAND_OFFSET + FAN_COMMAND_LEN, // command_end: end of command\r
1614 FAN_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1615 FAN_STOP_BIT, // stop_bit: flag: frame has NO stop bit\r
1616 FAN_LSB, // lsb_first: flag: LSB first\r
1617 FAN_FLAGS // flags: some flags\r
1618};\r
1619\r
1620#endif\r
1621\r
0a2f634b 1622#if IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
1623\r
1624static const PROGMEM IRMP_PARAMETER speaker_param =\r
1625{\r
1626 IRMP_SPEAKER_PROTOCOL, // protocol: ir protocol\r
1627 SPEAKER_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1628 SPEAKER_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1629 SPEAKER_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1630 SPEAKER_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1631 SPEAKER_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1632 SPEAKER_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1633 SPEAKER_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1634 SPEAKER_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1635 SPEAKER_ADDRESS_OFFSET, // address_offset: address offset\r
1636 SPEAKER_ADDRESS_OFFSET + SPEAKER_ADDRESS_LEN, // address_end: end of address\r
1637 SPEAKER_COMMAND_OFFSET, // command_offset: command offset\r
1638 SPEAKER_COMMAND_OFFSET + SPEAKER_COMMAND_LEN, // command_end: end of command\r
1639 SPEAKER_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1640 SPEAKER_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1641 SPEAKER_LSB, // lsb_first: flag: LSB first\r
1642 SPEAKER_FLAGS // flags: some flags\r
1643};\r
1644\r
1645#endif\r
1646\r
504d9df9 1647#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
1648\r
63b94f48 1649static const PROGMEM IRMP_PARAMETER bang_olufsen_param =\r
504d9df9 1650{\r
d155e9ab 1651 IRMP_BANG_OLUFSEN_PROTOCOL, // protocol: ir protocol\r
1652 BANG_OLUFSEN_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1653 BANG_OLUFSEN_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1654 BANG_OLUFSEN_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1655 BANG_OLUFSEN_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1656 BANG_OLUFSEN_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1657 BANG_OLUFSEN_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1658 BANG_OLUFSEN_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1659 BANG_OLUFSEN_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1660 BANG_OLUFSEN_ADDRESS_OFFSET, // address_offset: address offset\r
1661 BANG_OLUFSEN_ADDRESS_OFFSET + BANG_OLUFSEN_ADDRESS_LEN, // address_end: end of address\r
1662 BANG_OLUFSEN_COMMAND_OFFSET, // command_offset: command offset\r
1663 BANG_OLUFSEN_COMMAND_OFFSET + BANG_OLUFSEN_COMMAND_LEN, // command_end: end of command\r
1664 BANG_OLUFSEN_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1665 BANG_OLUFSEN_STOP_BIT, // stop_bit: flag: frame has stop bit\r
77f488bb 1666 BANG_OLUFSEN_LSB, // lsb_first: flag: LSB first\r
1667 BANG_OLUFSEN_FLAGS // flags: some flags\r
504d9df9 1668};\r
1669\r
1670#endif\r
1671\r
89e8cafb 1672#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
1673\r
0834784c 1674static uint_fast8_t first_bit;\r
592411d1 1675\r
63b94f48 1676static const PROGMEM IRMP_PARAMETER grundig_param =\r
592411d1 1677{\r
d155e9ab 1678 IRMP_GRUNDIG_PROTOCOL, // protocol: ir protocol\r
1aee56bc 1679\r
89e8cafb 1680 GRUNDIG_NOKIA_IR60_BIT_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1681 GRUNDIG_NOKIA_IR60_BIT_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1682 GRUNDIG_NOKIA_IR60_BIT_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1683 GRUNDIG_NOKIA_IR60_BIT_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
31c1f035 1684 0, // pulse_0_len_min: here: not used\r
1685 0, // pulse_0_len_max: here: not used\r
1686 0, // pause_0_len_min: here: not used\r
1687 0, // pause_0_len_max: here: not used\r
d155e9ab 1688 GRUNDIG_ADDRESS_OFFSET, // address_offset: address offset\r
1689 GRUNDIG_ADDRESS_OFFSET + GRUNDIG_ADDRESS_LEN, // address_end: end of address\r
1690 GRUNDIG_COMMAND_OFFSET, // command_offset: command offset\r
1691 GRUNDIG_COMMAND_OFFSET + GRUNDIG_COMMAND_LEN + 1, // command_end: end of command (USE 1 bit MORE to STORE NOKIA DATA!)\r
1692 NOKIA_COMPLETE_DATA_LEN, // complete_len: complete length of frame, here: NOKIA instead of GRUNDIG!\r
89e8cafb 1693 GRUNDIG_NOKIA_IR60_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1694 GRUNDIG_NOKIA_IR60_LSB, // lsb_first: flag: LSB first\r
1695 GRUNDIG_NOKIA_IR60_FLAGS // flags: some flags\r
592411d1 1696};\r
1697\r
1698#endif\r
1699\r
12948cf3 1700#if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
a7054daf 1701\r
63b94f48 1702static const PROGMEM IRMP_PARAMETER ruwido_param =\r
a7054daf 1703{\r
12948cf3 1704 IRMP_RUWIDO_PROTOCOL, // protocol: ir protocol\r
1705 SIEMENS_OR_RUWIDO_BIT_PULSE_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1706 SIEMENS_OR_RUWIDO_BIT_PULSE_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1707 SIEMENS_OR_RUWIDO_BIT_PAUSE_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1708 SIEMENS_OR_RUWIDO_BIT_PAUSE_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
31c1f035 1709 0, // pulse_0_len_min: here: not used\r
1710 0, // pulse_0_len_max: here: not used\r
1711 0, // pause_0_len_min: here: not used\r
1712 0, // pause_0_len_max: here: not used\r
12948cf3 1713 RUWIDO_ADDRESS_OFFSET, // address_offset: address offset\r
1714 RUWIDO_ADDRESS_OFFSET + RUWIDO_ADDRESS_LEN, // address_end: end of address\r
1715 RUWIDO_COMMAND_OFFSET, // command_offset: command offset\r
1716 RUWIDO_COMMAND_OFFSET + RUWIDO_COMMAND_LEN, // command_end: end of command\r
1717 SIEMENS_COMPLETE_DATA_LEN, // complete_len: complete length of frame, here: SIEMENS instead of RUWIDO!\r
1718 SIEMENS_OR_RUWIDO_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1719 SIEMENS_OR_RUWIDO_LSB, // lsb_first: flag: LSB first\r
1720 SIEMENS_OR_RUWIDO_FLAGS // flags: some flags\r
a7054daf 1721};\r
1722\r
1723#endif\r
1724\r
48664931 1725#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
b5ea7869 1726\r
63b94f48 1727static const PROGMEM IRMP_PARAMETER fdc_param =\r
b5ea7869 1728{\r
48664931 1729 IRMP_FDC_PROTOCOL, // protocol: ir protocol\r
1730 FDC_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1731 FDC_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1732 FDC_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1733 FDC_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1734 FDC_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1735 FDC_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1736 FDC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1737 FDC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1738 FDC_ADDRESS_OFFSET, // address_offset: address offset\r
1739 FDC_ADDRESS_OFFSET + FDC_ADDRESS_LEN, // address_end: end of address\r
1740 FDC_COMMAND_OFFSET, // command_offset: command offset\r
1741 FDC_COMMAND_OFFSET + FDC_COMMAND_LEN, // command_end: end of command\r
1742 FDC_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1743 FDC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1744 FDC_LSB, // lsb_first: flag: LSB first\r
1745 FDC_FLAGS // flags: some flags\r
b5ea7869 1746};\r
1747\r
1748#endif\r
1749\r
9e16d699 1750#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
1751\r
63b94f48 1752static const PROGMEM IRMP_PARAMETER rccar_param =\r
9e16d699 1753{\r
1754 IRMP_RCCAR_PROTOCOL, // protocol: ir protocol\r
1755 RCCAR_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1756 RCCAR_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1757 RCCAR_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1758 RCCAR_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1759 RCCAR_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1760 RCCAR_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1761 RCCAR_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1762 RCCAR_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1763 RCCAR_ADDRESS_OFFSET, // address_offset: address offset\r
1764 RCCAR_ADDRESS_OFFSET + RCCAR_ADDRESS_LEN, // address_end: end of address\r
1765 RCCAR_COMMAND_OFFSET, // command_offset: command offset\r
1766 RCCAR_COMMAND_OFFSET + RCCAR_COMMAND_LEN, // command_end: end of command\r
1767 RCCAR_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1768 RCCAR_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1769 RCCAR_LSB, // lsb_first: flag: LSB first\r
1770 RCCAR_FLAGS // flags: some flags\r
1771};\r
1772\r
1773#endif\r
1774\r
9405f84a 1775#if IRMP_SUPPORT_NIKON_PROTOCOL == 1\r
1776\r
63b94f48 1777static const PROGMEM IRMP_PARAMETER nikon_param =\r
9405f84a 1778{\r
1779 IRMP_NIKON_PROTOCOL, // protocol: ir protocol\r
1780 NIKON_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1781 NIKON_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1782 NIKON_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1783 NIKON_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1784 NIKON_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1785 NIKON_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1786 NIKON_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1787 NIKON_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1788 NIKON_ADDRESS_OFFSET, // address_offset: address offset\r
1789 NIKON_ADDRESS_OFFSET + NIKON_ADDRESS_LEN, // address_end: end of address\r
1790 NIKON_COMMAND_OFFSET, // command_offset: command offset\r
1791 NIKON_COMMAND_OFFSET + NIKON_COMMAND_LEN, // command_end: end of command\r
1792 NIKON_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1793 NIKON_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1794 NIKON_LSB, // lsb_first: flag: LSB first\r
1795 NIKON_FLAGS // flags: some flags\r
1796};\r
1797\r
1798#endif\r
1799\r
111d6191 1800#if IRMP_SUPPORT_KATHREIN_PROTOCOL == 1\r
1801\r
63b94f48 1802static const PROGMEM IRMP_PARAMETER kathrein_param =\r
111d6191 1803{\r
1804 IRMP_KATHREIN_PROTOCOL, // protocol: ir protocol\r
1805 KATHREIN_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1806 KATHREIN_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1807 KATHREIN_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1808 KATHREIN_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1809 KATHREIN_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1810 KATHREIN_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1811 KATHREIN_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1812 KATHREIN_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1813 KATHREIN_ADDRESS_OFFSET, // address_offset: address offset\r
1814 KATHREIN_ADDRESS_OFFSET + KATHREIN_ADDRESS_LEN, // address_end: end of address\r
1815 KATHREIN_COMMAND_OFFSET, // command_offset: command offset\r
1816 KATHREIN_COMMAND_OFFSET + KATHREIN_COMMAND_LEN, // command_end: end of command\r
1817 KATHREIN_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1818 KATHREIN_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1819 KATHREIN_LSB, // lsb_first: flag: LSB first\r
1820 KATHREIN_FLAGS // flags: some flags\r
1821};\r
1822\r
1823#endif\r
1824\r
deba2a0a 1825#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
1826\r
63b94f48 1827static const PROGMEM IRMP_PARAMETER netbox_param =\r
deba2a0a 1828{\r
1829 IRMP_NETBOX_PROTOCOL, // protocol: ir protocol\r
a42d1ee6 1830 NETBOX_PULSE_LEN, // pulse_1_len_min: minimum length of pulse with bit value 1, here: exact value\r
1831 NETBOX_PULSE_REST_LEN, // pulse_1_len_max: maximum length of pulse with bit value 1, here: rest value\r
1832 NETBOX_PAUSE_LEN, // pause_1_len_min: minimum length of pause with bit value 1, here: exact value\r
1833 NETBOX_PAUSE_REST_LEN, // pause_1_len_max: maximum length of pause with bit value 1, here: rest value\r
1834 NETBOX_PULSE_LEN, // pulse_0_len_min: minimum length of pulse with bit value 0, here: exact value\r
1835 NETBOX_PULSE_REST_LEN, // pulse_0_len_max: maximum length of pulse with bit value 0, here: rest value\r
1836 NETBOX_PAUSE_LEN, // pause_0_len_min: minimum length of pause with bit value 0, here: exact value\r
1837 NETBOX_PAUSE_REST_LEN, // pause_0_len_max: maximum length of pause with bit value 0, here: rest value\r
deba2a0a 1838 NETBOX_ADDRESS_OFFSET, // address_offset: address offset\r
1839 NETBOX_ADDRESS_OFFSET + NETBOX_ADDRESS_LEN, // address_end: end of address\r
1840 NETBOX_COMMAND_OFFSET, // command_offset: command offset\r
1841 NETBOX_COMMAND_OFFSET + NETBOX_COMMAND_LEN, // command_end: end of command\r
1842 NETBOX_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1843 NETBOX_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1844 NETBOX_LSB, // lsb_first: flag: LSB first\r
1845 NETBOX_FLAGS // flags: some flags\r
1846};\r
1847\r
1848#endif\r
1849\r
f50e01e7 1850#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
1851\r
63b94f48 1852static const PROGMEM IRMP_PARAMETER lego_param =\r
f50e01e7 1853{\r
1854 IRMP_LEGO_PROTOCOL, // protocol: ir protocol\r
1855 LEGO_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1856 LEGO_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1857 LEGO_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1858 LEGO_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1859 LEGO_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1860 LEGO_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1861 LEGO_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1862 LEGO_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1863 LEGO_ADDRESS_OFFSET, // address_offset: address offset\r
1864 LEGO_ADDRESS_OFFSET + LEGO_ADDRESS_LEN, // address_end: end of address\r
1865 LEGO_COMMAND_OFFSET, // command_offset: command offset\r
1866 LEGO_COMMAND_OFFSET + LEGO_COMMAND_LEN, // command_end: end of command\r
1867 LEGO_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1868 LEGO_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1869 LEGO_LSB, // lsb_first: flag: LSB first\r
1870 LEGO_FLAGS // flags: some flags\r
1871};\r
1872\r
1873#endif\r
1874\r
beda975f 1875#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
1876\r
63b94f48 1877static const PROGMEM IRMP_PARAMETER thomson_param =\r
beda975f 1878{\r
1879 IRMP_THOMSON_PROTOCOL, // protocol: ir protocol\r
1880 THOMSON_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1881 THOMSON_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1882 THOMSON_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1883 THOMSON_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1884 THOMSON_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1885 THOMSON_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1886 THOMSON_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1887 THOMSON_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1888 THOMSON_ADDRESS_OFFSET, // address_offset: address offset\r
1889 THOMSON_ADDRESS_OFFSET + THOMSON_ADDRESS_LEN, // address_end: end of address\r
1890 THOMSON_COMMAND_OFFSET, // command_offset: command offset\r
1891 THOMSON_COMMAND_OFFSET + THOMSON_COMMAND_LEN, // command_end: end of command\r
1892 THOMSON_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1893 THOMSON_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1894 THOMSON_LSB, // lsb_first: flag: LSB first\r
1895 THOMSON_FLAGS // flags: some flags\r
1896};\r
1897\r
1898#endif\r
1899\r
3a7e26e1 1900#if IRMP_SUPPORT_BOSE_PROTOCOL == 1\r
1901\r
1902static const PROGMEM IRMP_PARAMETER bose_param =\r
1903{\r
1904 IRMP_BOSE_PROTOCOL, // protocol: ir protocol\r
1905 BOSE_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
1906 BOSE_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
1907 BOSE_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
1908 BOSE_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1909 BOSE_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
1910 BOSE_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1911 BOSE_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
1912 BOSE_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
1913 BOSE_ADDRESS_OFFSET, // address_offset: address offset\r
1914 BOSE_ADDRESS_OFFSET + BOSE_ADDRESS_LEN, // address_end: end of address\r
1915 BOSE_COMMAND_OFFSET, // command_offset: command offset\r
1916 BOSE_COMMAND_OFFSET + BOSE_COMMAND_LEN, // command_end: end of command\r
1917 BOSE_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1918 BOSE_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1919 BOSE_LSB, // lsb_first: flag: LSB first\r
1920 BOSE_FLAGS // flags: some flags\r
1921};\r
1922\r
1923#endif\r
1924\r
2fb27bfe 1925#if IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1\r
1926\r
1927static const PROGMEM IRMP_PARAMETER a1tvbox_param =\r
1928{\r
1929 IRMP_A1TVBOX_PROTOCOL, // protocol: ir protocol\r
1930\r
1931 A1TVBOX_BIT_PULSE_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1932 A1TVBOX_BIT_PULSE_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1933 A1TVBOX_BIT_PAUSE_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1934 A1TVBOX_BIT_PAUSE_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
1935 0, // pulse_0_len_min: here: not used\r
1936 0, // pulse_0_len_max: here: not used\r
1937 0, // pause_0_len_min: here: not used\r
1938 0, // pause_0_len_max: here: not used\r
1939 A1TVBOX_ADDRESS_OFFSET, // address_offset: address offset\r
1940 A1TVBOX_ADDRESS_OFFSET + A1TVBOX_ADDRESS_LEN, // address_end: end of address\r
1941 A1TVBOX_COMMAND_OFFSET, // command_offset: command offset\r
1942 A1TVBOX_COMMAND_OFFSET + A1TVBOX_COMMAND_LEN, // command_end: end of command\r
1943 A1TVBOX_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1944 A1TVBOX_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1945 A1TVBOX_LSB, // lsb_first: flag: LSB first\r
1946 A1TVBOX_FLAGS // flags: some flags\r
1947};\r
1948\r
1949#endif\r
1950\r
0715cf5e 1951#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
1952\r
1953static const PROGMEM IRMP_PARAMETER merlin_param =\r
1954{\r
1955 IRMP_MERLIN_PROTOCOL, // protocol: ir protocol\r
1956\r
1957 MERLIN_BIT_PULSE_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1958 MERLIN_BIT_PULSE_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1959 MERLIN_BIT_PAUSE_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1960 MERLIN_BIT_PAUSE_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
1961 0, // pulse_0_len_min: here: not used\r
1962 0, // pulse_0_len_max: here: not used\r
1963 0, // pause_0_len_min: here: not used\r
1964 0, // pause_0_len_max: here: not used\r
1965 MERLIN_ADDRESS_OFFSET, // address_offset: address offset\r
1966 MERLIN_ADDRESS_OFFSET + MERLIN_ADDRESS_LEN, // address_end: end of address\r
1967 MERLIN_COMMAND_OFFSET, // command_offset: command offset\r
1968 MERLIN_COMMAND_OFFSET + MERLIN_COMMAND_LEN, // command_end: end of command\r
1969 MERLIN_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1970 MERLIN_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1971 MERLIN_LSB, // lsb_first: flag: LSB first\r
1972 MERLIN_FLAGS // flags: some flags\r
1973};\r
1974\r
1975#endif\r
1976\r
b85cb27d 1977#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
1978\r
1979static const PROGMEM IRMP_PARAMETER ortek_param =\r
1980{\r
1981 IRMP_ORTEK_PROTOCOL, // protocol: ir protocol\r
1982\r
1983 ORTEK_BIT_PULSE_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
1984 ORTEK_BIT_PULSE_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
1985 ORTEK_BIT_PAUSE_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
1986 ORTEK_BIT_PAUSE_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
1987 0, // pulse_0_len_min: here: not used\r
1988 0, // pulse_0_len_max: here: not used\r
1989 0, // pause_0_len_min: here: not used\r
1990 0, // pause_0_len_max: here: not used\r
1991 ORTEK_ADDRESS_OFFSET, // address_offset: address offset\r
1992 ORTEK_ADDRESS_OFFSET + ORTEK_ADDRESS_LEN, // address_end: end of address\r
1993 ORTEK_COMMAND_OFFSET, // command_offset: command offset\r
1994 ORTEK_COMMAND_OFFSET + ORTEK_COMMAND_LEN, // command_end: end of command\r
1995 ORTEK_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
1996 ORTEK_STOP_BIT, // stop_bit: flag: frame has stop bit\r
1997 ORTEK_LSB, // lsb_first: flag: LSB first\r
1998 ORTEK_FLAGS // flags: some flags\r
1999};\r
2000\r
2001#endif\r
2002\r
40ca4604 2003#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1\r
2004\r
2005static const PROGMEM IRMP_PARAMETER roomba_param =\r
2006{\r
2007 IRMP_ROOMBA_PROTOCOL, // protocol: ir protocol\r
2008 ROOMBA_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
2009 ROOMBA_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
2010 ROOMBA_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
2011 ROOMBA_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
2012 ROOMBA_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
2013 ROOMBA_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
2014 ROOMBA_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
2015 ROOMBA_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
2016 ROOMBA_ADDRESS_OFFSET, // address_offset: address offset\r
2017 ROOMBA_ADDRESS_OFFSET + ROOMBA_ADDRESS_LEN, // address_end: end of address\r
2018 ROOMBA_COMMAND_OFFSET, // command_offset: command offset\r
2019 ROOMBA_COMMAND_OFFSET + ROOMBA_COMMAND_LEN, // command_end: end of command\r
2020 ROOMBA_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
2021 ROOMBA_STOP_BIT, // stop_bit: flag: frame has stop bit\r
2022 ROOMBA_LSB, // lsb_first: flag: LSB first\r
2023 ROOMBA_FLAGS // flags: some flags\r
2024};\r
2025\r
2026#endif\r
2027\r
cb93f9e9 2028#if IRMP_SUPPORT_RCMM_PROTOCOL == 1\r
2029\r
2030static const PROGMEM IRMP_PARAMETER rcmm_param =\r
2031{\r
faf6479d 2032 IRMP_RCMM32_PROTOCOL, // protocol: ir protocol\r
0834784c 2033\r
faf6479d 2034 RCMM32_BIT_PULSE_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
2035 RCMM32_BIT_PULSE_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
cb93f9e9 2036 0, // pause_1_len_min: here: minimum length of short pause\r
2037 0, // pause_1_len_max: here: maximum length of short pause\r
faf6479d 2038 RCMM32_BIT_PULSE_LEN_MIN, // pulse_0_len_min: here: not used\r
2039 RCMM32_BIT_PULSE_LEN_MAX, // pulse_0_len_max: here: not used\r
cb93f9e9 2040 0, // pause_0_len_min: here: not used\r
2041 0, // pause_0_len_max: here: not used\r
faf6479d 2042 RCMM32_ADDRESS_OFFSET, // address_offset: address offset\r
2043 RCMM32_ADDRESS_OFFSET + RCMM32_ADDRESS_LEN, // address_end: end of address\r
2044 RCMM32_COMMAND_OFFSET, // command_offset: command offset\r
2045 RCMM32_COMMAND_OFFSET + RCMM32_COMMAND_LEN, // command_end: end of command\r
2046 RCMM32_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
2047 RCMM32_STOP_BIT, // stop_bit: flag: frame has stop bit\r
2048 RCMM32_LSB, // lsb_first: flag: LSB first\r
2049 RCMM32_FLAGS // flags: some flags\r
2050};\r
2051\r
2052#endif\r
2053\r
003c1008 2054#if IRMP_SUPPORT_PENTAX_PROTOCOL == 1\r
2055\r
2056static const PROGMEM IRMP_PARAMETER pentax_param =\r
2057{\r
2058 IRMP_PENTAX_PROTOCOL, // protocol: ir protocol\r
2059 PENTAX_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
2060 PENTAX_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
2061 PENTAX_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
2062 PENTAX_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
2063 PENTAX_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
2064 PENTAX_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
2065 PENTAX_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
2066 PENTAX_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
2067 PENTAX_ADDRESS_OFFSET, // address_offset: address offset\r
2068 PENTAX_ADDRESS_OFFSET + PENTAX_ADDRESS_LEN, // address_end: end of address\r
2069 PENTAX_COMMAND_OFFSET, // command_offset: command offset\r
2070 PENTAX_COMMAND_OFFSET + PENTAX_COMMAND_LEN, // command_end: end of command\r
2071 PENTAX_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
2072 PENTAX_STOP_BIT, // stop_bit: flag: frame has stop bit\r
2073 PENTAX_LSB, // lsb_first: flag: LSB first\r
2074 PENTAX_FLAGS // flags: some flags\r
2075};\r
2076\r
2077#endif\r
2078\r
43c535be 2079#if IRMP_SUPPORT_ACP24_PROTOCOL == 1\r
2080\r
2081static const PROGMEM IRMP_PARAMETER acp24_param =\r
2082{\r
2083 IRMP_ACP24_PROTOCOL, // protocol: ir protocol\r
2084 ACP24_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
2085 ACP24_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
2086 ACP24_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
2087 ACP24_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
2088 ACP24_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
2089 ACP24_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
2090 ACP24_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
2091 ACP24_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
2092 ACP24_ADDRESS_OFFSET, // address_offset: address offset\r
2093 ACP24_ADDRESS_OFFSET + ACP24_ADDRESS_LEN, // address_end: end of address\r
2094 ACP24_COMMAND_OFFSET, // command_offset: command offset\r
2095 ACP24_COMMAND_OFFSET + ACP24_COMMAND_LEN, // command_end: end of command\r
2096 ACP24_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
2097 ACP24_STOP_BIT, // stop_bit: flag: frame has stop bit\r
2098 ACP24_LSB, // lsb_first: flag: LSB first\r
2099 ACP24_FLAGS // flags: some flags\r
2100};\r
2101\r
2102#endif\r
2103\r
faf6479d 2104#if IRMP_SUPPORT_RADIO1_PROTOCOL == 1\r
2105\r
2106static const PROGMEM IRMP_PARAMETER radio1_param =\r
2107{\r
2108 IRMP_RADIO1_PROTOCOL, // protocol: ir protocol\r
0834784c 2109\r
faf6479d 2110 RADIO1_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
2111 RADIO1_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
2112 RADIO1_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
2113 RADIO1_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
2114 RADIO1_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
2115 RADIO1_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
2116 RADIO1_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
2117 RADIO1_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
2118 RADIO1_ADDRESS_OFFSET, // address_offset: address offset\r
2119 RADIO1_ADDRESS_OFFSET + RADIO1_ADDRESS_LEN, // address_end: end of address\r
2120 RADIO1_COMMAND_OFFSET, // command_offset: command offset\r
2121 RADIO1_COMMAND_OFFSET + RADIO1_COMMAND_LEN, // command_end: end of command\r
2122 RADIO1_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
2123 RADIO1_STOP_BIT, // stop_bit: flag: frame has stop bit\r
2124 RADIO1_LSB, // lsb_first: flag: LSB first\r
2125 RADIO1_FLAGS // flags: some flags\r
cb93f9e9 2126};\r
2127\r
2128#endif\r
2129\r
c2b70f0b 2130static uint_fast8_t irmp_bit; // current bit position\r
2131static IRMP_PARAMETER irmp_param;\r
4225a882 2132\r
6f750020 2133#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
c2b70f0b 2134static IRMP_PARAMETER irmp_param2;\r
6f750020 2135#endif\r
2136\r
ea29682a 2137static volatile uint_fast8_t irmp_ir_detected = FALSE;\r
2138static volatile uint_fast8_t irmp_protocol;\r
2139static volatile uint_fast16_t irmp_address;\r
2140static volatile uint_fast16_t irmp_command;\r
2141static volatile uint_fast16_t irmp_id; // only used for SAMSUNG protocol\r
2142static volatile uint_fast8_t irmp_flags;\r
2143// static volatile uint_fast8_t irmp_busy_flag;\r
2144\r
2145#if defined(__MBED__)\r
2146// DigitalIn inputPin(IRMP_PIN, PullUp); // this requires mbed.h and source to be compiled as cpp\r
2147gpio_t gpioIRin; // use low level c function instead\r
2148#endif\r
2149\r
4225a882 2150\r
48664931 2151#ifdef ANALYZE\r
ea29682a 2152#define input(x) (x)\r
2153static uint_fast8_t IRMP_PIN;\r
2154static uint_fast8_t radio;\r
4225a882 2155#endif\r
2156\r
2157/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2158 * Initialize IRMP decoder\r
2159 * @details Configures IRMP input pin\r
2160 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
2161 */\r
48664931 2162#ifndef ANALYZE\r
4225a882 2163void\r
2164irmp_init (void)\r
2165{\r
08f2dd9d 2166#if defined(PIC_CCS) || defined(PIC_C18) // PIC: do nothing\r
2167#elif defined (ARM_STM32) // STM32\r
95b27043 2168 GPIO_InitTypeDef GPIO_InitStructure;\r
2169\r
2170 /* GPIOx clock enable */\r
2171# if defined (ARM_STM32L1XX)\r
2172 RCC_AHBPeriphClockCmd(IRMP_PORT_RCC, ENABLE);\r
2173# elif defined (ARM_STM32F10X)\r
2174 RCC_APB2PeriphClockCmd(IRMP_PORT_RCC, ENABLE);\r
2175# elif defined (ARM_STM32F4XX)\r
2176 RCC_AHB1PeriphClockCmd(IRMP_PORT_RCC, ENABLE);\r
2177# endif\r
2178\r
2179 /* GPIO Configuration */\r
2180 GPIO_InitStructure.GPIO_Pin = IRMP_BIT;\r
2181# if defined (ARM_STM32L1XX) || defined (ARM_STM32F4XX)\r
2182 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
2183 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;\r
2184 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
2185 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
2186# elif defined (ARM_STM32F10X)\r
2187 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;\r
2188 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;\r
2189# endif\r
2190 GPIO_Init(IRMP_PORT, &GPIO_InitStructure);\r
2191\r
a8915151 2192#elif defined (LIBOPENCM3) // STM32 with libopencm3\r
4d08a2f7
L
2193\r
2194 /* GPIOx clock enable */\r
2195 rcc_periph_clock_enable(IRMP_PORT_RCC);\r
4d08a2f7 2196 /* GPIO Configuration */\r
a8915151 2197 gpio_set_mode(IRMP_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, IRMP_BIT);\r
4d08a2f7 2198\r
afd1e690 2199#elif defined(STELLARIS_ARM_CORTEX_M4)\r
95b27043 2200 // Enable the GPIO port\r
2201 ROM_SysCtlPeripheralEnable(IRMP_PORT_PERIPH);\r
2202\r
2203 // Set as an input\r
2204 ROM_GPIODirModeSet(IRMP_PORT_BASE, IRMP_PORT_PIN, GPIO_DIR_MODE_IN);\r
2205 ROM_GPIOPadConfigSet(IRMP_PORT_BASE, IRMP_PORT_PIN, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);\r
2206\r
aa276d72 2207#elif defined(__SDCC_stm8) // STM8\r
aa276d72 2208 IRMP_GPIO_STRUCT->DDR &= ~(1<<IRMP_BIT); // pin is input\r
95b27043 2209 IRMP_GPIO_STRUCT->CR1 |= (1<<IRMP_BIT); // activate pullup\r
2210\r
df24bb50 2211#elif defined (TEENSY_ARM_CORTEX_M4) // TEENSY\r
95b27043 2212 pinMode(IRMP_PIN, INPUT);\r
2213\r
ea29682a 2214#elif defined(__xtensa__) // ESP8266\r
30d1689d 2215 pinMode(IRMP_BIT_NUMBER, INPUT);\r
ea29682a 2216 // select pin function\r
2217# if (IRMP_BIT_NUMBER == 12)\r
2218 PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);\r
2219// doesn't work for me:\r
2220// # elif (IRMP_BIT_NUMBER == 13)\r
2221// PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U , FUNC_GPIO13);\r
2222# else\r
2223# warning Please add PIN_FUNC_SELECT when necessary.\r
2224# endif\r
2225 GPIO_DIS_OUTPUT(IRMP_BIT_NUMBER);\r
2226\r
2227#elif defined(__MBED__)\r
2228 gpio_init_in_ex(&gpioIRin, IRMP_PIN, IRMP_PINMODE); // initialize input for IR diode\r
2229\r
08f2dd9d 2230#else // AVR\r
d155e9ab 2231 IRMP_PORT &= ~(1<<IRMP_BIT); // deactivate pullup\r
2232 IRMP_DDR &= ~(1<<IRMP_BIT); // set pin to input\r
93ba2e01 2233#endif\r
4225a882 2234\r
2235#if IRMP_LOGGING == 1\r
2236 irmp_uart_init ();\r
2237#endif\r
2238}\r
2239#endif\r
2240/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2241 * Get IRMP data\r
2242 * @details gets decoded IRMP data\r
2243 * @param pointer in order to store IRMP data\r
2244 * @return TRUE: successful, FALSE: failed\r
2245 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
2246 */\r
716f8772 2247uint_fast8_t\r
4225a882 2248irmp_get_data (IRMP_DATA * irmp_data_p)\r
2249{\r
0834784c 2250 uint_fast8_t rtc = FALSE;\r
4225a882 2251\r
2252 if (irmp_ir_detected)\r
2253 {\r
df24bb50 2254 switch (irmp_protocol)\r
2255 {\r
4225a882 2256#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
df24bb50 2257 case IRMP_SAMSUNG_PROTOCOL:\r
2258 if ((irmp_command >> 8) == (~irmp_command & 0x00FF))\r
2259 {\r
2260 irmp_command &= 0xff;\r
2261 irmp_command |= irmp_id << 8;\r
2262 rtc = TRUE;\r
2263 }\r
2264 break;\r
956ea3ea 2265\r
2266#if IRMP_SUPPORT_SAMSUNG48_PROTOCOL == 1\r
df24bb50 2267 case IRMP_SAMSUNG48_PROTOCOL:\r
2268 irmp_command = (irmp_command & 0x00FF) | ((irmp_id & 0x00FF) << 8);\r
2269 rtc = TRUE;\r
2270 break;\r
956ea3ea 2271#endif\r
4225a882 2272#endif\r
956ea3ea 2273\r
4225a882 2274#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
df24bb50 2275 case IRMP_NEC_PROTOCOL:\r
2276 if ((irmp_command >> 8) == (~irmp_command & 0x00FF))\r
2277 {\r
2278 irmp_command &= 0xff;\r
2279 rtc = TRUE;\r
2280 }\r
2281 else if (irmp_address == 0x87EE)\r
2282 {\r
2283#ifdef ANALYZE\r
2284 ANALYZE_PRINTF ("Switching to APPLE protocol\n");\r
2285#endif // ANALYZE\r
2286 irmp_protocol = IRMP_APPLE_PROTOCOL;\r
2287 irmp_address = (irmp_command & 0xFF00) >> 8;\r
2288 irmp_command &= 0x00FF;\r
2289 rtc = TRUE;\r
2290 }\r
2291 break;\r
48664931 2292#endif\r
4bcf310e 2293\r
2294\r
2295#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
2296 case IRMP_VINCENT_PROTOCOL:\r
2297 if ((irmp_command >> 8) == (irmp_command & 0x00FF))\r
2298 {\r
2299 irmp_command &= 0xff;\r
2300 rtc = TRUE;\r
2301 }\r
2302 break;\r
2303#endif\r
2304\r
3a7e26e1 2305#if IRMP_SUPPORT_BOSE_PROTOCOL == 1\r
df24bb50 2306 case IRMP_BOSE_PROTOCOL:\r
2307 if ((irmp_command >> 8) == (~irmp_command & 0x00FF))\r
2308 {\r
2309 irmp_command &= 0xff;\r
2310 rtc = TRUE;\r
2311 }\r
2312 break;\r
3a7e26e1 2313#endif\r
12948cf3 2314#if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
df24bb50 2315 case IRMP_SIEMENS_PROTOCOL:\r
2316 case IRMP_RUWIDO_PROTOCOL:\r
2317 if (((irmp_command >> 1) & 0x0001) == (~irmp_command & 0x0001))\r
2318 {\r
2319 irmp_command >>= 1;\r
2320 rtc = TRUE;\r
2321 }\r
2322 break;\r
9405f84a 2323#endif\r
111d6191 2324#if IRMP_SUPPORT_KATHREIN_PROTOCOL == 1\r
df24bb50 2325 case IRMP_KATHREIN_PROTOCOL:\r
2326 if (irmp_command != 0x0000)\r
2327 {\r
2328 rtc = TRUE;\r
2329 }\r
2330 break;\r
111d6191 2331#endif\r
03780b34 2332#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
df24bb50 2333 case IRMP_RC5_PROTOCOL:\r
2334 irmp_address &= ~0x20; // clear toggle bit\r
2335 rtc = TRUE;\r
2336 break;\r
03780b34 2337#endif\r
c2b70f0b 2338#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
df24bb50 2339 case IRMP_S100_PROTOCOL:\r
2340 irmp_address &= ~0x20; // clear toggle bit\r
2341 rtc = TRUE;\r
2342 break;\r
c2b70f0b 2343#endif\r
89e8cafb 2344#if IRMP_SUPPORT_IR60_PROTOCOL == 1\r
df24bb50 2345 case IRMP_IR60_PROTOCOL:\r
2346 if (irmp_command != 0x007d) // 0x007d (== 62<<1 + 1) is start instruction frame\r
2347 {\r
2348 rtc = TRUE;\r
2349 }\r
2350 else\r
2351 {\r
2352#ifdef ANALYZE\r
2353 ANALYZE_PRINTF("Info IR60: got start instruction frame\n");\r
2354#endif // ANALYZE\r
2355 }\r
2356 break;\r
89e8cafb 2357#endif\r
48664931 2358#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
df24bb50 2359 case IRMP_RCCAR_PROTOCOL:\r
2360 // frame in irmp_data:\r
2361 // Bit 12 11 10 9 8 7 6 5 4 3 2 1 0\r
2362 // V D7 D6 D5 D4 D3 D2 D1 D0 A1 A0 C1 C0 // 10 9 8 7 6 5 4 3 2 1 0\r
2363 irmp_address = (irmp_command & 0x000C) >> 2; // addr: 0 0 0 0 0 0 0 0 0 A1 A0\r
2364 irmp_command = ((irmp_command & 0x1000) >> 2) | // V-Bit: V 0 0 0 0 0 0 0 0 0 0\r
2365 ((irmp_command & 0x0003) << 8) | // C-Bits: 0 C1 C0 0 0 0 0 0 0 0 0\r
2366 ((irmp_command & 0x0FF0) >> 4); // D-Bits: D7 D6 D5 D4 D3 D2 D1 D0\r
2367 rtc = TRUE; // Summe: V C1 C0 D7 D6 D5 D4 D3 D2 D1 D0\r
2368 break;\r
4225a882 2369#endif\r
beda975f 2370\r
2371#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1 // squeeze code to 8 bit, upper bit indicates release-key\r
df24bb50 2372 case IRMP_NETBOX_PROTOCOL:\r
2373 if (irmp_command & 0x1000) // last bit set?\r
2374 {\r
2375 if ((irmp_command & 0x1f) == 0x15) // key pressed: 101 01 (LSB)\r
2376 {\r
2377 irmp_command >>= 5;\r
2378 irmp_command &= 0x7F;\r
2379 rtc = TRUE;\r
2380 }\r
2381 else if ((irmp_command & 0x1f) == 0x10) // key released: 000 01 (LSB)\r
2382 {\r
2383 irmp_command >>= 5;\r
2384 irmp_command |= 0x80;\r
2385 rtc = TRUE;\r
2386 }\r
2387 else\r
2388 {\r
2389#ifdef ANALYZE\r
2390 ANALYZE_PRINTF("error NETBOX: bit6/7 must be 0/1\n");\r
2391#endif // ANALYZE\r
2392 }\r
2393 }\r
2394 else\r
2395 {\r
2396#ifdef ANALYZE\r
2397 ANALYZE_PRINTF("error NETBOX: last bit not set\n");\r
2398#endif // ANALYZE\r
2399 }\r
2400 break;\r
deba2a0a 2401#endif\r
f50e01e7 2402#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
df24bb50 2403 case IRMP_LEGO_PROTOCOL:\r
2404 {\r
2405 uint_fast8_t crc = 0x0F ^ ((irmp_command & 0xF000) >> 12) ^ ((irmp_command & 0x0F00) >> 8) ^ ((irmp_command & 0x00F0) >> 4);\r
2406\r
2407 if ((irmp_command & 0x000F) == crc)\r
2408 {\r
2409 irmp_command >>= 4;\r
2410 rtc = TRUE;\r
2411 }\r
2412 else\r
2413 {\r
2414#ifdef ANALYZE\r
2415 ANALYZE_PRINTF ("CRC error in LEGO protocol\n");\r
2416#endif // ANALYZE\r
2417 // rtc = TRUE; // don't accept codes with CRC errors\r
2418 }\r
2419 break;\r
2420 }\r
f50e01e7 2421#endif\r
cb93f9e9 2422\r
df24bb50 2423 default:\r
2424 {\r
2425 rtc = TRUE;\r
2426 break;\r
2427 }\r
2428 }\r
2429\r
2430 if (rtc)\r
2431 {\r
2432 irmp_data_p->protocol = irmp_protocol;\r
2433 irmp_data_p->address = irmp_address;\r
2434 irmp_data_p->command = irmp_command;\r
2435 irmp_data_p->flags = irmp_flags;\r
2436 irmp_command = 0;\r
2437 irmp_address = 0;\r
2438 irmp_flags = 0;\r
2439 }\r
2440\r
2441 irmp_ir_detected = FALSE;\r
4225a882 2442 }\r
2443\r
2444 return rtc;\r
2445}\r
2446\r
7644ac04 2447#if IRMP_USE_CALLBACK == 1\r
2448void\r
0834784c 2449irmp_set_callback_ptr (void (*cb)(uint_fast8_t))\r
7644ac04 2450{\r
2451 irmp_callback_ptr = cb;\r
2452}\r
2453#endif // IRMP_USE_CALLBACK == 1\r
2454\r
4225a882 2455// these statics must not be volatile, because they are only used by irmp_store_bit(), which is called by irmp_ISR()\r
0834784c 2456static uint_fast16_t irmp_tmp_address; // ir address\r
2457static uint_fast16_t irmp_tmp_command; // ir command\r
6f750020 2458\r
956ea3ea 2459#if (IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)) || IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
0834784c 2460static uint_fast16_t irmp_tmp_address2; // ir address\r
2461static uint_fast16_t irmp_tmp_command2; // ir command\r
6f750020 2462#endif\r
2463\r
69da6090 2464#if IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
0834784c 2465static uint_fast16_t irmp_lgair_address; // ir address\r
2466static uint_fast16_t irmp_lgair_command; // ir command\r
69da6090 2467#endif\r
2468\r
4225a882 2469#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
0834784c 2470static uint_fast16_t irmp_tmp_id; // ir id (only SAMSUNG)\r
770a1a9d 2471#endif\r
2472#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
0834784c 2473static uint8_t xor_check[6]; // check kaseikyo "parity" bits\r
2474static uint_fast8_t genre2; // save genre2 bits here, later copied to MSB in flags\r
4225a882 2475#endif\r
2476\r
40ca4604 2477#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
0834784c 2478static uint_fast8_t parity; // number of '1' of the first 14 bits, check if even.\r
40ca4604 2479#endif\r
2480\r
7365350c 2481#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
2482static uint_fast8_t check; // number of '1' of the first 14 bits, check if even.\r
2483static uint_fast8_t mitsu_parity; // number of '1' of the first 14 bits, check if even.\r
2484#endif\r
2485\r
4225a882 2486/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2487 * store bit\r
2488 * @details store bit in temp address or temp command\r
2489 * @param value to store: 0 or 1\r
2490 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
2491 */\r
d823e852 2492// verhindert, dass irmp_store_bit() inline compiliert wird:\r
0834784c 2493// static void irmp_store_bit (uint_fast8_t) __attribute__ ((noinline));\r
d823e852 2494\r
4225a882 2495static void\r
0834784c 2496irmp_store_bit (uint_fast8_t value)\r
4225a882 2497{\r
43c535be 2498#if IRMP_SUPPORT_ACP24_PROTOCOL == 1\r
2499 if (irmp_param.protocol == IRMP_ACP24_PROTOCOL) // squeeze 64 bits into 16 bits:\r
2500 {\r
df24bb50 2501 if (value)\r
2502 {\r
2503 // ACP24-Frame:\r
2504 // 1 2 3 4 5 6\r
2505 // 0123456789012345678901234567890123456789012345678901234567890123456789\r
2506 // N VVMMM ? ??? t vmA x y TTTT\r
2507 //\r
2508 // irmp_data_p->command:\r
2509 //\r
2510 // 5432109876543210\r
2511 // NAVVvMMMmtxyTTTT\r
2512\r
2513 switch (irmp_bit)\r
2514 {\r
2515 case 0: irmp_tmp_command |= (1<<15); break; // N\r
2516 case 2: irmp_tmp_command |= (1<<13); break; // V\r
2517 case 3: irmp_tmp_command |= (1<<12); break; // V\r
2518 case 4: irmp_tmp_command |= (1<<10); break; // M\r
2519 case 5: irmp_tmp_command |= (1<< 9); break; // M\r
2520 case 6: irmp_tmp_command |= (1<< 8); break; // M\r
2521 case 20: irmp_tmp_command |= (1<< 6); break; // t\r
2522 case 22: irmp_tmp_command |= (1<<11); break; // v\r
2523 case 23: irmp_tmp_command |= (1<< 7); break; // m\r
2524 case 24: irmp_tmp_command |= (1<<14); break; // A\r
2525 case 26: irmp_tmp_command |= (1<< 5); break; // x\r
2526 case 44: irmp_tmp_command |= (1<< 4); break; // y\r
2527 case 66: irmp_tmp_command |= (1<< 3); break; // T\r
2528 case 67: irmp_tmp_command |= (1<< 2); break; // T\r
2529 case 68: irmp_tmp_command |= (1<< 1); break; // T\r
2530 case 69: irmp_tmp_command |= (1<< 0); break; // T\r
2531 }\r
2532 }\r
43c535be 2533 }\r
2534 else\r
2535#endif // IRMP_SUPPORT_ACP24_PROTOCOL\r
2536\r
40ca4604 2537#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
2538 if (irmp_param.protocol == IRMP_ORTEK_PROTOCOL)\r
2539 {\r
df24bb50 2540 if (irmp_bit < 14)\r
2541 {\r
2542 if (value)\r
2543 {\r
2544 parity++;\r
2545 }\r
2546 }\r
2547 else if (irmp_bit == 14)\r
2548 {\r
2549 if (value) // value == 1: even parity\r
2550 {\r
2551 if (parity & 0x01)\r
2552 {\r
2553 parity = PARITY_CHECK_FAILED;\r
2554 }\r
2555 else\r
2556 {\r
2557 parity = PARITY_CHECK_OK;\r
2558 }\r
2559 }\r
2560 else\r
2561 {\r
2562 if (parity & 0x01) // value == 0: odd parity\r
2563 {\r
2564 parity = PARITY_CHECK_OK;\r
2565 }\r
2566 else\r
2567 {\r
2568 parity = PARITY_CHECK_FAILED;\r
2569 }\r
2570 }\r
2571 }\r
40ca4604 2572 }\r
43c535be 2573 else\r
40ca4604 2574#endif\r
43c535be 2575 {\r
df24bb50 2576 ;\r
43c535be 2577 }\r
40ca4604 2578\r
89e8cafb 2579#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
2580 if (irmp_bit == 0 && irmp_param.protocol == IRMP_GRUNDIG_PROTOCOL)\r
2581 {\r
df24bb50 2582 first_bit = value;\r
89e8cafb 2583 }\r
2584 else\r
2585#endif\r
770a1a9d 2586\r
4225a882 2587 if (irmp_bit >= irmp_param.address_offset && irmp_bit < irmp_param.address_end)\r
2588 {\r
df24bb50 2589 if (irmp_param.lsb_first)\r
2590 {\r
2591 irmp_tmp_address |= (((uint_fast16_t) (value)) << (irmp_bit - irmp_param.address_offset)); // CV wants cast\r
2592 }\r
2593 else\r
2594 {\r
2595 irmp_tmp_address <<= 1;\r
2596 irmp_tmp_address |= value;\r
2597 }\r
4225a882 2598 }\r
2599 else if (irmp_bit >= irmp_param.command_offset && irmp_bit < irmp_param.command_end)\r
2600 {\r
df24bb50 2601 if (irmp_param.lsb_first)\r
2602 {\r
956ea3ea 2603#if IRMP_SUPPORT_SAMSUNG48_PROTOCOL == 1\r
df24bb50 2604 if (irmp_param.protocol == IRMP_SAMSUNG48_PROTOCOL && irmp_bit >= 32)\r
2605 {\r
2606 irmp_tmp_id |= (((uint_fast16_t) (value)) << (irmp_bit - 32)); // CV wants cast\r
2607 }\r
2608 else\r
956ea3ea 2609#endif\r
df24bb50 2610 {\r
2611 irmp_tmp_command |= (((uint_fast16_t) (value)) << (irmp_bit - irmp_param.command_offset)); // CV wants cast\r
2612 }\r
2613 }\r
2614 else\r
2615 {\r
2616 irmp_tmp_command <<= 1;\r
2617 irmp_tmp_command |= value;\r
2618 }\r
4225a882 2619 }\r
770a1a9d 2620\r
69da6090 2621#if IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
2622 if (irmp_param.protocol == IRMP_NEC_PROTOCOL || irmp_param.protocol == IRMP_NEC42_PROTOCOL)\r
2623 {\r
df24bb50 2624 if (irmp_bit < 8)\r
2625 {\r
2626 irmp_lgair_address <<= 1; // LGAIR uses MSB\r
2627 irmp_lgair_address |= value;\r
2628 }\r
2629 else if (irmp_bit < 24)\r
2630 {\r
2631 irmp_lgair_command <<= 1; // LGAIR uses MSB\r
2632 irmp_lgair_command |= value;\r
2633 }\r
69da6090 2634 }\r
2635 // NO else!\r
2636#endif\r
2637\r
35213800 2638#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
f60c4644 2639 if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && irmp_bit >= 13 && irmp_bit < 26)\r
35213800 2640 {\r
df24bb50 2641 irmp_tmp_address2 |= (((uint_fast16_t) (value)) << (irmp_bit - 13)); // CV wants cast\r
35213800 2642 }\r
f60c4644 2643 else\r
35213800 2644#endif\r
2645\r
4225a882 2646#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
f60c4644 2647 if (irmp_param.protocol == IRMP_SAMSUNG_PROTOCOL && irmp_bit >= SAMSUNG_ID_OFFSET && irmp_bit < SAMSUNG_ID_OFFSET + SAMSUNG_ID_LEN)\r
4225a882 2648 {\r
df24bb50 2649 irmp_tmp_id |= (((uint_fast16_t) (value)) << (irmp_bit - SAMSUNG_ID_OFFSET)); // store with LSB first\r
4225a882 2650 }\r
f60c4644 2651 else\r
4225a882 2652#endif\r
770a1a9d 2653\r
2654#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
f60c4644 2655 if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL)\r
770a1a9d 2656 {\r
df24bb50 2657 if (irmp_bit >= 20 && irmp_bit < 24)\r
2658 {\r
7365350c 2659 irmp_tmp_command |= (((uint_fast16_t) (value)) << (irmp_bit - 8)); // store 4 system bits (genre 1) in upper nibble with LSB first\r
df24bb50 2660 }\r
2661 else if (irmp_bit >= 24 && irmp_bit < 28)\r
2662 {\r
7365350c 2663 genre2 |= (((uint_fast8_t) (value)) << (irmp_bit - 20)); // store 4 system bits (genre 2) in upper nibble with LSB first\r
df24bb50 2664 }\r
2665\r
2666 if (irmp_bit < KASEIKYO_COMPLETE_DATA_LEN)\r
2667 {\r
2668 if (value)\r
2669 {\r
2670 xor_check[irmp_bit / 8] |= 1 << (irmp_bit % 8);\r
2671 }\r
2672 else\r
2673 {\r
2674 xor_check[irmp_bit / 8] &= ~(1 << (irmp_bit % 8));\r
2675 }\r
2676 }\r
0f700c8e 2677 }\r
26b6c304 2678 else\r
770a1a9d 2679#endif\r
7365350c 2680\r
2681#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
2682 if (irmp_param.protocol == IRMP_MITSU_HEAVY_PROTOCOL) // squeeze 64 bits into 16 bits:\r
2683 {\r
2684 if (irmp_bit == 72 )\r
2685 { // irmp_tmp_address, irmp_tmp_command received: check parity & compress\r
2686 mitsu_parity = PARITY_CHECK_OK;\r
2687\r
2688 check = irmp_tmp_address >> 8; // inverted upper byte == lower byte?\r
2689 check = ~ check;\r
2690\r
2691 if (check == (irmp_tmp_address & 0xFF))\r
2692 { // ok:\r
2693 irmp_tmp_address <<= 8; // throw away upper byte\r
2694 }\r
2695 else\r
2696 {\r
2697 mitsu_parity = PARITY_CHECK_FAILED;\r
2698 }\r
2699\r
2700 check = irmp_tmp_command >> 8; // inverted upper byte == lower byte?\r
2701 check = ~ check;\r
2702 if (check == (irmp_tmp_command & 0xFF))\r
2703 { // ok: pack together\r
2704 irmp_tmp_address |= irmp_tmp_command & 0xFF; // byte 1, byte2 in irmp_tmp_address, irmp_tmp_command can be used for byte 3\r
2705 }\r
2706 else\r
2707 {\r
2708 mitsu_parity = PARITY_CHECK_FAILED;\r
2709 }\r
2710 irmp_tmp_command = 0;\r
2711 }\r
2712\r
2713 if (irmp_bit >= 72 )\r
2714 { // receive 3. word in irmp_tmp_command\r
2715 irmp_tmp_command <<= 1;\r
2716 irmp_tmp_command |= value;\r
2717 }\r
2718 }\r
2719 else\r
2720#endif // IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL\r
26b6c304 2721 {\r
df24bb50 2722 ;\r
26b6c304 2723 }\r
770a1a9d 2724\r
4225a882 2725 irmp_bit++;\r
2726}\r
2727\r
6f750020 2728/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2729 * store bit\r
2730 * @details store bit in temp address or temp command\r
2731 * @param value to store: 0 or 1\r
2732 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
2733 */\r
2734#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
2735static void\r
0834784c 2736irmp_store_bit2 (uint_fast8_t value)\r
6f750020 2737{\r
0834784c 2738 uint_fast8_t irmp_bit2;\r
6f750020 2739\r
2740 if (irmp_param.protocol)\r
2741 {\r
df24bb50 2742 irmp_bit2 = irmp_bit - 2;\r
6f750020 2743 }\r
2744 else\r
2745 {\r
df24bb50 2746 irmp_bit2 = irmp_bit - 1;\r
6f750020 2747 }\r
2748\r
2749 if (irmp_bit2 >= irmp_param2.address_offset && irmp_bit2 < irmp_param2.address_end)\r
2750 {\r
df24bb50 2751 irmp_tmp_address2 |= (((uint_fast16_t) (value)) << (irmp_bit2 - irmp_param2.address_offset)); // CV wants cast\r
6f750020 2752 }\r
2753 else if (irmp_bit2 >= irmp_param2.command_offset && irmp_bit2 < irmp_param2.command_end)\r
2754 {\r
df24bb50 2755 irmp_tmp_command2 |= (((uint_fast16_t) (value)) << (irmp_bit2 - irmp_param2.command_offset)); // CV wants cast\r
6f750020 2756 }\r
2757}\r
2758#endif // IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
2759\r
4225a882 2760/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2761 * ISR routine\r
2762 * @details ISR routine, called 10000 times per second\r
2763 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
2764 */\r
716f8772 2765uint_fast8_t\r
4225a882 2766irmp_ISR (void)\r
2767{\r
0834784c 2768 static uint_fast8_t irmp_start_bit_detected; // flag: start bit detected\r
2769 static uint_fast8_t wait_for_space; // flag: wait for data bit space\r
2770 static uint_fast8_t wait_for_start_space; // flag: wait for start bit space\r
2771 static uint_fast8_t irmp_pulse_time; // count bit time for pulse\r
2772 static PAUSE_LEN irmp_pause_time; // count bit time for pause\r
2773 static uint_fast16_t last_irmp_address = 0xFFFF; // save last irmp address to recognize key repetition\r
2774 static uint_fast16_t last_irmp_command = 0xFFFF; // save last irmp command to recognize key repetition\r
2775 static uint_fast16_t key_repetition_len; // SIRCS repeats frame 2-5 times with 45 ms pause\r
2776 static uint_fast8_t repetition_frame_number;\r
4225a882 2777#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
0834784c 2778 static uint_fast16_t last_irmp_denon_command; // save last irmp command to recognize DENON frame repetition\r
2779 static uint_fast16_t denon_repetition_len = 0xFFFF; // denon repetition len of 2nd auto generated frame\r
4225a882 2780#endif\r
c2b70f0b 2781#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || IRMP_SUPPORT_S100_PROTOCOL == 1\r
0834784c 2782 static uint_fast8_t rc5_cmd_bit6; // bit 6 of RC5 command is the inverted 2nd start bit\r
4225a882 2783#endif\r
77f488bb 2784#if IRMP_SUPPORT_MANCHESTER == 1\r
0834784c 2785 static PAUSE_LEN last_pause; // last pause value\r
504d9df9 2786#endif\r
77f488bb 2787#if IRMP_SUPPORT_MANCHESTER == 1 || IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
0834784c 2788 static uint_fast8_t last_value; // last bit value\r
4225a882 2789#endif\r
0834784c 2790 uint_fast8_t irmp_input; // input value\r
4225a882 2791\r
48664931 2792#ifdef ANALYZE\r
592411d1 2793 time_counter++;\r
1082ecf2 2794#endif // ANALYZE\r
592411d1 2795\r
aa276d72 2796#if defined(__SDCC_stm8)\r
2797 irmp_input = input(IRMP_GPIO_STRUCT->IDR)\r
ea29682a 2798#elif defined(__MBED__)\r
2799 //irmp_input = inputPin;\r
2800 irmp_input = gpio_read (&gpioIRin);\r
aa276d72 2801#else\r
4225a882 2802 irmp_input = input(IRMP_PIN);\r
aa276d72 2803#endif\r
4225a882 2804\r
7644ac04 2805#if IRMP_USE_CALLBACK == 1\r
2806 if (irmp_callback_ptr)\r
2807 {\r
df24bb50 2808 static uint_fast8_t last_inverted_input;\r
7644ac04 2809\r
df24bb50 2810 if (last_inverted_input != !irmp_input)\r
2811 {\r
2812 (*irmp_callback_ptr) (! irmp_input);\r
2813 last_inverted_input = !irmp_input;\r
2814 }\r
7644ac04 2815 }\r
2816#endif // IRMP_USE_CALLBACK == 1\r
2817\r
d155e9ab 2818 irmp_log(irmp_input); // log ir signal, if IRMP_LOGGING defined\r
4225a882 2819\r
2820 if (! irmp_ir_detected) // ir code already detected?\r
2821 { // no...\r
df24bb50 2822 if (! irmp_start_bit_detected) // start bit detected?\r
2823 { // no...\r
2824 if (! irmp_input) // receiving burst?\r
2825 { // yes...\r
1f54e86c 2826// irmp_busy_flag = TRUE;\r
48664931 2827#ifdef ANALYZE\r
df24bb50 2828 if (! irmp_pulse_time)\r
2829 {\r
2830 ANALYZE_PRINTF("%8.3fms [starting pulse]\n", (double) (time_counter * 1000) / F_INTERRUPTS);\r
2831 }\r
2832#endif // ANALYZE\r
2833 irmp_pulse_time++; // increment counter\r
2834 }\r
2835 else\r
2836 { // no...\r
2837 if (irmp_pulse_time) // it's dark....\r
2838 { // set flags for counting the time of darkness...\r
2839 irmp_start_bit_detected = 1;\r
2840 wait_for_start_space = 1;\r
2841 wait_for_space = 0;\r
2842 irmp_tmp_command = 0;\r
2843 irmp_tmp_address = 0;\r
0f700c8e 2844#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
df24bb50 2845 genre2 = 0;\r
0f700c8e 2846#endif\r
80b3a55d 2847#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
df24bb50 2848 irmp_tmp_id = 0;\r
80b3a55d 2849#endif\r
6f750020 2850\r
35213800 2851#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) || IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
df24bb50 2852 irmp_tmp_command2 = 0;\r
2853 irmp_tmp_address2 = 0;\r
6f750020 2854#endif\r
69da6090 2855#if IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
df24bb50 2856 irmp_lgair_command = 0;\r
2857 irmp_lgair_address = 0;\r
69da6090 2858#endif\r
df24bb50 2859 irmp_bit = 0xff;\r
2860 irmp_pause_time = 1; // 1st pause: set to 1, not to 0!\r
c2b70f0b 2861#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || IRMP_SUPPORT_S100_PROTOCOL == 1\r
df24bb50 2862 rc5_cmd_bit6 = 0; // fm 2010-03-07: bugfix: reset it after incomplete RC5 frame!\r
4225a882 2863#endif\r
df24bb50 2864 }\r
2865 else\r
2866 {\r
2867 if (key_repetition_len < 0xFFFF) // avoid overflow of counter\r
2868 {\r
2869 key_repetition_len++;\r
08f2dd9d 2870\r
2871#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
df24bb50 2872 if (denon_repetition_len < 0xFFFF) // avoid overflow of counter\r
2873 {\r
2874 denon_repetition_len++;\r
775fabfa 2875\r
df24bb50 2876 if (denon_repetition_len >= DENON_AUTO_REPETITION_PAUSE_LEN && last_irmp_denon_command != 0)\r
2877 {\r
645fbc69 2878#ifdef ANALYZE\r
df24bb50 2879 ANALYZE_PRINTF ("%8.3fms warning: did not receive inverted command repetition\n",\r
2880 (double) (time_counter * 1000) / F_INTERRUPTS);\r
66f8fd93 2881#endif // ANALYZE\r
df24bb50 2882 last_irmp_denon_command = 0;\r
2883 denon_repetition_len = 0xFFFF;\r
2884 }\r
2885 }\r
08f2dd9d 2886#endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
df24bb50 2887 }\r
2888 }\r
2889 }\r
2890 }\r
2891 else\r
2892 {\r
2893 if (wait_for_start_space) // we have received start bit...\r
2894 { // ...and are counting the time of darkness\r
2895 if (irmp_input) // still dark?\r
2896 { // yes\r
2897 irmp_pause_time++; // increment counter\r
4225a882 2898\r
9405f84a 2899#if IRMP_SUPPORT_NIKON_PROTOCOL == 1\r
df24bb50 2900 if (((irmp_pulse_time < NIKON_START_BIT_PULSE_LEN_MIN || irmp_pulse_time > NIKON_START_BIT_PULSE_LEN_MAX) && irmp_pause_time > IRMP_TIMEOUT_LEN) ||\r
2901 irmp_pause_time > IRMP_TIMEOUT_NIKON_LEN)\r
9405f84a 2902#else\r
df24bb50 2903 if (irmp_pause_time > IRMP_TIMEOUT_LEN) // timeout?\r
9405f84a 2904#endif\r
df24bb50 2905 { // yes...\r
c7a47e89 2906#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
df24bb50 2907 if (irmp_protocol == IRMP_JVC_PROTOCOL) // don't show eror if JVC protocol, irmp_pulse_time has been set below!\r
2908 {\r
2909 ;\r
2910 }\r
2911 else\r
c7a47e89 2912#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
df24bb50 2913 {\r
645fbc69 2914#ifdef ANALYZE\r
df24bb50 2915 ANALYZE_PRINTF ("%8.3fms error 1: pause after start bit pulse %d too long: %d\n", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_pulse_time, irmp_pause_time);\r
2916 ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
1082ecf2 2917#endif // ANALYZE\r
df24bb50 2918 }\r
1082ecf2 2919\r
df24bb50 2920 irmp_start_bit_detected = 0; // reset flags, let's wait for another start bit\r
2921 irmp_pulse_time = 0;\r
2922 irmp_pause_time = 0;\r
2923 }\r
2924 }\r
2925 else\r
2926 { // receiving first data pulse!\r
2927 IRMP_PARAMETER * irmp_param_p;\r
2928 irmp_param_p = (IRMP_PARAMETER *) 0;\r
46dd89b7 2929\r
6f750020 2930#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
df24bb50 2931 irmp_param2.protocol = 0;\r
6f750020 2932#endif\r
2933\r
645fbc69 2934#ifdef ANALYZE\r
df24bb50 2935 ANALYZE_PRINTF ("%8.3fms [start-bit: pulse = %2d, pause = %2d]\n", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_pulse_time, irmp_pause_time);\r
1082ecf2 2936#endif // ANALYZE\r
4225a882 2937\r
2938#if IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
df24bb50 2939 if (irmp_pulse_time >= SIRCS_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SIRCS_START_BIT_PULSE_LEN_MAX &&\r
2940 irmp_pause_time >= SIRCS_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SIRCS_START_BIT_PAUSE_LEN_MAX)\r
2941 { // it's SIRCS\r
645fbc69 2942#ifdef ANALYZE\r
df24bb50 2943 ANALYZE_PRINTF ("protocol = SIRCS, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
2944 SIRCS_START_BIT_PULSE_LEN_MIN, SIRCS_START_BIT_PULSE_LEN_MAX,\r
2945 SIRCS_START_BIT_PAUSE_LEN_MIN, SIRCS_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 2946#endif // ANALYZE\r
df24bb50 2947 irmp_param_p = (IRMP_PARAMETER *) &sircs_param;\r
2948 }\r
2949 else\r
4225a882 2950#endif // IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
2951\r
770a1a9d 2952#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
df24bb50 2953 if (irmp_protocol == IRMP_JVC_PROTOCOL && // last protocol was JVC, awaiting repeat frame\r
2954 irmp_pulse_time >= JVC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= JVC_START_BIT_PULSE_LEN_MAX &&\r
2955 irmp_pause_time >= JVC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= JVC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
2956 {\r
2957#ifdef ANALYZE\r
2958 ANALYZE_PRINTF ("protocol = NEC or JVC (type 1) repeat frame, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
2959 JVC_START_BIT_PULSE_LEN_MIN, JVC_START_BIT_PULSE_LEN_MAX,\r
2960 JVC_REPEAT_START_BIT_PAUSE_LEN_MIN, JVC_REPEAT_START_BIT_PAUSE_LEN_MAX);\r
2961#endif // ANALYZE\r
2962 irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
2963 }\r
2964 else\r
770a1a9d 2965#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
2966\r
4225a882 2967#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
df24bb50 2968 if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
2969 irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
2970 {\r
35213800 2971#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
645fbc69 2972#ifdef ANALYZE\r
df24bb50 2973 ANALYZE_PRINTF ("protocol = NEC42, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
2974 NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
2975 NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 2976#endif // ANALYZE\r
df24bb50 2977 irmp_param_p = (IRMP_PARAMETER *) &nec42_param;\r
35213800 2978#else\r
645fbc69 2979#ifdef ANALYZE\r
df24bb50 2980 ANALYZE_PRINTF ("protocol = NEC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
2981 NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
2982 NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 2983#endif // ANALYZE\r
df24bb50 2984 irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
35213800 2985#endif\r
df24bb50 2986 }\r
2987 else if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
2988 irmp_pause_time >= NEC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
2989 { // it's NEC\r
93ba2e01 2990#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
df24bb50 2991 if (irmp_protocol == IRMP_JVC_PROTOCOL) // last protocol was JVC, awaiting repeat frame\r
2992 { // some jvc remote controls use nec repetition frame for jvc repetition frame\r
645fbc69 2993#ifdef ANALYZE\r
df24bb50 2994 ANALYZE_PRINTF ("protocol = JVC repeat frame type 2, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
2995 NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
2996 NEC_REPEAT_START_BIT_PAUSE_LEN_MIN, NEC_REPEAT_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 2997#endif // ANALYZE\r
df24bb50 2998 irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
2999 }\r
3000 else\r
93ba2e01 3001#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
df24bb50 3002 {\r
645fbc69 3003#ifdef ANALYZE\r
df24bb50 3004 ANALYZE_PRINTF ("protocol = NEC (repetition frame), start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3005 NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
3006 NEC_REPEAT_START_BIT_PAUSE_LEN_MIN, NEC_REPEAT_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3007#endif // ANALYZE\r
46dd89b7 3008\r
df24bb50 3009 irmp_param_p = (IRMP_PARAMETER *) &nec_rep_param;\r
3010 }\r
3011 }\r
3012 else\r
93ba2e01 3013\r
3014#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
df24bb50 3015 if (irmp_protocol == IRMP_JVC_PROTOCOL && // last protocol was JVC, awaiting repeat frame\r
3016 irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
3017 irmp_pause_time >= NEC_0_PAUSE_LEN_MIN && irmp_pause_time <= NEC_0_PAUSE_LEN_MAX)\r
3018 { // it's JVC repetition type 3\r
3019#ifdef ANALYZE\r
3020 ANALYZE_PRINTF ("protocol = JVC repeat frame type 3, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3021 NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
3022 NEC_0_PAUSE_LEN_MIN, NEC_0_PAUSE_LEN_MAX);\r
3023#endif // ANALYZE\r
3024 irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
3025 }\r
3026 else\r
93ba2e01 3027#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
3028\r
4225a882 3029#endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
3030\r
b85cb27d 3031#if IRMP_SUPPORT_TELEFUNKEN_PROTOCOL == 1\r
df24bb50 3032 if (irmp_pulse_time >= TELEFUNKEN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= TELEFUNKEN_START_BIT_PULSE_LEN_MAX &&\r
3033 irmp_pause_time >= TELEFUNKEN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= TELEFUNKEN_START_BIT_PAUSE_LEN_MAX)\r
3034 {\r
645fbc69 3035#ifdef ANALYZE\r
df24bb50 3036 ANALYZE_PRINTF ("protocol = TELEFUNKEN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3037 TELEFUNKEN_START_BIT_PULSE_LEN_MIN, TELEFUNKEN_START_BIT_PULSE_LEN_MAX,\r
3038 TELEFUNKEN_START_BIT_PAUSE_LEN_MIN, TELEFUNKEN_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3039#endif // ANALYZE\r
df24bb50 3040 irmp_param_p = (IRMP_PARAMETER *) &telefunken_param;\r
3041 }\r
3042 else\r
b85cb27d 3043#endif // IRMP_SUPPORT_TELEFUNKEN_PROTOCOL == 1\r
3044\r
40ca4604 3045#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1\r
df24bb50 3046 if (irmp_pulse_time >= ROOMBA_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_START_BIT_PULSE_LEN_MAX &&\r
3047 irmp_pause_time >= ROOMBA_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= ROOMBA_START_BIT_PAUSE_LEN_MAX)\r
3048 {\r
645fbc69 3049#ifdef ANALYZE\r
df24bb50 3050 ANALYZE_PRINTF ("protocol = ROOMBA, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3051 ROOMBA_START_BIT_PULSE_LEN_MIN, ROOMBA_START_BIT_PULSE_LEN_MAX,\r
3052 ROOMBA_START_BIT_PAUSE_LEN_MIN, ROOMBA_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3053#endif // ANALYZE\r
df24bb50 3054 irmp_param_p = (IRMP_PARAMETER *) &roomba_param;\r
3055 }\r
3056 else\r
40ca4604 3057#endif // IRMP_SUPPORT_ROOMBA_PROTOCOL == 1\r
3058\r
43c535be 3059#if IRMP_SUPPORT_ACP24_PROTOCOL == 1\r
df24bb50 3060 if (irmp_pulse_time >= ACP24_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= ACP24_START_BIT_PULSE_LEN_MAX &&\r
3061 irmp_pause_time >= ACP24_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= ACP24_START_BIT_PAUSE_LEN_MAX)\r
3062 {\r
43c535be 3063#ifdef ANALYZE\r
df24bb50 3064 ANALYZE_PRINTF ("protocol = ACP24, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3065 ACP24_START_BIT_PULSE_LEN_MIN, ACP24_START_BIT_PULSE_LEN_MAX,\r
3066 ACP24_START_BIT_PAUSE_LEN_MIN, ACP24_START_BIT_PAUSE_LEN_MAX);\r
43c535be 3067#endif // ANALYZE\r
df24bb50 3068 irmp_param_p = (IRMP_PARAMETER *) &acp24_param;\r
3069 }\r
3070 else\r
43c535be 3071#endif // IRMP_SUPPORT_ROOMBA_PROTOCOL == 1\r
3072\r
003c1008 3073#if IRMP_SUPPORT_PENTAX_PROTOCOL == 1\r
df24bb50 3074 if (irmp_pulse_time >= PENTAX_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= PENTAX_START_BIT_PULSE_LEN_MAX &&\r
3075 irmp_pause_time >= PENTAX_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= PENTAX_START_BIT_PAUSE_LEN_MAX)\r
3076 {\r
003c1008 3077#ifdef ANALYZE\r
df24bb50 3078 ANALYZE_PRINTF ("protocol = PENTAX, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3079 PENTAX_START_BIT_PULSE_LEN_MIN, PENTAX_START_BIT_PULSE_LEN_MAX,\r
3080 PENTAX_START_BIT_PAUSE_LEN_MIN, PENTAX_START_BIT_PAUSE_LEN_MAX);\r
003c1008 3081#endif // ANALYZE\r
df24bb50 3082 irmp_param_p = (IRMP_PARAMETER *) &pentax_param;\r
3083 }\r
3084 else\r
003c1008 3085#endif // IRMP_SUPPORT_PENTAX_PROTOCOL == 1\r
3086\r
9405f84a 3087#if IRMP_SUPPORT_NIKON_PROTOCOL == 1\r
df24bb50 3088 if (irmp_pulse_time >= NIKON_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NIKON_START_BIT_PULSE_LEN_MAX &&\r
3089 irmp_pause_time >= NIKON_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NIKON_START_BIT_PAUSE_LEN_MAX)\r
3090 {\r
645fbc69 3091#ifdef ANALYZE\r
df24bb50 3092 ANALYZE_PRINTF ("protocol = NIKON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3093 NIKON_START_BIT_PULSE_LEN_MIN, NIKON_START_BIT_PULSE_LEN_MAX,\r
3094 NIKON_START_BIT_PAUSE_LEN_MIN, NIKON_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3095#endif // ANALYZE\r
df24bb50 3096 irmp_param_p = (IRMP_PARAMETER *) &nikon_param;\r
3097 }\r
3098 else\r
9405f84a 3099#endif // IRMP_SUPPORT_NIKON_PROTOCOL == 1\r
3100\r
4225a882 3101#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
df24bb50 3102 if (irmp_pulse_time >= SAMSUNG_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SAMSUNG_START_BIT_PULSE_LEN_MAX &&\r
3103 irmp_pause_time >= SAMSUNG_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SAMSUNG_START_BIT_PAUSE_LEN_MAX)\r
3104 { // it's SAMSUNG\r
645fbc69 3105#ifdef ANALYZE\r
df24bb50 3106 ANALYZE_PRINTF ("protocol = SAMSUNG, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3107 SAMSUNG_START_BIT_PULSE_LEN_MIN, SAMSUNG_START_BIT_PULSE_LEN_MAX,\r
3108 SAMSUNG_START_BIT_PAUSE_LEN_MIN, SAMSUNG_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3109#endif // ANALYZE\r
df24bb50 3110 irmp_param_p = (IRMP_PARAMETER *) &samsung_param;\r
3111 }\r
3112 else\r
4225a882 3113#endif // IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
3114\r
30d1689d 3115#if IRMP_SUPPORT_SAMSUNGAH_PROTOCOL == 1\r
3116 if (irmp_pulse_time >= SAMSUNGAH_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SAMSUNGAH_START_BIT_PULSE_LEN_MAX &&\r
3117 irmp_pause_time >= SAMSUNGAH_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SAMSUNGAH_START_BIT_PAUSE_LEN_MAX)\r
3118 { // it's SAMSUNGAH\r
3119#ifdef ANALYZE\r
3120 ANALYZE_PRINTF ("protocol = SAMSUNGAH, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3121 SAMSUNGAH_START_BIT_PULSE_LEN_MIN, SAMSUNGAH_START_BIT_PULSE_LEN_MAX,\r
3122 SAMSUNGAH_START_BIT_PAUSE_LEN_MIN, SAMSUNGAH_START_BIT_PAUSE_LEN_MAX);\r
3123#endif // ANALYZE\r
3124 irmp_param_p = (IRMP_PARAMETER *) &samsungah_param;\r
3125 }\r
3126 else\r
3127#endif // IRMP_SUPPORT_SAMSUNGAH_PROTOCOL == 1\r
3128\r
4225a882 3129#if IRMP_SUPPORT_MATSUSHITA_PROTOCOL == 1\r
df24bb50 3130 if (irmp_pulse_time >= MATSUSHITA_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MATSUSHITA_START_BIT_PULSE_LEN_MAX &&\r
3131 irmp_pause_time >= MATSUSHITA_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MATSUSHITA_START_BIT_PAUSE_LEN_MAX)\r
3132 { // it's MATSUSHITA\r
645fbc69 3133#ifdef ANALYZE\r
df24bb50 3134 ANALYZE_PRINTF ("protocol = MATSUSHITA, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3135 MATSUSHITA_START_BIT_PULSE_LEN_MIN, MATSUSHITA_START_BIT_PULSE_LEN_MAX,\r
3136 MATSUSHITA_START_BIT_PAUSE_LEN_MIN, MATSUSHITA_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3137#endif // ANALYZE\r
df24bb50 3138 irmp_param_p = (IRMP_PARAMETER *) &matsushita_param;\r
3139 }\r
3140 else\r
4225a882 3141#endif // IRMP_SUPPORT_MATSUSHITA_PROTOCOL == 1\r
3142\r
3143#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
df24bb50 3144 if (irmp_pulse_time >= KASEIKYO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= KASEIKYO_START_BIT_PULSE_LEN_MAX &&\r
3145 irmp_pause_time >= KASEIKYO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= KASEIKYO_START_BIT_PAUSE_LEN_MAX)\r
3146 { // it's KASEIKYO\r
645fbc69 3147#ifdef ANALYZE\r
df24bb50 3148 ANALYZE_PRINTF ("protocol = KASEIKYO, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3149 KASEIKYO_START_BIT_PULSE_LEN_MIN, KASEIKYO_START_BIT_PULSE_LEN_MAX,\r
3150 KASEIKYO_START_BIT_PAUSE_LEN_MIN, KASEIKYO_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3151#endif // ANALYZE\r
df24bb50 3152 irmp_param_p = (IRMP_PARAMETER *) &kaseikyo_param;\r
3153 }\r
3154 else\r
4225a882 3155#endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
3156\r
95b27043 3157#if IRMP_SUPPORT_PANASONIC_PROTOCOL == 1\r
df24bb50 3158 if (irmp_pulse_time >= PANASONIC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= PANASONIC_START_BIT_PULSE_LEN_MAX &&\r
3159 irmp_pause_time >= PANASONIC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= PANASONIC_START_BIT_PAUSE_LEN_MAX)\r
3160 { // it's PANASONIC\r
95b27043 3161#ifdef ANALYZE\r
df24bb50 3162 ANALYZE_PRINTF ("protocol = PANASONIC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3163 PANASONIC_START_BIT_PULSE_LEN_MIN, PANASONIC_START_BIT_PULSE_LEN_MAX,\r
3164 PANASONIC_START_BIT_PAUSE_LEN_MIN, PANASONIC_START_BIT_PAUSE_LEN_MAX);\r
95b27043 3165#endif // ANALYZE\r
df24bb50 3166 irmp_param_p = (IRMP_PARAMETER *) &panasonic_param;\r
3167 }\r
3168 else\r
95b27043 3169#endif // IRMP_SUPPORT_PANASONIC_PROTOCOL == 1\r
3170\r
7365350c 3171#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
3172 if (irmp_pulse_time >= MITSU_HEAVY_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MITSU_HEAVY_START_BIT_PULSE_LEN_MAX &&\r
3173 irmp_pause_time >= MITSU_HEAVY_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MITSU_HEAVY_START_BIT_PAUSE_LEN_MAX)\r
3174 { // it's MITSU_HEAVY\r
3175#ifdef ANALYZE\r
3176 ANALYZE_PRINTF ("protocol = MITSU_HEAVY, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3177 MITSU_HEAVY_START_BIT_PULSE_LEN_MIN, MITSU_HEAVY_START_BIT_PULSE_LEN_MAX,\r
3178 MITSU_HEAVY_START_BIT_PAUSE_LEN_MIN, MITSU_HEAVY_START_BIT_PAUSE_LEN_MAX);\r
3179#endif // ANALYZE\r
3180 irmp_param_p = (IRMP_PARAMETER *) &mitsu_heavy_param;\r
3181 }\r
3182 else\r
3183#endif // IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
3184\r
4bcf310e 3185#if IRMP_SUPPORT_VINCENT_PROTOCOL == 1\r
3186 if (irmp_pulse_time >= VINCENT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= VINCENT_START_BIT_PULSE_LEN_MAX &&\r
3187 irmp_pause_time >= VINCENT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= VINCENT_START_BIT_PAUSE_LEN_MAX)\r
3188 { // it's VINCENT\r
3189#ifdef ANALYZE\r
3190 ANALYZE_PRINTF ("protocol = VINCENT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3191 VINCENT_START_BIT_PULSE_LEN_MIN, VINCENT_START_BIT_PULSE_LEN_MAX,\r
3192 VINCENT_START_BIT_PAUSE_LEN_MIN, VINCENT_START_BIT_PAUSE_LEN_MAX);\r
3193#endif // ANALYZE\r
3194 irmp_param_p = (IRMP_PARAMETER *) &vincent_param;\r
3195 }\r
3196 else\r
3197#endif // IRMP_SUPPORT_VINCENT_PROTOCOL == 1\r
3198\r
faf6479d 3199#if IRMP_SUPPORT_RADIO1_PROTOCOL == 1\r
df24bb50 3200 if (irmp_pulse_time >= RADIO1_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RADIO1_START_BIT_PULSE_LEN_MAX &&\r
3201 irmp_pause_time >= RADIO1_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RADIO1_START_BIT_PAUSE_LEN_MAX)\r
3202 {\r
645fbc69 3203#ifdef ANALYZE\r
df24bb50 3204 ANALYZE_PRINTF ("protocol = RADIO1, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3205 RADIO1_START_BIT_PULSE_LEN_MIN, RADIO1_START_BIT_PULSE_LEN_MAX,\r
3206 RADIO1_START_BIT_PAUSE_LEN_MIN, RADIO1_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3207#endif // ANALYZE\r
df24bb50 3208 irmp_param_p = (IRMP_PARAMETER *) &radio1_param;\r
3209 }\r
3210 else\r
faf6479d 3211#endif // IRMP_SUPPORT_RRADIO1_PROTOCOL == 1\r
3212\r
4225a882 3213#if IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
df24bb50 3214 if (irmp_pulse_time >= RECS80_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RECS80_START_BIT_PULSE_LEN_MAX &&\r
3215 irmp_pause_time >= RECS80_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RECS80_START_BIT_PAUSE_LEN_MAX)\r
3216 { // it's RECS80\r
645fbc69 3217#ifdef ANALYZE\r
df24bb50 3218 ANALYZE_PRINTF ("protocol = RECS80, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3219 RECS80_START_BIT_PULSE_LEN_MIN, RECS80_START_BIT_PULSE_LEN_MAX,\r
3220 RECS80_START_BIT_PAUSE_LEN_MIN, RECS80_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3221#endif // ANALYZE\r
df24bb50 3222 irmp_param_p = (IRMP_PARAMETER *) &recs80_param;\r
3223 }\r
3224 else\r
4225a882 3225#endif // IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
3226\r
c2b70f0b 3227#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
df24bb50 3228 if (((irmp_pulse_time >= S100_START_BIT_LEN_MIN && irmp_pulse_time <= S100_START_BIT_LEN_MAX) ||\r
3229 (irmp_pulse_time >= 2 * S100_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * S100_START_BIT_LEN_MAX)) &&\r
3230 ((irmp_pause_time >= S100_START_BIT_LEN_MIN && irmp_pause_time <= S100_START_BIT_LEN_MAX) ||\r
3231 (irmp_pause_time >= 2 * S100_START_BIT_LEN_MIN && irmp_pause_time <= 2 * S100_START_BIT_LEN_MAX)))\r
3232 { // it's S100\r
3233#ifdef ANALYZE\r
3234 ANALYZE_PRINTF ("protocol = S100, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or pulse: %3d - %3d, pause: %3d - %3d\n",\r
3235 S100_START_BIT_LEN_MIN, S100_START_BIT_LEN_MAX,\r
3236 2 * S100_START_BIT_LEN_MIN, 2 * S100_START_BIT_LEN_MAX,\r
3237 S100_START_BIT_LEN_MIN, S100_START_BIT_LEN_MAX,\r
3238 2 * S100_START_BIT_LEN_MIN, 2 * S100_START_BIT_LEN_MAX);\r
3239#endif // ANALYZE\r
3240\r
3241 irmp_param_p = (IRMP_PARAMETER *) &s100_param;\r
3242 last_pause = irmp_pause_time;\r
3243\r
3244 if ((irmp_pulse_time > S100_START_BIT_LEN_MAX && irmp_pulse_time <= 2 * S100_START_BIT_LEN_MAX) ||\r
3245 (irmp_pause_time > S100_START_BIT_LEN_MAX && irmp_pause_time <= 2 * S100_START_BIT_LEN_MAX))\r
3246 {\r
3247 last_value = 0;\r
3248 rc5_cmd_bit6 = 1<<6;\r
3249 }\r
3250 else\r
3251 {\r
3252 last_value = 1;\r
3253 }\r
3254 }\r
3255 else\r
c2b70f0b 3256#endif // IRMP_SUPPORT_S100_PROTOCOL == 1\r
3257\r
4225a882 3258#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
df24bb50 3259 if (((irmp_pulse_time >= RC5_START_BIT_LEN_MIN && irmp_pulse_time <= RC5_START_BIT_LEN_MAX) ||\r
3260 (irmp_pulse_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX)) &&\r
3261 ((irmp_pause_time >= RC5_START_BIT_LEN_MIN && irmp_pause_time <= RC5_START_BIT_LEN_MAX) ||\r
3262 (irmp_pause_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pause_time <= 2 * RC5_START_BIT_LEN_MAX)))\r
3263 { // it's RC5\r
6f750020 3264#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
df24bb50 3265 if (irmp_pulse_time >= FDC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FDC_START_BIT_PULSE_LEN_MAX &&\r
3266 irmp_pause_time >= FDC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FDC_START_BIT_PAUSE_LEN_MAX)\r
3267 {\r
3268#ifdef ANALYZE\r
3269 ANALYZE_PRINTF ("protocol = RC5 or FDC\n");\r
3270 ANALYZE_PRINTF ("FDC start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3271 FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX,\r
3272 FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX);\r
3273 ANALYZE_PRINTF ("RC5 start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3274 RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
3275 RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX);\r
3276#endif // ANALYZE\r
3277 memcpy_P (&irmp_param2, &fdc_param, sizeof (IRMP_PARAMETER));\r
3278 }\r
3279 else\r
6f750020 3280#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1\r
12948cf3 3281\r
6f750020 3282#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
df24bb50 3283 if (irmp_pulse_time >= RCCAR_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_START_BIT_PULSE_LEN_MAX &&\r
3284 irmp_pause_time >= RCCAR_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_START_BIT_PAUSE_LEN_MAX)\r
3285 {\r
3286#ifdef ANALYZE\r
3287 ANALYZE_PRINTF ("protocol = RC5 or RCCAR\n");\r
3288 ANALYZE_PRINTF ("RCCAR start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3289 RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX,\r
3290 RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX);\r
3291 ANALYZE_PRINTF ("RC5 start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3292 RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
3293 RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX);\r
3294#endif // ANALYZE\r
3295 memcpy_P (&irmp_param2, &rccar_param, sizeof (IRMP_PARAMETER));\r
3296 }\r
3297 else\r
6f750020 3298#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
df24bb50 3299 {\r
3300#ifdef ANALYZE\r
3301 ANALYZE_PRINTF ("protocol = RC5, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or pulse: %3d - %3d, pause: %3d - %3d\n",\r
3302 RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
3303 2 * RC5_START_BIT_LEN_MIN, 2 * RC5_START_BIT_LEN_MAX,\r
3304 RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
3305 2 * RC5_START_BIT_LEN_MIN, 2 * RC5_START_BIT_LEN_MAX);\r
3306#endif // ANALYZE\r
3307 }\r
3308\r
3309 irmp_param_p = (IRMP_PARAMETER *) &rc5_param;\r
3310 last_pause = irmp_pause_time;\r
3311\r
3312 if ((irmp_pulse_time > RC5_START_BIT_LEN_MAX && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX) ||\r
3313 (irmp_pause_time > RC5_START_BIT_LEN_MAX && irmp_pause_time <= 2 * RC5_START_BIT_LEN_MAX))\r
3314 {\r
3315 last_value = 0;\r
3316 rc5_cmd_bit6 = 1<<6;\r
3317 }\r
3318 else\r
3319 {\r
3320 last_value = 1;\r
3321 }\r
3322 }\r
3323 else\r
4225a882 3324#endif // IRMP_SUPPORT_RC5_PROTOCOL == 1\r
3325\r
3326#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
df24bb50 3327 if ( (irmp_pulse_time >= DENON_PULSE_LEN_MIN && irmp_pulse_time <= DENON_PULSE_LEN_MAX) &&\r
3328 ((irmp_pause_time >= DENON_1_PAUSE_LEN_MIN && irmp_pause_time <= DENON_1_PAUSE_LEN_MAX) ||\r
3329 (irmp_pause_time >= DENON_0_PAUSE_LEN_MIN && irmp_pause_time <= DENON_0_PAUSE_LEN_MAX)))\r
3330 { // it's DENON\r
3331#ifdef ANALYZE\r
3332 ANALYZE_PRINTF ("protocol = DENON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
3333 DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX,\r
3334 DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX,\r
3335 DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX);\r
3336#endif // ANALYZE\r
3337 irmp_param_p = (IRMP_PARAMETER *) &denon_param;\r
3338 }\r
3339 else\r
4225a882 3340#endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
3341\r
beda975f 3342#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
df24bb50 3343 if ( (irmp_pulse_time >= THOMSON_PULSE_LEN_MIN && irmp_pulse_time <= THOMSON_PULSE_LEN_MAX) &&\r
3344 ((irmp_pause_time >= THOMSON_1_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_1_PAUSE_LEN_MAX) ||\r
3345 (irmp_pause_time >= THOMSON_0_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_0_PAUSE_LEN_MAX)))\r
3346 { // it's THOMSON\r
3347#ifdef ANALYZE\r
3348 ANALYZE_PRINTF ("protocol = THOMSON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
3349 THOMSON_PULSE_LEN_MIN, THOMSON_PULSE_LEN_MAX,\r
3350 THOMSON_1_PAUSE_LEN_MIN, THOMSON_1_PAUSE_LEN_MAX,\r
3351 THOMSON_0_PAUSE_LEN_MIN, THOMSON_0_PAUSE_LEN_MAX);\r
3352#endif // ANALYZE\r
3353 irmp_param_p = (IRMP_PARAMETER *) &thomson_param;\r
3354 }\r
3355 else\r
beda975f 3356#endif // IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
3357\r
3a7e26e1 3358#if IRMP_SUPPORT_BOSE_PROTOCOL == 1\r
df24bb50 3359 if (irmp_pulse_time >= BOSE_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= BOSE_START_BIT_PULSE_LEN_MAX &&\r
3360 irmp_pause_time >= BOSE_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= BOSE_START_BIT_PAUSE_LEN_MAX)\r
3361 {\r
645fbc69 3362#ifdef ANALYZE\r
df24bb50 3363 ANALYZE_PRINTF ("protocol = BOSE, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3364 BOSE_START_BIT_PULSE_LEN_MIN, BOSE_START_BIT_PULSE_LEN_MAX,\r
3365 BOSE_START_BIT_PAUSE_LEN_MIN, BOSE_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3366#endif // ANALYZE\r
df24bb50 3367 irmp_param_p = (IRMP_PARAMETER *) &bose_param;\r
3368 }\r
3369 else\r
3a7e26e1 3370#endif // IRMP_SUPPORT_BOSE_PROTOCOL == 1\r
3371\r
4225a882 3372#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
df24bb50 3373 if (irmp_pulse_time >= RC6_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RC6_START_BIT_PULSE_LEN_MAX &&\r
3374 irmp_pause_time >= RC6_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RC6_START_BIT_PAUSE_LEN_MAX)\r
3375 { // it's RC6\r
3376#ifdef ANALYZE\r
3377 ANALYZE_PRINTF ("protocol = RC6, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3378 RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX,\r
3379 RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX);\r
3380#endif // ANALYZE\r
3381 irmp_param_p = (IRMP_PARAMETER *) &rc6_param;\r
3382 last_pause = 0;\r
3383 last_value = 1;\r
3384 }\r
3385 else\r
4225a882 3386#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
3387\r
3388#if IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
df24bb50 3389 if (irmp_pulse_time >= RECS80EXT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RECS80EXT_START_BIT_PULSE_LEN_MAX &&\r
3390 irmp_pause_time >= RECS80EXT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RECS80EXT_START_BIT_PAUSE_LEN_MAX)\r
3391 { // it's RECS80EXT\r
645fbc69 3392#ifdef ANALYZE\r
df24bb50 3393 ANALYZE_PRINTF ("protocol = RECS80EXT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3394 RECS80EXT_START_BIT_PULSE_LEN_MIN, RECS80EXT_START_BIT_PULSE_LEN_MAX,\r
3395 RECS80EXT_START_BIT_PAUSE_LEN_MIN, RECS80EXT_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3396#endif // ANALYZE\r
df24bb50 3397 irmp_param_p = (IRMP_PARAMETER *) &recs80ext_param;\r
3398 }\r
3399 else\r
4225a882 3400#endif // IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
3401\r
3402#if IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
df24bb50 3403 if (irmp_pulse_time >= NUBERT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NUBERT_START_BIT_PULSE_LEN_MAX &&\r
3404 irmp_pause_time >= NUBERT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NUBERT_START_BIT_PAUSE_LEN_MAX)\r
3405 { // it's NUBERT\r
645fbc69 3406#ifdef ANALYZE\r
df24bb50 3407 ANALYZE_PRINTF ("protocol = NUBERT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3408 NUBERT_START_BIT_PULSE_LEN_MIN, NUBERT_START_BIT_PULSE_LEN_MAX,\r
3409 NUBERT_START_BIT_PAUSE_LEN_MIN, NUBERT_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3410#endif // ANALYZE\r
df24bb50 3411 irmp_param_p = (IRMP_PARAMETER *) &nubert_param;\r
3412 }\r
3413 else\r
4225a882 3414#endif // IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
3415\r
0715cf5e 3416#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
df24bb50 3417 if (irmp_pulse_time >= FAN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FAN_START_BIT_PULSE_LEN_MAX &&\r
3418 irmp_pause_time >= FAN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FAN_START_BIT_PAUSE_LEN_MAX)\r
3419 { // it's FAN\r
0715cf5e 3420#ifdef ANALYZE\r
df24bb50 3421 ANALYZE_PRINTF ("protocol = FAN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3422 FAN_START_BIT_PULSE_LEN_MIN, FAN_START_BIT_PULSE_LEN_MAX,\r
3423 FAN_START_BIT_PAUSE_LEN_MIN, FAN_START_BIT_PAUSE_LEN_MAX);\r
0715cf5e 3424#endif // ANALYZE\r
df24bb50 3425 irmp_param_p = (IRMP_PARAMETER *) &fan_param;\r
3426 }\r
3427 else\r
0715cf5e 3428#endif // IRMP_SUPPORT_FAN_PROTOCOL == 1\r
3429\r
0a2f634b 3430#if IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
df24bb50 3431 if (irmp_pulse_time >= SPEAKER_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SPEAKER_START_BIT_PULSE_LEN_MAX &&\r
3432 irmp_pause_time >= SPEAKER_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SPEAKER_START_BIT_PAUSE_LEN_MAX)\r
3433 { // it's SPEAKER\r
645fbc69 3434#ifdef ANALYZE\r
df24bb50 3435 ANALYZE_PRINTF ("protocol = SPEAKER, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3436 SPEAKER_START_BIT_PULSE_LEN_MIN, SPEAKER_START_BIT_PULSE_LEN_MAX,\r
3437 SPEAKER_START_BIT_PAUSE_LEN_MIN, SPEAKER_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3438#endif // ANALYZE\r
df24bb50 3439 irmp_param_p = (IRMP_PARAMETER *) &speaker_param;\r
3440 }\r
3441 else\r
0a2f634b 3442#endif // IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
3443\r
504d9df9 3444#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
df24bb50 3445 if (irmp_pulse_time >= BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN && irmp_pulse_time <= BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX &&\r
3446 irmp_pause_time >= BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX)\r
3447 { // it's BANG_OLUFSEN\r
3448#ifdef ANALYZE\r
3449 ANALYZE_PRINTF ("protocol = BANG_OLUFSEN\n");\r
3450 ANALYZE_PRINTF ("start bit 1 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3451 BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX,\r
3452 BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX);\r
3453 ANALYZE_PRINTF ("start bit 2 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3454 BANG_OLUFSEN_START_BIT2_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT2_PULSE_LEN_MAX,\r
3455 BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MAX);\r
3456 ANALYZE_PRINTF ("start bit 3 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3457 BANG_OLUFSEN_START_BIT3_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PULSE_LEN_MAX,\r
3458 BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX);\r
3459 ANALYZE_PRINTF ("start bit 4 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3460 BANG_OLUFSEN_START_BIT4_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PULSE_LEN_MAX,\r
3461 BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MAX);\r
3462#endif // ANALYZE\r
3463 irmp_param_p = (IRMP_PARAMETER *) &bang_olufsen_param;\r
3464 last_value = 0;\r
3465 }\r
3466 else\r
504d9df9 3467#endif // IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
3468\r
89e8cafb 3469#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
df24bb50 3470 if (irmp_pulse_time >= GRUNDIG_NOKIA_IR60_START_BIT_LEN_MIN && irmp_pulse_time <= GRUNDIG_NOKIA_IR60_START_BIT_LEN_MAX &&\r
3471 irmp_pause_time >= GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MIN && irmp_pause_time <= GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MAX)\r
3472 { // it's GRUNDIG\r
3473#ifdef ANALYZE\r
3474 ANALYZE_PRINTF ("protocol = GRUNDIG, pre bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3475 GRUNDIG_NOKIA_IR60_START_BIT_LEN_MIN, GRUNDIG_NOKIA_IR60_START_BIT_LEN_MAX,\r
3476 GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MIN, GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MAX);\r
3477#endif // ANALYZE\r
3478 irmp_param_p = (IRMP_PARAMETER *) &grundig_param;\r
3479 last_pause = irmp_pause_time;\r
3480 last_value = 1;\r
3481 }\r
3482 else\r
89e8cafb 3483#endif // IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
592411d1 3484\r
0715cf5e 3485#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1 // check MERLIN before RUWIDO!\r
df24bb50 3486 if (irmp_pulse_time >= MERLIN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MERLIN_START_BIT_PULSE_LEN_MAX &&\r
3487 irmp_pause_time >= MERLIN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MERLIN_START_BIT_PAUSE_LEN_MAX)\r
3488 { // it's MERLIN\r
3489#ifdef ANALYZE\r
3490 ANALYZE_PRINTF ("protocol = MERLIN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3491 MERLIN_START_BIT_PULSE_LEN_MIN, MERLIN_START_BIT_PULSE_LEN_MAX,\r
3492 MERLIN_START_BIT_PAUSE_LEN_MIN, MERLIN_START_BIT_PAUSE_LEN_MAX);\r
3493#endif // ANALYZE\r
3494 irmp_param_p = (IRMP_PARAMETER *) &merlin_param;\r
3495 last_pause = 0;\r
3496 last_value = 1;\r
3497 }\r
3498 else\r
0715cf5e 3499#endif // IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
3500\r
12948cf3 3501#if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
df24bb50 3502 if (((irmp_pulse_time >= SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX) ||\r
3503 (irmp_pulse_time >= 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX)) &&\r
3504 ((irmp_pause_time >= SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX) ||\r
3505 (irmp_pause_time >= 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX)))\r
3506 { // it's RUWIDO or SIEMENS\r
3507#ifdef ANALYZE\r
3508 ANALYZE_PRINTF ("protocol = RUWIDO, start bit timings: pulse: %3d - %3d or %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
3509 SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN, SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX,\r
3510 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN, 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX,\r
3511 SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN, SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX,\r
3512 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN, 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX);\r
3513#endif // ANALYZE\r
3514 irmp_param_p = (IRMP_PARAMETER *) &ruwido_param;\r
3515 last_pause = irmp_pause_time;\r
3516 last_value = 1;\r
3517 }\r
3518 else\r
12948cf3 3519#endif // IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
3520\r
48664931 3521#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
df24bb50 3522 if (irmp_pulse_time >= FDC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FDC_START_BIT_PULSE_LEN_MAX &&\r
3523 irmp_pause_time >= FDC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FDC_START_BIT_PAUSE_LEN_MAX)\r
3524 {\r
645fbc69 3525#ifdef ANALYZE\r
df24bb50 3526 ANALYZE_PRINTF ("protocol = FDC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3527 FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX,\r
3528 FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3529#endif // ANALYZE\r
df24bb50 3530 irmp_param_p = (IRMP_PARAMETER *) &fdc_param;\r
3531 }\r
3532 else\r
48664931 3533#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1\r
12948cf3 3534\r
9e16d699 3535#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
df24bb50 3536 if (irmp_pulse_time >= RCCAR_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_START_BIT_PULSE_LEN_MAX &&\r
3537 irmp_pause_time >= RCCAR_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_START_BIT_PAUSE_LEN_MAX)\r
3538 {\r
645fbc69 3539#ifdef ANALYZE\r
df24bb50 3540 ANALYZE_PRINTF ("protocol = RCCAR, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3541 RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX,\r
3542 RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3543#endif // ANALYZE\r
df24bb50 3544 irmp_param_p = (IRMP_PARAMETER *) &rccar_param;\r
3545 }\r
3546 else\r
9e16d699 3547#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
89e8cafb 3548\r
111d6191 3549#if IRMP_SUPPORT_KATHREIN_PROTOCOL == 1\r
df24bb50 3550 if (irmp_pulse_time >= KATHREIN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= KATHREIN_START_BIT_PULSE_LEN_MAX &&\r
3551 irmp_pause_time >= KATHREIN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= KATHREIN_START_BIT_PAUSE_LEN_MAX)\r
3552 { // it's KATHREIN\r
645fbc69 3553#ifdef ANALYZE\r
df24bb50 3554 ANALYZE_PRINTF ("protocol = KATHREIN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3555 KATHREIN_START_BIT_PULSE_LEN_MIN, KATHREIN_START_BIT_PULSE_LEN_MAX,\r
3556 KATHREIN_START_BIT_PAUSE_LEN_MIN, KATHREIN_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3557#endif // ANALYZE\r
df24bb50 3558 irmp_param_p = (IRMP_PARAMETER *) &kathrein_param;\r
3559 }\r
3560 else\r
111d6191 3561#endif // IRMP_SUPPORT_KATHREIN_PROTOCOL == 1\r
3562\r
deba2a0a 3563#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
df24bb50 3564 if (irmp_pulse_time >= NETBOX_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NETBOX_START_BIT_PULSE_LEN_MAX &&\r
3565 irmp_pause_time >= NETBOX_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NETBOX_START_BIT_PAUSE_LEN_MAX)\r
3566 { // it's NETBOX\r
645fbc69 3567#ifdef ANALYZE\r
df24bb50 3568 ANALYZE_PRINTF ("protocol = NETBOX, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3569 NETBOX_START_BIT_PULSE_LEN_MIN, NETBOX_START_BIT_PULSE_LEN_MAX,\r
3570 NETBOX_START_BIT_PAUSE_LEN_MIN, NETBOX_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3571#endif // ANALYZE\r
df24bb50 3572 irmp_param_p = (IRMP_PARAMETER *) &netbox_param;\r
3573 }\r
3574 else\r
deba2a0a 3575#endif // IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
3576\r
f50e01e7 3577#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
df24bb50 3578 if (irmp_pulse_time >= LEGO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= LEGO_START_BIT_PULSE_LEN_MAX &&\r
3579 irmp_pause_time >= LEGO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= LEGO_START_BIT_PAUSE_LEN_MAX)\r
3580 {\r
645fbc69 3581#ifdef ANALYZE\r
df24bb50 3582 ANALYZE_PRINTF ("protocol = LEGO, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3583 LEGO_START_BIT_PULSE_LEN_MIN, LEGO_START_BIT_PULSE_LEN_MAX,\r
3584 LEGO_START_BIT_PAUSE_LEN_MIN, LEGO_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3585#endif // ANALYZE\r
df24bb50 3586 irmp_param_p = (IRMP_PARAMETER *) &lego_param;\r
3587 }\r
3588 else\r
93ba2e01 3589#endif // IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
f50e01e7 3590\r
2fb27bfe 3591#if IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1\r
df24bb50 3592 if (irmp_pulse_time >= A1TVBOX_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= A1TVBOX_START_BIT_PULSE_LEN_MAX &&\r
3593 irmp_pause_time >= A1TVBOX_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= A1TVBOX_START_BIT_PAUSE_LEN_MAX)\r
3594 { // it's A1TVBOX\r
3595#ifdef ANALYZE\r
3596 ANALYZE_PRINTF ("protocol = A1TVBOX, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3597 A1TVBOX_START_BIT_PULSE_LEN_MIN, A1TVBOX_START_BIT_PULSE_LEN_MAX,\r
3598 A1TVBOX_START_BIT_PAUSE_LEN_MIN, A1TVBOX_START_BIT_PAUSE_LEN_MAX);\r
3599#endif // ANALYZE\r
3600 irmp_param_p = (IRMP_PARAMETER *) &a1tvbox_param;\r
3601 last_pause = 0;\r
3602 last_value = 1;\r
3603 }\r
3604 else\r
b85cb27d 3605#endif // IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1\r
3606\r
3607#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
df24bb50 3608 if (irmp_pulse_time >= ORTEK_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= ORTEK_START_BIT_PULSE_LEN_MAX &&\r
3609 irmp_pause_time >= ORTEK_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= ORTEK_START_BIT_PAUSE_LEN_MAX)\r
3610 { // it's ORTEK (Hama)\r
3611#ifdef ANALYZE\r
3612 ANALYZE_PRINTF ("protocol = ORTEK, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3613 ORTEK_START_BIT_PULSE_LEN_MIN, ORTEK_START_BIT_PULSE_LEN_MAX,\r
3614 ORTEK_START_BIT_PAUSE_LEN_MIN, ORTEK_START_BIT_PAUSE_LEN_MAX);\r
3615#endif // ANALYZE\r
3616 irmp_param_p = (IRMP_PARAMETER *) &ortek_param;\r
3617 last_pause = 0;\r
3618 last_value = 1;\r
3619 parity = 0;\r
3620 }\r
3621 else\r
cb93f9e9 3622#endif // IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
2fb27bfe 3623\r
cb93f9e9 3624#if IRMP_SUPPORT_RCMM_PROTOCOL == 1\r
df24bb50 3625 if (irmp_pulse_time >= RCMM32_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCMM32_START_BIT_PULSE_LEN_MAX &&\r
3626 irmp_pause_time >= RCMM32_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCMM32_START_BIT_PAUSE_LEN_MAX)\r
3627 { // it's RCMM\r
645fbc69 3628#ifdef ANALYZE\r
df24bb50 3629 ANALYZE_PRINTF ("protocol = RCMM, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
3630 RCMM32_START_BIT_PULSE_LEN_MIN, RCMM32_START_BIT_PULSE_LEN_MAX,\r
3631 RCMM32_START_BIT_PAUSE_LEN_MIN, RCMM32_START_BIT_PAUSE_LEN_MAX);\r
1082ecf2 3632#endif // ANALYZE\r
df24bb50 3633 irmp_param_p = (IRMP_PARAMETER *) &rcmm_param;\r
3634 }\r
3635 else\r
cb93f9e9 3636#endif // IRMP_SUPPORT_RCMM_PROTOCOL == 1\r
df24bb50 3637 {\r
645fbc69 3638#ifdef ANALYZE\r
df24bb50 3639 ANALYZE_PRINTF ("protocol = UNKNOWN\n");\r
1082ecf2 3640#endif // ANALYZE\r
df24bb50 3641 irmp_start_bit_detected = 0; // wait for another start bit...\r
3642 }\r
4225a882 3643\r
df24bb50 3644 if (irmp_start_bit_detected)\r
3645 {\r
3646 memcpy_P (&irmp_param, irmp_param_p, sizeof (IRMP_PARAMETER));\r
46dd89b7 3647\r
df24bb50 3648 if (! (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))\r
3649 {\r
645fbc69 3650#ifdef ANALYZE\r
df24bb50 3651 ANALYZE_PRINTF ("pulse_1: %3d - %3d\n", irmp_param.pulse_1_len_min, irmp_param.pulse_1_len_max);\r
3652 ANALYZE_PRINTF ("pause_1: %3d - %3d\n", irmp_param.pause_1_len_min, irmp_param.pause_1_len_max);\r
1082ecf2 3653#endif // ANALYZE\r
df24bb50 3654 }\r
3655 else\r
3656 {\r
645fbc69 3657#ifdef ANALYZE\r
df24bb50 3658 ANALYZE_PRINTF ("pulse: %3d - %3d or %3d - %3d\n", irmp_param.pulse_1_len_min, irmp_param.pulse_1_len_max,\r
3659 2 * irmp_param.pulse_1_len_min, 2 * irmp_param.pulse_1_len_max);\r
3660 ANALYZE_PRINTF ("pause: %3d - %3d or %3d - %3d\n", irmp_param.pause_1_len_min, irmp_param.pause_1_len_max,\r
3661 2 * irmp_param.pause_1_len_min, 2 * irmp_param.pause_1_len_max);\r
1082ecf2 3662#endif // ANALYZE\r
df24bb50 3663 }\r
46dd89b7 3664\r
6f750020 3665#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
df24bb50 3666 if (irmp_param2.protocol)\r
3667 {\r
645fbc69 3668#ifdef ANALYZE\r
df24bb50 3669 ANALYZE_PRINTF ("pulse_0: %3d - %3d\n", irmp_param2.pulse_0_len_min, irmp_param2.pulse_0_len_max);\r
3670 ANALYZE_PRINTF ("pause_0: %3d - %3d\n", irmp_param2.pause_0_len_min, irmp_param2.pause_0_len_max);\r
3671 ANALYZE_PRINTF ("pulse_1: %3d - %3d\n", irmp_param2.pulse_1_len_min, irmp_param2.pulse_1_len_max);\r
3672 ANALYZE_PRINTF ("pause_1: %3d - %3d\n", irmp_param2.pause_1_len_min, irmp_param2.pause_1_len_max);\r
1082ecf2 3673#endif // ANALYZE\r
df24bb50 3674 }\r
6f750020 3675#endif\r
3676\r
d823e852 3677\r
504d9df9 3678#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
df24bb50 3679 if (irmp_param.protocol == IRMP_RC6_PROTOCOL)\r
3680 {\r
645fbc69 3681#ifdef ANALYZE\r
df24bb50 3682 ANALYZE_PRINTF ("pulse_toggle: %3d - %3d\n", RC6_TOGGLE_BIT_LEN_MIN, RC6_TOGGLE_BIT_LEN_MAX);\r
1082ecf2 3683#endif // ANALYZE\r
df24bb50 3684 }\r
504d9df9 3685#endif\r
77f488bb 3686\r
df24bb50 3687 if (! (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))\r
3688 {\r
645fbc69 3689#ifdef ANALYZE\r
df24bb50 3690 ANALYZE_PRINTF ("pulse_0: %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
3691 ANALYZE_PRINTF ("pause_0: %3d - %3d\n", irmp_param.pause_0_len_min, irmp_param.pause_0_len_max);\r
1082ecf2 3692#endif // ANALYZE\r
df24bb50 3693 }\r
3694 else\r
3695 {\r
645fbc69 3696#ifdef ANALYZE\r
df24bb50 3697 ANALYZE_PRINTF ("pulse: %3d - %3d or %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max,\r
3698 2 * irmp_param.pulse_0_len_min, 2 * irmp_param.pulse_0_len_max);\r
3699 ANALYZE_PRINTF ("pause: %3d - %3d or %3d - %3d\n", irmp_param.pause_0_len_min, irmp_param.pause_0_len_max,\r
3700 2 * irmp_param.pause_0_len_min, 2 * irmp_param.pause_0_len_max);\r
1082ecf2 3701#endif // ANALYZE\r
df24bb50 3702 }\r
46dd89b7 3703\r
1082ecf2 3704#ifdef ANALYZE\r
504d9df9 3705#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
df24bb50 3706 if (irmp_param.protocol == IRMP_BANG_OLUFSEN_PROTOCOL)\r
3707 {\r
3708 ANALYZE_PRINTF ("pulse_r: %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
3709 ANALYZE_PRINTF ("pause_r: %3d - %3d\n", BANG_OLUFSEN_R_PAUSE_LEN_MIN, BANG_OLUFSEN_R_PAUSE_LEN_MAX);\r
3710 }\r
504d9df9 3711#endif\r
3712\r
df24bb50 3713 ANALYZE_PRINTF ("command_offset: %2d\n", irmp_param.command_offset);\r
3714 ANALYZE_PRINTF ("command_len: %3d\n", irmp_param.command_end - irmp_param.command_offset);\r
3715 ANALYZE_PRINTF ("complete_len: %3d\n", irmp_param.complete_len);\r
3716 ANALYZE_PRINTF ("stop_bit: %3d\n", irmp_param.stop_bit);\r
48664931 3717#endif // ANALYZE\r
df24bb50 3718 }\r
4225a882 3719\r
df24bb50 3720 irmp_bit = 0;\r
4225a882 3721\r
77f488bb 3722#if IRMP_SUPPORT_MANCHESTER == 1\r
df24bb50 3723 if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) &&\r
3724 irmp_param.protocol != IRMP_RUWIDO_PROTOCOL && // Manchester, but not RUWIDO\r
3725 irmp_param.protocol != IRMP_RC6_PROTOCOL) // Manchester, but not RC6\r
3726 {\r
3727 if (irmp_pause_time > irmp_param.pulse_1_len_max && irmp_pause_time <= 2 * irmp_param.pulse_1_len_max)\r
3728 {\r
3729#ifdef ANALYZE\r
3730 ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
3731 ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '0' : '1');\r
3732 ANALYZE_NEWLINE ();\r
3733#endif // ANALYZE\r
3734 irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1);\r
3735 }\r
3736 else if (! last_value) // && irmp_pause_time >= irmp_param.pause_1_len_min && irmp_pause_time <= irmp_param.pause_1_len_max)\r
3737 {\r
3738#ifdef ANALYZE\r
3739 ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
3740 ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '1' : '0');\r
3741 ANALYZE_NEWLINE ();\r
3742#endif // ANALYZE\r
3743 irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0);\r
3744 }\r
3745 }\r
3746 else\r
77f488bb 3747#endif // IRMP_SUPPORT_MANCHESTER == 1\r
a7054daf 3748\r
deba2a0a 3749#if IRMP_SUPPORT_SERIAL == 1\r
df24bb50 3750 if (irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL)\r
3751 {\r
3752 ; // do nothing\r
3753 }\r
3754 else\r
deba2a0a 3755#endif // IRMP_SUPPORT_SERIAL == 1\r
3756\r
3757\r
4225a882 3758#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
df24bb50 3759 if (irmp_param.protocol == IRMP_DENON_PROTOCOL)\r
3760 {\r
645fbc69 3761#ifdef ANALYZE\r
df24bb50 3762 ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
1082ecf2 3763#endif // ANALYZE\r
4225a882 3764\r
df24bb50 3765 if (irmp_pause_time >= DENON_1_PAUSE_LEN_MIN && irmp_pause_time <= DENON_1_PAUSE_LEN_MAX)\r
3766 { // pause timings correct for "1"?\r
645fbc69 3767#ifdef ANALYZE\r
df24bb50 3768 ANALYZE_PUTCHAR ('1'); // yes, store 1\r
3769 ANALYZE_NEWLINE ();\r
1082ecf2 3770#endif // ANALYZE\r
df24bb50 3771 irmp_store_bit (1);\r
3772 }\r
3773 else // if (irmp_pause_time >= DENON_0_PAUSE_LEN_MIN && irmp_pause_time <= DENON_0_PAUSE_LEN_MAX)\r
3774 { // pause timings correct for "0"?\r
645fbc69 3775#ifdef ANALYZE\r
df24bb50 3776 ANALYZE_PUTCHAR ('0'); // yes, store 0\r
3777 ANALYZE_NEWLINE ();\r
1082ecf2 3778#endif // ANALYZE\r
df24bb50 3779 irmp_store_bit (0);\r
3780 }\r
3781 }\r
3782 else\r
4225a882 3783#endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
beda975f 3784#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
df24bb50 3785 if (irmp_param.protocol == IRMP_THOMSON_PROTOCOL)\r
3786 {\r
645fbc69 3787#ifdef ANALYZE\r
df24bb50 3788 ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
1082ecf2 3789#endif // ANALYZE\r
beda975f 3790\r
df24bb50 3791 if (irmp_pause_time >= THOMSON_1_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_1_PAUSE_LEN_MAX)\r
3792 { // pause timings correct for "1"?\r
645fbc69 3793#ifdef ANALYZE\r
df24bb50 3794 ANALYZE_PUTCHAR ('1'); // yes, store 1\r
3795 ANALYZE_NEWLINE ();\r
1082ecf2 3796#endif // ANALYZE\r
df24bb50 3797 irmp_store_bit (1);\r
3798 }\r
3799 else // if (irmp_pause_time >= THOMSON_0_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_0_PAUSE_LEN_MAX)\r
3800 { // pause timings correct for "0"?\r
645fbc69 3801#ifdef ANALYZE\r
df24bb50 3802 ANALYZE_PUTCHAR ('0'); // yes, store 0\r
3803 ANALYZE_NEWLINE ();\r
1082ecf2 3804#endif // ANALYZE\r
df24bb50 3805 irmp_store_bit (0);\r
3806 }\r
3807 }\r
3808 else\r
beda975f 3809#endif // IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
df24bb50 3810 {\r
3811 ; // else do nothing\r
3812 }\r
3813\r
3814 irmp_pulse_time = 1; // set counter to 1, not 0\r
3815 irmp_pause_time = 0;\r
3816 wait_for_start_space = 0;\r
3817 }\r
3818 }\r
3819 else if (wait_for_space) // the data section....\r
3820 { // counting the time of darkness....\r
3821 uint_fast8_t got_light = FALSE;\r
3822\r
3823 if (irmp_input) // still dark?\r
3824 { // yes...\r
3825 if (irmp_bit == irmp_param.complete_len && irmp_param.stop_bit == 1)\r
3826 {\r
3827 if (\r
a42d1ee6 3828#if IRMP_SUPPORT_MANCHESTER == 1\r
df24bb50 3829 (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) ||\r
a42d1ee6 3830#endif\r
3831#if IRMP_SUPPORT_SERIAL == 1\r
df24bb50 3832 (irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) ||\r
a42d1ee6 3833#endif\r
df24bb50 3834 (irmp_pulse_time >= irmp_param.pulse_0_len_min && irmp_pulse_time <= irmp_param.pulse_0_len_max))\r
3835 {\r
3836#ifdef ANALYZE\r
3837 if (! (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))\r
3838 {\r
3839 ANALYZE_PRINTF ("stop bit detected\n");\r
3840 }\r
3841#endif // ANALYZE\r
3842 irmp_param.stop_bit = 0;\r
3843 }\r
3844 else\r
3845 {\r
3846#ifdef ANALYZE\r
3847 ANALYZE_PRINTF ("error: stop bit timing wrong, irmp_bit = %d, irmp_pulse_time = %d, pulse_0_len_min = %d, pulse_0_len_max = %d\n",\r
3848 irmp_bit, irmp_pulse_time, irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
3849#endif // ANALYZE\r
3850 irmp_start_bit_detected = 0; // wait for another start bit...\r
3851 irmp_pulse_time = 0;\r
3852 irmp_pause_time = 0;\r
3853 }\r
3854 }\r
3855 else\r
3856 {\r
3857 irmp_pause_time++; // increment counter\r
4225a882 3858\r
3859#if IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
df24bb50 3860 if (irmp_param.protocol == IRMP_SIRCS_PROTOCOL && // Sony has a variable number of bits:\r
3861 irmp_pause_time > SIRCS_PAUSE_LEN_MAX && // minimum is 12\r
3862 irmp_bit >= 12 - 1) // pause too long?\r
3863 { // yes, break and close this frame\r
3864 irmp_param.complete_len = irmp_bit + 1; // set new complete length\r
3865 got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
3866 irmp_tmp_address |= (irmp_bit - SIRCS_MINIMUM_DATA_LEN + 1) << 8; // new: store number of additional bits in upper byte of address!\r
3867 irmp_param.command_end = irmp_param.command_offset + irmp_bit + 1; // correct command length\r
3868 irmp_pause_time = SIRCS_PAUSE_LEN_MAX - 1; // correct pause length\r
3869 }\r
3870 else\r
4225a882 3871#endif\r
0715cf5e 3872#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
df24bb50 3873 if (irmp_param.protocol == IRMP_FAN_PROTOCOL && // FAN has no stop bit.\r
3874 irmp_bit >= FAN_COMPLETE_DATA_LEN - 1) // last bit in frame\r
3875 { // yes, break and close this frame\r
3876 if (irmp_pulse_time <= FAN_0_PULSE_LEN_MAX && irmp_pause_time >= FAN_0_PAUSE_LEN_MIN)\r
3877 {\r
458a6d64 3878#ifdef ANALYZE\r
df24bb50 3879 ANALYZE_PRINTF ("Generating virtual stop bit\n");\r
458a6d64 3880#endif // ANALYZE\r
df24bb50 3881 got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
3882 }\r
3883 else if (irmp_pulse_time >= FAN_1_PULSE_LEN_MIN && irmp_pause_time >= FAN_1_PAUSE_LEN_MIN)\r
3884 {\r
458a6d64 3885#ifdef ANALYZE\r
df24bb50 3886 ANALYZE_PRINTF ("Generating virtual stop bit\n");\r
458a6d64 3887#endif // ANALYZE\r
df24bb50 3888 got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
3889 }\r
3890 }\r
3891 else\r
0715cf5e 3892#endif\r
deba2a0a 3893#if IRMP_SUPPORT_SERIAL == 1\r
df24bb50 3894 // NETBOX generates no stop bit, here is the timeout condition:\r
3895 if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) && irmp_param.protocol == IRMP_NETBOX_PROTOCOL &&\r
3896 irmp_pause_time >= NETBOX_PULSE_LEN * (NETBOX_COMPLETE_DATA_LEN - irmp_bit))\r
3897 {\r
3898 got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
3899 }\r
3900 else\r
deba2a0a 3901#endif\r
89e8cafb 3902#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
df24bb50 3903 if (irmp_param.protocol == IRMP_GRUNDIG_PROTOCOL && !irmp_param.stop_bit)\r
3904 {\r
3905 if (irmp_pause_time > IR60_TIMEOUT_LEN && (irmp_bit == 5 || irmp_bit == 6))\r
3906 {\r
3907#ifdef ANALYZE\r
3908 ANALYZE_PRINTF ("Switching to IR60 protocol\n");\r
3909#endif // ANALYZE\r
3910 got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
3911 irmp_param.stop_bit = TRUE; // set flag\r
3912\r
3913 irmp_param.protocol = IRMP_IR60_PROTOCOL; // change protocol\r
3914 irmp_param.complete_len = IR60_COMPLETE_DATA_LEN; // correct complete len\r
3915 irmp_param.address_offset = IR60_ADDRESS_OFFSET;\r
3916 irmp_param.address_end = IR60_ADDRESS_OFFSET + IR60_ADDRESS_LEN;\r
3917 irmp_param.command_offset = IR60_COMMAND_OFFSET;\r
3918 irmp_param.command_end = IR60_COMMAND_OFFSET + IR60_COMMAND_LEN;\r
3919\r
3920 irmp_tmp_command <<= 1;\r
3921 irmp_tmp_command |= first_bit;\r
3922 }\r
3923 else if (irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= GRUNDIG_COMPLETE_DATA_LEN - 2)\r
3924 { // special manchester decoder\r
3925 irmp_param.complete_len = GRUNDIG_COMPLETE_DATA_LEN; // correct complete len\r
3926 got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
3927 irmp_param.stop_bit = TRUE; // set flag\r
3928 }\r
3929 else if (irmp_bit >= GRUNDIG_COMPLETE_DATA_LEN)\r
3930 {\r
3931#ifdef ANALYZE\r
3932 ANALYZE_PRINTF ("Switching to NOKIA protocol, irmp_bit = %d\n", irmp_bit);\r
3933#endif // ANALYZE\r
3934 irmp_param.protocol = IRMP_NOKIA_PROTOCOL; // change protocol\r
3935 irmp_param.address_offset = NOKIA_ADDRESS_OFFSET;\r
3936 irmp_param.address_end = NOKIA_ADDRESS_OFFSET + NOKIA_ADDRESS_LEN;\r
3937 irmp_param.command_offset = NOKIA_COMMAND_OFFSET;\r
3938 irmp_param.command_end = NOKIA_COMMAND_OFFSET + NOKIA_COMMAND_LEN;\r
3939\r
3940 if (irmp_tmp_command & 0x300)\r
3941 {\r
3942 irmp_tmp_address = (irmp_tmp_command >> 8);\r
3943 irmp_tmp_command &= 0xFF;\r
3944 }\r
3945 }\r
3946 }\r
3947 else\r
d155e9ab 3948#endif\r
12948cf3 3949#if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
df24bb50 3950 if (irmp_param.protocol == IRMP_RUWIDO_PROTOCOL && !irmp_param.stop_bit)\r
3951 {\r
3952 if (irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= RUWIDO_COMPLETE_DATA_LEN - 2)\r
3953 { // special manchester decoder\r
3954 irmp_param.complete_len = RUWIDO_COMPLETE_DATA_LEN; // correct complete len\r
3955 got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
3956 irmp_param.stop_bit = TRUE; // set flag\r
3957 }\r
3958 else if (irmp_bit >= RUWIDO_COMPLETE_DATA_LEN)\r
3959 {\r
3960#ifdef ANALYZE\r
3961 ANALYZE_PRINTF ("Switching to SIEMENS protocol\n");\r
3962#endif // ANALYZE\r
3963 irmp_param.protocol = IRMP_SIEMENS_PROTOCOL; // change protocol\r
3964 irmp_param.address_offset = SIEMENS_ADDRESS_OFFSET;\r
3965 irmp_param.address_end = SIEMENS_ADDRESS_OFFSET + SIEMENS_ADDRESS_LEN;\r
3966 irmp_param.command_offset = SIEMENS_COMMAND_OFFSET;\r
3967 irmp_param.command_end = SIEMENS_COMMAND_OFFSET + SIEMENS_COMMAND_LEN;\r
3968\r
3969 // 76543210\r
3970 // RUWIDO: AAAAAAAAACCCCCCCp\r
3971 // SIEMENS: AAAAAAAAAAACCCCCCCCCCp\r
3972 irmp_tmp_address <<= 2;\r
3973 irmp_tmp_address |= (irmp_tmp_command >> 6);\r
3974 irmp_tmp_command &= 0x003F;\r
cb93f9e9 3975// irmp_tmp_command <<= 4;\r
df24bb50 3976 irmp_tmp_command |= last_value;\r
3977 }\r
3978 }\r
3979 else\r
12948cf3 3980#endif\r
40ca4604 3981#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1\r
df24bb50 3982 if (irmp_param.protocol == IRMP_ROOMBA_PROTOCOL && // Roomba has no stop bit\r
3983 irmp_bit >= ROOMBA_COMPLETE_DATA_LEN - 1) // it's the last data bit...\r
3984 { // break and close this frame\r
3985 if (irmp_pulse_time >= ROOMBA_1_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_1_PULSE_LEN_MAX)\r
3986 {\r
3987 irmp_pause_time = ROOMBA_1_PAUSE_LEN_EXACT;\r
3988 }\r
3989 else if (irmp_pulse_time >= ROOMBA_0_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_0_PULSE_LEN_MAX)\r
3990 {\r
3991 irmp_pause_time = ROOMBA_0_PAUSE_LEN;\r
3992 }\r
3993\r
3994 got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
3995 }\r
3996 else\r
40ca4604 3997#endif\r
77f488bb 3998#if IRMP_SUPPORT_MANCHESTER == 1\r
df24bb50 3999 if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) &&\r
4000 irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= irmp_param.complete_len - 2 && !irmp_param.stop_bit)\r
4001 { // special manchester decoder\r
4002 got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
4003 irmp_param.stop_bit = TRUE; // set flag\r
4004 }\r
4005 else\r
77f488bb 4006#endif // IRMP_SUPPORT_MANCHESTER == 1\r
df24bb50 4007 if (irmp_pause_time > IRMP_TIMEOUT_LEN) // timeout?\r
4008 { // yes...\r
4009 if (irmp_bit == irmp_param.complete_len - 1 && irmp_param.stop_bit == 0)\r
4010 {\r
4011 irmp_bit++;\r
4012 }\r
a777fd4e 4013#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
4014 else if ((irmp_param.protocol == IRMP_NEC_PROTOCOL || irmp_param.protocol == IRMP_NEC42_PROTOCOL) && irmp_bit == 0)\r
4015 { // it was a non-standard repetition frame\r
4016