From 770a1a9d7a8e23b224c1fbb84c9fd34e08abe3c7 Mon Sep 17 00:00:00 2001 From: ukw Date: Sat, 28 Aug 2010 22:42:29 +0000 Subject: [PATCH 1/1] Version 1.7.3: better support of Kaseikyo and Apple remote controls git-svn-id: svn://mikrocontroller.net/irmp@44 aeb2e35e-bfc4-4214-b83c-9e8de998ed28 --- IR-Data/Panasonic-Blue-Ray.txt | 2 +- IR-Data/test-suite.sh | 2 + README.txt | 4 +- irmp.c | 133 ++++++++++++++++++++++++++++++--- irmp.exe | Bin 19968 -> 25088 bytes irmp.h | 25 ++++++- irmpconfig.h | 25 ++++--- irsnd.c | 60 ++++++++++++++- irsndconfig.h | 8 +- 9 files changed, 225 insertions(+), 34 deletions(-) diff --git a/IR-Data/Panasonic-Blue-Ray.txt b/IR-Data/Panasonic-Blue-Ray.txt index f26d35d..af9ef9f 100644 --- a/IR-Data/Panasonic-Blue-Ray.txt +++ b/IR-Data/Panasonic-Blue-Ray.txt @@ -2,7 +2,7 @@ 00000000000000000000000000000000000001111111111111111000000111000000111111111110000001110000001110000001110000011100000011100000011100000011100000111100000111000000111000000111000000111111111111000001110000001110000001110000011110000011110000011100000011111111111100000111111111111100000111000000111111111111000001111000001110000001110000001110000011110000011110000011110000011100000011111111111100000111100000111111111111000000111111111111000001111111111110000001111111111110000011110000011110000011111111111100000111100000111111111111100000111111111111000001111000001111000001111000001111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000011110000011111111111100000011100000011100000111100000111100000111100000111000000111000001111000001111000001111000001110000001111111111110000011110000011110000011100000111100000111100000111100000111111111111000001111111111111000001111000001111111111110000011110000011110000011110000011110000011100000111100000111100000111100000111111111111000001111000001111111111111000001111111111110000011111111111110000011111111111100000111100000111100000111111111111100000111000001111111111111000001111111111111000001110000011110000011110000011111111111110000011111111111111111 # Power 00000000000000000000000000000000000011111111111111110000001110000001111111111100000011100000011100000011100000011100000111000000111000000111000000111000001111000001110000001110000001111111111110000011110000011100000011100000011100000111100000111100000111111111111000000111111111111000001110000001111111111110000011110000011110000011100000011100000011100000111100000111100000111100000111111111111000001111000001111111111110000001111111111110000011111111111110000011111111111100000111100000111100000111111111111000000111000001111111111111000001111111111111000001110000011110000011110000011111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000111111111111111100000011100000111111111111100000111000000111000000111000001111000001111000001111000001110000001110000011110000011110000011110000011111111111100000111100000111100000111100000111000001111000001111000001111111111111000001111111111110000011110000011111111111110000011100000111100000111100000111100000111100000111000001111000001111000001111111111111000001110000011111111111110000011111111111100000011111111111100000111111111111100000111000001111000001111111111111000001111000001111111111110000011111111111110000011110000011100000111100000111111111111100000111111111111111111 -# Power (laenger gedrueckt) +# Power (TV?) (laenger gedrueckt) 0000000000000000000000000000000000000111111111111111100000011100000011111111111000000111000000111000000111000001110000001110000001110000001110000011110000011100000011100000011100000111111111111100000111000000111000000111000001111000001110000001110000001110000011110000011110000011111111111100000011100000111100000111100000111100000111000000111000001111000001111000001111111111110000001110000011111111111110000011111111111100000111111111111100000111111111111000000111000001111000001111111111111000001111000001111111111110000011111111111110000011111111111100000111111111111100000111100000111111111111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000001111111111111111000000111000001111111111110000001110000001110000011110000011110000011110000011100000011100000111100000111100000111100000111000000111111111111000001111000001111000001110000011110000011110000011110000011110000011100000111100000111111111111100000111100000111000001111000001111000001111000001111000001110000011110000011111111111110000011110000011111111111100000111111111111100000111111111111000001111111111111000001111000001110000001111111111110000011110000011111111111100000111111111111100000111111111111100000111111111111000001111000001111111111111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000001110000011111111111110000011110000011110000011100000111100000111100000111100000111100000111000001111000001111000001111000001111111111110000011110000011110000011110000011110000011100000111100000111100000111100000111100000111111111111000001111000001111000001110000011110000011110000011110000011110000011100000111111111111100000111100000111111111111000001111111111111000001111111111111000001111111111110000011110000011110000011111111111100000111100000111111111111100000111111111111000001111111111111000001111111111110000001110000011111111111110000011111111111111111111 # Taste 1 000000000000000000000000000000000000011111111111111100000011100000011111111111100000011000000111000000111000000111000000111000001110000001110000001110000001110000011110000011100000011111111111100000011100000111100000111000000111000000111000001111000001111111111110000001111111111110000011110000011111111111100000011100000011100000111100000111100000111100000111000001111000001111000001111000001111000001110000011110000011111111111110000011110000011100000111100000111100000111100000111000000111000001111000001111111111111000001110000001111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000011110000011111111111100000011100000111100000111100000111100000111000000111000001111000001111000001111000001110000011110000011111111111110000011110000011100000111100000111100000111100000111100000111111111111000001111111111111000001111000001111111111110000011110000011110000011110000011100000111100000111100000111100000111100000111000001111000001111000001111000001111111111110000011110000011110000011110000011100000111100000111100000111100000111100000111111111111000001111000001111111111111000001111111111111111111 diff --git a/IR-Data/test-suite.sh b/IR-Data/test-suite.sh index 840b7ac..53585ed 100644 --- a/IR-Data/test-suite.sh +++ b/IR-Data/test-suite.sh @@ -43,10 +43,12 @@ for j in \ Sony_Bravia_RM-ED0009_new.txt \ Yamaha-RAV388.txt \ apple.txt \ + apple-unibody-remote.txt \ bo_beolink1000-10kHz.txt \ denon.txt \ elta_radio.txt \ fdc.txt \ + jvc.txt \ nec-repetition.txt \ nec-skymaster-dt500.txt \ nec.txt \ diff --git a/README.txt b/README.txt index 36d8795..e065ac2 100644 --- a/README.txt +++ b/README.txt @@ -1,8 +1,8 @@ IRMP - Infrared Multi Protocol Decoder -------------------------------------- -Version IRMP: 1.7.2 01.07.2010 -Version IRSND: 1.7.2 01.07.2010 +Version IRMP: 1.7.3 29.08.2010 +Version IRSND: 1.7.3 29.08.2010 Dokumentation: diff --git a/irmp.c b/irmp.c index 861836c..4077f54 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.75 2010/07/01 09:00:16 fm Exp $ + * $Id: irmp.c,v 1.79 2010/08/28 22:14:56 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -439,9 +439,9 @@ typedef uint8_t PAUSE_LEN; #define KASEIKYO_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1) #define KASEIKYO_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) #define KASEIKYO_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1) -#define KASEIKYO_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MAX_TOLERANCE_60 + 0.5) + 1) -#define KASEIKYO_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1) -#define KASEIKYO_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) +#define KASEIKYO_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) +#define KASEIKYO_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) +#define KASEIKYO_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) #define KASEIKYO_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1) #define KASEIKYO_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) @@ -566,6 +566,19 @@ typedef uint8_t PAUSE_LEN; #define RCCAR_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) #define RCCAR_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) +#define JVC_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) +#define JVC_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1) +#define JVC_REPEAT_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * (JVC_FRAME_REPEAT_PAUSE_TIME - IRMP_TIMEOUT_TIME) * MIN_TOLERANCE_40 + 0.5) - 1) // HACK! +#define JVC_REPEAT_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * (JVC_FRAME_REPEAT_PAUSE_TIME - IRMP_TIMEOUT_TIME) * MAX_TOLERANCE_40 + 0.5) - 1) // HACK! +#define JVC_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) +#define JVC_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1) +#define JVC_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) +#define JVC_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1) +#define JVC_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1) +#define JVC_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1) +// autodetect JVC repetition frame within 50 msec: +#define JVC_FRAME_REPEAT_PAUSE_LEN_MAX (uint16_t)(F_INTERRUPTS * JVC_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + #define AUTO_FRAME_REPETITION_LEN (uint16_t)(F_INTERRUPTS * AUTO_FRAME_REPETITION_TIME + 0.5) // use uint16_t! #ifdef ANALYZE @@ -1257,11 +1270,12 @@ irmp_get_data (IRMP_DATA * irmp_data_p) irmp_command &= 0xff; rtc = TRUE; } - else if ((irmp_command & 0xFF00) == 0xD100) + else if (irmp_address == 0x87EE) { ANALYZE_PRINTF ("Switching to APPLE protocol\n"); irmp_protocol = IRMP_APPLE_PROTOCOL; - irmp_command &= 0xff; + irmp_address = (irmp_command & 0xFF00) >> 8; + irmp_command &= 0x00FF; rtc = TRUE; } break; @@ -1300,19 +1314,22 @@ irmp_get_data (IRMP_DATA * irmp_data_p) } // 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 +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 +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) +static uint16_t irmp_tmp_id; // ir id (only SAMSUNG) +#endif +#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1 +static uint8_t xor_check[6]; // check kaseikyo "parity" bits #endif -static uint8_t irmp_bit; // current bit position +static uint8_t irmp_bit; // current bit position /*--------------------------------------------------------------------------------------------------------------------------------------------------- * store bit @@ -1326,6 +1343,7 @@ static uint8_t irmp_bit; static void irmp_store_bit (uint8_t value) { + if (irmp_bit >= irmp_param.address_offset && irmp_bit < irmp_param.address_end) { if (irmp_param.lsb_first) @@ -1350,12 +1368,34 @@ irmp_store_bit (uint8_t value) irmp_tmp_command |= value; } } + #if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1 else if (irmp_param.protocol == IRMP_SAMSUNG_PROTOCOL && irmp_bit >= SAMSUNG_ID_OFFSET && irmp_bit < SAMSUNG_ID_OFFSET + SAMSUNG_ID_LEN) { irmp_tmp_id |= (((uint16_t) (value)) << (irmp_bit - SAMSUNG_ID_OFFSET)); // store with LSB first } #endif + +#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1 + else if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && irmp_bit >= 20 && irmp_bit < 24) + { + irmp_tmp_command |= (((uint16_t) (value)) << (irmp_bit - 8)); // store 4 system bits in upper nibble with LSB first + } + + if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && irmp_bit < KASEIKYO_COMPLETE_DATA_LEN) + { + if (value) + { + xor_check[irmp_bit / 8] |= 1 << (irmp_bit % 8); + } + else + { + xor_check[irmp_bit / 8] &= ~(1 << (irmp_bit % 8)); + } + } + +#endif + irmp_bit++; } @@ -1513,6 +1553,19 @@ irmp_ISR (void) else #endif // IRMP_SUPPORT_SIRCS_PROTOCOL == 1 +#if IRMP_SUPPORT_JVC_PROTOCOL == 1 + if (irmp_protocol == IRMP_JVC_PROTOCOL && // last protocol was JVC, awaiting repeat frame + irmp_pulse_time >= JVC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= JVC_START_BIT_PULSE_LEN_MAX && + irmp_pause_time >= JVC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= JVC_REPEAT_START_BIT_PAUSE_LEN_MAX) + { + ANALYZE_PRINTF ("protocol = NEC or JVC repeat frame, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n", + JVC_START_BIT_PULSE_LEN_MIN, JVC_START_BIT_PULSE_LEN_MAX, + JVC_REPEAT_START_BIT_PAUSE_LEN_MIN, JVC_REPEAT_START_BIT_PAUSE_LEN_MAX); + irmp_param_p = (IRMP_PARAMETER *) &nec_param; // tricky: use nec parameters + } + else +#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1 + #if IRMP_SUPPORT_NEC_PROTOCOL == 1 if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX && irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX) @@ -1967,6 +2020,18 @@ irmp_ISR (void) { irmp_bit++; } +#if IRMP_SUPPORT_JVC_PROTOCOL == 1 + else if (irmp_param.protocol == IRMP_NEC_PROTOCOL && (irmp_bit == 16 || irmp_bit == 17)) // it was a JVC stop bit + { + ANALYZE_PRINTF ("Switching to JVC protocol\n"); + irmp_param.stop_bit = TRUE; // set flag + irmp_param.protocol = IRMP_JVC_PROTOCOL; // switch protocol + irmp_param.complete_len = irmp_bit; // patch length: 16 or 17 + irmp_tmp_command = (irmp_tmp_address >> 4); // set command: upper 12 bits are command bits + irmp_tmp_address = irmp_tmp_address & 0x000F; // lower 4 bits are address bits + irmp_start_bit_detected = 1; // tricky: don't wait for another start bit... + } +#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1 else { ANALYZE_PRINTF ("error 2: pause %d after data bit %d too long\n", irmp_pause_time, irmp_bit); @@ -2333,6 +2398,17 @@ irmp_ISR (void) else #endif +#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1 + // if KASEIKYO protocol and the code will be repeated within 50 ms, we will ignore 2nd repetition frame + if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && repetition_frame_number == 1) + { + ANALYZE_PRINTF ("code skipped: KASEIKYO auto repetition frame #%d, counter = %d, auto repetition len = %d\n", + repetition_frame_number + 1, repetition_counter, AUTO_FRAME_REPETITION_LEN); + repetition_counter = 0; + } + else +#endif + #if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1 // if SAMSUNG32 protocol and the code will be repeated within 50 ms, we will ignore every 2nd frame if (irmp_param.protocol == IRMP_SAMSUNG32_PROTOCOL && (repetition_frame_number & 0x01)) @@ -2417,6 +2493,32 @@ irmp_ISR (void) } } #endif // IRMP_SUPPORT_NEC_PROTOCOL + +#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1 + if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL) + { + uint8_t xor; + // ANALYZE_PRINTF ("0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", + // xor_check[0], xor_check[1], xor_check[2], xor_check[3], xor_check[4], xor_check[5]); + + xor = (xor_check[0] & 0x0F) ^ ((xor_check[0] & 0xF0) >> 4) ^ (xor_check[1] & 0x0F) ^ ((xor_check[1] & 0xF0) >> 4); + + if (xor != (xor_check[2] & 0x0F)) + { + ANALYZE_PRINTF ("error 4: wrong XOR check for customer id: 0x%1x 0x%1x\n", xor, xor_check[2] & 0x0F); + irmp_ir_detected = FALSE; + } + + xor = xor_check[2] ^ xor_check[3] ^ xor_check[4]; + + if (xor != xor_check[5]) + { + ANALYZE_PRINTF ("error 4: wrong XOR check for data bits: 0x%02x 0x%02x\n", xor, xor_check[5]); + irmp_ir_detected = FALSE; + } + } +#endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1 + irmp_protocol = irmp_param.protocol; #if IRMP_SUPPORT_FDC_PROTOCOL == 1 @@ -2477,6 +2579,13 @@ irmp_ISR (void) irmp_tmp_command = 0; irmp_pulse_time = 0; irmp_pause_time = 0; + +#if IRMP_SUPPORT_JVC_PROTOCOL == 1 + if (irmp_protocol == IRMP_JVC_PROTOCOL) // the stop bit of JVC frame is also start bit of next frame + { // set pulse time here! + irmp_pulse_time = ((uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME)); + } +#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1 } } } diff --git a/irmp.exe b/irmp.exe index 8c536cc61a404ef20a88608138a8bad7c3a1e615..808c9e2907ee03d68dc1a4491c908ab0e3894236 100644 GIT binary patch literal 25088 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�FKoV7ClSyS<*4c(qP-Hg1M~XE52IrOH@Jp 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 10000 ~250 bytes #define IRMP_SUPPORT_SAMSUNG_PROTOCOL 1 // Samsung + Samsung32 >= 10000 ~250 bytes #define IRMP_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 ~50 bytes -#define IRMP_SUPPORT_KASEIKYO_PROTOCOL 1 // support Kaseikyo >= 10000 ~50 bytes -#define IRMP_SUPPORT_DENON_PROTOCOL 1 // support DENON >= 10000 ~250 bytes -#define IRMP_SUPPORT_RC5_PROTOCOL 0 // RC5 >= 10000 ~250 bytes -#define IRMP_SUPPORT_RC6_PROTOCOL 0 // RC6 >= 10000 ~200 bytes -#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 0 // Grundig >= 10000 ~150 bytes -#define IRMP_SUPPORT_NOKIA_PROTOCOL 0 // Nokia >= 10000 ~150 bytes -#define IRMP_SUPPORT_NUBERT_PROTOCOL 0 // NUBERT >= 10000 ~50 bytes -#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 0 // Bang & Olufsen >= 10000 ~200 bytes +#define IRMP_SUPPORT_KASEIKYO_PROTOCOL 1 // Kaseikyo >= 10000 ~250 bytes +#define IRMP_SUPPORT_DENON_PROTOCOL 1 // DENON >= 10000 ~250 bytes +#define IRMP_SUPPORT_JVC_PROTOCOL 1 // JVC >= 10000 ~250 bytes +#define IRMP_SUPPORT_RC5_PROTOCOL 1 // RC5 >= 10000 ~250 bytes +#define IRMP_SUPPORT_RC6_PROTOCOL 1 // RC6 >= 10000 ~200 bytes +#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 1 // Grundig >= 10000 ~150 bytes +#define IRMP_SUPPORT_NOKIA_PROTOCOL 1 // Nokia >= 10000 ~150 bytes +#define IRMP_SUPPORT_NUBERT_PROTOCOL 1 // NUBERT >= 10000 ~50 bytes +#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 1 // Bang & Olufsen >= 10000 ~200 bytes #define IRMP_SUPPORT_FDC_PROTOCOL 0 // FDC3402 keyboard >= 10000 (better 15000) ~50 bytes (~400 in combination with RC5) #define IRMP_SUPPORT_RCCAR_PROTOCOL 0 // RC Car >= 10000 (better 15000) ~150 bytes (~500 in combination with RC5) #define IRMP_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens Gigaset >= 15000 ~150 bytes @@ -105,4 +106,10 @@ #define IRMP_SUPPORT_RECS80EXT_PROTOCOL 0 #endif +#if IRMP_SUPPORT_JVC_PROTOCOL == 1 && IRMP_SUPPORT_NEC_PROTOCOL == 0 +#warning JVC protocol needs also NEC protocol, NEC protocol enabled +#undef IRMP_SUPPORT_NEC_PROTOCOL +#define IRMP_SUPPORT_NEC_PROTOCOL 1 +#endif + #endif /* _WC_IRMPCONFIG_H_ */ diff --git a/irsnd.c b/irsnd.c index 029d476..ee91c6b 100644 --- a/irsnd.c +++ b/irsnd.c @@ -3,7 +3,7 @@ * * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irsnd.c,v 1.20 2010/06/15 15:47:21 fm Exp $ + * $Id: irsnd.c,v 1.21 2010/08/18 12:03:26 fm Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -84,6 +84,14 @@ typedef unsigned short uint16_t; #define MATSUSHITA_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_0_PAUSE_TIME + 0.5) #define MATSUSHITA_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * MATSUSHITA_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t! +#define KASEIKYO_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME + 0.5) +#define KASEIKYO_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME + 0.5) +#define KASEIKYO_PULSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME + 0.5) +#define KASEIKYO_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME + 0.5) +#define KASEIKYO_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME + 0.5) +#define KASEIKYO_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * KASEIKYO_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t! +#define KASEIKYO_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * KASEIKYO_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t! + #define RECS80_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME + 0.5) #define RECS80_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME + 0.5) #define RECS80_PULSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_PULSE_TIME + 0.5) @@ -390,6 +398,29 @@ irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait) break; } #endif +#if IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1 + case IRMP_KASEIKYO_PROTOCOL: + { + uint8_t xor; + + address = bitsrevervse (irmp_data_p->address, KASEIKYO_ADDRESS_LEN); + command = bitsrevervse (irmp_data_p->command, KASEIKYO_COMMAND_LEN + 4); + + xor = ((address & 0x000F) ^ ((address & 0x00F0) >> 4) ^ ((address & 0x0F00) >> 8) ^ ((address & 0xF000) >> 12)) & 0x0F; + + irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA + irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA + irsnd_buffer[2] = xor << 4 | (command & 0x000F); // XXXXCCCC + irsnd_buffer[3] = 0 | (command & 0xF000) >> 12; // 0000CCCC + irsnd_buffer[4] = (command & 0x0FF0) >> 4; // CCCCCCCC + + xor = irsnd_buffer[2] ^ irsnd_buffer[3] ^ irsnd_buffer[4]; + + irsnd_buffer[5] = xor; + irsnd_busy = TRUE; + break; + } +#endif #if IRSND_SUPPORT_RECS80_PROTOCOL == 1 case IRMP_RECS80_PROTOCOL: { @@ -743,6 +774,24 @@ irsnd_ISR (void) break; } #endif +#if IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1 + case IRMP_KASEIKYO_PROTOCOL: + { + startbit_pulse_len = KASEIKYO_START_BIT_PULSE_LEN; + startbit_pause_len = KASEIKYO_START_BIT_PAUSE_LEN; + pulse_1_len = KASEIKYO_PULSE_LEN; + pause_1_len = KASEIKYO_1_PAUSE_LEN; + pulse_0_len = KASEIKYO_PULSE_LEN; + pause_0_len = KASEIKYO_0_PAUSE_LEN; + has_stop_bit = KASEIKYO_STOP_BIT; + complete_data_len = KASEIKYO_COMPLETE_DATA_LEN; + n_auto_repetitions = (repeat_counter == 0) ? KASEIKYO_FRAMES : 1; // 2 frames auto repetition if first frame + auto_repetition_pause_len = KASEIKYO_AUTO_REPETITION_PAUSE_LEN; // 75 ms pause + repeat_frame_pause_len = KASEIKYO_FRAME_REPEAT_PAUSE_LEN; + irsnd_set_freq (IRSND_FREQ_38_KHZ); + break; + } +#endif #if IRSND_SUPPORT_RECS80_PROTOCOL == 1 case IRMP_RECS80_PROTOCOL: { @@ -963,6 +1012,9 @@ irsnd_ISR (void) #if IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 case IRMP_MATSUSHITA_PROTOCOL: #endif +#if IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1 + case IRMP_KASEIKYO_PROTOCOL: +#endif #if IRSND_SUPPORT_RECS80_PROTOCOL == 1 case IRMP_RECS80_PROTOCOL: #endif @@ -986,9 +1038,9 @@ irsnd_ISR (void) #endif -#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1 || IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 || \ - IRSND_SUPPORT_RECS80_PROTOCOL == 1 || IRSND_SUPPORT_RECS80EXT_PROTOCOL == 1 || IRSND_SUPPORT_DENON_PROTOCOL == 1 || IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || \ - IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 +#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1 || IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 || \ + IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1 || IRSND_SUPPORT_RECS80_PROTOCOL == 1 || IRSND_SUPPORT_RECS80EXT_PROTOCOL == 1 || IRSND_SUPPORT_DENON_PROTOCOL == 1 || \ + IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 { if (pulse_counter == 0) { diff --git a/irsndconfig.h b/irsndconfig.h index cde0a90..5220a4a 100644 --- a/irsndconfig.h +++ b/irsndconfig.h @@ -3,7 +3,7 @@ * * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irsndconfig.h,v 1.9 2010/07/01 11:17:11 fm Exp $ + * $Id: irsndconfig.h,v 1.10 2010/08/18 12:03:26 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -33,8 +33,8 @@ #define IRSND_SUPPORT_SIRCS_PROTOCOL 1 // Sony SIRCS >= 10000 uses ~150 bytes #define IRSND_SUPPORT_NEC_PROTOCOL 1 // NEC + APPLE >= 10000 uses ~100 bytes #define IRSND_SUPPORT_SAMSUNG_PROTOCOL 1 // Samsung + Samsung32 >= 10000 uses ~300 bytes -#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 uses ~150 bytes -#define IRSND_SUPPORT_KASEIKYO_PROTOCOL 0 // Kaseikyo NOT SUPPORTED YET! +#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 uses ~200 bytes +#define IRSND_SUPPORT_KASEIKYO_PROTOCOL 1 // Kaseikyo >= 10000 uses ~150 bytes #define IRSND_SUPPORT_RC5_PROTOCOL 1 // RC5 >= 10000 uses ~150 bytes #define IRSND_SUPPORT_DENON_PROTOCOL 1 // DENON >= 10000 uses ~200 bytes #define IRSND_SUPPORT_RC6_PROTOCOL 0 // RC6 NOT SUPPORTED YET! @@ -47,6 +47,8 @@ #define IRSND_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens, Gigaset >= 15000 uses ~150 bytes #define IRSND_SUPPORT_RECS80_PROTOCOL 0 // RECS80 >= 20000 uses ~100 bytes #define IRSND_SUPPORT_RECS80EXT_PROTOCOL 0 // RECS80EXT >= 20000 uses ~100 bytes +#define IRSND_SUPPORT_JVC_PROTOCOL 0 // JVC NOT SUPPORTED YET! + /*--------------------------------------------------------------------------------------------------------------------------------------------------- * Change hardware pin here: -- 2.39.2