]> cloudbase.mooo.com Git - irmp.git/blobdiff - irmp.c
version 1.9.3: added thomson protocol
[irmp.git] / irmp.c
diff --git a/irmp.c b/irmp.c
index 1016dbc8469d08a6287b6bf3b5a00959b9a8ad20..0313571b07c3181bc1e03a1171a73c6d12b9d2da 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.101 2011/04/20 09:09:48 fm Exp $\r
+ * $Id: irmp.c,v 1.103 2011/05/20 09:31:25 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -29,6 +29,7 @@
  * FDC          - FDC IR keyboard\r
  * RCCAR        - IR remote control for RC cars\r
  * JVC          - JVC\r
+ * THOMSON      - Thomson\r
  * NIKON        - Nikon cameras\r
  * RUWIDO       - T-Home\r
  * KATHREIN     - Kathrein\r
@@ -368,6 +369,7 @@ typedef unsigned int16  uint16_t;
 #endif\r
 \r
 #if IRMP_SUPPORT_NETBOX_PROTOCOL == 1 ||                \\r
+    IRMP_SUPPORT_MERLIN_PROTOCOL == 1 ||                \\r
     IRMP_SUPPORT_IMON_PROTOCOL == 1 \r
 #define IRMP_SUPPORT_SERIAL                     1\r
 #else\r
@@ -502,6 +504,13 @@ typedef unsigned int16  uint16_t;
 #endif\r
 #define DENON_0_PAUSE_LEN_MAX                   ((uint8_t)(F_INTERRUPTS * DENON_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
 \r
+#define THOMSON_PULSE_LEN_MIN                   ((uint8_t)(F_INTERRUPTS * THOMSON_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define THOMSON_PULSE_LEN_MAX                   ((uint8_t)(F_INTERRUPTS * THOMSON_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define THOMSON_1_PAUSE_LEN_MIN                 ((uint8_t)(F_INTERRUPTS * THOMSON_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define THOMSON_1_PAUSE_LEN_MAX                 ((uint8_t)(F_INTERRUPTS * THOMSON_1_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define THOMSON_0_PAUSE_LEN_MIN                 ((uint8_t)(F_INTERRUPTS * THOMSON_0_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define THOMSON_0_PAUSE_LEN_MAX                 ((uint8_t)(F_INTERRUPTS * THOMSON_0_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+\r
 #define RC6_START_BIT_PULSE_LEN_MIN             ((uint8_t)(F_INTERRUPTS * RC6_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
 #define RC6_START_BIT_PULSE_LEN_MAX             ((uint8_t)(F_INTERRUPTS * RC6_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
 #define RC6_START_BIT_PAUSE_LEN_MIN             ((uint8_t)(F_INTERRUPTS * RC6_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
@@ -669,6 +678,15 @@ typedef unsigned int16  uint16_t;
 #define LEGO_0_PAUSE_LEN_MIN                    ((uint8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
 #define LEGO_0_PAUSE_LEN_MAX                    ((uint8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
 \r
+#define MERLIN_START_BIT_PULSE_LEN_MIN          ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define MERLIN_START_BIT_PULSE_LEN_MAX          ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define MERLIN_START_BIT_PAUSE_LEN_MIN          ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define MERLIN_START_BIT_PAUSE_LEN_MAX          ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define MERLIN_PULSE_LEN                        ((uint8_t)(F_INTERRUPTS * MERLIN_PULSE_TIME))\r
+#define MERLIN_PAUSE_LEN                        ((uint8_t)(F_INTERRUPTS * MERLIN_PAUSE_TIME))\r
+#define MERLIN_PULSE_REST_LEN                   ((uint8_t)(F_INTERRUPTS * MERLIN_PULSE_TIME / 4))\r
+#define MERLIN_PAUSE_REST_LEN                   ((uint8_t)(F_INTERRUPTS * MERLIN_PAUSE_TIME / 4))\r
+\r
 #define IMON_START_BIT_PULSE_LEN_MIN            ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
 #define IMON_START_BIT_PULSE_LEN_MAX            ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
 #define IMON_START_BIT_PAUSE_LEN_MIN            ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
@@ -1430,6 +1448,56 @@ static PROGMEM IRMP_PARAMETER lego_param =
 \r
 #endif\r
 \r
