]> cloudbase.mooo.com Git - irmp.git/commitdiff
Version 2.9.0: added MERLIN and FAN protocol
authorukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Wed, 27 May 2015 09:38:19 +0000 (09:38 +0000)
committerukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Wed, 27 May 2015 09:38:19 +0000 (09:38 +0000)
git-svn-id: svn://mikrocontroller.net/irmp@159 aeb2e35e-bfc4-4214-b83c-9e8de998ed28

README.txt
irmp.c
irmpconfig.h
irmpprotocols.h
irsnd.c
irsndconfig.h

index 33059d916633c4f60163ab71d90c86c61a465837..e93a5f2ebd48f28cfde8c150b92258b8021ea0c1 100644 (file)
@@ -1,8 +1,8 @@
 IRMP - Infrared Multi Protocol Decoder\r
 --------------------------------------\r
 \r
-Version IRMP:  2.8.4 21.05.2015\r
-Version IRSND: 2.8.4 21.05.2015\r
+Version IRMP:  2.9.0 27.05.2015\r
+Version IRSND: 2.9.0 27.05.2015\r
 \r
 Dokumentation:\r
  \r
diff --git a/irmp.c b/irmp.c
index 62bfbe933cdd93f444b5845118c59c659d804373..49748e18ff1c598f834ca11668822501fbc59dd5 100644 (file)
--- a/irmp.c
+++ b/irmp.c
@@ -3,7 +3,7 @@
  *\r
  * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmp.c,v 1.171 2015/04/23 12:46:13 fm Exp $\r
+ * $Id: irmp.c,v 1.172 2015/05/27 09:33:14 fm Exp $\r
  *\r
  * Supported AVR mikrocontrollers:\r
  *\r
@@ -42,6 +42,7 @@
     IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1 ||     \\r
     IRMP_SUPPORT_IR60_PROTOCOL == 1 ||                  \\r
     IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1 ||               \\r
+    IRMP_SUPPORT_MERLIN_PROTOCOL == 1 ||                \\r
     IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
 #  define IRMP_SUPPORT_MANCHESTER                   1\r
 #else\r
 #define NUBERT_0_PAUSE_LEN_MIN                  ((uint_fast8_t)(F_INTERRUPTS * NUBERT_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
 #define NUBERT_0_PAUSE_LEN_MAX                  ((uint_fast8_t)(F_INTERRUPTS * NUBERT_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
 \r
+#define FAN_START_BIT_PULSE_LEN_MIN             ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define FAN_START_BIT_PULSE_LEN_MAX             ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+#define FAN_START_BIT_PAUSE_LEN_MIN             ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define FAN_START_BIT_PAUSE_LEN_MAX             ((uint_fast8_t)(F_INTERRUPTS * FAN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+#define FAN_1_PULSE_LEN_MIN                     ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define FAN_1_PULSE_LEN_MAX                     ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+#define FAN_1_PAUSE_LEN_MIN                     ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define FAN_1_PAUSE_LEN_MAX                     ((uint_fast8_t)(F_INTERRUPTS * FAN_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+#define FAN_0_PULSE_LEN_MIN                     ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define FAN_0_PULSE_LEN_MAX                     ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+#define FAN_0_PAUSE_LEN_MIN                     ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define FAN_0_PAUSE_LEN_MAX                     ((uint_fast8_t)(F_INTERRUPTS * FAN_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+\r
 #define SPEAKER_START_BIT_PULSE_LEN_MIN          ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
 #define SPEAKER_START_BIT_PULSE_LEN_MAX          ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
 #define SPEAKER_START_BIT_PAUSE_LEN_MIN          ((uint_fast8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
 #define A1TVBOX_BIT_PAUSE_LEN_MIN               ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
 #define A1TVBOX_BIT_PAUSE_LEN_MAX               ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
 \r
+#define MERLIN_START_BIT_PULSE_LEN_MIN          ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define MERLIN_START_BIT_PULSE_LEN_MAX          ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define MERLIN_START_BIT_PAUSE_LEN_MIN          ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define MERLIN_START_BIT_PAUSE_LEN_MAX          ((uint_fast8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define MERLIN_BIT_PULSE_LEN_MIN                ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
+#define MERLIN_BIT_PULSE_LEN_MAX                ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
+#define MERLIN_BIT_PAUSE_LEN_MIN                ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
+#define MERLIN_BIT_PAUSE_LEN_MAX                ((uint_fast8_t)(F_INTERRUPTS * MERLIN_BIT_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
+\r
 #define ORTEK_START_BIT_PULSE_LEN_MIN           ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
 #define ORTEK_START_BIT_PULSE_LEN_MAX           ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
 #define ORTEK_START_BIT_PAUSE_LEN_MIN           ((uint_fast8_t)(F_INTERRUPTS * ORTEK_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
