00000000000000000000000000000000000001111111111111111000000111000000111111111110000001110000001110000001110000011100000011100000011100000011100000111100000111000000111000000111000000111111111111000001110000001110000001110000011110000011110000011100000011111111111100000111111111111100000111000000111111111111000001111000001110000001110000001110000011110000011110000011110000011100000011111111111100000111100000111111111111000000111111111111000001111111111110000001111111111110000011110000011110000011111111111100000111100000111111111111100000111111111111000001111000001111000001111000001111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000011110000011111111111100000011100000011100000111100000111100000111100000111000000111000001111000001111000001111000001110000001111111111110000011110000011110000011100000111100000111100000111100000111111111111000001111111111111000001111000001111111111110000011110000011110000011110000011110000011100000111100000111100000111100000111111111111000001111000001111111111111000001111111111110000011111111111110000011111111111100000111100000111100000111111111111100000111000001111111111111000001111111111111000001110000011110000011110000011111111111110000011111111111111111\r
# Power\r
00000000000000000000000000000000000011111111111111110000001110000001111111111100000011100000011100000011100000011100000111000000111000000111000000111000001111000001110000001110000001111111111110000011110000011100000011100000011100000111100000111100000111111111111000000111111111111000001110000001111111111110000011110000011110000011100000011100000011100000111100000111100000111100000111111111111000001111000001111111111110000001111111111110000011111111111110000011111111111100000111100000111100000111111111111000000111000001111111111111000001111111111111000001110000011110000011110000011111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000111111111111111100000011100000111111111111100000111000000111000000111000001111000001111000001111000001110000001110000011110000011110000011110000011111111111100000111100000111100000111100000111000001111000001111000001111111111111000001111111111110000011110000011111111111110000011100000111100000111100000111100000111100000111000001111000001111000001111111111111000001110000011111111111110000011111111111100000011111111111100000111111111111100000111000001111000001111111111111000001111000001111111111110000011111111111110000011110000011100000111100000111111111111100000111111111111111111\r
-# Power (laenger gedrueckt)\r
+# Power (TV?) (laenger gedrueckt)\r
0000000000000000000000000000000000000111111111111111100000011100000011111111111000000111000000111000000111000001110000001110000001110000001110000011110000011100000011100000011100000111111111111100000111000000111000000111000001111000001110000001110000001110000011110000011110000011111111111100000011100000111100000111100000111100000111000000111000001111000001111000001111111111110000001110000011111111111110000011111111111100000111111111111100000111111111111000000111000001111000001111111111111000001111000001111111111110000011111111111110000011111111111100000111111111111100000111100000111111111111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000001111111111111111000000111000001111111111110000001110000001110000011110000011110000011110000011100000011100000111100000111100000111100000111000000111111111111000001111000001111000001110000011110000011110000011110000011110000011100000111100000111111111111100000111100000111000001111000001111000001111000001111000001110000011110000011111111111110000011110000011111111111100000111111111111100000111111111111000001111111111111000001111000001110000001111111111110000011110000011111111111100000111111111111100000111111111111100000111111111111000001111000001111111111111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000001110000011111111111110000011110000011110000011100000111100000111100000111100000111100000111000001111000001111000001111000001111111111110000011110000011110000011110000011110000011100000111100000111100000111100000111100000111111111111000001111000001111000001110000011110000011110000011110000011110000011100000111111111111100000111100000111111111111000001111111111111000001111111111111000001111111111110000011110000011110000011111111111100000111100000111111111111100000111111111111000001111111111111000001111111111110000001110000011111111111110000011111111111111111111\r
# Taste 1\r
000000000000000000000000000000000000011111111111111100000011100000011111111111100000011000000111000000111000000111000000111000001110000001110000001110000001110000011110000011100000011111111111100000011100000111100000111000000111000000111000001111000001111111111110000001111111111110000011110000011111111111100000011100000011100000111100000111100000111100000111000001111000001111000001111000001111000001110000011110000011111111111110000011110000011100000111100000111100000111100000111000000111000001111000001111111111111000001110000001111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000011110000011111111111100000011100000111100000111100000111100000111000000111000001111000001111000001111000001110000011110000011111111111110000011110000011100000111100000111100000111100000111100000111111111111000001111111111111000001111000001111111111110000011110000011110000011110000011100000111100000111100000111100000111100000111000001111000001111000001111000001111111111110000011110000011110000011110000011100000111100000111100000111100000111100000111111111111000001111000001111111111111000001111111111111111111\r
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 \
IRMP - Infrared Multi Protocol Decoder\r
--------------------------------------\r
\r
-Version IRMP: 1.7.2 01.07.2010\r
-Version IRSND: 1.7.2 01.07.2010\r
+Version IRMP: 1.7.3 29.08.2010\r
+Version IRSND: 1.7.3 29.08.2010\r
\r
Dokumentation:\r
\r
*\r
* Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.75 2010/07/01 09:00:16 fm Exp $\r
+ * $Id: irmp.c,v 1.79 2010/08/28 22:14:56 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define KASEIKYO_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
#define KASEIKYO_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
#define KASEIKYO_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1)\r
-#define KASEIKYO_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MAX_TOLERANCE_60 + 0.5) + 1)\r
-#define KASEIKYO_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1)\r
-#define KASEIKYO_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
+#define KASEIKYO_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
+#define KASEIKYO_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
+#define KASEIKYO_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
#define KASEIKYO_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1)\r
#define KASEIKYO_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
\r
#define RCCAR_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
#define RCCAR_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
\r
+#define JVC_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define JVC_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#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!\r
+#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!\r
+#define JVC_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define JVC_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#define JVC_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define JVC_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#define JVC_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define JVC_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+// autodetect JVC repetition frame within 50 msec:\r
+#define JVC_FRAME_REPEAT_PAUSE_LEN_MAX (uint16_t)(F_INTERRUPTS * JVC_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)\r
+\r
#define AUTO_FRAME_REPETITION_LEN (uint16_t)(F_INTERRUPTS * AUTO_FRAME_REPETITION_TIME + 0.5) // use uint16_t!\r
\r
#ifdef ANALYZE\r
irmp_command &= 0xff;\r
rtc = TRUE;\r
}\r
- else if ((irmp_command & 0xFF00) == 0xD100)\r
+ else if (irmp_address == 0x87EE)\r
{\r
ANALYZE_PRINTF ("Switching to APPLE protocol\n");\r
irmp_protocol = IRMP_APPLE_PROTOCOL;\r
- irmp_command &= 0xff;\r
+ irmp_address = (irmp_command & 0xFF00) >> 8;\r
+ irmp_command &= 0x00FF;\r
rtc = TRUE;\r
}\r
break;\r
}\r
\r
// these statics must not be volatile, because they are only used by irmp_store_bit(), which is called by irmp_ISR()\r
-static uint16_t irmp_tmp_address; // ir address\r
-static uint16_t irmp_tmp_command; // ir command\r
+static uint16_t irmp_tmp_address; // ir address\r
+static uint16_t irmp_tmp_command; // ir command\r
\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
-static uint16_t irmp_tmp_address2; // ir address\r
-static uint16_t irmp_tmp_command2; // ir command\r
+static uint16_t irmp_tmp_address2; // ir address\r
+static uint16_t irmp_tmp_command2; // ir command\r
#endif\r
\r
#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
-static uint16_t irmp_tmp_id; // ir id (only SAMSUNG)\r
+static uint16_t irmp_tmp_id; // ir id (only SAMSUNG)\r
+#endif\r
+#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+static uint8_t xor_check[6]; // check kaseikyo "parity" bits\r
#endif\r
\r
-static uint8_t irmp_bit; // current bit position\r
+static uint8_t irmp_bit; // current bit position\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* store bit\r
static void\r
irmp_store_bit (uint8_t value)\r
{\r
+\r
if (irmp_bit >= irmp_param.address_offset && irmp_bit < irmp_param.address_end)\r
{\r
if (irmp_param.lsb_first)\r
irmp_tmp_command |= value;\r
}\r
}\r
+\r
#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
else if (irmp_param.protocol == IRMP_SAMSUNG_PROTOCOL && irmp_bit >= SAMSUNG_ID_OFFSET && irmp_bit < SAMSUNG_ID_OFFSET + SAMSUNG_ID_LEN)\r
{\r
irmp_tmp_id |= (((uint16_t) (value)) << (irmp_bit - SAMSUNG_ID_OFFSET)); // store with LSB first\r
}\r
#endif\r
+\r
+#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && irmp_bit >= 20 && irmp_bit < 24)\r
+ {\r
+ irmp_tmp_command |= (((uint16_t) (value)) << (irmp_bit - 8)); // store 4 system bits in upper nibble with LSB first\r
+ }\r
+\r
+ if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && irmp_bit < KASEIKYO_COMPLETE_DATA_LEN)\r
+ {\r
+ if (value)\r
+ {\r
+ xor_check[irmp_bit / 8] |= 1 << (irmp_bit % 8);\r
+ }\r
+ else\r
+ {\r
+ xor_check[irmp_bit / 8] &= ~(1 << (irmp_bit % 8));\r
+ }\r
+ }\r
+\r
+#endif\r
+\r
irmp_bit++;\r
}\r
\r
else\r
#endif // IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ if (irmp_protocol == IRMP_JVC_PROTOCOL && // last protocol was JVC, awaiting repeat frame\r
+ irmp_pulse_time >= JVC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= JVC_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= JVC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= JVC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+ ANALYZE_PRINTF ("protocol = NEC or JVC repeat frame, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ JVC_START_BIT_PULSE_LEN_MIN, JVC_START_BIT_PULSE_LEN_MAX,\r
+ JVC_REPEAT_START_BIT_PAUSE_LEN_MIN, JVC_REPEAT_START_BIT_PAUSE_LEN_MAX);\r
+ irmp_param_p = (IRMP_PARAMETER *) &nec_param; // tricky: use nec parameters\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+\r
#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
{\r
irmp_bit++;\r
}\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_NEC_PROTOCOL && (irmp_bit == 16 || irmp_bit == 17)) // it was a JVC stop bit\r
+ {\r
+ ANALYZE_PRINTF ("Switching to JVC protocol\n");\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.protocol = IRMP_JVC_PROTOCOL; // switch protocol\r
+ irmp_param.complete_len = irmp_bit; // patch length: 16 or 17\r
+ irmp_tmp_command = (irmp_tmp_address >> 4); // set command: upper 12 bits are command bits\r
+ irmp_tmp_address = irmp_tmp_address & 0x000F; // lower 4 bits are address bits\r
+ irmp_start_bit_detected = 1; // tricky: don't wait for another start bit...\r
+ }\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
else\r
{\r
ANALYZE_PRINTF ("error 2: pause %d after data bit %d too long\n", irmp_pause_time, irmp_bit);\r
else\r
#endif\r
\r
+#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+ // if KASEIKYO protocol and the code will be repeated within 50 ms, we will ignore 2nd repetition frame\r
+ if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && repetition_frame_number == 1)\r
+ {\r
+ ANALYZE_PRINTF ("code skipped: KASEIKYO auto repetition frame #%d, counter = %d, auto repetition len = %d\n",\r
+ repetition_frame_number + 1, repetition_counter, AUTO_FRAME_REPETITION_LEN);\r
+ repetition_counter = 0;\r
+ }\r
+ else\r
+#endif\r
+\r
#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
// if SAMSUNG32 protocol and the code will be repeated within 50 ms, we will ignore every 2nd frame\r
if (irmp_param.protocol == IRMP_SAMSUNG32_PROTOCOL && (repetition_frame_number & 0x01))\r
}\r
}\r
#endif // IRMP_SUPPORT_NEC_PROTOCOL\r
+\r
+#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL)\r
+ {\r
+ uint8_t xor;\r
+ // ANALYZE_PRINTF ("0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",\r
+ // xor_check[0], xor_check[1], xor_check[2], xor_check[3], xor_check[4], xor_check[5]);\r
+\r
+ xor = (xor_check[0] & 0x0F) ^ ((xor_check[0] & 0xF0) >> 4) ^ (xor_check[1] & 0x0F) ^ ((xor_check[1] & 0xF0) >> 4);\r
+\r
+ if (xor != (xor_check[2] & 0x0F))\r
+ {\r
+ ANALYZE_PRINTF ("error 4: wrong XOR check for customer id: 0x%1x 0x%1x\n", xor, xor_check[2] & 0x0F);\r
+ irmp_ir_detected = FALSE;\r
+ }\r
+\r
+ xor = xor_check[2] ^ xor_check[3] ^ xor_check[4];\r
+\r
+ if (xor != xor_check[5])\r
+ {\r
+ ANALYZE_PRINTF ("error 4: wrong XOR check for data bits: 0x%02x 0x%02x\n", xor, xor_check[5]);\r
+ irmp_ir_detected = FALSE;\r
+ }\r
+ }\r
+#endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+\r
irmp_protocol = irmp_param.protocol;\r
\r
#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
irmp_tmp_command = 0;\r
irmp_pulse_time = 0;\r
irmp_pause_time = 0;\r
+\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ if (irmp_protocol == IRMP_JVC_PROTOCOL) // the stop bit of JVC frame is also start bit of next frame\r
+ { // set pulse time here!\r
+ irmp_pulse_time = ((uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME));\r
+ }\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
}\r
}\r
}\r
*\r
* Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.h,v 1.39 2010/06/25 13:18:36 fm Exp $\r
+ * $Id: irmp.h,v 1.41 2010/08/18 12:03:26 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define IRMP_SIEMENS_PROTOCOL 17 // Siemens, e.g. Gigaset\r
#define IRMP_FDC_PROTOCOL 18 // FDC keyboard\r
#define IRMP_RCCAR_PROTOCOL 19 // RC Car\r
+#define IRMP_JVC_PROTOCOL 20 // JVC\r
\r
// some flags of struct IRMP_PARAMETER:\r
#define IRMP_PARAM_FLAG_IS_MANCHESTER 0x01\r
#define KASEIKYO_PULSE_TIME 423.0e-6 // 525 usec pulse\r
#define KASEIKYO_1_PAUSE_TIME 1269.0e-6 // 525 usec pause\r
#define KASEIKYO_0_PAUSE_TIME 423.0e-6 // 1690 usec pause\r
-#define KASEIKYO_FRAME_REPEAT_PAUSE_TIME 45.0e-3 // frame repeat after 45ms\r
+#define KASEIKYO_AUTO_REPETITION_PAUSE_TIME 74.0e-3 // repetition after 74 ms\r
+#define KASEIKYO_FRAME_REPEAT_PAUSE_TIME 74.0e-3 // frame repeat after 74 ms\r
#define KASEIKYO_ADDRESS_OFFSET 0 // skip 0 bits\r
#define KASEIKYO_ADDRESS_LEN 16 // read 16 address bits\r
#define KASEIKYO_COMMAND_OFFSET 28 // skip 28 bits (16 manufacturer & 4 parity & 8 genre)\r
#define KASEIKYO_COMPLETE_DATA_LEN 48 // complete length\r
#define KASEIKYO_STOP_BIT 1 // has stop bit\r
#define KASEIKYO_LSB 1 // LSB...MSB?\r
+#define KASEIKYO_FRAMES 2 // KASEIKYO sends 1st frame 2 times\r
#define KASEIKYO_FLAGS 0 // flags\r
\r
#define RECS80_START_BIT_PULSE_TIME 158.0e-6 // 158 usec pulse\r
#define RCCAR_LSB 1 // LSB...MSB\r
#define RCCAR_FLAGS 0 // flags\r
\r
-#define AUTO_FRAME_REPETITION_TIME 50.0e-3 // SIRCS/SAMSUNG32/NUBERT: automatic repetition after 25-50ms\r
+#define JVC_START_BIT_PULSE_TIME 9000.0e-6 // 9000 usec pulse\r
+#define JVC_START_BIT_PAUSE_TIME 4500.0e-6 // 4500 usec pause\r
+#define JVC_PULSE_TIME 560.0e-6 // 560 usec pulse\r
+#define JVC_1_PAUSE_TIME 1690.0e-6 // 1690 usec pause\r
+#define JVC_0_PAUSE_TIME 560.0e-6 // 560 usec pause\r
+#define JVC_FRAME_REPEAT_PAUSE_TIME 25.0e-3 // frame repeat after 25ms\r
+#define JVC_ADDRESS_OFFSET 0 // skip 0 bits\r
+#define JVC_ADDRESS_LEN 4 // read 4 address bits\r
+#define JVC_COMMAND_OFFSET 4 // skip 4 bits\r
+#define JVC_COMMAND_LEN 12 // read 12 bits\r
+#define JVC_COMPLETE_DATA_LEN 16 // complete length\r
+#define JVC_STOP_BIT 1 // has stop bit\r
+#define JVC_LSB 1 // LSB...MSB\r
+#define JVC_FLAGS 0 // flags\r
+\r
+#define AUTO_FRAME_REPETITION_TIME 80.0e-3 // SIRCS/SAMSUNG32/NUBERT: automatic repetition after 25-50ms\r
+ // KASEIKYO: automatic repetition after 75ms\r
\r
#define TRUE 1\r
#define FALSE 0\r
*\r
* Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmpconfig.h,v 1.34 2010/06/26 18:11:08 fm Exp $\r
+ * $Id: irmpconfig.h,v 1.37 2010/08/18 12:03:26 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define IRMP_SUPPORT_NEC_PROTOCOL 1 // NEC + APPLE >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL 1 // Samsung + Samsung32 >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 ~50 bytes\r
-#define IRMP_SUPPORT_KASEIKYO_PROTOCOL 1 // support Kaseikyo >= 10000 ~50 bytes\r
-#define IRMP_SUPPORT_DENON_PROTOCOL 1 // support DENON >= 10000 ~250 bytes\r
-#define IRMP_SUPPORT_RC5_PROTOCOL 0 // RC5 >= 10000 ~250 bytes\r
-#define IRMP_SUPPORT_RC6_PROTOCOL 0 // RC6 >= 10000 ~200 bytes\r
-#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 0 // Grundig >= 10000 ~150 bytes\r
-#define IRMP_SUPPORT_NOKIA_PROTOCOL 0 // Nokia >= 10000 ~150 bytes\r
-#define IRMP_SUPPORT_NUBERT_PROTOCOL 0 // NUBERT >= 10000 ~50 bytes\r
-#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 0 // Bang & Olufsen >= 10000 ~200 bytes\r
+#define IRMP_SUPPORT_KASEIKYO_PROTOCOL 1 // Kaseikyo >= 10000 ~250 bytes\r
+#define IRMP_SUPPORT_DENON_PROTOCOL 1 // DENON >= 10000 ~250 bytes\r
+#define IRMP_SUPPORT_JVC_PROTOCOL 1 // JVC >= 10000 ~250 bytes\r
+#define IRMP_SUPPORT_RC5_PROTOCOL 1 // RC5 >= 10000 ~250 bytes\r
+#define IRMP_SUPPORT_RC6_PROTOCOL 1 // RC6 >= 10000 ~200 bytes\r
+#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 1 // Grundig >= 10000 ~150 bytes\r
+#define IRMP_SUPPORT_NOKIA_PROTOCOL 1 // Nokia >= 10000 ~150 bytes\r
+#define IRMP_SUPPORT_NUBERT_PROTOCOL 1 // NUBERT >= 10000 ~50 bytes\r
+#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 1 // Bang & Olufsen >= 10000 ~200 bytes\r
#define IRMP_SUPPORT_FDC_PROTOCOL 0 // FDC3402 keyboard >= 10000 (better 15000) ~50 bytes (~400 in combination with RC5)\r
#define IRMP_SUPPORT_RCCAR_PROTOCOL 0 // RC Car >= 10000 (better 15000) ~150 bytes (~500 in combination with RC5)\r
#define IRMP_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens Gigaset >= 15000 ~150 bytes\r
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL 0\r
#endif\r
\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1 && IRMP_SUPPORT_NEC_PROTOCOL == 0\r
+#warning JVC protocol needs also NEC protocol, NEC protocol enabled\r
+#undef IRMP_SUPPORT_NEC_PROTOCOL\r
+#define IRMP_SUPPORT_NEC_PROTOCOL 1\r
+#endif\r
+\r
#endif /* _WC_IRMPCONFIG_H_ */\r
*\r
* Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsnd.c,v 1.20 2010/06/15 15:47:21 fm Exp $\r
+ * $Id: irsnd.c,v 1.21 2010/08/18 12:03:26 fm Exp $\r
*\r
* This program is free software; you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License as published by\r
#define MATSUSHITA_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_0_PAUSE_TIME + 0.5)\r
#define MATSUSHITA_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * MATSUSHITA_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
\r
+#define KASEIKYO_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME + 0.5)\r
+#define KASEIKYO_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME + 0.5)\r
+#define KASEIKYO_PULSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_PULSE_TIME + 0.5)\r
+#define KASEIKYO_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_1_PAUSE_TIME + 0.5)\r
+#define KASEIKYO_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME + 0.5)\r
+#define KASEIKYO_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * KASEIKYO_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t!\r
+#define KASEIKYO_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * KASEIKYO_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
+\r
#define RECS80_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME + 0.5)\r
#define RECS80_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME + 0.5)\r
#define RECS80_PULSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_PULSE_TIME + 0.5)\r
break;\r
}\r
#endif\r
+#if IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+ case IRMP_KASEIKYO_PROTOCOL:\r
+ {\r
+ uint8_t xor;\r
+\r
+ address = bitsrevervse (irmp_data_p->address, KASEIKYO_ADDRESS_LEN);\r
+ command = bitsrevervse (irmp_data_p->command, KASEIKYO_COMMAND_LEN + 4);\r
+\r
+ xor = ((address & 0x000F) ^ ((address & 0x00F0) >> 4) ^ ((address & 0x0F00) >> 8) ^ ((address & 0xF000) >> 12)) & 0x0F;\r
+\r
+ irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
+ irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
+ irsnd_buffer[2] = xor << 4 | (command & 0x000F); // XXXXCCCC\r
+ irsnd_buffer[3] = 0 | (command & 0xF000) >> 12; // 0000CCCC\r
+ irsnd_buffer[4] = (command & 0x0FF0) >> 4; // CCCCCCCC\r
+\r
+ xor = irsnd_buffer[2] ^ irsnd_buffer[3] ^ irsnd_buffer[4];\r
+\r
+ irsnd_buffer[5] = xor;\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1\r
case IRMP_RECS80_PROTOCOL:\r
{\r
break;\r
}\r
#endif\r
+#if IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+ case IRMP_KASEIKYO_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = KASEIKYO_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = KASEIKYO_START_BIT_PAUSE_LEN;\r
+ pulse_1_len = KASEIKYO_PULSE_LEN;\r
+ pause_1_len = KASEIKYO_1_PAUSE_LEN;\r
+ pulse_0_len = KASEIKYO_PULSE_LEN;\r
+ pause_0_len = KASEIKYO_0_PAUSE_LEN;\r
+ has_stop_bit = KASEIKYO_STOP_BIT;\r
+ complete_data_len = KASEIKYO_COMPLETE_DATA_LEN;\r
+ n_auto_repetitions = (repeat_counter == 0) ? KASEIKYO_FRAMES : 1; // 2 frames auto repetition if first frame\r
+ auto_repetition_pause_len = KASEIKYO_AUTO_REPETITION_PAUSE_LEN; // 75 ms pause\r
+ repeat_frame_pause_len = KASEIKYO_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+ break;\r
+ }\r
+#endif\r
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1\r
case IRMP_RECS80_PROTOCOL:\r
{\r
#if IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1\r
case IRMP_MATSUSHITA_PROTOCOL:\r
#endif\r
+#if IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+ case IRMP_KASEIKYO_PROTOCOL:\r
+#endif\r
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1\r
case IRMP_RECS80_PROTOCOL:\r
#endif\r
#endif\r
\r
\r
-#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1 || IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 || \\r
- IRSND_SUPPORT_RECS80_PROTOCOL == 1 || IRSND_SUPPORT_RECS80EXT_PROTOCOL == 1 || IRSND_SUPPORT_DENON_PROTOCOL == 1 || IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || \\r
- IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1\r
+#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_SAMSUNG_PROTOCOL == 1 || IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 || \\r
+ IRSND_SUPPORT_KASEIKYO_PROTOCOL == 1 || IRSND_SUPPORT_RECS80_PROTOCOL == 1 || IRSND_SUPPORT_RECS80EXT_PROTOCOL == 1 || IRSND_SUPPORT_DENON_PROTOCOL == 1 || \\r
+ IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1\r
{\r
if (pulse_counter == 0)\r
{\r
*\r
* Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsndconfig.h,v 1.9 2010/07/01 11:17:11 fm Exp $\r
+ * $Id: irsndconfig.h,v 1.10 2010/08/18 12:03:26 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define IRSND_SUPPORT_SIRCS_PROTOCOL 1 // Sony SIRCS >= 10000 uses ~150 bytes\r
#define IRSND_SUPPORT_NEC_PROTOCOL 1 // NEC + APPLE >= 10000 uses ~100 bytes\r
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL 1 // Samsung + Samsung32 >= 10000 uses ~300 bytes\r
-#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 uses ~150 bytes\r
-#define IRSND_SUPPORT_KASEIKYO_PROTOCOL 0 // Kaseikyo NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 uses ~200 bytes\r
+#define IRSND_SUPPORT_KASEIKYO_PROTOCOL 1 // Kaseikyo >= 10000 uses ~150 bytes\r
#define IRSND_SUPPORT_RC5_PROTOCOL 1 // RC5 >= 10000 uses ~150 bytes\r
#define IRSND_SUPPORT_DENON_PROTOCOL 1 // DENON >= 10000 uses ~200 bytes\r
#define IRSND_SUPPORT_RC6_PROTOCOL 0 // RC6 NOT SUPPORTED YET!\r
#define IRSND_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens, Gigaset >= 15000 uses ~150 bytes\r
#define IRSND_SUPPORT_RECS80_PROTOCOL 0 // RECS80 >= 20000 uses ~100 bytes\r
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL 0 // RECS80EXT >= 20000 uses ~100 bytes\r
+#define IRSND_SUPPORT_JVC_PROTOCOL 0 // JVC NOT SUPPORTED YET!\r
+\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* Change hardware pin here:\r