]> cloudbase.mooo.com Git - irmp.git/blobdiff - irmp.c
Version 2.0.3:
[irmp.git] / irmp.c
diff --git a/irmp.c b/irmp.c
index 020860f6a8ac2594d110955656eafd05d42b45ba..9a707ba6e7c454819048d063ef5ee3f74367a9a0 100644 (file)
--- a/irmp.c
+++ b/irmp.c
@@ -3,7 +3,7 @@
  *\r
  * Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmp.c,v 1.110 2011/09/22 10:19:44 fm Exp $\r
+ * $Id: irmp.c,v 1.112 2012/02/13 10:59:07 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -1736,6 +1736,7 @@ static uint16_t irmp_tmp_id;
 #endif\r
 #if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
 static uint8_t  xor_check[6];                                                           // check kaseikyo "parity" bits\r
+static uint8_t  genre2;                                                                 // save genre2 bits here, later copied to MSB in flags\r
 #endif\r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
@@ -1798,23 +1799,29 @@ irmp_store_bit (uint8_t value)
 #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
+    else if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL)\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
+        if (irmp_bit >= 20 && irmp_bit < 24)\r
         {\r
-            xor_check[irmp_bit / 8] |= 1 << (irmp_bit % 8);\r
+            irmp_tmp_command |= (((uint16_t) (value)) << (irmp_bit - 8));       // store 4 system bits (genre 1) in upper nibble with LSB first\r
         }\r
-        else\r
+       else if (irmp_bit >= 24 && irmp_bit < 28)\r
         {\r
-            xor_check[irmp_bit / 8] &= ~(1 << (irmp_bit % 8));\r
+            genre2 |= (((uint8_t) (value)) << (irmp_bit - 20));                 // store 4 system bits (genre 2) in upper nibble with LSB first\r
         }\r
-    }\r
 \r