@@ -555,6 +578,7 @@ static const char proto_lgair[]         PROGMEM = "LGAIR";
 static const char proto_samsung48[]     PROGMEM = "SAMSG48";\r
 static const char proto_merlin[]        PROGMEM = "MERLIN";\r
 static const char proto_pentax[]        PROGMEM = "PENTAX";\r
+static const char proto_fan[]           PROGMEM = "FAN";\r
 \r
 static const char proto_radio1[]        PROGMEM = "RADIO1";\r
 \r
@@ -605,6 +629,7 @@ irmp_protocol_names[IRMP_N_PROTOCOLS + 1] PROGMEM =
     proto_samsung48,\r
     proto_merlin,\r
     proto_pentax,\r
+    proto_fan,\r
     proto_radio1\r
 };\r
 \r
@@ -1319,6 +1344,31 @@ static const PROGMEM IRMP_PARAMETER nubert_param =
 \r
 #endif\r
 \r
+#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+\r
+static const PROGMEM IRMP_PARAMETER fan_param =\r
+{\r
+    IRMP_FAN_PROTOCOL,                                                  // protocol:        ir protocol\r
+    FAN_1_PULSE_LEN_MIN,                                                // pulse_1_len_min: minimum length of pulse with bit value 1\r
+    FAN_1_PULSE_LEN_MAX,                                                // pulse_1_len_max: maximum length of pulse with bit value 1\r
+    FAN_1_PAUSE_LEN_MIN,                                                // pause_1_len_min: minimum length of pause with bit value 1\r
+    FAN_1_PAUSE_LEN_MAX,                                                // pause_1_len_max: maximum length of pause with bit value 1\r
+    FAN_0_PULSE_LEN_MIN,                                                // pulse_0_len_min: minimum length of pulse with bit value 0\r
+    FAN_0_PULSE_LEN_MAX,                                                // pulse_0_len_max: maximum length of pulse with bit value 0\r
+    FAN_0_PAUSE_LEN_MIN,                                                // pause_0_len_min: minimum length of pause with bit value 0\r
+    FAN_0_PAUSE_LEN_MAX,                                                // pause_0_len_max: maximum length of pause with bit value 0\r
+    FAN_ADDRESS_OFFSET,                                                 // address_offset:  address offset\r
+    FAN_ADDRESS_OFFSET + FAN_ADDRESS_LEN,                               // address_end:     end of address\r
+    FAN_COMMAND_OFFSET,                                                 // command_offset:  command offset\r
+    FAN_COMMAND_OFFSET + FAN_COMMAND_LEN,                               // command_end:     end of command\r
+    FAN_COMPLETE_DATA_LEN,                                              // complete_len:    complete length of frame\r
+    FAN_STOP_BIT,                                                       // stop_bit:        flag: frame has NO stop bit\r
+    FAN_LSB,                                                            // lsb_first:       flag: LSB first\r
+    FAN_FLAGS                                                           // flags:           some flags\r
+};\r
+\r
+#endif\r
+\r
 #if IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
 \r
 static const PROGMEM IRMP_PARAMETER speaker_param =\r
@@ -1648,6 +1698,32 @@ static const PROGMEM IRMP_PARAMETER a1tvbox_param =
 \r
 #endif\r
 \r