+#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
+\r
+static PROGMEM IRMP_PARAMETER netbox_param =\r
+{\r
+    IRMP_MERLIN_PROTOCOL,                                               // protocol:        ir protocol\r
+    MERLIN_PULSE_LEN,                                                   // pulse_1_len_min: minimum length of pulse with bit value 1, here: exact value\r
+    MERLIN_PULSE_REST_LEN,                                              // pulse_1_len_max: maximum length of pulse with bit value 1, here: rest value\r
+    MERLIN_PAUSE_LEN,                                                   // pause_1_len_min: minimum length of pause with bit value 1, here: exact value\r
+    MERLIN_PAUSE_REST_LEN,                                              // pause_1_len_max: maximum length of pause with bit value 1, here: rest value\r
+    MERLIN_PULSE_LEN,                                                   // pulse_0_len_min: minimum length of pulse with bit value 0, here: exact value\r
+    MERLIN_PULSE_REST_LEN,                                              // pulse_0_len_max: maximum length of pulse with bit value 0, here: rest value\r
+    MERLIN_PAUSE_LEN,                                                   // pause_0_len_min: minimum length of pause with bit value 0, here: exact value\r
+    MERLIN_PAUSE_REST_LEN,                                              // pause_0_len_max: maximum length of pause with bit value 0, here: rest value\r
+    MERLIN_ADDRESS_OFFSET,                                              // address_offset:  address offset\r
+    MERLIN_ADDRESS_OFFSET + MERLIN_ADDRESS_LEN,                         // address_end:     end of address\r
+    MERLIN_COMMAND_OFFSET,                                              // command_offset:  command offset\r
+    MERLIN_COMMAND_OFFSET + MERLIN_COMMAND_LEN,                         // command_end:     end of command\r
+    MERLIN_COMPLETE_DATA_LEN,                                           // complete_len:    complete length of frame\r
+    MERLIN_STOP_BIT,                                                    // stop_bit:        flag: frame has stop bit\r
+    MERLIN_LSB,                                                         // lsb_first:       flag: LSB first\r
+    MERLIN_FLAGS                                                        // flags:           some flags\r
+};\r
+\r
+#endif\r
+\r
+#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+\r
+static PROGMEM IRMP_PARAMETER thomson_param =\r
+{\r
+    IRMP_THOMSON_PROTOCOL,                                              // protocol:        ir protocol\r
+    THOMSON_PULSE_LEN_MIN,                                              // pulse_1_len_min: minimum length of pulse with bit value 1\r
+    THOMSON_PULSE_LEN_MAX,                                              // pulse_1_len_max: maximum length of pulse with bit value 1\r
+    THOMSON_1_PAUSE_LEN_MIN,                                            // pause_1_len_min: minimum length of pause with bit value 1\r
+    THOMSON_1_PAUSE_LEN_MAX,                                            // pause_1_len_max: maximum length of pause with bit value 1\r
+    THOMSON_PULSE_LEN_MIN,                                              // pulse_0_len_min: minimum length of pulse with bit value 0\r
+    THOMSON_PULSE_LEN_MAX,                                              // pulse_0_len_max: maximum length of pulse with bit value 0\r
+    THOMSON_0_PAUSE_LEN_MIN,                                            // pause_0_len_min: minimum length of pause with bit value 0\r
+    THOMSON_0_PAUSE_LEN_MAX,                                            // pause_0_len_max: maximum length of pause with bit value 0\r
+    THOMSON_ADDRESS_OFFSET,                                             // address_offset:  address offset\r
+    THOMSON_ADDRESS_OFFSET + THOMSON_ADDRESS_LEN,                       // address_end:     end of address\r
+    THOMSON_COMMAND_OFFSET,                                             // command_offset:  command offset\r
+    THOMSON_COMMAND_OFFSET + THOMSON_COMMAND_LEN,                       // command_end:     end of command\r
+    THOMSON_COMPLETE_DATA_LEN,                                          // complete_len:    complete length of frame\r
+    THOMSON_STOP_BIT,                                                   // stop_bit:        flag: frame has stop bit\r
+    THOMSON_LSB,                                                        // lsb_first:       flag: LSB first\r
+    THOMSON_FLAGS                                                       // flags:           some flags\r
+};\r
+\r
+#endif\r
+\r
 #if IRMP_SUPPORT_IMON_PROTOCOL == 1\r
 \r
 static PROGMEM IRMP_PARAMETER imon_param =\r
@@ -1573,8 +1641,8 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
                 rtc = TRUE;                                     // Summe:  V  C1 C0 D7 D6 D5 D4 D3 D2 D1 D0\r
                 break;\r
 #endif\r
-#if 1 // squeeze code to 8 bit, upper bit indicates release-key\r
-#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1                           // squeeze code to 8 bit, upper bit indicates release-key\r
             case IRMP_NETBOX_PROTOCOL:\r
                 if (irmp_command & 0x1000)                      // last bit set?\r
                 {\r
@@ -1601,7 +1669,6 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
                 }\r
                 break;\r
 #endif\r
