]> cloudbase.mooo.com Git - irmp.git/commitdiff
Version 1.7.3: better support of Kaseikyo and Apple remote controls
authorukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Sat, 28 Aug 2010 22:42:29 +0000 (22:42 +0000)
committerukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Sat, 28 Aug 2010 22:42:29 +0000 (22:42 +0000)
git-svn-id: svn://mikrocontroller.net/irmp@44 aeb2e35e-bfc4-4214-b83c-9e8de998ed28

IR-Data/Panasonic-Blue-Ray.txt
IR-Data/test-suite.sh
README.txt
irmp.c
irmp.exe
irmp.h
irmpconfig.h
irsnd.c
irsndconfig.h

index f26d35dc6fefeddce761593a1fd4856d725b8935..af9ef9f1ad929a8a5d015eca7e2f0903109f83fa 100644 (file)
@@ -2,7 +2,7 @@
 00000000000000000000000000000000000001111111111111111000000111000000111111111110000001110000001110000001110000011100000011100000011100000011100000111100000111000000111000000111000000111111111111000001110000001110000001110000011110000011110000011100000011111111111100000111111111111100000111000000111111111111000001111000001110000001110000001110000011110000011110000011110000011100000011111111111100000111100000111111111111000000111111111111000001111111111110000001111111111110000011110000011110000011111111111100000111100000111111111111100000111111111111000001111000001111000001111000001111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000011110000011111111111100000011100000011100000111100000111100000111100000111000000111000001111000001111000001111000001110000001111111111110000011110000011110000011100000111100000111100000111100000111111111111000001111111111111000001111000001111111111110000011110000011110000011110000011110000011100000111100000111100000111100000111111111111000001111000001111111111111000001111111111110000011111111111110000011111111111100000111100000111100000111111111111100000111000001111111111111000001111111111111000001110000011110000011110000011111111111110000011111111111111111\r
 # Power\r
 00000000000000000000000000000000000011111111111111110000001110000001111111111100000011100000011100000011100000011100000111000000111000000111000000111000001111000001110000001110000001111111111110000011110000011100000011100000011100000111100000111100000111111111111000000111111111111000001110000001111111111110000011110000011110000011100000011100000011100000111100000111100000111100000111111111111000001111000001111111111110000001111111111110000011111111111110000011111111111100000111100000111100000111111111111000000111000001111111111111000001111111111111000001110000011110000011110000011111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000111111111111111100000011100000111111111111100000111000000111000000111000001111000001111000001111000001110000001110000011110000011110000011110000011111111111100000111100000111100000111100000111000001111000001111000001111111111111000001111111111110000011110000011111111111110000011100000111100000111100000111100000111100000111000001111000001111000001111111111111000001110000011111111111110000011111111111100000011111111111100000111111111111100000111000001111000001111111111111000001111000001111111111110000011111111111110000011110000011100000111100000111111111111100000111111111111111111\r
-# Power (laenger gedrueckt)\r
+# Power (TV?) (laenger gedrueckt)\r
 0000000000000000000000000000000000000111111111111111100000011100000011111111111000000111000000111000000111000001110000001110000001110000001110000011110000011100000011100000011100000111111111111100000111000000111000000111000001111000001110000001110000001110000011110000011110000011111111111100000011100000111100000111100000111100000111000000111000001111000001111000001111111111110000001110000011111111111110000011111111111100000111111111111100000111111111111000000111000001111000001111111111111000001111000001111111111110000011111111111110000011111111111100000111111111111100000111100000111111111111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000001111111111111111000000111000001111111111110000001110000001110000011110000011110000011110000011100000011100000111100000111100000111100000111000000111111111111000001111000001111000001110000011110000011110000011110000011110000011100000111100000111111111111100000111100000111000001111000001111000001111000001111000001110000011110000011111111111110000011110000011111111111100000111111111111100000111111111111000001111111111111000001111000001110000001111111111110000011110000011111111111100000111111111111100000111111111111100000111111111111000001111000001111111111111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000001110000011111111111110000011110000011110000011100000111100000111100000111100000111100000111000001111000001111000001111000001111111111110000011110000011110000011110000011110000011100000111100000111100000111100000111100000111111111111000001111000001111000001110000011110000011110000011110000011110000011100000111111111111100000111100000111111111111000001111111111111000001111111111111000001111111111110000011110000011110000011111111111100000111100000111111111111100000111111111111000001111111111111000001111111111110000001110000011111111111110000011111111111111111111\r
 # Taste 1\r
 000000000000000000000000000000000000011111111111111100000011100000011111111111100000011000000111000000111000000111000000111000001110000001110000001110000001110000011110000011100000011111111111100000011100000111100000111000000111000000111000001111000001111111111110000001111111111110000011110000011111111111100000011100000011100000111100000111100000111100000111000001111000001111000001111000001111000001110000011110000011111111111110000011110000011100000111100000111100000111100000111000000111000001111000001111111111111000001110000001111111111110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000011111111111111110000011110000011111111111100000011100000111100000111100000111100000111000000111000001111000001111000001111000001110000011110000011111111111110000011110000011100000111100000111100000111100000111100000111111111111000001111111111111000001111000001111111111110000011110000011110000011110000011100000111100000111100000111100000111100000111000001111000001111000001111000001111111111110000011110000011110000011110000011100000111100000111100000111100000111100000111111111111000001111000001111111111111000001111111111111111111\r