+#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
+\r
+static const PROGMEM IRMP_PARAMETER merlin_param =\r
+{\r
+    IRMP_MERLIN_PROTOCOL,                                               // protocol:        ir protocol\r
+\r
+    MERLIN_BIT_PULSE_LEN_MIN,                                           // pulse_1_len_min: here: minimum length of short pulse\r
+    MERLIN_BIT_PULSE_LEN_MAX,                                           // pulse_1_len_max: here: maximum length of short pulse\r
+    MERLIN_BIT_PAUSE_LEN_MIN,                                           // pause_1_len_min: here: minimum length of short pause\r
+    MERLIN_BIT_PAUSE_LEN_MAX,                                           // pause_1_len_max: here: maximum length of short pause\r
+    0,                                                                  // pulse_0_len_min: here: not used\r
+    0,                                                                  // pulse_0_len_max: here: not used\r
+    0,                                                                  // pause_0_len_min: here: not used\r
+    0,                                                                  // pause_0_len_max: here: not used\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_ORTEK_PROTOCOL == 1\r
 \r
 static const PROGMEM IRMP_PARAMETER ortek_param =\r
@@ -2811,6 +2887,20 @@ irmp_ISR (void)
                     else\r
 #endif // IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
 \r
+#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+                    if (irmp_pulse_time >= FAN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FAN_START_BIT_PULSE_LEN_MAX &&\r
+                        irmp_pause_time >= FAN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FAN_START_BIT_PAUSE_LEN_MAX)\r
+                    {                                                           // it's FAN\r
+#ifdef ANALYZE\r
+                        ANALYZE_PRINTF ("protocol = FAN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+                                        FAN_START_BIT_PULSE_LEN_MIN, FAN_START_BIT_PULSE_LEN_MAX,\r
+                                        FAN_START_BIT_PAUSE_LEN_MIN, FAN_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+                        irmp_param_p = (IRMP_PARAMETER *) &fan_param;\r
+                    }\r
+                    else\r
+#endif // IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+\r
 #if IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
                     if (irmp_pulse_time >= SPEAKER_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SPEAKER_START_BIT_PULSE_LEN_MAX &&\r
                         irmp_pause_time >= SPEAKER_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SPEAKER_START_BIT_PAUSE_LEN_MAX)\r
@@ -2866,6 +2956,22 @@ irmp_ISR (void)
                     else\r
 #endif // IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
 \r
+#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1 // check MERLIN before RUWIDO!\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
+#ifdef ANALYZE\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
+#endif // ANALYZE\r
+                        irmp_param_p = (IRMP_PARAMETER *) &merlin_param;\r
+                        last_pause = 0;\r
+                        last_value = 1;\r
+                    }\r
+                    else\r
+#endif // IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
+\r
 #if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
                     if (((irmp_pulse_time >= SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX) ||\r
                          (irmp_pulse_time >= 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX)) &&\r
@@ -3237,6 +3343,23 @@ irmp_ISR (void)
                         }\r
                         else\r
 #endif\r
+#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+                        if (irmp_param.protocol == IRMP_FAN_PROTOCOL &&                             // FAN has no stop bit.\r
+                            irmp_bit >= FAN_COMPLETE_DATA_LEN - 1)                                  // last bit in frame\r
+                        {                                                                           // yes, break and close this frame\r
+                            if (irmp_pulse_time <= FAN_0_PULSE_LEN_MAX && irmp_pause_time >= FAN_0_PAUSE_LEN_MIN)\r
+                            {\r
+                                ANALYZE_PRINTF ("Generating virtual stop bit\n");\r
+                                got_light = TRUE;                                                   // this is a lie, but helps (generates stop bit)\r
+                            }\r
+                            else if (irmp_pulse_time >= FAN_1_PULSE_LEN_MIN && irmp_pause_time >= FAN_1_PAUSE_LEN_MIN)\r
+                            {\r
+                                ANALYZE_PRINTF ("Generating virtual stop bit\n");\r
+                                got_light = TRUE;                                                   // this is a lie, but helps (generates stop bit)\r
+                            }\r
+                        }\r
+                        else\r
+#endif\r
 #if IRMP_SUPPORT_SERIAL == 1\r
                         // NETBOX generates no stop bit, here is the timeout condition:\r
                         if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) && irmp_param.protocol == IRMP_NETBOX_PROTOCOL &&\r
@@ -4493,6 +4616,11 @@ print_timings (void)
             NUBERT_0_PULSE_LEN_MIN, NUBERT_0_PULSE_LEN_MAX, NUBERT_0_PAUSE_LEN_MIN, NUBERT_0_PAUSE_LEN_MAX,\r
             NUBERT_1_PULSE_LEN_MIN, NUBERT_1_PULSE_LEN_MAX, NUBERT_1_PAUSE_LEN_MIN, NUBERT_1_PAUSE_LEN_MAX);\r
 \r
