From 6f75002072ad07fe60d9e57370d3980b5229f7f4 Mon Sep 17 00:00:00 2001 From: ukw Date: Tue, 22 Jun 2010 12:32:40 +0000 Subject: [PATCH] Version 1.6.8: fixed conflicts between RC5 and FDC/RCCAR protocol git-svn-id: svn://mikrocontroller.net/irmp@34 aeb2e35e-bfc4-4214-b83c-9e8de998ed28 --- IR-Data/fdc-20kHz.txt | 8 +- IR-Data/test-suite.sh | 44 +++-- README.txt | 4 +- irmp.c | 361 +++++++++++++++++++++++++++++++++++------- irmp.exe | Bin 22528 -> 22016 bytes irmp.h | 12 +- irmpconfig.h | 14 +- irsnd.exe | Bin 13312 -> 13824 bytes irsndmain.c | 2 +- main.c | 4 +- 10 files changed, 349 insertions(+), 100 deletions(-) diff --git a/IR-Data/fdc-20kHz.txt b/IR-Data/fdc-20kHz.txt index 8b2bda7..5a89a59 100644 --- a/IR-Data/fdc-20kHz.txt +++ b/IR-Data/fdc-20kHz.txt @@ -52,13 +52,13 @@ 000000000000000000000000000000000000000000111111111111111111100000011111111111111100000011111111111111000000111111111111110000001111111111111110000001111111111111100000011111111111111000000111110000001111000000111110000001111000000111100000001111000000111100000011111000000111100000011111000000111100000011111000000111100000011110000000111100000011110000001111100000011110000001111111111111110000001111000000111100000001111111111111100000011110000001111100000011110000001111100000011110000001111111111111100000011111111111111100000011110000001111111111111100000001111111111111100000011111111111111000000111111111111111000000111111111111111111 # 9 000000000000000000000000000000000000000000111111111111111111100000011111111111111100000011111111111111000000111111111111110000001111111111111110000001111111111111100000011111111111111000000111110000001111000000111110000001111000000111110000001111000000111110000001111000000111100000011111000000111100000011111000000111100000011111000000111100000011111000000111100000011110000001111100000011111111111111000000111110000001111111111111100000011110000001111100000011110000001111100000011111111111111000000111110000001111111111111100000011110000001111111111111110000001111111111111100000011111111111111000000111111111111111000000111111111111111111 -# ss +# 0Ÿ 000000000000000000000000000000000000000001111111111111111111100000011111111111111000000111111111111110000001111111111111110000001111111111111100000011111111111111000000111111111111111000000111100000011111000000111100000011110000001111100000011110000001111100000011110000001111100000011110000001111100000011110000001111000000111110000001111000000111110000001111000000111110000001111111111111100000011111111111111000000111110000001111111111111100000011111000000111100000011110000001111100000011110000001111100000011111111111111000000111110000001111111111111100000011111111111111000000111111111111111000000111111111111110000001111111111111111111 -# ' +# ss 000000000000000000000000000000000000000001111111111111111111100000011111111111111000000111111111111110000001111111111111110000001111111111111100000011111111111111000000111111111111111000000111100000011111000000111100000011110000000111100000011110000001111100000011110000001111100000011110000001111100000011110000001111000000011110000001111000000111110000001111000000111110000001111000000111110000001111111111111100000011111111111111000000111110000001111000000111110000001111000000111111111111110000001111111111111110000001111000000111110000001111111111111100000011111111111111000000111111111111111000000111111111111110000001111111111111111111 -# Backspace +# Accent 000000000000000000000000000000000000000000111111111111111111100000011111111111111000000111111111111111000000111111111111110000001111111111111100000011111111111111100000011111111111111000000111100000011111000000111100000011111000000111100000011111000000111100000011110000001111100000011110000001111100000011110000001111100000011110000001111100000011110000001111000000111110000001111111111111100000011111000000111111111111110000001111111111111100000011111000000111100000011111000000111100000011111000000111111111111110000001111000000111110000001111111111111100000011111111111111000000111111111111111000000111111111111110000001111111111111111111 -# ????? +# Backspace 000000000000000000000000000000000000000000111111111111111111100000011111111111111000000111111111111111000000111111111111110000001111111111111100000011111111111111100000011111111111111000000111100000011111000000111100000011111000000111100000011111000000111100000011110000001111100000011110000001111100000011110000001111100000011110000001111100000011110000001111000000111110000001111111111111100000011111111111111100000011111111111111000000111111111111110000001111100000011110000001111100000011110000001111000000111110000001111000000111110000001111111111111100000011111111111111000000111111111111111000000111111111111110000001111111111111111111 # Tab 000000000000000000000000000000000000000001111111111111111111000000111111111111111000000111111111111110000001111111111111100000011111111111111100000011111111111111000000111111111111110000001111100000011110000001111100000011110000001111100000011110000001111000000111110000001111000000111110000001111000000111110000001111000000111110000001111000000111100000011111000000111100000011111000000111100000011111000000111100000011111111111111000000111110000001111000000111110000001111111111111100000011111111111111000000111111111111111000000111111111111110000001111100000011111111111111000000111111111111110000001111111111111110000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000011111111111111111110000001111111111111100000011111111111111100000011111111111111000000111111111111110000001111111111111110000001111111111111100000011111000000111100000011110000000111100000011110000001111100000011110000001111100000011110000001111100000011110000001111000000111110000001111000000111111111111111000000111111111111110000001111111111111100000011111111111111100000011110000001111100000011110000001111000000011111111111111000000111100000011111000000111100000011111111111111000000011111111111111000000111111111111110000001111111111111100000001111000000111111111111110000001111111111111110000001111111111111100000011111111111111111 diff --git a/IR-Data/test-suite.sh b/IR-Data/test-suite.sh index 57817f4..840b7ac 100644 --- a/IR-Data/test-suite.sh +++ b/IR-Data/test-suite.sh @@ -11,7 +11,16 @@ # $Id: test-suite.sh,v 1.10 2010/06/09 12:04:04 fm Exp $ #---------------------------------------------------------------------------- +set -e # exit on error cd `dirname $0` +mkdir -p tmpsrc +cp ../irmp.[ch] ../irmpconfig.h ../irsnd.[ch] ../irsndconfig.h ../makefile.lnx tmpsrc +cd tmpsrc +sed 's/#define \(IRMP_SUPPORT_[A-Z_0-9]* *\)[01]/#define \1 1/g' irmpconfig.new +mv irmpconfig.new irmpconfig.h +make -f makefile.lnx clean +make -f makefile.lnx all +cd .. for j in \ Dbox.txt \ @@ -37,12 +46,14 @@ for j in \ bo_beolink1000-10kHz.txt \ denon.txt \ elta_radio.txt \ + fdc.txt \ nec-repetition.txt \ nec-skymaster-dt500.txt \ nec.txt \ nubert-subwoofer.txt \ orion_vcr_07660BM070.txt \ panasonic-scan.txt \ + rc-car.txt \ rc5.txt \ rc5x-79.txt \ rc5x.txt \ @@ -52,9 +63,9 @@ for j in \ sharp-denon2.txt do echo "testing $j ..." - if ../irmp -v < $j | grep -q error + if tmpsrc/irmp -v < $j | grep -q error then - ../irmp -v < $j | grep error + tmpsrc/irmp -v < $j | grep error echo "test failed" exit 1 fi @@ -66,26 +77,29 @@ for j in \ denon-15kHz.txt do echo "testing $j ..." - if ../irmp-15kHz -v < $j | grep -q error + if tmpsrc/irmp-15kHz -v < $j | grep -q error then - ../irmp-15kHz -v < $j | grep error + tmpsrc/irmp-15kHz -v < $j | grep error echo "test failed" exit 1 fi done -# for j in \ -# fdc-20kHz.txt -# do -# echo "testing $j ..." -# if ../irmp-20kHz -v < $j | grep -q error -# then -# ../irmp-20kHz -v < $j | grep error -# echo "test failed" -# exit 1 -# fi -# done +for j in \ + rc-car-20kHz.txt \ + fdc-20kHz.txt \ + fdc2-20kHz.txt +do + echo "testing $j ..." + if tmpsrc/irmp-20kHz -v < $j | grep -q error + then + tmpsrc/irmp-20kHz -v < $j | grep error + echo "test failed" + exit 1 + fi +done +rm -rf tmpsrc echo "all tests successful" exit 0 diff --git a/README.txt b/README.txt index 08c9527..5783fa4 100644 --- a/README.txt +++ b/README.txt @@ -1,8 +1,8 @@ IRMP - Infrared Multi Protocol Decoder -------------------------------------- -Version IRMP: 1.6.7 21.06.2010 -Version IRSND: 1.6.7 21.06.2010 +Version IRMP: 1.6.8 22.06.2010 +Version IRSND: 1.6.8 22.06.2010 Dokumentation: diff --git a/irmp.c b/irmp.c index 651cd5d..2df0d8e 100644 --- a/irmp.c +++ b/irmp.c @@ -3,7 +3,7 @@ * * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irmp.c,v 1.53 2010/06/21 08:27:09 fm Exp $ + * $Id: irmp.c,v 1.59 2010/06/22 12:39:27 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -524,12 +524,16 @@ typedef uint8_t PAUSE_LEN; #define FDC_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) #define FDC_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1) #define FDC_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) -#define FDC_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) -#define FDC_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) -#define FDC_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) -#define FDC_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) -#define FDC_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) -#define FDC_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1) +#define FDC_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) +#define FDC_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_PULSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) +#define FDC_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1) +#define FDC_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1) +#if 0 +#define FDC_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * FDC_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) // could be negative: 255 +#else +#define FDC_0_PAUSE_LEN_MIN (1) // simply use 1 +#endif +#define FDC_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * FDC_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) #define RCCAR_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * RCCAR_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1) #define RCCAR_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RCCAR_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) @@ -1166,6 +1170,10 @@ static PROGMEM IRMP_PARAMETER rccar_param = static uint8_t irmp_bit; // current bit position static IRMP_PARAMETER irmp_param; +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) +static IRMP_PARAMETER irmp_param2; +#endif + static volatile uint8_t irmp_ir_detected; static volatile uint8_t irmp_protocol; static volatile uint16_t irmp_address; @@ -1244,12 +1252,10 @@ irmp_get_data (IRMP_DATA * irmp_data_p) // Bit 12 11 10 9 8 7 6 5 4 3 2 1 0 // V D7 D6 D5 D4 D3 D2 D1 D0 A1 A0 C1 C0 // 10 9 8 7 6 5 4 3 2 1 0 irmp_address = (irmp_command & 0x000C) >> 2; // addr: 0 0 0 0 0 0 0 0 0 A1 A0 -printf ("\n! %04x ", irmp_command); irmp_command = ((irmp_command & 0x1000) >> 2) | // V-Bit: V 0 0 0 0 0 0 0 0 0 0 ((irmp_command & 0x0003) << 8) | // C-Bits: 0 C1 C0 0 0 0 0 0 0 0 0 ((irmp_command & 0x0FF0) >> 4); // D-Bits: D7 D6 D5 D4 D3 D2 D1 D0 rtc = TRUE; // Summe: V C1 C0 D7 D6 D5 D4 D3 D2 D1 D0 -printf ("%04x\n", irmp_command); break; #endif default: @@ -1276,6 +1282,12 @@ printf ("%04x\n", irmp_command); // these statics must not be volatile, because they are only used by irmp_store_bit(), which is called by irmp_ISR() static uint16_t irmp_tmp_address; // ir address static uint16_t irmp_tmp_command; // ir command + +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) +static uint16_t irmp_tmp_address2; // ir address +static uint16_t irmp_tmp_command2; // ir command +#endif + #if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1 static uint16_t irmp_tmp_id; // ir id (only SAMSUNG) #endif @@ -1324,6 +1336,38 @@ irmp_store_bit (uint8_t value) irmp_bit++; } +/*--------------------------------------------------------------------------------------------------------------------------------------------------- + * store bit + * @details store bit in temp address or temp command + * @param value to store: 0 or 1 + *--------------------------------------------------------------------------------------------------------------------------------------------------- + */ +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) +static void +irmp_store_bit2 (uint8_t value) +{ + uint8_t irmp_bit2; + + if (irmp_param.protocol) + { + irmp_bit2 = irmp_bit - 2; + } + else + { + irmp_bit2 = irmp_bit - 1; + } + + if (irmp_bit2 >= irmp_param2.address_offset && irmp_bit2 < irmp_param2.address_end) + { + irmp_tmp_address2 |= (((uint16_t) (value)) << (irmp_bit2 - irmp_param2.address_offset)); // CV wants cast + } + else if (irmp_bit2 >= irmp_param2.command_offset && irmp_bit2 < irmp_param2.command_end) + { + irmp_tmp_command2 |= (((uint16_t) (value)) << (irmp_bit2 - irmp_param2.command_offset)); // CV wants cast + } +} +#endif // IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) + /*--------------------------------------------------------------------------------------------------------------------------------------------------- * ISR routine * @details ISR routine, called 10000 times per second @@ -1386,6 +1430,12 @@ irmp_ISR (void) wait_for_space = 0; irmp_tmp_command = 0; irmp_tmp_address = 0; + +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) + irmp_tmp_command2 = 0; + irmp_tmp_address2 = 0; +#endif + irmp_bit = 0xff; irmp_pause_time = 1; // 1st pause: set to 1, not to 0! #if IRMP_SUPPORT_RC5_PROTOCOL == 1 @@ -1419,6 +1469,10 @@ irmp_ISR (void) { // receiving first data pulse! IRMP_PARAMETER * irmp_param_p = (IRMP_PARAMETER *) 0; +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) + irmp_param2.protocol = 0; +#endif + ANALYZE_PRINTF ("start-bit: pulse = %d, pause = %d\n", irmp_pulse_time, irmp_pause_time); #if IRMP_SUPPORT_SIRCS_PROTOCOL == 1 @@ -1508,9 +1562,42 @@ irmp_ISR (void) ((irmp_pause_time >= RC5_START_BIT_LEN_MIN && irmp_pause_time <= RC5_START_BIT_LEN_MAX) || (irmp_pause_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pause_time <= 2 * RC5_START_BIT_LEN_MAX))) { // it's RC5 - ANALYZE_PRINTF ("protocol = RC5, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", - RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, - RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX); +#if IRMP_SUPPORT_FDC_PROTOCOL == 1 + if (irmp_pulse_time >= FDC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FDC_START_BIT_PULSE_LEN_MAX && + irmp_pause_time >= FDC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FDC_START_BIT_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF ("protocol = RC5 or FDC\n"); + ANALYZE_PRINTF ("FDC start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", + FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX, + FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX); + ANALYZE_PRINTF ("RC5 start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX); + memcpy_P (&irmp_param2, &fdc_param, sizeof (IRMP_PARAMETER)); + } + else +#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1 +#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1 + if (irmp_pulse_time >= RCCAR_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_START_BIT_PULSE_LEN_MAX && + irmp_pause_time >= RCCAR_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_START_BIT_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF ("protocol = RC5 or RCCAR\n"); + ANALYZE_PRINTF ("RCCAR start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", + RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX, + RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX); + ANALYZE_PRINTF ("RC5 start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX); + memcpy_P (&irmp_param2, &rccar_param, sizeof (IRMP_PARAMETER)); + } + else +#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1 + { + ANALYZE_PRINTF ("protocol = RC5, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX); + } + irmp_param_p = (IRMP_PARAMETER *) &rc5_param; last_pause = irmp_pause_time; @@ -1677,6 +1764,16 @@ irmp_ISR (void) 2 * irmp_param.pause_1_len_min, 2 * irmp_param.pause_1_len_max); } +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) + if (irmp_param2.protocol) + { + ANALYZE_PRINTF ("pulse_0: %3d - %3d\n", irmp_param2.pulse_0_len_min, irmp_param2.pulse_0_len_max); + ANALYZE_PRINTF ("pause_0: %3d - %3d\n", irmp_param2.pause_0_len_min, irmp_param2.pause_0_len_max); + ANALYZE_PRINTF ("pulse_1: %3d - %3d\n", irmp_param2.pulse_1_len_min, irmp_param2.pulse_1_len_max); + ANALYZE_PRINTF ("pause_1: %3d - %3d\n", irmp_param2.pause_1_len_min, irmp_param2.pause_1_len_max); + } +#endif + #if IRMP_SUPPORT_RC6_PROTOCOL == 1 if (irmp_param.protocol == IRMP_RC6_PROTOCOL) { @@ -1717,7 +1814,7 @@ irmp_ISR (void) ANALYZE_NEWLINE (); irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1); } - else if (! last_value) + else if (! last_value) // && irmp_pause_time >= irmp_param.pause_1_len_min && irmp_pause_time <= irmp_param.pause_1_len_max) { ANALYZE_PRINTF ("%8d [bit %2d: pulse = %3d, pause = %3d] ", time_counter, irmp_bit, irmp_pulse_time, irmp_pause_time); @@ -1889,10 +1986,15 @@ irmp_ISR (void) irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1 ); ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '1' : '0'); irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0 ); - ANALYZE_NEWLINE (); +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) + if (! irmp_param2.protocol) +#endif + { + ANALYZE_NEWLINE (); + } last_value = (irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0; } - else // if (irmp_pulse_time >= irmp_param.pulse_1_len_max && irmp_pulse_time <= irmp_param.pulse_1_len_max) + else if (irmp_pulse_time >= irmp_param.pulse_1_len_min && irmp_pulse_time <= irmp_param.pulse_1_len_max) { uint8_t manchester_value; @@ -1916,9 +2018,96 @@ irmp_ISR (void) #endif // 0 ANALYZE_PUTCHAR (manchester_value + '0'); - ANALYZE_NEWLINE (); +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) + if (! irmp_param2.protocol) +#endif + { + ANALYZE_NEWLINE (); + } irmp_store_bit (manchester_value); } + else + { +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && IRMP_SUPPORT_FDC_PROTOCOL == 1 + if (irmp_param2.protocol == IRMP_FDC_PROTOCOL && + irmp_pulse_time >= FDC_PULSE_LEN_MIN && irmp_pulse_time <= FDC_PULSE_LEN_MAX && + ((irmp_pause_time >= FDC_1_PAUSE_LEN_MIN && irmp_pause_time <= FDC_1_PAUSE_LEN_MAX) || + (irmp_pause_time >= FDC_0_PAUSE_LEN_MIN && irmp_pause_time <= FDC_0_PAUSE_LEN_MAX))) + { + ANALYZE_PUTCHAR ('?'); + irmp_param.protocol = 0; + } + else +#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1 +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && IRMP_SUPPORT_RCCAR_PROTOCOL == 1 + if (irmp_param2.protocol == IRMP_RCCAR_PROTOCOL && + irmp_pulse_time >= RCCAR_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_PULSE_LEN_MAX && + ((irmp_pause_time >= RCCAR_1_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_1_PAUSE_LEN_MAX) || + (irmp_pause_time >= RCCAR_0_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_0_PAUSE_LEN_MAX))) + { + ANALYZE_PUTCHAR ('?'); + irmp_param.protocol = 0; + } + else +#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1 + { + ANALYZE_PUTCHAR ('?'); + ANALYZE_NEWLINE (); + ANALYZE_PRINTF ("error 3 RC5: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time); + ANALYZE_ONLY_NORMAL_PUTCHAR ('\n'); + irmp_start_bit_detected = 0; // reset flags and wait for next start bit + irmp_pause_time = 0; + } + } + +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && IRMP_SUPPORT_FDC_PROTOCOL == 1 + if (irmp_param2.protocol == IRMP_FDC_PROTOCOL && irmp_pulse_time >= FDC_PULSE_LEN_MIN && irmp_pulse_time <= FDC_PULSE_LEN_MAX) + { + if (irmp_pause_time >= FDC_1_PAUSE_LEN_MIN && irmp_pause_time <= FDC_1_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF (" 1 (FDC)\n"); + irmp_store_bit2 (1); + } + else if (irmp_pause_time >= FDC_0_PAUSE_LEN_MIN && irmp_pause_time <= FDC_0_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF (" 0 (FDC)\n"); + irmp_store_bit2 (0); + } + + if (! irmp_param.protocol) + { + ANALYZE_PRINTF ("Switching to FDC protocol\n"); + memcpy (&irmp_param, &irmp_param2, sizeof (IRMP_PARAMETER)); + irmp_param2.protocol = 0; + irmp_tmp_address = irmp_tmp_address2; + irmp_tmp_command = irmp_tmp_command2; + } + } +#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1 +#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && IRMP_SUPPORT_RCCAR_PROTOCOL == 1 + if (irmp_param2.protocol == IRMP_RCCAR_PROTOCOL && irmp_pulse_time >= RCCAR_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_PULSE_LEN_MAX) + { + if (irmp_pause_time >= RCCAR_1_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_1_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF (" 1 (RCCAR)\n"); + irmp_store_bit2 (1); + } + else if (irmp_pause_time >= RCCAR_0_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_0_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF (" 0 (RCCAR)\n"); + irmp_store_bit2 (0); + } + + if (! irmp_param.protocol) + { + ANALYZE_PRINTF ("Switching to RCCAR protocol\n"); + memcpy (&irmp_param, &irmp_param2, sizeof (IRMP_PARAMETER)); + irmp_param2.protocol = 0; + irmp_tmp_address = irmp_tmp_address2; + irmp_tmp_command = irmp_tmp_command2; + } + } +#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1 last_pause = irmp_pause_time; wait_for_space = 0; @@ -2197,7 +2386,10 @@ irmp_ISR (void) #endif #if IRMP_SUPPORT_RC5_PROTOCOL == 1 - irmp_tmp_command |= rc5_cmd_bit6; // store bit 6 + if (irmp_param.protocol == IRMP_RC5_PROTOCOL) + { + irmp_tmp_command |= rc5_cmd_bit6; // store bit 6 + } #endif irmp_command = irmp_tmp_command; // store command @@ -2254,48 +2446,99 @@ irmp_ISR (void) static void print_timings (void) { - printf ("PROTOCOL START BIT NO. START BIT PULSE START BIT PAUSE\n"); + printf ("PROTOCOL S S-PULSE S-PAUSE PULSE-0 PAUSE-0 PULSE-1 PAUSE-1\n"); printf ("====================================================================================\n"); - printf ("SIRCS 1 %3d - %3d %3d - %3d\n", - SIRCS_START_BIT_PULSE_LEN_MIN, SIRCS_START_BIT_PULSE_LEN_MAX, SIRCS_START_BIT_PAUSE_LEN_MIN, SIRCS_START_BIT_PAUSE_LEN_MAX); - printf ("NEC 1 %3d - %3d %3d - %3d\n", - NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX, NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX); - printf ("NEC (rep) 1 %3d - %3d %3d - %3d\n", - NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX, NEC_REPEAT_START_BIT_PAUSE_LEN_MIN, NEC_REPEAT_START_BIT_PAUSE_LEN_MAX); - printf ("SAMSUNG 1 %3d - %3d %3d - %3d\n", - SAMSUNG_START_BIT_PULSE_LEN_MIN, SAMSUNG_START_BIT_PULSE_LEN_MAX, SAMSUNG_START_BIT_PAUSE_LEN_MIN, SAMSUNG_START_BIT_PAUSE_LEN_MAX); - printf ("MATSUSHITA 1 %3d - %3d %3d - %3d\n", - MATSUSHITA_START_BIT_PULSE_LEN_MIN, MATSUSHITA_START_BIT_PULSE_LEN_MAX, MATSUSHITA_START_BIT_PAUSE_LEN_MIN, MATSUSHITA_START_BIT_PAUSE_LEN_MAX); - printf ("KASEIKYO 1 %3d - %3d %3d - %3d\n", - KASEIKYO_START_BIT_PULSE_LEN_MIN, KASEIKYO_START_BIT_PULSE_LEN_MAX, KASEIKYO_START_BIT_PAUSE_LEN_MIN, KASEIKYO_START_BIT_PAUSE_LEN_MAX); - printf ("RECS80 1 %3d - %3d %3d - %3d\n", - RECS80_START_BIT_PULSE_LEN_MIN, RECS80_START_BIT_PULSE_LEN_MAX, RECS80_START_BIT_PAUSE_LEN_MIN, RECS80_START_BIT_PAUSE_LEN_MAX); - printf ("RC5 1 %3d - %3d %3d - %3d\n", - RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX); - printf ("DENON 1 %3d - %3d %3d - %3d or %3d - %3d\n", - DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX, DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX); - printf ("RC6 1 %3d - %3d %3d - %3d\n", - RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX, RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX); - printf ("RECS80EXT 1 %3d - %3d %3d - %3d\n", - RECS80EXT_START_BIT_PULSE_LEN_MIN, RECS80EXT_START_BIT_PULSE_LEN_MAX, RECS80EXT_START_BIT_PAUSE_LEN_MIN, RECS80EXT_START_BIT_PAUSE_LEN_MAX); - printf ("NUBERT 1 %3d - %3d %3d - %3d\n", - NUBERT_START_BIT_PULSE_LEN_MIN, NUBERT_START_BIT_PULSE_LEN_MAX, NUBERT_START_BIT_PAUSE_LEN_MIN, NUBERT_START_BIT_PAUSE_LEN_MAX); - printf ("BANG_OLUFSEN 1 %3d - %3d %3d - %3d\n", - BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX, BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX); - printf ("BANG_OLUFSEN 2 %3d - %3d %3d - %3d\n", - BANG_OLUFSEN_START_BIT2_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT2_PULSE_LEN_MAX, BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MAX); - printf ("BANG_OLUFSEN 3 %3d - %3d %3d - %3d\n", - BANG_OLUFSEN_START_BIT3_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PULSE_LEN_MAX, BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX); - printf ("BANG_OLUFSEN 4 %3d - %3d %3d - %3d\n", - BANG_OLUFSEN_START_BIT4_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PULSE_LEN_MAX, BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MAX); - printf ("GRUNDIG/NOKIA 1 %3d - %3d %3d - %3d\n", - GRUNDIG_OR_NOKIA_START_BIT_LEN_MIN, GRUNDIG_OR_NOKIA_START_BIT_LEN_MAX, GRUNDIG_OR_NOKIA_PRE_PAUSE_LEN_MIN, GRUNDIG_OR_NOKIA_PRE_PAUSE_LEN_MAX); - printf ("SIEMENS 1 %3d - %3d %3d - %3d\n", - SIEMENS_START_BIT_LEN_MIN, SIEMENS_START_BIT_LEN_MAX, SIEMENS_START_BIT_LEN_MIN, SIEMENS_START_BIT_LEN_MAX); - printf ("FDC 1 %3d - %3d %3d - %3d\n", - FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX, FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX); - printf ("RCCAR 1 %3d - %3d %3d - %3d\n", - RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX, RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX); + printf ("SIRCS 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + SIRCS_START_BIT_PULSE_LEN_MIN, SIRCS_START_BIT_PULSE_LEN_MAX, SIRCS_START_BIT_PAUSE_LEN_MIN, SIRCS_START_BIT_PAUSE_LEN_MAX, + SIRCS_0_PULSE_LEN_MIN, SIRCS_0_PULSE_LEN_MAX, SIRCS_PAUSE_LEN_MIN, SIRCS_PAUSE_LEN_MAX, + SIRCS_1_PULSE_LEN_MIN, SIRCS_1_PULSE_LEN_MAX, SIRCS_PAUSE_LEN_MIN, SIRCS_PAUSE_LEN_MAX); + + printf ("NEC 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX, NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX, + NEC_PULSE_LEN_MIN, NEC_PULSE_LEN_MAX, NEC_0_PAUSE_LEN_MIN, NEC_0_PAUSE_LEN_MAX, + NEC_PULSE_LEN_MIN, NEC_PULSE_LEN_MAX, NEC_1_PAUSE_LEN_MIN, NEC_1_PAUSE_LEN_MAX); + + printf ("NEC (rep) 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX, NEC_REPEAT_START_BIT_PAUSE_LEN_MIN, NEC_REPEAT_START_BIT_PAUSE_LEN_MAX, + NEC_PULSE_LEN_MIN, NEC_PULSE_LEN_MAX, NEC_0_PAUSE_LEN_MIN, NEC_0_PAUSE_LEN_MAX, + NEC_PULSE_LEN_MIN, NEC_PULSE_LEN_MAX, NEC_1_PAUSE_LEN_MIN, NEC_1_PAUSE_LEN_MAX); + + printf ("SAMSUNG 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + SAMSUNG_START_BIT_PULSE_LEN_MIN, SAMSUNG_START_BIT_PULSE_LEN_MAX, SAMSUNG_START_BIT_PAUSE_LEN_MIN, SAMSUNG_START_BIT_PAUSE_LEN_MAX, + SAMSUNG_PULSE_LEN_MIN, SAMSUNG_PULSE_LEN_MAX, SAMSUNG_0_PAUSE_LEN_MIN, SAMSUNG_0_PAUSE_LEN_MAX, + SAMSUNG_PULSE_LEN_MIN, SAMSUNG_PULSE_LEN_MAX, SAMSUNG_1_PAUSE_LEN_MIN, SAMSUNG_1_PAUSE_LEN_MAX); + + printf ("MATSUSHITA 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + MATSUSHITA_START_BIT_PULSE_LEN_MIN, MATSUSHITA_START_BIT_PULSE_LEN_MAX, MATSUSHITA_START_BIT_PAUSE_LEN_MIN, MATSUSHITA_START_BIT_PAUSE_LEN_MAX, + MATSUSHITA_PULSE_LEN_MIN, MATSUSHITA_PULSE_LEN_MAX, MATSUSHITA_0_PAUSE_LEN_MIN, MATSUSHITA_0_PAUSE_LEN_MAX, + MATSUSHITA_PULSE_LEN_MIN, MATSUSHITA_PULSE_LEN_MAX, MATSUSHITA_1_PAUSE_LEN_MIN, MATSUSHITA_1_PAUSE_LEN_MAX); + + printf ("KASEIKYO 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + KASEIKYO_START_BIT_PULSE_LEN_MIN, KASEIKYO_START_BIT_PULSE_LEN_MAX, KASEIKYO_START_BIT_PAUSE_LEN_MIN, KASEIKYO_START_BIT_PAUSE_LEN_MAX, + KASEIKYO_PULSE_LEN_MIN, KASEIKYO_PULSE_LEN_MAX, KASEIKYO_0_PAUSE_LEN_MIN, KASEIKYO_0_PAUSE_LEN_MAX, + KASEIKYO_PULSE_LEN_MIN, KASEIKYO_PULSE_LEN_MAX, KASEIKYO_1_PAUSE_LEN_MIN, KASEIKYO_1_PAUSE_LEN_MAX); + + printf ("RECS80 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + RECS80_START_BIT_PULSE_LEN_MIN, RECS80_START_BIT_PULSE_LEN_MAX, RECS80_START_BIT_PAUSE_LEN_MIN, RECS80_START_BIT_PAUSE_LEN_MAX, + RECS80_PULSE_LEN_MIN, RECS80_PULSE_LEN_MAX, RECS80_0_PAUSE_LEN_MIN, RECS80_0_PAUSE_LEN_MAX, + RECS80_PULSE_LEN_MIN, RECS80_PULSE_LEN_MAX, RECS80_1_PAUSE_LEN_MIN, RECS80_1_PAUSE_LEN_MAX); + + printf ("RC5 1 %3d - %3d %3d - %3d %3d - %3d\n", + RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX, + RC5_BIT_LEN_MIN, RC5_BIT_LEN_MAX); + + printf ("DENON 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, + DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX, + DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX); + + printf ("RC6 1 %3d - %3d %3d - %3d %3d - %3d\n", + RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX, RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX, + RC6_BIT_LEN_MIN, RC6_BIT_LEN_MAX); + + printf ("RECS80EXT 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + RECS80EXT_START_BIT_PULSE_LEN_MIN, RECS80EXT_START_BIT_PULSE_LEN_MAX, RECS80EXT_START_BIT_PAUSE_LEN_MIN, RECS80EXT_START_BIT_PAUSE_LEN_MAX, + RECS80EXT_PULSE_LEN_MIN, RECS80EXT_PULSE_LEN_MAX, RECS80EXT_0_PAUSE_LEN_MIN, RECS80EXT_0_PAUSE_LEN_MAX, + RECS80EXT_PULSE_LEN_MIN, RECS80EXT_PULSE_LEN_MAX, RECS80EXT_1_PAUSE_LEN_MIN, RECS80EXT_1_PAUSE_LEN_MAX); + + printf ("NUBERT 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + NUBERT_START_BIT_PULSE_LEN_MIN, NUBERT_START_BIT_PULSE_LEN_MAX, NUBERT_START_BIT_PAUSE_LEN_MIN, NUBERT_START_BIT_PAUSE_LEN_MAX, + NUBERT_0_PULSE_LEN_MIN, NUBERT_0_PULSE_LEN_MAX, NUBERT_0_PAUSE_LEN_MIN, NUBERT_0_PAUSE_LEN_MAX, + NUBERT_1_PULSE_LEN_MIN, NUBERT_1_PULSE_LEN_MAX, NUBERT_1_PAUSE_LEN_MIN, NUBERT_1_PAUSE_LEN_MAX); + + printf ("BANG_OLUFSEN 1 %3d - %3d %3d - %3d\n", + BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX, + BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX); + + printf ("BANG_OLUFSEN 3 %3d - %3d %3d - %3d\n", + BANG_OLUFSEN_START_BIT3_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PULSE_LEN_MAX, + BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX); + + printf ("BANG_OLUFSEN 4 %3d - %3d %3d - %3d\n", + BANG_OLUFSEN_START_BIT4_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PULSE_LEN_MAX, + BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MAX); + + printf ("BANG_OLUFSEN - %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + BANG_OLUFSEN_PULSE_LEN_MIN, BANG_OLUFSEN_PULSE_LEN_MAX, BANG_OLUFSEN_0_PAUSE_LEN_MIN, BANG_OLUFSEN_0_PAUSE_LEN_MAX, + BANG_OLUFSEN_PULSE_LEN_MIN, BANG_OLUFSEN_PULSE_LEN_MAX, BANG_OLUFSEN_1_PAUSE_LEN_MIN, BANG_OLUFSEN_1_PAUSE_LEN_MAX); + + printf ("GRUNDIG/NOKIA 1 %3d - %3d %3d - %3d %3d - %3d\n", + GRUNDIG_OR_NOKIA_START_BIT_LEN_MIN, GRUNDIG_OR_NOKIA_START_BIT_LEN_MAX, GRUNDIG_OR_NOKIA_PRE_PAUSE_LEN_MIN, GRUNDIG_OR_NOKIA_PRE_PAUSE_LEN_MAX, + GRUNDIG_OR_NOKIA_BIT_LEN_MIN, GRUNDIG_OR_NOKIA_BIT_LEN_MAX); + + printf ("SIEMENS 1 %3d - %3d %3d - %3d %3d - %3d\n", + SIEMENS_START_BIT_LEN_MIN, SIEMENS_START_BIT_LEN_MAX, SIEMENS_START_BIT_LEN_MIN, SIEMENS_START_BIT_LEN_MAX, + SIEMENS_BIT_LEN_MIN, SIEMENS_BIT_LEN_MAX); + + printf ("FDC 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX, FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX, + FDC_PULSE_LEN_MIN, FDC_PULSE_LEN_MAX, FDC_0_PAUSE_LEN_MIN, FDC_0_PAUSE_LEN_MAX, + FDC_PULSE_LEN_MIN, FDC_PULSE_LEN_MAX, FDC_1_PAUSE_LEN_MIN, FDC_1_PAUSE_LEN_MAX); + + printf ("RCCAR 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n", + RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX, RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX, + RCCAR_PULSE_LEN_MIN, RCCAR_PULSE_LEN_MAX, RCCAR_0_PAUSE_LEN_MIN, RCCAR_0_PAUSE_LEN_MAX, + RCCAR_PULSE_LEN_MIN, RCCAR_PULSE_LEN_MAX, RCCAR_1_PAUSE_LEN_MIN, RCCAR_1_PAUSE_LEN_MAX); } void @@ -2516,7 +2759,7 @@ main (int argc, char ** argv) if (! analyze) { - for (i = 0; i < (int) ((8000.0 * F_INTERRUPTS) / 10000); i++) // newline: long pause of 800 msec + for (i = 0; i < (int) ((8000.0 * F_INTERRUPTS) / 10000); i++) // newline: long pause of 800 msec { (void) irmp_ISR (); } diff --git a/irmp.exe b/irmp.exe index c178079c297bc25d85e1d5ddafcb3201767afd56..2e9c7a389b57172ce0708f8e006e11849415f86f 100644 GIT binary patch literal 22016 zcmeHv3w%`7wfC79c@7gGqbN|vFj%aB^US=H2}u+Rgph;?3WSi%Fd0G;Co>85^D#P! zCK=M&7F&DEwZYWZwzkFA3sGB54DwL40b5HIzea1@89>Eqd5O&ZuYJy$OoDn_wcqde z-CvLHv-e(mt+m%$d+oK??3u9a#(Oy#$8mC$M1tc6P}AdP?@xY>VtDcuPfX?>%Xs0+ z0m;%AuB`Gkv}#%c%^L%?n>BT{O-;=~%?6Jq5NgsiG-*nfS86sl*LxNym6=+BwL1}c zPyWDLePU7m<@UZb^p$_vBGgTNQ&_*DZxZU+tG>l*`2#2Vu4VB0J_W09WpzbEosW14 z?78w%j$0~GaFc(kSt`OtIjJN|lEHCb0%R@^{h1MU4vL%lcu`x*aSH0<5o_*VbYQGa zlO(X4`%Z>PxJ1C}WJN&k`ztxlNsShc+X;RbJzOqIm2Mb0aeE=3CH!Qe}KMf*K?7$G`KDjm#8|Q!nCU0%KHKLM%7fQb{{@{ z=+4&>F1Vp%>5fCH&Q}?Zf(GXh*xS#eD<5O%0@cvaXnNL&x0`j3H+(YFpv4}NjS$i%-BQYcKDUc81 z?HuE@4jPVsR`mS>!@QSNKLrQjB<4o|(YoO=o&TlgIIHrP=&L%vj6qTNS_^XjSyQ^=l0wrzN+(U==d`eYMKe|7{6m|FbHN! znnblrO{%V_@YNH;-$(Xj_Yr`WM;$&psfS_xGNb+4oDR8QYFpxPxfEspXJjOi;~_-bWbw63(tkmN!u5Y zh6}^zrnGBCJ5KRe`WO0T)xMS_*}X*80WxP=K<>g6KVAEyVRB+EdB3ir}!#yKpO=+C1ieK<)yO4B~d z$il}mXmYPI{+rlBD=!s%)@s*VFddfwR z$3Gk13{ln#Be~+p5^-ev#1XykAu#oA#fvD9OdOvgQsxS)k~@%I3n`!fFp-!ibIRM@ z;rJzRt#+$8*Hr(NScx>h%vUaw@S$a3CJ4KfWL4hXB=N1_BGP60whQ<;PMI6VJFo%7 z;bjPjPk09_h3|+sjfk2DRNkeOwuPo& zFF5Ea1$nh3be%Zv0?VfW!tB3Bg;`A^u84v-%eDwGp9Tv2eUXU5ABB@c3k6(N$B$ue z@Zwpji6tC=jfkH_i_o%M=ePJ;CJY4|F%2Es<-QJKC|wj}1sK!Lggk_C&2uY!+b818 z2l=y%{IQ8cQ$fBLLo0j-#Ua5Q{E>&~z+qi@3#vNahlo8&TA3aeaqNfMZdUC&pxX6} z?0{qF4v#1mQWJLml<#0?vLBMaDe#AzvO_I&38p5)ABvwoH2cNK0o{tk?{J)nEYfhq zQNKq`NF&Ei9S*-CiGK(I!Y&rRRGoiEM?}8@I#MKzDrrXK9Tnw%Xm!!7YDh*5BX39} z&#gantl|?Vr73&Zl;lC_s?NJorksr_`LmYAU_SpSU*Sg%lAM+u{PS|0lPHGpdZ+pI zA35hQB**i{aC9GuV>ldpdiZR5VA@`0 z&`e%fNu0bed^S^c*PV#vV@f$irA{lz%5?kj%Zy*-bg@6!Y+&VpHC$CEM>tH%B~l?C#a@4R%*~YJr0-*qGNzS0NCEOA zb@}}Vi3D#JyMj(u)m`^Pbf|RCy{P+0`yQ5|*@xP$WEu`a!)NYLi$QnWU{{HD8k^vF zW{;9hv{Z}D%-bF3VikJN=nz*Ym>-TZUfdpF#->4=kCb#iBo(bsED{*mNN=7$ z510$1r^I47Bt@ojoU`|`eJJAQh%B=@Pld!I#_+0;gYfa-BgJ{(9Grl>)G1SSUQPky zY>ui^f?dsA1JJu-u%Hu(+bHUu;dyhN$de#zj_(K)fe)4t*Le8C&|Zb`@sfQk?qa(_ z^fx1>+NlX2$G)Wr5ojoE<*%CXJBn}Qix)EE2W_|;>m$xZQ5sMsH! z@6i5WqS5}i0_yoj#Xu&?_sz431daX?yGOO_d1N3X75*Gw`eHqom1lT(VR;G3!j|^ zzQWza{d*DKU6v$nAD;SY%I*anRdO`C9w~ za?f*_A;ZIxU^4MuK7q`-gio!;$o4QYB_mrPrYqAYkllX~Sue<|ypEC3Rk$sE7%(rpjN@-s z({XdVox$$MJ3b9FcOD2%@ntV1U4&T>z=YdUZ?~Da#*f2j*b||-0|`)g9VbvS?i?UM! zJu(Q`(``4qdc@u02JxENrX(3c^M(6ouT4!XL$d~sDmY~K3UZoORgaPc2p^Div4&{= z9W)Q_M7tT0x1Xug%{~|$zf9b_*bd|XT=L+gdu*m_a!-)kBVw_wQM2|Y@qYARb<|8Z zqP}~{qA&Ymtn#Pho^dj6bEu{w-aERN5tjcle+K@OCX0B#ct0DC>}k0OL%dQv$ur0W zX}VtqzEW0;7l(_=h<{{{54US-dlfZ?D=!$AyIWOiSf$P{T z>=p_{>lp@wWS2|0V9EfgOzisx1O`6-UIzr(D~M(4H4uO%22A3t;k!P}DuZzBnh984 z3>?|Bo=qWM`yAzw<&Z!qzMKlCdM3nBfS!0zoec|4_fPdLV#AR=jo?GeLdGX6%l(%^ z0Tf@KfMFW@o*;5!E-u#_wbp9msT+J}fY2S(PDjzA%uJ~J;9SuXt((7i$8Ag{WT0E` z-qQ5mYIk(e8OKs>?(On!yrYZGr*zU&+Kc34oycHLZb5wrKkZe#k_?^?YYG)$kbq?NsX?KZs-o5_jT_tlis4t#du@$Y187Mw&9@$;#}z&w1n!#V+@(zjil&5ap#IDL-B(U^WDe&p~UM^Ei33dvu4<+${Uya$qU56Fbl(a;xK*nOIisc7(H8j=gP1=0Vvocw z4PA~HIkl%qVqYi;O^ysnBhN^2LceJoJg%5A7&($~42SBwSzL?G+72%=4n9sdUcJB4 z>M-wnKS}oF<9g|1y<4@q_kOZhL0@1c5-&whMlK{&9bcE>yj-fyi5`lcjb8$WPwZhb z^?qLq1-O4yv<#>9+H#3~1(|kG3hQp!-)|wH zcuSNXxm7!z+gCy^gd~UNOwm|$DWD4YWNzu`t33aAZTu9g;ORyAgZSd+l&yi!^mYyitrt3v165Ku)K`lqH zNBoCSOF*2Q=-8%%*Y@%iuyc!2P>3Gekb}iK|Q0=Zl7};H-{SrQgF4fMXTPG8ukmv=u;)d+(p*t++|-j?o9k3BBqxYfh>*u7{am|Z=I(s= zA+USxn@^8|VP*9V3AGmVj^W^Cj=dqAHP>~A-aMY;i-AKzJr_gAUjcB(QD6fh(|<*5 z4KY9NV4%*y(7bLl4f+lO*Efh)>`|nYt5?(J+gExXJ3PVC==f`xyW6}5Qi|MW_Flw810^s0fKB{89Fb=WLtn^DO6KaC(AfrT;Vc>R4 z5@zZp%w(g4nT!;Bj$eZQRp{7eEyX)zDNm?7fFCVA5lxR~bT1n%UlIGNj6@%fdScPi zQHE`NRlrXJ{#GUnsSui!P~VH5py3W;98*At;elm0vWyzPFXDo7oFvP3IMM746W~rO z{T3_~SM6Rj{m!#l*s;MGsHK4YE;7&oy(hOFG#;>Zok8>XH-o5VHK(9K!Jt?}U0L#^4Sb zR0oEc6{4l-QLJuV>*mqWmm*toWFc+To$JylzIjJkam=-o__5q%Fd3AT`n~^h#PR=ZugGEmtnK5|!$m&IF0j?gfLinfX zbwl)wV{fY}nuZ-KO^ihL$sHF0@7AniSZ>0i*T-Td=5#^Q@xKS+Exs&W*lH5mW|+0e zDH{?t*gM9T)vDb$Pg?>yBu zBYInQbWyhBY#<}LDqZ#m#|MGTg^|Izj+X;5ma2?ncaZV(U+{H75#OIJZmxa@%*B-> z?L~xT4yZ3ZV|*6YKUv>TL*1SjEK4mPg@xFcU_TrRFwshQ(tLuI^CRVK1fLy(j;LEZ z6uW|bZy+p7blJ)JZY8l8nd%hH1bpM*#S{k-$g# zbJ6aM{S}i%_DpA<1GQyj6$xiNRUKnV-kxlzudJpg_6$SKT{n!K!t9QZH_XBj&l!%q zzw(Bs%l_hi5p4ItYC@s2oXf!A5WVe|VIQ??BnI>3QbJGFr z-*S*8<~+>atJr%Dd#`8jM)q!D?;zd>53cB4s+C`}AKPbS_WtOeIowHzzCVx|9a_CD z%5}@N!}ICqvz^@WI4#Tnx@X~Pj+=)v6Ge*h_A2}q8RapQK9sE}O(XDtnQ0)gg$MsL@&)P`C; znp$tr6VNa`&4z{`kEoeb53bFc#^$Dtc65l2q09#gD2bWIg@Jhj7it4Z6aZtDiz|vN z=cOiNl|6#;w7t>e+F*j^sOi@ zuC(et6SwjFip`&%S&E(|rDe;@J|!m&Hb~Mv$r)4lRut!dO0MJg2XD91RaKv!+c>$( zRxT{9_$^!3r3XD^Zpyc^M=aI2~t%l+;@nDNpj|u96 z9-1);;}=lV9>C!S__%YlZ26MKMOf;TbCf?X4dQu;laW6%=}(E+94TidQw;O-G)7HD zvDq#-pN9U5tgbl_fIN0h3h_J*f1bi(DMul1qsrA~#l&-*jKT?HG>n&%^cLr>tliui zqN7{T_0!C44AhUE-hyHR|60w$tCoKj=D|R1LnG1-EGOeE@ZIoP`3ijMJ|{l)pA(_J>7Sa7wWk z^ScruJZOX{FE~6?cb=wUV^ed0STQe6;_@+qKh{1H6Q40EmRBt=UcQu%V46yergDDy z%B7X11VFQBCEsMQ`8t9!n9wB5`T8-aUf6z|>tFB?Z{DM5LiS+le9<$z+|U952VG+A6~SU`cyYoX>@CYVr=wAHy?~n}BEh z=#736p6TQ8DBe%tIX|h{gvLK^vP@10&DZi__v7?QkqV}*TwJ=Wvq`DL@v5S@xTr#u=400+MV|k$$@|az&-dZxwAvYCS|759aP`A~UIB!^GUB+}Ho6uv zEzo;ibMo=lgj(kj0d9C$;-3oLT)X8WSg^TKpr12`CY;}f(uh)v(u&d|%mpmUgxO~m zYSScmJ_ohA7Rnb4$d+o+&~2HcGi^cUl+yMJZNnC3lgg^1iYg5|u`5Xip-)FS>x(1o zAZHN5qGz?6Rb9iZ4tFdlTEqaK^0nU0=~mJgSNMLovZS*6XD@tN`@~ll?%t`NdgX2j z{hb?EY+qB`7Fg2|*xa(F!qe!fZS}Cuf|mLXH0z%&^uG9^?^+2uBGlBs4fm2?r@Ki! z;`qUoaf0s@?k&afBPruc@O4HF%Jh_b&nM8vH-+5jN}}eU0Nu&Dh0cWP|Hu2?1&S6V zk3lcT=@l&@T-DYFI0Lod-|xvcdU(jP%Ie|@n{GjUVOO$=}5 z6l3ig59b88<|c0g^5%f2wjTeAMQx*p`x9vK;T@L%fz7o+A3jcTTo$CN_lH`8HQxFL z?9=Cg(^3QK&GfIJaNKYBzL)R$AzKrr=QSnJ)@;qy5TUu&@x3qv_3FZz2YwA54 zLK`=F0yVzo=1uTfu8`z}wn2~Ey}D@CsvEh#$ZA4OkZlw9EpUO2nwyxCZPFSBohhpk zAnPUIH*VfmvQnL=C0OIbwFEwGns}L;xGb_nTk|GQO?z#ywYiDo3Yj&6f#ybUOAXfN z*V4r#JI&##FWrK*Yuf1Hu9R0cdOR)M6RD%cxW=drc#=rme0i0qMtPvQ&eIBhKayPU z2^NR&;lC*;0t@6Tn|R4+2FQuqXkjTiwY<_3{Mg|`(#5SMg7L}&o>nmBs$?rdp1>{T zo&Y}g;2x&VQ_Oz|;L;MeP8$JWlxtN?68O85XC`B=45#~{in+1@IQe# zsWc|WY<`v3Pl!ujf^KPEh{Zcf=8N`ro>mS1WlL7b1sp{CuMR9 zg^K<_0#Al)l57&;DU?dJn*C)Tm!0G{X;OAJkEhI>B2~!JGNyngGn0o+mdGl764{K| zAe)xU!&I^~SsL-flvz_ai46D@<@rcYGyd;+@Cyq(5^g%)C}HZ+Bf`ldx{rY4M;Yv& z0a}H;qgsmZ?|1^vS=-v`*}S3g7R{E;jZLktyilOY-dgALY_4sczqz3<(A?VW4bDd_ zwAZ$7UeKn`(_rs4cs;GbYEPgQJKB|}U!cn?P-bd0&R_shba9in`5)wFZuC_ z8iKblJ{mmEfam5AX7SXQ2O8S2DK~mrlY^XvwJslu^9i{`DfZZK}J)#^QZ ztH-#3%ra3LK~CqjAFaU{oas77Ur=6DUQ|-Dxa|5>tAxhC`=8Ao^y7xduy3Whsk$%e z^tv+LYTbI>MqQik4&B|l@9B2yp4L69dr|kY?seT?b#LoV>m>SV`pfls`nh_&-lAWq z|FXVbzeyj^hxMKMUj4WA-_t*?AJp&D|4#pk{tdm%kZH&>%r%${C59@)8iU8M$#Apb zD~3A^U55J%|6%x^;UU8#hF=<) z++b`pwi>@;>@a@A_yglE{7XTv8Q(IVHfEbOt+i9YP#RF%e2=tVtU*3 zp()MmHkX@kGS`~D=0A3)mEd`Ze47xvaYjwtU>D?)_bhqv_4?{q4iPgfc0tXbJpKlU$wqream{v zDz|0XrrKuN=G&~cg||{*dMhI*kFg5H9@f*%$9 zykJ+sP{F=}KNq}HAT7))oK^V6LTh1B;flg_h2FyE!cgJ=DZH!jtA*PNe^~g_!r{V^ z!Xt%m6rL(PUx8!d^UA3-Ww@DY!eMNVdE~?w1dsz1~-DA2Z zb$fM3bsy>!`l;|)js7ZlY=OQ+zgSAXp1&M|+{ zTx2dYZ!m8$cbdOr{<-;A=6&YF<|F1&^Iy$xnNOLe`RVyH^YilO=IiqF^GouVz0`19r&`$nr>BD7g(2Bo2_59?zH~K`YwDm z&t|sWU~98=+5Xe^h;7*R2ipl-mVG|_aJ}7cZ?Qjbf8UnSm~&9G&}BgY<1k{ zc-ZkX$8Px9Nk_A@&-nxApPVvRu`A+w5?)eS;4Nq@c)s9J!S4&M#LCxUrD>h{B*Tie zRbf?&bW3%OSkwD-kLZSVuOR-srAz3P`b+g+&};Qq>lf&adMnoRI{l6Mkp6c4cl7=G zU5Gu;>Yvk}(7&rcr%&j!4YLfh4PP=87>W&x4J)v&YYl!wi{Tc-{f0inkFd784a0`t z8Ac6%FgL)3Dl?n)A$a%}(`M2gjn9rFL<}c*$&wnBRkNF?wPqAEzNOQNP7i)Cda^6y8t+(E6z0KNb z?X`Z#`fKa6))DK=)}x3eG3(pb_pRrwu$vpduR=AT+oRjBJE1#?WQ{9lxg2-GbkelO Vyxtr(Z#Vau0sr^&Zwm+(_;2Oa8{q%| literal 22528 zcmeHvdwf*Y_3xQUhD=_Zpc#qsaD-q{0cYmSEAz;MBnko{Bq0(-l90?W8S`>7lf)Kv zGzlgd@bS~z>iuaAMtiA0z13C`t<~_5hp(dchtx+)TdXre6{}ZX!rbrL=bXvpffnig z<9o10tw+SM+tFVL)QXx0`jE!Q@+)Vt=Tr>A5~r2C&# zzV+6djStId*K^T_-$Z@abH^Y4J&-+Hs@;g4DS#}eErmX|fu zd5G3%&P$6qZm~ke?R70{Y9podFUoA+S7_Q6smblH(jyXyv%4L2t|xj5!Llxo97sU{H(IyabjAEzidNK1-mwS+ymK3s6MY@XaRJ9Ytqt$p< zZFfgi>scY_Bt)*f^4gG-W}ffvhSTUC;=6y&!GRGD6hoQg@phxk;065Vz5HgzPg$vF z4srQj*N!xi8Ez-*Kt^a-1f;b7X~czXS`XfQPhBSblXD$)^F5WQxI-q!awwhHa_5-7 zsUf(wN!Ucc!b)=6ck^8?)CM}xe|ji#J<2jS7xA0ZX()cPhBULR%u_FOG(ZhBTbkhU z3H=PJ!_@zF@YBTLiG+?TWC~f{ByXa3idW<5Wtbvl*N)6BS>Pk`B{*=He9eyAI=qB@ zQSij2@yPk!i@djaO`iRukY^L}W^x2TN)MhmKORZzO=n2j`J}z!5v_!DJ0a~2emXmN zB2{FVmEsr{ytBPXp5Q3-1%y6dLZ1>mks+e9QXKjfkQT|acNF>xLQjy;rv*pEsq_$5a6<}yJe`lK#7IQqwrwSgYcIZ=VzaH(wvzUr`MDh%cB;3#JVoNW`_olCb zML?_Vs^EzWL`rGF6DjJRMGOt->JG087!367M8@*(1$cgs5LQ^(PvtVj!>&Q zl%Lke%)8GNM9W||UV*~UYg;23{N}B2=kWcd%REnCB`pw{Q&_BqNMH^91R2)Q4jDu= z1kuwZ2QHB?_?|i7fyuU?LCW@$CX+10BDj^2)ZBs$i{LAnqzr;lRm3JBZ$k#g)K^Q4 z#g95Mupl<-W=sZn6$z_|FnFCRW5vMw0Oq~QYw_q<*BIt}7?S+)GEb3&tCpEs2J)mf z@J0|<>@D-G91SxU=;Sz-dHkch&I3C6kuuMExl0^p|JFHa4or2$ zu+hNBBrp-lQEViy%WvMZtjx=mMlMH(XvPU0g~8()WP2C1r;zPU2%bpnxKb8jsyD?u z!Fz!>13pCIQ5VH8iK$y2fYn8wITekPF;5PjNa}D9i6kOnkV$0G)Ox3TCwpo}pl5E` z1oWLMGFmQD&LtQo-*s`!QVBkv5hur`e%vW0kQP(;2u8I8(#8J>qmz#~p#P9m}%+6_9H-{5;L9d;OjB3S4c zbF1ioVmpojOH-*&=??m2&5*)n0(2?QKbEx^AZK%s&+21mT zycjcskqm5t?KOwi)6A*KqtBEHJR(LMa9UVu#BJ#^FIN^>9*qeVST4gBj|+QdiS*-2 z^lL@<)c=VhETPd5zpz+A3}d*+?xQp=i)Hxkt8l37Pp9yK!jb|d$Jv-S2>8ShLJ??S z+q{kWCttozMeeG@$~=H0$v@MP?7tYAn*z;Ec1-f0FAI|5*(=QgW|0LWk);?|>gIdq zqT)FygG8pI+CPo>6hoTR+k06pctQ~{2T!W`bp@Dq>`(k1RuuZTB5)$FH9&q%iP~?H z9wkpFVnuEx;1fxKD}pC4;MYx%QBPr7W1-OzR7BPkkrD=<9IymWrt$0cp$9ILg;Sfq z=n5W8Ygi6PDUt22LBsD9Z&K3hc)$$ ztcIg13e@PDB2ubwkuc^T z0ZJg9I8q0X^N~}h(Q@)}e%+hs5{;20Txj1K$ds8)J2ni*#3UrE5MetJ!A39b_ z#Kct`NcY0(rBQYy!qz8!In3>}Gc0lu-tbQN;6G_$Fkce6asq;0a{sh-MRusj3Gm&E zDbL`$izrX#dyLF{5`2N+aaBjFctS`Od1;>-Jek@)Sr#^lID>})Pq$#0;bzhCV08Cz zv&017^DB%axuTsawl1ZG8=3Z1G|HCWoFs>8tQtTyrUuYX8KxbWCUG*%g6Qi+c<}ep z7qS`@k=bCNU&CTI+B#JolVoRm|InkPsY9v(%6f~k`QULyAQk7TB+;z1r2+V!_Y-N+ z0HSM1R~q>*)Eo(-v&Qz$_wX=kCJI{b_#A5hZuZVkkoUhUMdCJ@*9^~M(bgoZNEC)n zZ*>pS>93bHJxWTFb#xq3KdlWO!WyBd1nZ1kLI(2&%tc^^Ixd%K%R9lD{N|zAqan|< zXN3RrNNk3sY2$kiK}t^rM#XVPal@OjM6Mj3ZLERZIj z!kn=Ln77(tl8h}H5rCWHuDf+zTnB{GMX!jqHniVK#EbKEVnUqe9Qou3iABgj55 zJkJ3Gd|?^Cc?fYVTv#Wxa_Ay?Ae`Id`i9U)=k|=)xn0_XMUyB5QE6kn8RPm^*i=78 z-cf3sMu!&P0^2k?!*t}!)W6Gc!)aqV{}WUtZQP*GHg3?T;|bBH)5=)-XVm+X{}`j0 zTR~sqkMGGuI5R>6>T6&#$6-{mFK1Cvm4p!U~UXo32dcW_-gCqY?mye|b0>?VUz`a+HY# zpnEZHfoH@XN^=}>$0kIIz!Z^kG#Q2-rE3-nY;tYe{A!1i?-_s}j45&*D*W?%;2%76 zJF{$lnWq%0WX2>6xd-VICvu$D;)#@iVUxn|lI2-C3T@LEv~3J6ouSQ>(XvLNsTYkN zja-ThjXT5Fmw9R!jC8Xkir%$DE#5vVu%H7shSDjPac``_o87^}HR7fzFiX5Z>t)xs zxap*OMO?Jfg{OEI8=>1>d9+EMwece{r@9KDKrs>J2t{#N?}52nqCj&aQtP41H5vaZ z&n8J4grN*ELbt>e8ChOn_rE#pW;4*Z30n-4x zmJMm>P7T+!$0+O5km#aTBo(D8?)pqC zsIyN)*VF?fNcWJxM!p};NvGihbES)8caDZ|1Jkz9hZ=VdyN+z*`_pOc;2uRUE6BRv zNX!a*K${IX$Rz1wcZI?`lJ}BC>Sdu^uZCP%^{VTuaLpWhDnll^f97VpYBwJ0Mo&t1fMch+fJL`gBKC z!&*jM9Sn#~@>RfL38%;_pX=u=B`RL|oZcu_<&*W3Bddp5wQEP|s6+IeQbt6^Y80#T zarjBGnux0aB+p@11rcvD>gVBdV9qj8lFU`{s%1L9{csS*S1x?e^-^{(O3Ez*>l9q& zwXeYJxxSUzX-HF%v`ATfMcE6GFGeawDnfk)@|8$6NEN7ikT)W=BGsebiF|F}L)k%* zoF7fI(KH81hm?)F6}bZ`AIaFaHai0;Gw_p8clP~2!tLFQjo?4@)}e$A3%P!UO&Pcd zR(f84fx%==$;5=+@M7&sv%t?CEOZgB&P2aKX#@7jxW($Fc#>g>U=> zJJ)B5z}H*Yj1*;OLSIKtgB+NNrIK-HJdS zC=M!1@lS)^{8?S6()}s1&P1s*@Hd=MB!t9BA4ugiW@q!=bQEUF;=4DZ81iRNt@QND znnF(|=g-OUXV1Acu@7&Qbhl7R7lnZ-{Mp7`&=e3k5ZT0_^#`dj%C7ICN$NR14=5v5j! z-U@UN(EW#Ip=~YeU7I7W##@r4WeJ#0#Y5TMpe}rX%2ZKP#Iu&`!)ydp;g1hSqZ^)O z9wNNwuhA$L;5>fw`s}-a#6N$3_Ij3gXZIt=8Du?cC_^y&p)_Tg;+hg?J<9jI2uorE zh%wR)e0L!oa;BEiTJX$aSqOfj+*2x+7iU`=_Tw#@SY1L@kK#hSY!RFti27$Ra19z7Y_Jr2bo30zGlXz*bz_k^XU zG*GxHG#)$hSn6^T0w81AkvZ0hAVt}wEGYK`r6!q=1!H8E2N{t0 zs2Bqx)88TUQ8PXtGO6$=K30@_(keu^CG)Z3jDyT!kkCi{7!a9$g$PoV-8w!WGQVr3 zL1le-$~}+8@!`iHo-+=zL*~Oj21KSG7D2kRgD~XrS&>;zTQ15kvf|I~tn}!lrnH`~ zZ|wjpoo5`UltG5pvsE_+N*7FYIWfRD0^xg1H{YG+6*sS|*IQYr~Ac)V?QB5}Ru^C@z-x*K~UtiT1ICv<- z69$E-W;VJGy^qF?_X8RLDc+02D~b3aJ8SA03e4#h)u+NB~|Npv8&TRvHc~ghf(MM$JWqRuVRqck7^d@5|CO+KrYvf4%mRk*=>PzzToIWD{zy6kdh*5reOG>^tg_*MW_g>Pa# z8R&@yl4+m{Y8HmJhkMWyc?92OLeb@+!?z!v4W$jvUX9_>v+1qT(tFxedYiK7?aaj6 zyKvSd+AftA@8m>oXqPIR^gU!Y}fB6U|9~`uq~1E{M<+*(%{f0{qpj-D8Z7#UK(DIH^^F7`-3Pd+iR=P6 zKsvCY_(17~;)A8Y3z^7l&|Vs@23lY7hta^n=swYa0te_omdQ*?vhQ#*$6-D`49@^N z+cDTo8cY-&YJ7=WT51YfW*D`=k+4--V4n-`yg;kVowFc|zkge3 z+YRxDs@RMza3t*JpD)NPujHS<2|uj5c0-XmtLN+XDWO}^LJQLD$9>7673zdP+E4mY z=64Ovw(s+Wg&`b&N057i(es}6Y=R)3S1tKmJ%z(uY1d&jJS;Oneep5jRcQZ6{UCMq zxx&yal|1AY!k0sTxZr?_mcx?fQd_CmQ_6bO=&^_Lvk^-j-P?6QAx%qY$&vcLbRts) zra~V>3Cx=*gm;|qMMF$<@@5jeFfE`aM{`r9g|$+Qi-~*n1^=*RXdZ zd$+Q;AMYQY@6y0(?5K;897r>eCL$fF;=bQjV(q*kO(^wZ;6!EtMm)+0TH z^aRpNNN*vPAss_f0zLyN3uy+D5vc^J2B`@BR-`#d*+>^4O+-pW`s!Ma`#aKJq}@m_ zBOOHhv&iM=FbrINo-*Wf2jJ%ANB)hs5)HK2GAfaZIF2?j+StlF8vJ#hhUPU|e~Y%D zv~+PX{bt?YQrFU$LNsPs>$TUn`D=ZCf@uvjwz+Pg4wui@;?wGF+Sb}Yn@d~k_Pcyq z2B%%!;1>b4v+6;$McdfYyvBwK;W3c800AZu(>l>HN1{Sy0LcuXuY6%yVfmam!v2OP zFw!PrgQ`%kol9?tMqCTypJa%mS5jQ~{i%(lqn+(@wYvNb{)U!jts6h`cU|`VNfVp# ze3ln1DPLZ4^|=v@<9A6xMfvjb1q&+*&Vghcy+sA(#S0fzEjZ^Zl9Ce8(qydEgrDUYy$1AjV`~dTI!J7+x#u9)ohy} z=wW!aAJGm2!f{(j%>UDVBGliYg=pAoT3VU1>oGu`-$f(F+QbRacKEP4p?$VjcB+Jd&cwy7;ZTcyMs z{fn`>7M~Bi+q7{5&C!Z`C$t;4?TPvneD%Y-B{6_U34oQtZM-s|x1`?PI0Hng_7V5=;Y(bfhKXN?XVv@>ZU>skWM z6h(;<(P%)d57qk#Qk$ zkS<$Vv9xgMV$tJh%PR`XDzx(#R%lC>&O_U9y>$8F@?r)R*H*B+yjWat&i@AwQ5G#o z;!dm8$4X)$whP3y$Jz)V!EapG_rs^4_cD>nS&uKdKbeQK#vcx18HuyTmxES`fwRUJ zgDsi;v)5l)p(%!p!dZ{cg3)0LXN5mH7)1a&OzC^@5(_*#iY+QS+Z5(`K9NfQzFS))eMYneL@|Q0xUQ%3A zE)RRw`n#&=+Y4gQiJzRA+)~=De4V~aA1)jcQVMTex!oqSJ>fgx{V44F>tFfQAxTOt> z$%U&6Ho*`SHyI60fu{IgX;WmvLm_pb!f{Qto&OSCEw;_tH3&KAx<(8U$E7!hFVg*) z`C=D5;%5D=e4P<)6klhA8|I5{j6?zA*ox_ExOc30vaY@jM&{?+V1{{V^R&p?jAJG? zcf-A7nTemf?|_qeiW_ZQdc%B)+>e^NQ92r5)gyH@K8(!I@F-*18RkXedK5FGbTs}z zV|8>!IGLxo(Z(_bdJB-g_fvyUBKW?7k2+jgc~N?rm>EqDSt3Bd(v? z?=j_57VF<1*M9{*2jwAIY2#HohM)h^BfYAwy~ z2Ap$zuG)J1b&uLc7xy>d;&KE|*Vk0*_u%-;ajD>{-WzE1SG(&Qus6OAnAU1wH_=~- z;ke(6b+=gag12VcvZ`BKAU*gxAkwU^ZEdag-`om}MHt)Xuda8k4y;+@@>P3UT5g2x za(Tojr1iV<^Q#J0thkQ*dqQ=f8NA)d{S;K7qn2hSWV^DOwN6c_mRf2Qpf_UNHqug^ ztJPoa!L<)=2aF=m&0H#JqP^utS9M3NzpbU2OpahD{PH@aM{+>7zOg}5fF^|@j|+}y+pS&UL&OC2_Ij{BwJYL~w-fD4mmzucIc zxV%~9j79*TxUH9_lG7xXyZmSDep|V)tw>T{DWU}sRbs*5k`iT&u((nwJu8`OR&9S5rkpldGT&47#YqEh;W6 zDPAlXnBk7IVt;7*cWQvX=RR}cD@Aat>>)o){$7zXF;Pwb@tGX{S16Uq$rmb1kP9T9!hgQm9p#3bg|LQ)lZG ziV0l8{Bkbg3X4*uO2y9!l9E!BQWbcVNlEGW?5byV+F`NB3Y=#u@xk?=h`>2&+uB@B zs~d0Db~ZIOw>f77e9gADI*+TVwry@xL!Gast;Ox13tw-mZEKp>uAiZWZ)tG5+WeI+ zUmHA@bB2DNZboi;idO6J`>;zaY<9Q&i_`=W512Sl1bhwtn;9KCggAVzn*tccRbT3B zXou5T<7$g_#&;KY0+n3nVpqGX5kVK;&Kb3B3z>uW&CmuK3hKxSJ7>6S@v&h>uH(uW z?UBea`f(6rMt58}f>+0tF`-2r)Z@!*b3L{|Sr&)f;xCYNJv@%A{e?il=h~aKv_Cp$ zbTl*zh8fyse7JSaSR&8Dyvjnv358`9GqgBOiMr33r<-Tc>kNi@)){njPlC4i3Vir( zPTv&*J`m`%n$Z_n-PlmK$aQlCwmq6Ocb#>$usWw!@6uac!fH~>Xl^7v9aoMo!Eig1 zbr?Ulw4k)0sAyry)hkv=g&*qYrVsj?aGS7hmAdnEm+SPp5?z(9Mz==SuDeaQPWOoJ zdEG0zS9Ndc_UZnj`$YGd?x;?oKVN^5eujRwUaz<4=j*T0*XwW8`}9G5kA8#xXZlC< zFX)H#yY&C9e_#JseS#syaGoK{Fx@cEU^C1&EHW%JTx+N?cnkppe#UR;H{5IZnc?S# z#|%#yo-@2+c*pQZ!`}=?3`Y%0Az8=}CJWPqnZlKVQz#M^3H8EF!cT-dgg)UuVWaRH zVY~3U@UCz~;EZZxhH;kBWON#fjrB&qajmi2IB5Kh@wdk9#=jc>X*^+6nzSaJ$!f|s z-E8VJ-D~=vrbkSVo3@)?Grev4lj&2_*QRew3Uiiurg^T}XttZLGA}kSH@nPD=5}+? ze5d&?^MmF=^AqN0%rBX@nO`^m(R{%CiTR&qr6t93zGa$are&VRYRR))Z7H*?w5+x? zSvoAYSb8lREcaRdx8)_vR?8O_l{MX}u^O#K*2UHe>vh(ft$o&etq)qaSa)0ZTK8K| zTT^m0IkR$fIr%w@a%yuLbJphEnX^9U@to&!ewXuV&g(gE=X{j&an3(-zRpqFc-w`x z>9#9uW?PAcKY;jDIgoNdmav)6gA^8x20&i`^gymV7u+^EcR-MkI%hxT` zRqDLDHeFEnGu_X1Pw1Z0ZPmS}i|A7IlVPP+eW`w>evSSX{XO~z^}o>nPQOF{y8bWv zPxVLj6Ac=}RD;3bfL$&#)EXKMZHC(n_Zj}v@GHZMhOLI(hIe6&e=$T1Ul@+V9(mzX zVXlxP6bK82WkQv(T4)j02^)k5g=d79gx7?(g^z@P2&aT}<3+|9#(74&vCz20SZ(wg ze{AeC-fjG;@loTG#^;SM8()V_eq&5FO*09w#|o3z)M2{AbeHL8riV?xF#X!J#q>I? za=+=%rjJcWOvhlCDdzLcIl&3c#h7uM&jJFM?oKej%e^M1}`Slo|n?Y1u1 z*k`t5wgvVQ`*PURI{Q=h!}b}Da>rW71F#)=z}T z$({PzVZ?G7ghHDI^ zhAKm+A!z6`+zl@?2oE!4*lFMe4ZKRWa2foH37(};xCZlCD>Ps}e}Wl(On5?gTG)&^ z-6rf2_6qL_e-b_x4hvrjCxrxKs&TSW3tw{uyiKlgp>etKI?Qm3F<|_O@m}Kt#=jUp zF&;4nqDxyj~P8}+JrfK#r%=^3-eKPjl~U5(QkPV`o9EzVVU&? ztIOI1&+xGIaqH98&DNK!+u$AEvi`yPz7^{rpW`x-ZPD$3mJaKVKzH=_GAV9LG^@>P V;j0GVp@z(8_~H3M1K**6{|nboN(%r0 diff --git a/irmp.h b/irmp.h index 909cc73..2f70149 100644 --- a/irmp.h +++ b/irmp.h @@ -3,7 +3,7 @@ * * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irmp.h,v 1.34 2010/06/15 15:47:21 fm Exp $ + * $Id: irmp.h,v 1.37 2010/06/22 11:55:45 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -284,11 +284,11 @@ extern "C" #define SIEMENS_LSB 0 // MSB...LSB #define SIEMENS_FLAGS (IRMP_PARAM_FLAG_IS_MANCHESTER | IRMP_PARAM_FLAG_1ST_PULSE_IS_1) // flags -#define FDC_START_BIT_PULSE_TIME 2120.0e-6 // 2120 usec pulse -#define FDC_START_BIT_PAUSE_TIME 900.0e-6 // 900 usec pause -#define FDC_PULSE_TIME 360.0e-6 // 360 usec pulse -#define FDC_1_PAUSE_TIME 650.0e-6 // 650 usec pause -#define FDC_0_PAUSE_TIME 180.0e-6 // 180 usec pause +#define FDC_START_BIT_PULSE_TIME 2085.0e-6 // 2085 usec pulse +#define FDC_START_BIT_PAUSE_TIME 966.0e-6 // 966 usec pause +#define FDC_PULSE_TIME 300.0e-6 // 300 usec pulse +#define FDC_1_PAUSE_TIME 715.0e-6 // 715 usec pause +#define FDC_0_PAUSE_TIME 220.0e-6 // 220 usec pause #define FDC_FRAME_REPEAT_PAUSE_TIME 60.0e-3 // frame repeat after 60ms #define FDC_ADDRESS_OFFSET 0 // skip 0 bits #define FDC_ADDRESS_LEN 8 // read 8 address bits diff --git a/irmpconfig.h b/irmpconfig.h index e72c76f..6fa6fdd 100644 --- a/irmpconfig.h +++ b/irmpconfig.h @@ -3,7 +3,7 @@ * * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irmpconfig.h,v 1.22 2010/06/15 12:02:52 fm Exp $ + * $Id: irmpconfig.h,v 1.27 2010/06/22 12:39:51 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -46,8 +46,8 @@ #define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 1 // flag: support Bang & Olufsen uses ~200 bytes #define IRMP_SUPPORT_GRUNDIG_PROTOCOL 1 // flag: support Grundig uses ~150 bytes #define IRMP_SUPPORT_NOKIA_PROTOCOL 1 // flag: support Nokia uses ~150 bytes -#define IRMP_SUPPORT_FDC_PROTOCOL 0 // flag: support FDC3402 keyboard uses ~50 bytes -#define IRMP_SUPPORT_RCCAR_PROTOCOL 0 // flag: support RC car uses ~150 bytes +#define IRMP_SUPPORT_FDC_PROTOCOL 0 // flag: support FDC3402 keyboard uses ~50/400 bytes +#define IRMP_SUPPORT_RCCAR_PROTOCOL 0 // flag: support RC car uses ~150/500 bytes /*--------------------------------------------------------------------------------------------------------------------------------------------------- * THE FOLLOWING DECODERS WORK ONLY FOR F_INTERRUPTS > 14500! @@ -59,14 +59,6 @@ #define IRMP_SUPPORT_SIEMENS_PROTOCOL 0 // DO NOT CHANGE! F_INTERRUPTS too low! #endif -#if IRMP_SUPPORT_FDC_PROTOCOL == 1 && IRMP_SUPPORT_RC5_PROTOCOL == 1 -#error Protocols RC5 and FDC may not be enabled both at the same time. Please disable one of them in irmpconfig.h. -#endif - -#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1 && IRMP_SUPPORT_RC5_PROTOCOL == 1 -#error Protocols RC5 and RCCAR may not be enabled both at the same time. Please disable one of them in irmpconfig.h. -#endif - /*--------------------------------------------------------------------------------------------------------------------------------------------------- * Change hardware pin here: *--------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/irsnd.exe b/irsnd.exe index 7864c5e1ad54b08b97de0b1343bf6653ce321827..c1393231ea1daa2ac9e12c435edb86120eaa93d7 100644 GIT binary patch delta 2563 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