]> cloudbase.mooo.com Git - irmp.git/blobdiff - irmp.c
version 2.0.0-pre1: added NEC42 protocol
[irmp.git] / irmp.c
diff --git a/irmp.c b/irmp.c
index 8c0c6a74304bd8b255bc248df2c86490c7dc1e1f..5c35ccf04769a2f9e22ff3115c2153e2a1177260 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.97 2011/02/25 15:24:06 fm Exp $\r
+ * $Id: irmp.c,v 1.99 2011/03/10 12:29:13 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
  *   RC6\r
  *   ---\r
  *\r
- *   RC6 frame:  1 start bit + 1 bit "1" + 3 mode bits + 1 toggle bit + 16 data bits + 2666 µs pause\r
+ *   RC6 frame:  1 start bit + 1 bit "1" + 3 mode bits + 1 toggle bit + 16 data bits + 2666 us pause\r
  *   RC6 data:   8 address bits + 8 command bits\r
  *\r
  *   start  bit               toggle bit "0":      toggle bit "1":     data/mode "0":      data/mode "1":\r
@@ -957,11 +957,11 @@ static PROGMEM IRMP_PARAMETER nec_rep_param =
 \r
 #endif\r
 \r
-#if IRMP_SUPPORT_NEC16_PROTOCOL == 1\r
+#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
 \r
-static PROGMEM IRMP_PARAMETER nec16_param =\r
+static PROGMEM IRMP_PARAMETER nec42_param =\r
 {\r
-    IRMP_NEC16_PROTOCOL,                                                // protocol:        ir protocol\r
+    IRMP_NEC42_PROTOCOL,                                                // protocol:        ir protocol\r
     NEC_PULSE_LEN_MIN,                                                  // pulse_1_len_min: minimum length of pulse with bit value 1\r
     NEC_PULSE_LEN_MAX,                                                  // pulse_1_len_max: maximum length of pulse with bit value 1\r
     NEC_1_PAUSE_LEN_MIN,                                                // pause_1_len_min: minimum length of pause with bit value 1\r
@@ -970,14 +970,14 @@ static PROGMEM IRMP_PARAMETER nec16_param =
     NEC_PULSE_LEN_MAX,                                                  // pulse_0_len_max: maximum length of pulse with bit value 0\r
     NEC_0_PAUSE_LEN_MIN,                                                // pause_0_len_min: minimum length of pause with bit value 0\r
     NEC_0_PAUSE_LEN_MAX,                                                // pause_0_len_max: maximum length of pause with bit value 0\r
-    NEC16_ADDRESS_OFFSET,                                               // address_offset:  address offset\r
-    NEC16_ADDRESS_OFFSET + NEC16_ADDRESS_LEN,                           // address_end:     end of address\r
-    NEC16_COMMAND_OFFSET,                                               // command_offset:  command offset\r
-    NEC16_COMMAND_OFFSET + NEC16_COMMAND_LEN,                           // command_end:     end of command\r
-    NEC16_COMPLETE_DATA_LEN,                                            // complete_len:    complete length of frame\r
-    NEC16_STOP_BIT,                                                     // stop_bit:        flag: frame has stop bit\r
-    NEC16_LSB,                                                          // lsb_first:       flag: LSB first\r
-    NEC16_FLAGS                                                         // flags:           some flags\r
+    NEC42_ADDRESS_OFFSET,                                               // address_offset:  address offset\r
+    NEC42_ADDRESS_OFFSET + NEC_ADDRESS_LEN,                             // address_end:     end of address\r
+    NEC42_COMMAND_OFFSET,                                               // command_offset:  command offset\r
+    NEC42_COMMAND_OFFSET + NEC_COMMAND_LEN,                             // command_end:     end of command\r
+    NEC42_COMPLETE_DATA_LEN,                                            // complete_len:    complete length of frame\r
+    NEC_STOP_BIT,                                                       // stop_bit:        flag: frame has stop bit\r
+    NEC_LSB,                                                            // lsb_first:       flag: LSB first\r
+    NEC_FLAGS                                                           // flags:           some flags\r
 };\r
 \r
 #endif\r
@@ -1609,7 +1609,7 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
 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
+#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1) || IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
 static uint16_t irmp_tmp_address2;                                                      // ir address\r
 static uint16_t irmp_tmp_command2;                                                      // ir command\r
 #endif\r
@@ -1666,6 +1666,13 @@ irmp_store_bit (uint8_t value)
         }\r
     }\r
 \r
+#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+    else if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && irmp_bit >= 13 && irmp_bit < 26)\r
+    {\r
+        irmp_tmp_address2 |= (((uint16_t) (value)) << (irmp_bit - 13));                             // CV wants cast\r
+    }\r
+#endif\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
@@ -1791,7 +1798,7 @@ irmp_ISR (void)
                     irmp_tmp_command        = 0;\r
                     irmp_tmp_address        = 0;\r
 \r