-#endif // 0\r
 #if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
             case IRMP_LEGO_PROTOCOL:\r
             {\r
@@ -2085,6 +2152,20 @@ irmp_ISR (void)
                     else\r
 #endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
 \r
+#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+                    if ( (irmp_pulse_time >= THOMSON_PULSE_LEN_MIN && irmp_pulse_time <= THOMSON_PULSE_LEN_MAX) &&\r
+                        ((irmp_pause_time >= THOMSON_1_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_1_PAUSE_LEN_MAX) ||\r
+                         (irmp_pause_time >= THOMSON_0_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_0_PAUSE_LEN_MAX)))\r
+                    {                                                           // it's THOMSON\r
+                        ANALYZE_PRINTF ("protocol = THOMSON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
+                                        THOMSON_PULSE_LEN_MIN, THOMSON_PULSE_LEN_MAX,\r
+                                        THOMSON_1_PAUSE_LEN_MIN, THOMSON_1_PAUSE_LEN_MAX,\r
+                                        THOMSON_0_PAUSE_LEN_MIN, THOMSON_0_PAUSE_LEN_MAX);\r
+                        irmp_param_p = (IRMP_PARAMETER *) &thomson_param;\r
+                    }\r
+                    else\r
+#endif // IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+\r
 #if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
                     if (irmp_pulse_time >= RC6_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RC6_START_BIT_PULSE_LEN_MAX &&\r
                         irmp_pause_time >= RC6_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RC6_START_BIT_PAUSE_LEN_MAX)\r
@@ -2226,6 +2307,18 @@ irmp_ISR (void)
                     else\r
 #endif // IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
 \r
+#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
+                    if (irmp_pulse_time >= MERLIN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MERLIN_START_BIT_PULSE_LEN_MAX &&\r
+                        irmp_pause_time >= MERLIN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MERLIN_START_BIT_PAUSE_LEN_MAX)\r
+                    {                                                           // it's MERLIN\r
+                        ANALYZE_PRINTF ("protocol = MERLIN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+                                        MERLIN_START_BIT_PULSE_LEN_MIN, MERLIN_START_BIT_PULSE_LEN_MAX,\r
+                                        MERLIN_START_BIT_PAUSE_LEN_MIN, MERLIN_START_BIT_PAUSE_LEN_MAX);\r
+                        irmp_param_p = (IRMP_PARAMETER *) &netbox_param;\r
+                    }\r
+                    else\r
+#endif // IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
+\r
 #if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
                     if (irmp_pulse_time >= LEGO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= LEGO_START_BIT_PULSE_LEN_MAX &&\r
                         irmp_pause_time >= LEGO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= LEGO_START_BIT_PAUSE_LEN_MAX)\r
@@ -2367,6 +2460,26 @@ irmp_ISR (void)
                     }\r
                     else\r
 #endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
+#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
+\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
+                          ANALYZE_PUTCHAR ('1');                                  // yes, store 1\r
+                          ANALYZE_NEWLINE ();\r
+                          irmp_store_bit (1);\r
+                        }\r
+                        else // if (irmp_pause_time >= THOMSON_0_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_0_PAUSE_LEN_MAX)\r
+                        {                                                       // pause timings correct for "0"?\r
+                          ANALYZE_PUTCHAR ('0');                                  // yes, store 0\r
+                          ANALYZE_NEWLINE ();\r
+                          irmp_store_bit (0);\r
+                        }\r
+                    }\r
+                    else\r
+#endif // IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
                     {\r
                         ;                                                       // else do nothing\r
                     }\r
@@ -2435,6 +2548,15 @@ irmp_ISR (void)
                             got_light = TRUE;                                                       // this is a lie, but helps (generates stop bit)\r
                         }\r
                         else\r
+#if 1\r
+                        // MERLIN generates no stop bit, here is the timeout condition:\r
+                        if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) && irmp_param.protocol == IRMP_MERLIN_PROTOCOL &&\r
+                            irmp_pause_time >= MERLIN_PULSE_LEN * (MERLIN_COMPLETE_DATA_LEN - irmp_bit))\r
+                        {\r
+                            got_light = TRUE;                                                       // this is a lie, but helps (generates stop bit)\r
+                        }\r
+                        else\r
+#endif\r
 #endif\r
 #if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
                         if (irmp_param.protocol == IRMP_GRUNDIG_PROTOCOL && !irmp_param.stop_bit)\r
@@ -3332,6 +3454,11 @@ print_timings (void)
             DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX,\r
             DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX);\r
 \r
+    printf ("THOMSON        1  %3d - %3d             %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d\n",\r
+            THOMSON_PULSE_LEN_MIN, THOMSON_PULSE_LEN_MAX,\r
+            THOMSON_PULSE_LEN_MIN, THOMSON_PULSE_LEN_MAX, THOMSON_0_PAUSE_LEN_MIN, THOMSON_0_PAUSE_LEN_MAX,\r
+            THOMSON_PULSE_LEN_MIN, THOMSON_PULSE_LEN_MAX, THOMSON_1_PAUSE_LEN_MIN, THOMSON_1_PAUSE_LEN_MAX);\r
+\r
     printf ("RC6            1  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d\n",\r
             RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX, RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX,\r
             RC6_BIT_PULSE_LEN_MIN, RC6_BIT_PULSE_LEN_MAX, RC6_BIT_PAUSE_LEN_MIN, RC6_BIT_PAUSE_LEN_MAX);\r