index 840b7acdbc232f2b402fc71c1354afabce066524..53585edb6787394efc1a9179a39508bbcb839d9f 100644 (file)
@@ -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                         \
index 36d8795b6a5057c1b24d1913d99af41fa386b097..e065ac21c3a34c778462d6cd33cdd88b85bfd99f 100644 (file)
@@ -1,8 +1,8 @@
 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
diff --git a/irmp.c b/irmp.c
index 861836c4b1298e178d315ded08337679fa400a6c..4077f54fd83e7c6a047c895b714fe9872c02e045 100644 (file)
--- a/irmp.c
+++ b/irmp.c
@@ -3,7 +3,7 @@
  *\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
@@ -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)\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
@@ -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)\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
@@ -1257,11 +1270,12 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
                     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
@@ -1300,19 +1314,22 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
 }\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
@@ -1326,6 +1343,7 @@ static uint8_t    irmp_bit;
 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
@@ -1350,12 +1368,34 @@ irmp_store_bit (uint8_t value)
             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
@@ -1513,6 +1553,19 @@ irmp_ISR (void)
                     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
@@ -1967,6 +2020,18 @@ irmp_ISR (void)
                             {\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
@@ -2333,6 +2398,17 @@ irmp_ISR (void)
                 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
@@ -2417,6 +2493,32 @@ irmp_ISR (void)
                             }\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
@@ -2477,6 +2579,13 @@ irmp_ISR (void)
                 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
index 8c536cc61a404ef20a88608138a8bad7c3a1e615..808c9e2907ee03d68dc1a4491c908ab0e3894236 100644 (file)
Binary files a/irmp.exe and b/irmp.exe differ
diff --git a/irmp.h b/irmp.h
index 5035f37d0f6e9f64f20ca386f9db6f091c898df7..c8c709acf50fabf13b79a1bc9da954428959d6a8 100644 (file)
--- a/irmp.h
+++ b/irmp.h
@@ -3,7 +3,7 @@
  *\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
@@ -45,6 +45,7 @@ extern "C"
 #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
@@ -128,7 +129,8 @@ extern "C"
 #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
@@ -136,6 +138,7 @@ extern "C"
 #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
@@ -314,7 +317,23 @@ extern "C"
 #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
index a9b2f1b5b457a4966cd1a38ed62633688f4b2d0c..2d2684889590b62d402102984ba6b22d6eaaeb2b 100644 (file)
@@ -3,7 +3,7 @@
  *\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
diff --git a/irsnd.c b/irsnd.c
index 029d476d20e482b4c11d72c46c9c72356d775dbd..ee91c6bda245be96d5afa37e4fd5b3b34264fae9 100644 (file)
--- a/irsnd.c
+++ b/irsnd.c
@@ -3,7 +3,7 @@
  *\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
@@ -84,6 +84,14 @@ typedef unsigned short    uint16_t;
 #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
@@ -390,6 +398,29 @@ irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait)
             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
@@ -743,6 +774,24 @@ irsnd_ISR (void)
                         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
@@ -963,6 +1012,9 @@ irsnd_ISR (void)
 #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
@@ -986,9 +1038,9 @@ irsnd_ISR (void)
 #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
index cde0a9021d7b302519ab7863eb9bc9120edb98a2..5220a4a2f31b7bca0d487ff782d660cdaef0347f 100644 (file)
@@ -3,7 +3,7 @@
  *\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
@@ -33,8 +33,8 @@
 #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
@@ -47,6 +47,8 @@
 #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