-#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\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
                     irmp_tmp_address2       = 0;\r
 #endif\r
@@ -1872,7 +1879,7 @@ irmp_ISR (void)
                         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
+                        irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
                     }\r
                     else\r
 #endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
@@ -1881,10 +1888,18 @@ irmp_ISR (void)
                     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
+#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+                        ANALYZE_PRINTF ("protocol = NEC42, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+                                        NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
+                                        NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX);\r
+                        irmp_param_p = (IRMP_PARAMETER *) &nec42_param;\r
+#else\r
                         ANALYZE_PRINTF ("protocol = NEC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
                                         NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
                                         NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX);\r
                         irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
+#endif\r
+\r
                     }\r
                     else if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN        && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
                              irmp_pause_time >= NEC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
@@ -2473,6 +2488,39 @@ irmp_ISR (void)
                                 irmp_start_bit_detected = 1;                                        // tricky: don't wait for another start bit...\r
                             }\r
 #endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
+                            else if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && irmp_bit == 32)  // it was a NEC stop bit\r
+                            {\r
+                                ANALYZE_PRINTF ("Switching to NEC protocol\n");\r
+                                irmp_param.stop_bit     = TRUE;                                     // set flag\r
+                                irmp_param.protocol     = IRMP_NEC_PROTOCOL;                        // switch protocol\r
+                                irmp_param.complete_len = irmp_bit;                                 // patch length: 16 or 17\r
+\r
+                                //        0123456789ABC0123456789ABC0123456701234567\r
+                                // NEC42: AAAAAAAAAAAAAaaaaaaaaaaaaaCCCCCCCCcccccccc\r
+                                // NEC:   AAAAAAAAaaaaaaaaCCCCCCCCcccccccc\r
+                                irmp_tmp_address        |= (irmp_tmp_address2 & 0x0007) << 12;\r
+                                irmp_tmp_command        = (irmp_tmp_address2 >> 3) | (irmp_tmp_command << 10);\r
+                            }\r
+#endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+                            else if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && irmp_bit == 16)  // 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
+\r
+                                //        0123456789ABC0123456789ABC0123456701234567\r
+                                // NEC42: AAAAAAAAAAAAAaaaaaaaaaaaaaCCCCCCCCcccccccc\r
+                                // JVC:   AAAACCCCCCCCCCCC\r
+                                irmp_tmp_command        = (irmp_tmp_address >> 4) | (irmp_tmp_address2 << 9);   // set command: upper 12 bits are command bits\r
+                                irmp_tmp_address        = irmp_tmp_address & 0x000F;                            // lower 4 bits are address bits\r
+                            }\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+#endif // IRMP_SUPPORT_NEC42_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
@@ -2770,11 +2818,20 @@ irmp_ISR (void)
 #endif // IRMP_SUPPORT_SAMSUNG_PROTOCOL\r
 \r
 #if IRMP_SUPPORT_NEC16_PROTOCOL\r
-                    if (irmp_param.protocol == IRMP_NEC_PROTOCOL && irmp_bit == 8 &&\r
-                        irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
+#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+                    if (irmp_param.protocol == IRMP_NEC42_PROTOCOL &&\r
+#else // IRMP_SUPPORT_NEC_PROTOCOL instead\r
+                    if (irmp_param.protocol == IRMP_NEC_PROTOCOL &&\r
+#endif // IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+                        irmp_bit == 8 && irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
                     {\r
                         ANALYZE_PRINTF ("Switching to NEC16 protocol\n");\r
-                        memcpy_P (&irmp_param, &nec16_param, sizeof (IRMP_PARAMETER));\r
+                        irmp_param.protocol = IRMP_NEC16_PROTOCOL;\r
+                        irmp_param.address_offset   = NEC16_ADDRESS_OFFSET;\r
+                        irmp_param.address_end      = NEC16_ADDRESS_OFFSET + NEC16_ADDRESS_LEN;\r
+                        irmp_param.command_offset   = NEC16_COMMAND_OFFSET;\r
+                        irmp_param.command_end      = NEC16_COMMAND_OFFSET + NEC16_COMMAND_LEN;\r
+                        irmp_param.complete_len     = NEC16_COMPLETE_DATA_LEN;\r
                         wait_for_space = 0;\r
                     }\r
                     else\r
@@ -3473,7 +3530,7 @@ get_fdc_key (uint16_t cmd)
                             case 0x000C: key = '\\';    break;\r
                             case 0x001C: key = '~';     break;\r
                             case 0x002D: key = '|';     break;\r
-                            case 0x0034: key = 'µ';     break;\r
+                            case 0x0034: key = 0xB5;    break; // Mu\r
                         }\r
                     }\r
                     else if (state & (STATE_LEFT_CTRL))\r