+        if (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
@@ -1914,7 +1921,7 @@ irmp_ISR (void)
 #ifdef ANALYZE\r
                 if (! irmp_pulse_time)\r
                 {\r
-                    ANALYZE_PRINTF("%8d [starting pulse]\n", time_counter);\r
+                    ANALYZE_PRINTF("%8.3fms [starting pulse]\n", (double) (time_counter * 1000) / F_INTERRUPTS);\r
                 }\r
 #endif\r
                 irmp_pulse_time++;                                              // increment counter\r
@@ -1928,6 +1935,9 @@ irmp_ISR (void)
                     wait_for_space          = 0;\r
                     irmp_tmp_command        = 0;\r
                     irmp_tmp_address        = 0;\r
+#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
+                    genre2                  = 0;\r
+#endif\r
 \r
 #if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) || IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
                     irmp_tmp_command2       = 0;\r
@@ -1972,7 +1982,7 @@ irmp_ISR (void)
                         else\r
 #endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
                         {\r
-                            ANALYZE_PRINTF ("%8d error 1: pause after start bit pulse %d too long: %d\n", time_counter, irmp_pulse_time, irmp_pause_time);\r
+                            ANALYZE_PRINTF ("%8.3fms error 1: pause after start bit pulse %d too long: %d\n", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_pulse_time, irmp_pause_time);\r
                             ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
                         }\r
 //                      irmp_busy_flag = FALSE;\r
@@ -1989,7 +1999,7 @@ irmp_ISR (void)
                     irmp_param2.protocol = 0;\r
 #endif\r
 \r
-                    ANALYZE_PRINTF ("%8d [start-bit: pulse = %2d, pause = %2d]\n", time_counter, irmp_pulse_time, irmp_pause_time);\r
+                    ANALYZE_PRINTF ("%8.3fms [start-bit: pulse = %2d, pause = %2d]\n", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_pulse_time, irmp_pause_time);\r
 \r
 #if IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
                     if (irmp_pulse_time >= SIRCS_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SIRCS_START_BIT_PULSE_LEN_MAX &&\r
@@ -2453,14 +2463,14 @@ irmp_ISR (void)
                     {\r
                         if (irmp_pause_time > irmp_param.pulse_1_len_max && irmp_pause_time <= 2 * irmp_param.pulse_1_len_max)\r
                         {\r
-                            ANALYZE_PRINTF ("%8d [bit %2d: pulse = %3d, pause = %3d] ", time_counter, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+                            ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
                             ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '0' : '1');\r
                             ANALYZE_NEWLINE ();\r
                             irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1);\r
                         }\r
                         else if (! last_value)  // && irmp_pause_time >= irmp_param.pause_1_len_min && irmp_pause_time <= irmp_param.pause_1_len_max)\r
                         {\r
-                            ANALYZE_PRINTF ("%8d [bit %2d: pulse = %3d, pause = %3d] ", time_counter, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+                            ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
 \r
                             ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '1' : '0');\r
                             ANALYZE_NEWLINE ();\r
@@ -2482,7 +2492,7 @@ irmp_ISR (void)
 #if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
                     if (irmp_param.protocol == IRMP_DENON_PROTOCOL)\r
                     {\r
-                        ANALYZE_PRINTF ("%8d [bit %2d: pulse = %3d, pause = %3d] ", time_counter, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+                        ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
 \r
                         if (irmp_pause_time >= DENON_1_PAUSE_LEN_MIN && irmp_pause_time <= DENON_1_PAUSE_LEN_MAX)\r
                         {                                                       // pause timings correct for "1"?\r
@@ -2502,7 +2512,7 @@ irmp_ISR (void)
 #if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
                     if (irmp_param.protocol == IRMP_THOMSON_PROTOCOL)\r
                     {\r
-                        ANALYZE_PRINTF ("%8d [bit %2d: pulse = %3d, pause = %3d] ", time_counter, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+                        ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
 \r
                         if (irmp_pause_time >= THOMSON_1_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_1_PAUSE_LEN_MAX)\r
                         {                                                       // pause timings correct for "1"?\r
@@ -2703,7 +2713,7 @@ irmp_ISR (void)
                                 //        0123456789ABC0123456789ABC0123456701234567\r
                                 // NEC42: AAAAAAAAAAAAAaaaaaaaaaaaaaCCCCCCCCcccccccc\r
                                 // NEC:   AAAAAAAAaaaaaaaaCCCCCCCCcccccccc\r
-                                irmp_tmp_address        |= (irmp_tmp_address2 & 0x0007) << 12;\r
+                                irmp_tmp_address        |= (irmp_tmp_address2 & 0x0007) << 13;      // fm 2012-02-13: 12 -> 13\r
                                 irmp_tmp_command        = (irmp_tmp_address2 >> 3) | (irmp_tmp_command << 10);\r
                             }\r
 #endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
@@ -2743,7 +2753,7 @@ irmp_ISR (void)
 \r
                 if (got_light)\r
                 {\r
-                    ANALYZE_PRINTF ("%8d [bit %2d: pulse = %3d, pause = %3d] ", time_counter, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+                    ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
 \r
 #if IRMP_SUPPORT_MANCHESTER == 1\r
                     if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))                                     // Manchester\r
@@ -3252,7 +3262,7 @@ irmp_ISR (void)
 #endif\r
 \r
                 {\r
-                    ANALYZE_PRINTF ("%8d code detected, length = %d\n", time_counter, irmp_bit);\r
+                    ANALYZE_PRINTF ("%8.3fms code detected, length = %d\n", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit);\r
                     irmp_ir_detected = TRUE;\r
 \r
 #if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
@@ -3336,6 +3346,8 @@ irmp_ISR (void)
                                 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
+                            irmp_flags |= genre2;      // write the genre2 bits into MSB of the flag byte\r
                         }\r
 #endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
 \r
@@ -3806,7 +3818,7 @@ next_tick (void)
 \r
             if (verbose)\r
             {\r
-                printf ("%8d ", time_counter);\r
+                printf ("%8.3fms ", (double) (time_counter * 1000) / F_INTERRUPTS);\r
             }\r
 \r
             if (irmp_data.protocol == IRMP_FDC_PROTOCOL && (key = get_fdc_key (irmp_data.command)) != 0)\r