+    printf ("FAN            1  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d\n",\r
+            FAN_START_BIT_PULSE_LEN_MIN, FAN_START_BIT_PULSE_LEN_MAX, FAN_START_BIT_PAUSE_LEN_MIN, FAN_START_BIT_PAUSE_LEN_MAX,\r
+            FAN_0_PULSE_LEN_MIN, FAN_0_PULSE_LEN_MAX, FAN_0_PAUSE_LEN_MIN, FAN_0_PAUSE_LEN_MAX,\r
+            FAN_1_PULSE_LEN_MIN, FAN_1_PULSE_LEN_MAX, FAN_1_PAUSE_LEN_MIN, FAN_1_PAUSE_LEN_MAX);\r
+\r
     printf ("SPEAKER        1  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d\n",\r
             SPEAKER_START_BIT_PULSE_LEN_MIN, SPEAKER_START_BIT_PULSE_LEN_MAX, SPEAKER_START_BIT_PAUSE_LEN_MIN, SPEAKER_START_BIT_PAUSE_LEN_MAX,\r
             SPEAKER_0_PULSE_LEN_MIN, SPEAKER_0_PULSE_LEN_MAX, SPEAKER_0_PAUSE_LEN_MIN, SPEAKER_0_PAUSE_LEN_MAX,\r
index 7e16f2635b0b1eddb1853f3a861566e06aa3ee33..c334e23493d568e6f4deff09715c9885eb145e5f 100644 (file)
@@ -6,7 +6,7 @@
  * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
  * Extensions for PIC 12F1820 W.Strobl 2014-07-20\r
  *\r
- * $Id: irmpconfig.h,v 1.127 2015/04/23 12:47:29 fm Exp $\r
+ * $Id: irmpconfig.h,v 1.129 2015/05/27 09:35:42 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
@@ -72,6 +72,7 @@
 #define IRMP_SUPPORT_BOSE_PROTOCOL              0       // BOSE                 >= 10000                 ~150 bytes\r
 #define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             >= 10000                 ~200 bytes\r
 #define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               >= 10000                  ~50 bytes\r
+#define IRMP_SUPPORT_FAN_PROTOCOL               0       // FAN (ventilator)     >= 10000                  ~50 bytes\r
 #define IRMP_SUPPORT_SPEAKER_PROTOCOL           0       // SPEAKER (~NUBERT)    >= 10000                  ~50 bytes\r
 #define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang & Olufsen       >= 10000                 ~200 bytes\r
 #define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     >= 15000                  ~50 bytes\r
index 763e2b5c07f18343fa5923622366e816e3b6265c..8b566feecc2972f84f64365aa423641c2b727d21 100644 (file)
@@ -5,7 +5,7 @@
  *\r
  * Copyright (c) 2013-2015 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmpprotocols.h,v 1.32 2015/04/23 12:46:13 fm Exp $\r
+ * $Id: irmpprotocols.h,v 1.33 2015/05/27 09:33:14 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 IRMP_SAMSUNG48_PROTOCOL                 41              // air conditioner with SAMSUNG protocol (48 bits)\r
 #define IRMP_MERLIN_PROTOCOL                    42              // Merlin (Pollin 620 185)\r
 #define IRMP_PENTAX_PROTOCOL                    43              // Pentax camera\r
-#define IRMP_RADIO1_PROTOCOL                    44              // Radio protocol (experimental status), do not use it yet!\r
+#define IRMP_FAN_PROTOCOL                       44              // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit\r
+#define IRMP_RADIO1_PROTOCOL                    45              // Radio protocol (experimental status), do not use it yet!\r
 \r
-#define IRMP_N_PROTOCOLS                        44              // number of supported protocols\r
+#define IRMP_N_PROTOCOLS                        45              // number of supported protocols\r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * timing constants:\r
@@ -353,17 +354,43 @@ typedef uint8_t     PAUSE_LEN;
 #define NUBERT_LSB                              0                               // MSB?\r
 #define NUBERT_FLAGS                            0                               // flags\r
 \r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * FAN: (ventilator)\r
+ *\r
+ * Similar to NUBERT, but\r
+ *   - has data bit instead of stop bit\r
+ *   - has NO frame repetition\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define FAN_START_BIT_PULSE_TIME                1340.0e-6                       // 1340 usec pulse\r
+#define FAN_START_BIT_PAUSE_TIME                 340.0e-6                       //  340 usec pause\r
+#define FAN_1_PULSE_TIME                        1340.0e-6                       // 1340 usec pulse\r
+#define FAN_1_PAUSE_TIME                         340.0e-6                       //  340 usec pause\r
+#define FAN_0_PULSE_TIME                         500.0e-6                       //  500 usec pulse\r
+#define FAN_0_PAUSE_TIME                        1300.0e-6                       // 1300 usec pause\r
+#define FAN_FRAMES                              1                               // FAN sends only 1 frame (NUBERT sends 2)\r
+#define FAN_AUTO_REPETITION_PAUSE_TIME            35.0e-3                       // auto repetition after 35ms\r
+#define FAN_FRAME_REPEAT_PAUSE_TIME               35.0e-3                       // frame repeat after 45ms\r
+#define FAN_ADDRESS_OFFSET                      0                               // skip 0 bits\r
+#define FAN_ADDRESS_LEN                         0                               // read 0 address bits\r
+#define FAN_COMMAND_OFFSET                      0                               // skip 0 bits\r
+#define FAN_COMMAND_LEN                         11                              // read 10 bits\r
+#define FAN_COMPLETE_DATA_LEN                   11                              // complete length\r
+#define FAN_STOP_BIT                            0                               // has NO stop bit\r
+#define FAN_LSB                                 0                               // MSB\r
+#define FAN_FLAGS                               0                               // flags\r
+\r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * SPEAKER:\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  */\r
-#define SPEAKER_START_BIT_PULSE_TIME             440.0e-6                       // 1340 usec pulse\r
-#define SPEAKER_START_BIT_PAUSE_TIME            1250.0e-6                       //  340 usec pause\r
-#define SPEAKER_1_PULSE_TIME                    1250.0e-6                       // 1340 usec pulse\r
-#define SPEAKER_1_PAUSE_TIME                     440.0e-6                       //  340 usec pause\r
-#define SPEAKER_0_PULSE_TIME                     440.0e-6                       //  500 usec pulse\r
-#define SPEAKER_0_PAUSE_TIME                    1250.0e-6                       // 1300 usec pause\r
-#define SPEAKER_FRAMES                          2                               // Nubert sends 2 frames\r
+#define SPEAKER_START_BIT_PULSE_TIME             440.0e-6                       //  440 usec pulse\r
+#define SPEAKER_START_BIT_PAUSE_TIME            1250.0e-6                       // 1250 usec pause\r
+#define SPEAKER_1_PULSE_TIME                    1250.0e-6                       // 1250 usec pulse\r
+#define SPEAKER_1_PAUSE_TIME                     440.0e-6                       //  440 usec pause\r
+#define SPEAKER_0_PULSE_TIME                     440.0e-6                       //  440 usec pulse\r
+#define SPEAKER_0_PAUSE_TIME                    1250.0e-6                       // 1250 usec pause\r
+#define SPEAKER_FRAMES                          2                               // SPEAKER sends 2 frames\r
 #define SPEAKER_AUTO_REPETITION_PAUSE_TIME        35.0e-3                       // auto repetition after 35ms\r
 #define SPEAKER_FRAME_REPEAT_PAUSE_TIME           35.0e-3                       // frame repeat after 45ms\r
 #define SPEAKER_ADDRESS_OFFSET                  0                               // skip 0 bits\r
@@ -686,10 +713,10 @@ typedef uint8_t     PAUSE_LEN;
  * See notes for A1TVBOX\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  */\r
-#define MERLIN_START_BIT_PULSE_TIME            210.0e-6                         // 300 usec pulse\r
-#define MERLIN_START_BIT_PAUSE_TIME            420.0e-6                         // 340 usec pause\r
-#define MERLIN_BIT_PULSE_TIME                  210.0e-6                         // 250 usec pulse\r
-#define MERLIN_BIT_PAUSE_TIME                  210.0e-6                         // 150 usec pulse\r
+#define MERLIN_START_BIT_PULSE_TIME            210.0e-6                         // 210 usec pulse\r
+#define MERLIN_START_BIT_PAUSE_TIME            420.0e-6                         // 429 usec pause\r
+#define MERLIN_BIT_PULSE_TIME                  210.0e-6                         // 210 usec pulse\r
+#define MERLIN_BIT_PAUSE_TIME                  210.0e-6                         // 210 usec pulse\r
 #define MERLIN_STOP_BIT                        0                                // has no stop bit\r
 #define MERLIN_LSB                             0                                // MSB...LSB\r
 #define MERLIN_FLAGS                           (IRMP_PARAM_FLAG_IS_MANCHESTER | IRMP_PARAM_FLAG_1ST_PULSE_IS_1 )  // flags\r
diff --git a/irsnd.c b/irsnd.c
index a802e99ea4ffb530e5e3dd706970da6c4f0c1362..e477e4dfef54ab0e8bf39168e554edfc81756b79 100644 (file)
--- a/irsnd.c
+++ b/irsnd.c
@@ -13,7 +13,7 @@
  * ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284, ATmega1284P\r
  * ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P\r
  *\r
- * $Id: irsnd.c,v 1.87 2015/05/21 06:17:31 fm Exp $\r
+ * $Id: irsnd.c,v 1.88 2015/05/27 09:33:14 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 NUBERT_AUTO_REPETITION_PAUSE_LEN        (uint16_t)(F_INTERRUPTS * NUBERT_AUTO_REPETITION_PAUSE_TIME + 0.5)              // use uint16_t!\r
 #define NUBERT_FRAME_REPEAT_PAUSE_LEN           (uint16_t)(F_INTERRUPTS * NUBERT_FRAME_REPEAT_PAUSE_TIME + 0.5)                 // use uint16_t!\r
 \r
+#define FAN_START_BIT_PULSE_LEN                 (uint8_t)(F_INTERRUPTS * FAN_START_BIT_PULSE_TIME + 0.5)\r
+#define FAN_START_BIT_PAUSE_LEN                 (uint8_t)(F_INTERRUPTS * FAN_START_BIT_PAUSE_TIME + 0.5)\r
+#define FAN_1_PULSE_LEN                         (uint8_t)(F_INTERRUPTS * FAN_1_PULSE_TIME + 0.5)\r
+#define FAN_1_PAUSE_LEN                         (uint8_t)(F_INTERRUPTS * FAN_1_PAUSE_TIME + 0.5)\r
+#define FAN_0_PULSE_LEN                         (uint8_t)(F_INTERRUPTS * FAN_0_PULSE_TIME + 0.5)\r
+#define FAN_0_PAUSE_LEN                         (uint8_t)(F_INTERRUPTS * FAN_0_PAUSE_TIME + 0.5)\r
+#define FAN_AUTO_REPETITION_PAUSE_LEN           (uint16_t)(F_INTERRUPTS * FAN_AUTO_REPETITION_PAUSE_TIME + 0.5)              // use uint16_t!\r
+#define FAN_FRAME_REPEAT_PAUSE_LEN              (uint16_t)(F_INTERRUPTS * FAN_FRAME_REPEAT_PAUSE_TIME + 0.5)                 // use uint16_t!\r
+\r
 #define SPEAKER_START_BIT_PULSE_LEN             (uint8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PULSE_TIME + 0.5)\r
 #define SPEAKER_START_BIT_PAUSE_LEN             (uint8_t)(F_INTERRUPTS * SPEAKER_START_BIT_PAUSE_TIME + 0.5)\r
 #define SPEAKER_1_PULSE_LEN                     (uint8_t)(F_INTERRUPTS * SPEAKER_1_PULSE_TIME + 0.5)\r
@@ -1155,6 +1164,15 @@ irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait)
             break;\r
         }\r
 #endif\r
+#if IRSND_SUPPORT_FAN_PROTOCOL == 1\r
+        case IRMP_FAN_PROTOCOL:\r
+        {\r
+            irsnd_buffer[0] = irmp_data_p->command >> 3;                                                        // CCCCCCCC\r
+            irsnd_buffer[1] = (irmp_data_p->command & 0x0007) << 5;                                             // CCC00000\r
+            irsnd_busy      = TRUE;\r
+            break;\r
+        }\r
+#endif\r
 #if IRSND_SUPPORT_SPEAKER_PROTOCOL == 1\r
         case IRMP_SPEAKER_PROTOCOL:\r
         {\r
@@ -1850,6 +1868,24 @@ irsnd_ISR (void)
                         break;\r
                     }\r
 #endif\r
+#if IRSND_SUPPORT_FAN_PROTOCOL == 1\r
+                    case IRMP_FAN_PROTOCOL:\r
+                    {\r
+                        startbit_pulse_len          = FAN_START_BIT_PULSE_LEN;\r
+                        startbit_pause_len          = FAN_START_BIT_PAUSE_LEN - 1;\r
+                        pulse_1_len                 = FAN_1_PULSE_LEN;\r
+                        pause_1_len                 = FAN_1_PAUSE_LEN - 1;\r
+                        pulse_0_len                 = FAN_0_PULSE_LEN;\r
+                        pause_0_len                 = FAN_0_PAUSE_LEN - 1;\r
+                        has_stop_bit                = FAN_STOP_BIT;\r
+                        complete_data_len           = FAN_COMPLETE_DATA_LEN;\r
+                        n_auto_repetitions          = FAN_FRAMES;                                   // only 1 frame\r
+                        auto_repetition_pause_len   = FAN_AUTO_REPETITION_PAUSE_LEN;                // 35 ms pause\r
+                        repeat_frame_pause_len      = FAN_FRAME_REPEAT_PAUSE_LEN;\r
+                        irsnd_set_freq (IRSND_FREQ_36_KHZ);\r
+                        break;\r
+                    }\r
+#endif\r
 #if IRSND_SUPPORT_SPEAKER_PROTOCOL == 1\r
                     case IRMP_SPEAKER_PROTOCOL:\r
                     {\r
@@ -2172,6 +2208,9 @@ irsnd_ISR (void)
 #if IRSND_SUPPORT_NUBERT_PROTOCOL == 1\r
                 case IRMP_NUBERT_PROTOCOL:\r
 #endif\r
+#if IRSND_SUPPORT_FAN_PROTOCOL == 1\r
+                case IRMP_FAN_PROTOCOL:\r
+#endif\r
 #if IRSND_SUPPORT_SPEAKER_PROTOCOL == 1\r
                 case IRMP_SPEAKER_PROTOCOL:\r
 #endif\r
@@ -2206,9 +2245,10 @@ irsnd_ISR (void)
 #if IRSND_SUPPORT_SIRCS_PROTOCOL == 1  || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_NEC16_PROTOCOL == 1 || IRSND_SUPPORT_NEC42_PROTOCOL == 1 || \\r
     IRSND_SUPPORT_LGAIR_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_SPEAKER_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 ||   \\r
-    IRSND_SUPPORT_JVC_PROTOCOL == 1 || IRSND_SUPPORT_NIKON_PROTOCOL == 1 || IRSND_SUPPORT_LEGO_PROTOCOL == 1 || IRSND_SUPPORT_THOMSON_PROTOCOL == 1 || \\r
-    IRSND_SUPPORT_ROOMBA_PROTOCOL == 1 || IRSND_SUPPORT_TELEFUNKEN_PROTOCOL == 1 || IRSND_SUPPORT_PENTAX_PROTOCOL == 1\r
+    IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_FAN_PROTOCOL == 1 || IRSND_SUPPORT_SPEAKER_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || \\r
+    IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 || IRSND_SUPPORT_JVC_PROTOCOL == 1 || IRSND_SUPPORT_NIKON_PROTOCOL == 1 || \\r
+    IRSND_SUPPORT_LEGO_PROTOCOL == 1 || IRSND_SUPPORT_THOMSON_PROTOCOL == 1 || IRSND_SUPPORT_ROOMBA_PROTOCOL == 1 || IRSND_SUPPORT_TELEFUNKEN_PROTOCOL == 1 || \\r
+    IRSND_SUPPORT_PENTAX_PROTOCOL == 1\r
                 {\r
 #if IRSND_SUPPORT_DENON_PROTOCOL == 1\r
                     if (irsnd_protocol == IRMP_DENON_PROTOCOL)\r
index 61e052d3880e2e5c14649404c57365e0337813a9..bb349a9f7354478bee8db3fa897ec36acae35fa4 100644 (file)
@@ -5,7 +5,7 @@
  *\r
  * Copyright (c) 2010-2015 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irsndconfig.h,v 1.68 2015/05/07 06:51:10 fm Exp $\r
+ * $Id: irsndconfig.h,v 1.70 2015/05/27 09:35:43 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
@@ -62,6 +62,7 @@
 // exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space\r
 #define IRSND_SUPPORT_KATHREIN_PROTOCOL         0       // Kathrein             >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!\r
 #define IRSND_SUPPORT_NUBERT_PROTOCOL           0       // NUBERT               >= 10000                 ~100 bytes\r
+#define IRSND_SUPPORT_FAN_PROTOCOL              0       // FAN (ventilator)     >= 10000                 ~100 bytes\r
 #define IRSND_SUPPORT_SPEAKER_PROTOCOL          0       // SPEAKER              >= 10000                 ~100 bytes\r
 #define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     0       // Bang&Olufsen         >= 10000                 ~250 bytes\r
 #define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               >= 15000                 ~100 bytes\r