]> cloudbase.mooo.com Git - irmp.git/commitdiff
version 2.0.0-pre2: added LEGO protocol
authorukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Mon, 11 Apr 2011 14:26:04 +0000 (14:26 +0000)
committerukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Mon, 11 Apr 2011 14:26:04 +0000 (14:26 +0000)
git-svn-id: svn://mikrocontroller.net/irmp@69 aeb2e35e-bfc4-4214-b83c-9e8de998ed28

README.txt
irmp.c
irmp.h
irmpconfig.h
irsnd.c
irsnd.h
irsndconfig.h
irsndmain.c
main.c

index f7c5c5c236f0910c49e8eec79300e7cf047b11b5..fb3a571d3b2af8d7460632bbffa52ad2cde7df51 100644 (file)
@@ -1,8 +1,8 @@
 IRMP - Infrared Multi Protocol Decoder\r
 --------------------------------------\r
 \r
-Version IRMP:  2.0.0-pre1 10.03.2010\r
-Version IRSND: 1.9.1      22.01.2010\r
+Version IRMP:  2.0.0-pre2 11.04.2010\r
+Version IRSND: 1.9.2      11.04.2010\r
 \r
 Dokumentation:\r
  \r
diff --git a/irmp.c b/irmp.c
index 5c35ccf04769a2f9e22ff3115c2153e2a1177260..46e56c539c6149f18bd389a09fbc514e3cf27a56 100644 (file)
--- a/irmp.c
+++ b/irmp.c
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * irmp.c - infrared multi-protocol decoder, supports several remote control protocols\r
  *\r
- * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmp.c,v 1.99 2011/03/10 12:29:13 fm Exp $\r
+ * $Id: irmp.c,v 1.100 2011/04/11 12:54:24 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -32,6 +32,7 @@
  * NIKON        - Nikon cameras\r
  * RUWIDO       - T-Home\r
  * KATHREIN     - Kathrein\r
+ * LEGO         - Lego Power Functions RC\r
  *\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  *\r
@@ -675,6 +676,17 @@ typedef unsigned int16  uint16_t;
 #define NETBOX_PULSE_REST_LEN                   ((uint8_t)(F_INTERRUPTS * NETBOX_PULSE_TIME / 4))\r
 #define NETBOX_PAUSE_REST_LEN                   ((uint8_t)(F_INTERRUPTS * NETBOX_PAUSE_TIME / 4))\r
 \r
+#define LEGO_START_BIT_PULSE_LEN_MIN            ((uint8_t)(F_INTERRUPTS * LEGO_START_BIT_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define LEGO_START_BIT_PULSE_LEN_MAX            ((uint8_t)(F_INTERRUPTS * LEGO_START_BIT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#define LEGO_START_BIT_PAUSE_LEN_MIN            ((uint8_t)(F_INTERRUPTS * LEGO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define LEGO_START_BIT_PAUSE_LEN_MAX            ((uint8_t)(F_INTERRUPTS * LEGO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#define LEGO_PULSE_LEN_MIN                      ((uint8_t)(F_INTERRUPTS * LEGO_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define LEGO_PULSE_LEN_MAX                      ((uint8_t)(F_INTERRUPTS * LEGO_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#define LEGO_1_PAUSE_LEN_MIN                    ((uint8_t)(F_INTERRUPTS * LEGO_1_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define LEGO_1_PAUSE_LEN_MAX                    ((uint8_t)(F_INTERRUPTS * LEGO_1_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#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 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
@@ -1412,6 +1424,31 @@ static PROGMEM IRMP_PARAMETER netbox_param =
 \r
 #endif\r
 \r
+#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
+\r
+static PROGMEM IRMP_PARAMETER lego_param =\r
+{\r
+    IRMP_LEGO_PROTOCOL,                                                 // protocol:        ir protocol\r
+    LEGO_PULSE_LEN_MIN,                                                 // pulse_1_len_min: minimum length of pulse with bit value 1\r
+    LEGO_PULSE_LEN_MAX,                                                 // pulse_1_len_max: maximum length of pulse with bit value 1\r
+    LEGO_1_PAUSE_LEN_MIN,                                               // pause_1_len_min: minimum length of pause with bit value 1\r
+    LEGO_1_PAUSE_LEN_MAX,                                               // pause_1_len_max: maximum length of pause with bit value 1\r
+    LEGO_PULSE_LEN_MIN,                                                 // pulse_0_len_min: minimum length of pulse with bit value 0\r
+    LEGO_PULSE_LEN_MAX,                                                 // pulse_0_len_max: maximum length of pulse with bit value 0\r
+    LEGO_0_PAUSE_LEN_MIN,                                               // pause_0_len_min: minimum length of pause with bit value 0\r
+    LEGO_0_PAUSE_LEN_MAX,                                               // pause_0_len_max: maximum length of pause with bit value 0\r
+    LEGO_ADDRESS_OFFSET,                                                // address_offset:  address offset\r
+    LEGO_ADDRESS_OFFSET + LEGO_ADDRESS_LEN,                             // address_end:     end of address\r
+    LEGO_COMMAND_OFFSET,                                                // command_offset:  command offset\r
+    LEGO_COMMAND_OFFSET + LEGO_COMMAND_LEN,                             // command_end:     end of command\r
+    LEGO_COMPLETE_DATA_LEN,                                             // complete_len:    complete length of frame\r
+    LEGO_STOP_BIT,                                                      // stop_bit:        flag: frame has stop bit\r
+    LEGO_LSB,                                                           // lsb_first:       flag: LSB first\r
+    LEGO_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
@@ -1584,6 +1621,24 @@ irmp_get_data (IRMP_DATA * irmp_data_p)
                 break;\r
 #endif\r
 #endif // 0\r
+#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
+            case IRMP_LEGO_PROTOCOL:\r
+            {\r
+                uint8_t crc = 0x0F ^ ((irmp_command & 0xF000) >> 12) ^ ((irmp_command & 0x0F00) >> 8) ^ ((irmp_command & 0x00F0) >> 4);\r
+\r
+                if ((irmp_command & 0x000F) == crc)\r
+                {\r
+                    irmp_command >>= 4;\r
+                    rtc = TRUE;\r
+                }\r
+                else\r
+                {\r
+                    ANALYZE_PRINTF ("CRC error in LEGO protocol\n");\r
+                    rtc = TRUE;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
             default:\r
                 rtc = TRUE;\r
         }\r
@@ -2190,6 +2245,18 @@ irmp_ISR (void)
                     else\r
 #endif // IRMP_SUPPORT_NETBOX_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
+                    {\r
+                        ANALYZE_PRINTF ("protocol = LEGO, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+                                        LEGO_START_BIT_PULSE_LEN_MIN, LEGO_START_BIT_PULSE_LEN_MAX,\r
+                                        LEGO_START_BIT_PAUSE_LEN_MIN, LEGO_START_BIT_PAUSE_LEN_MAX);\r
+                        irmp_param_p = (IRMP_PARAMETER *) &lego_param;\r
+                    }\r
+                    else\r
+#endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
+\r
 #if IRMP_SUPPORT_IMON_PROTOCOL == 1\r
                     if (irmp_pulse_time >= IMON_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= IMON_START_BIT_PULSE_LEN_MAX &&\r
                         irmp_pause_time >= IMON_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= IMON_START_BIT_PAUSE_LEN_MAX)\r
@@ -3344,6 +3411,12 @@ print_timings (void)
             NIKON_START_BIT_PULSE_LEN_MIN, NIKON_START_BIT_PULSE_LEN_MAX, NIKON_START_BIT_PAUSE_LEN_MIN, NIKON_START_BIT_PAUSE_LEN_MAX,\r
             NIKON_PULSE_LEN_MIN, NIKON_PULSE_LEN_MAX, NIKON_0_PAUSE_LEN_MIN, NIKON_0_PAUSE_LEN_MAX,\r
             NIKON_PULSE_LEN_MIN, NIKON_PULSE_LEN_MAX, NIKON_1_PAUSE_LEN_MIN, NIKON_1_PAUSE_LEN_MAX);\r
+\r
+    printf ("LEGO           1  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d  %3d - %3d\n",\r
+            LEGO_START_BIT_PULSE_LEN_MIN, LEGO_START_BIT_PULSE_LEN_MAX, LEGO_START_BIT_PAUSE_LEN_MIN, LEGO_START_BIT_PAUSE_LEN_MAX,\r
+            LEGO_PULSE_LEN_MIN, LEGO_PULSE_LEN_MAX, LEGO_0_PAUSE_LEN_MIN, LEGO_0_PAUSE_LEN_MAX,\r
+            LEGO_PULSE_LEN_MIN, LEGO_PULSE_LEN_MAX, LEGO_1_PAUSE_LEN_MIN, LEGO_1_PAUSE_LEN_MAX);\r
+\r
 }\r
 \r
 void\r
diff --git a/irmp.h b/irmp.h
index b1235874a5f7d7ccaaa18a0075d4cdd795466f6b..cac734fb613fca9c9d38c5a90255d6d054ea95fe 100644 (file)
--- a/irmp.h
+++ b/irmp.h
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * irmp.h\r
  *\r
- * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmp.h,v 1.59 2011/03/10 12:29:14 fm Exp $\r
+ * $Id: irmp.h,v 1.60 2011/04/11 12:54:24 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -76,6 +76,7 @@ typedef uint8_t     PAUSE_LEN;
 #define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)\r
 #define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)\r
 #define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits\r
+#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC\r
 #define IRMP_IMON_PROTOCOL                      99              // Imon (bitserial) PROTOTYPE!\r
 \r
 // some flags of struct IRMP_PARAMETER:\r
@@ -446,6 +447,21 @@ typedef uint8_t     PAUSE_LEN;
 #define NETBOX_LSB                              1                               // LSB\r
 #define NETBOX_FLAGS                            IRMP_PARAM_FLAG_IS_SERIAL       // flags\r
 \r
+#define LEGO_START_BIT_PULSE_TIME                158.0e-6                       //  158 usec pulse ( 6 x 1/38kHz)\r
+#define LEGO_START_BIT_PAUSE_TIME               1026.0e-6                       // 1026 usec pause (39 x 1/38kHz)\r
+#define LEGO_PULSE_TIME                          158.0e-6                       //  158 usec pulse ( 6 x 1/38kHz)\r
+#define LEGO_1_PAUSE_TIME                        553.0e-6                       //  553 usec pause (21 x 1/38kHz)\r
+#define LEGO_0_PAUSE_TIME                        263.0e-6                       //  263 usec pause (10 x 1/38kHz)\r
+#define LEGO_FRAME_REPEAT_PAUSE_TIME              40.0e-3                       // frame repeat after 40ms\r
+#define LEGO_ADDRESS_OFFSET                     0                               // skip 0 bits\r
+#define LEGO_ADDRESS_LEN                        0                               // read 0 address bits\r
+#define LEGO_COMMAND_OFFSET                     0                               // skip 0 bits\r
+#define LEGO_COMMAND_LEN                        16                              // read 16 bits (12 command + 4 CRC)\r
+#define LEGO_COMPLETE_DATA_LEN                  16                              // complete length\r
+#define LEGO_STOP_BIT                           1                               // has stop bit\r
+#define LEGO_LSB                                0                               // MSB...LSB\r
+#define LEGO_FLAGS                              0                               // flags\r
+\r
 #define IMON_START_BIT_PULSE_TIME               1333.0e-6                       // 1333 usec pulse\r
 #define IMON_START_BIT_PAUSE_TIME               1172.0e-6                       // 1333 usec pause\r
 #define IMON_PULSE_TIME                          500.0e-6                       //  500 usec pulse\r
index a34aebba7dd8ca81affd603c729492e17bf3d971..1b5640857920404f6c0ec696f40efb9ecc753b33 100644 (file)
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * irmpconfig.h\r
  *\r
- * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmpconfig.h,v 1.64 2011/03/10 12:54:37 fm Exp $\r
+ * $Id: irmpconfig.h,v 1.65 2011/04/11 12:54:25 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
 \r
 // more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space\r
 #define IRMP_SUPPORT_RC5_PROTOCOL               0       // RC5                  >= 10000                 ~250 bytes\r
+#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 & RC6A           >= 10000                 ~250 bytes\r
 #define IRMP_SUPPORT_JVC_PROTOCOL               0       // JVC                  >= 10000                 ~150 bytes\r
 #define IRMP_SUPPORT_NEC16_PROTOCOL             0       // NEC16                >= 10000                  ~50 bytes\r
 #define IRMP_SUPPORT_NEC42_PROTOCOL             0       // NEC42                >= 10000                 ~150 bytes\r
-#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 & RC6A           >= 10000                 ~250 bytes\r
 #define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SAB2008)       >= 10000                 ~300 bytes\r
 #define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              >= 10000                 ~300 bytes\r
+#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      >= 15000                 ~550 bytes\r
 #define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                >= 10000                 ~300 bytes\r
+\r
+// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space\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_BANG_OLUFSEN_PROTOCOL      0       // Bang & Olufsen       >= 10000                 ~200 bytes\r
 #define IRMP_SUPPORT_IMON_PROTOCOL              0       // IMON keyboard        >= 10000                 ~400 bytes (PROTOTYPE!)\r
 #define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     >= 10000 (better 15000)  ~150 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                 ~550 bytes\r
 #define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       >= 15000                 ~550 bytes\r
 #define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     >= 15000                  ~50 bytes\r
 #define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  >= 15000                  ~50 bytes\r
+#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        >= 20000                 ~150 bytes\r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * Change hardware pin here:\r
 #define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0\r
 #endif\r
 \r
+#if IRMP_SUPPORT_LEGO_PROTOCOL == 1 && F_INTERRUPTS < 20000\r
+#warning F_INTERRUPTS too low, LEGO protocol disabled (should be at least 20000)\r
+#undef IRMP_SUPPORT_LEGO_PROTOCOL\r
+#define IRMP_SUPPORT_LEGO_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
diff --git a/irsnd.c b/irsnd.c
index 5f471a6c2f965504edfebb3b0a0f37ea99f065d0..050031cee754d9450cf78b0250a07a1d17da72fd 100644 (file)
--- a/irsnd.c
+++ b/irsnd.c
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * @file irsnd.c\r
  *\r
- * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irsnd.c,v 1.32 2011/02/22 17:05:57 fm Exp $\r
+ * $Id: irsnd.c,v 1.35 2011/04/11 13:26:17 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
@@ -54,12 +54,83 @@ typedef unsigned short    uint16_t;
 #include "irsndconfig.h"\r
 #include "irsnd.h"\r
 \r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ *  ATmega pin definition of OC2 / OC2A / OC2B\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#if defined (__AVR_ATmega8__)                           // ATmega8 uses OC2 = PB3\r
+#undef  IRSND_OC2                                       // has no OC2A / OC2B\r
+#define IRSND_OC2                               0       // magic: use OC2\r
+#define IRSND_PORT                              PORTB   // port B\r
+#define IRSND_DDR                               DDRB    // ddr B\r
+#define IRSND_BIT                               3       // OC2A\r
+\r
+#elif defined (__AVR_ATmega16__)    \\r
+  ||  defined (__AVR_ATmega32__)                        // ATmega16|32 uses OC2 = PD7\r
+#undef  IRSND_OC2                                       // has no OC2A / OC2B\r
+#define IRSND_OC2                               0       // magic: use OC2\r
+#define IRSND_PORT                              PORTD   // port D\r
+#define IRSND_DDR                               DDRD    // ddr D\r
+#define IRSND_BIT                               7       // OC2\r
+\r
+#elif defined (__AVR_ATmega162__)                       // ATmega162 uses OC2 = PB1\r
+#undef  IRSND_OC2                                       // has no OC2A / OC2B\r
+#define IRSND_OC2                               0       // magic: use OC2\r
+#define IRSND_PORT                              PORTB   // port B\r
+#define IRSND_DDR                               DDRB    // ddr B\r
+#define IRSND_BIT                               1       // OC2\r
+\r
+#elif defined (__AVR_ATmega164__)   \\r
+   || defined (__AVR_ATmega324__)   \\r
+   || defined (__AVR_ATmega644__)   \\r
+   || defined (__AVR_ATmega644P__)  \\r
+   || defined (__AVR_ATmega1284__)                      // ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6\r
+#if IRSND_OC2 == 1                                      // OC2A\r
+#define IRSND_PORT                              PORTD   // port D\r
+#define IRSND_DDR                               DDRD    // ddr D\r
+#define IRSND_BIT                               7       // OC2A\r
+#elif IRSND_OC2 == 2                                    // OC2B\r
+#define IRSND_PORT                              PORTD   // port D\r
+#define IRSND_DDR                               DDRD    // ddr D\r
+#define IRSND_BIT                               6       // OC2B\r
+#else\r
+#error Wrong value for IRSND_OC2, choose 1 or 2 in irsndconfig.h\r
+#endif // IRSND_OC2\r
+\r
+#elif defined (__AVR_ATmega48__)    \\r
+   || defined (__AVR_ATmega88__)    \\r
+   || defined (__AVR_ATmega168__)   \\r
+   || defined (__AVR_ATmega168__)   \\r
+   || defined (__AVR_ATmega328__)   \\r
+   || defined (__AVR_ATmega328P__)                      // ATmega48|88|168|328P uses OC2A = PB3 or OC2B = PD3\r
+#if IRSND_OC2 == 1                                      // OC2A\r
+#define IRSND_PORT                              PORTB   // port B\r
+#define IRSND_DDR                               DDRB    // ddr B\r
+#define IRSND_BIT                               3       // OC2A\r
+#elif IRSND_OC2 == 2                                    // OC2B\r
+#define IRSND_PORT                              PORTD   // port D\r
+#define IRSND_DDR                               DDRD    // ddr D\r
+#define IRSND_BIT                               3       // OC2B\r
+#else\r
+#error Wrong value for IRSND_OC2, choose 1 or 2 in irsndconfig.h\r
+#endif // IRSND_OC2\r
+\r
+#else\r
+#if !defined (unix) && !defined (WIN32)\r
+#error OC2A/OC2B not defined, please fill in definitions here.\r
+#endif // unix, WIN32\r
+#endif // __AVR...\r
+\r
 #if IRSND_SUPPORT_NIKON_PROTOCOL == 1\r
 typedef uint16_t    IRSND_PAUSE_LEN;\r
 #else\r
 typedef uint8_t     IRSND_PAUSE_LEN;\r
 #endif\r
 \r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ *  IR timings\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
 #define SIRCS_START_BIT_PULSE_LEN               (uint8_t)(F_INTERRUPTS * SIRCS_START_BIT_PULSE_TIME + 0.5)\r
 #define SIRCS_START_BIT_PAUSE_LEN               (uint8_t)(F_INTERRUPTS * SIRCS_START_BIT_PAUSE_TIME + 0.5)\r
 #define SIRCS_1_PULSE_LEN                       (uint8_t)(F_INTERRUPTS * SIRCS_1_PULSE_TIME + 0.5)\r
@@ -198,7 +269,15 @@ typedef uint8_t     IRSND_PAUSE_LEN;
 #define NIKON_PULSE_LEN                         (uint8_t)(F_INTERRUPTS * NIKON_PULSE_TIME + 0.5)\r
 #define NIKON_1_PAUSE_LEN                       (uint8_t)(F_INTERRUPTS * NIKON_1_PAUSE_TIME + 0.5)\r
 #define NIKON_0_PAUSE_LEN                       (uint8_t)(F_INTERRUPTS * NIKON_0_PAUSE_TIME + 0.5)\r
-#define NIKON_FRAME_REPEAT_PAUSE_LEN            (uint16_t)(F_INTERRUPTS * NIKON_FRAME_REPEAT_PAUSE_TIME + 0.5)                // use uint16_t!\r
+#define NIKON_FRAME_REPEAT_PAUSE_LEN            (uint16_t)(F_INTERRUPTS * NIKON_FRAME_REPEAT_PAUSE_TIME + 0.5)              // use uint16_t!\r
+\r
+#define LEGO_START_BIT_PULSE_LEN                (uint8_t)(F_INTERRUPTS * LEGO_START_BIT_PULSE_TIME + 0.5)\r
+#define LEGO_START_BIT_PAUSE_LEN                (uint8_t)(F_INTERRUPTS * LEGO_START_BIT_PAUSE_TIME + 0.5)\r
+#define LEGO_REPEAT_START_BIT_PAUSE_LEN         (uint8_t)(F_INTERRUPTS * LEGO_REPEAT_START_BIT_PAUSE_TIME + 0.5)\r
+#define LEGO_PULSE_LEN                          (uint8_t)(F_INTERRUPTS * LEGO_PULSE_TIME + 0.5)\r
+#define LEGO_1_PAUSE_LEN                        (uint8_t)(F_INTERRUPTS * LEGO_1_PAUSE_TIME + 0.5)\r
+#define LEGO_0_PAUSE_LEN                        (uint8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME + 0.5)\r
+#define LEGO_FRAME_REPEAT_PAUSE_LEN             (uint16_t)(F_INTERRUPTS * LEGO_FRAME_REPEAT_PAUSE_TIME + 0.5)               // use uint16_t!\r
 \r
 static volatile uint8_t                         irsnd_busy;\r
 static volatile uint8_t                         irsnd_protocol;\r
@@ -206,6 +285,10 @@ static volatile uint8_t                         irsnd_buffer[6];
 static volatile uint8_t                         irsnd_repeat;\r
 static volatile uint8_t                         irsnd_is_on = FALSE;\r
 \r
+#if IRSND_USE_CALLBACK == 1\r
+static void                                     (*irsnd_callback_ptr) (uint8_t);\r
+#endif // IRSND_USE_CALLBACK == 1\r
+\r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  *  Switch PWM on\r
  *  @details  Switches PWM on with a narrow spike on all 3 channels -> leds glowing\r
@@ -217,12 +300,22 @@ irsnd_on (void)
     if (! irsnd_is_on)\r
     {\r
 #ifndef DEBUG\r
-#if defined (__AVR_ATmega32__)\r
-        TCCR2 |= (1<<COM20)|(1<<WGM21);                 // = 0x42: toggle OC2A on compare match, clear Timer 2 at compare match OCR2A\r
-#else\r
-        TCCR2A |= (1<<COM2A0)|(1<<WGM21);               // = 0x42: toggle OC2A on compare match, clear Timer 2 at compare match OCR2A\r
-#endif  // __AVR...\r
+#if   IRSND_OC2 == 0                                    // use OC2\r
+        TCCR2 |= (1<<COM20)|(1<<WGM21);                 // toggle OC2 on compare match, clear Timer 2 at compare match OCR2\r
+#elif IRSND_OC2 == 1                                    // use OC2A\r
+        TCCR2A |= (1<<COM2A0)|(1<<WGM21);               // toggle OC2A on compare match, clear Timer 2 at compare match OCR2A\r
+#else                                                   // use OC2B\r
+        TCCR2A |= (1<<COM2B0)|(1<<WGM21);               // toggle OC2B on compare match, clear Timer 2 at compare match OCR2A (yes: A, not B!)\r
+#endif // IRSND_OC2\r
 #endif // DEBUG\r
+\r
+#if IRSND_USE_CALLBACK == 1\r
+        if (irsnd_callback_ptr)\r
+        {\r
+            (*irsnd_callback_ptr) (TRUE);\r
+        }\r
+#endif // IRSND_USE_CALLBACK == 1\r
+\r
         irsnd_is_on = TRUE;\r
     }\r
 }\r
@@ -238,13 +331,23 @@ irsnd_off (void)
     if (irsnd_is_on)\r
     {\r
 #ifndef DEBUG\r
-#if defined (__AVR_ATmega32__)\r
-        TCCR2 &= ~(1<<COM20);                                                           // normal port operation, OC2A disconnected.\r
-#else\r
-        TCCR2A &= ~(1<<COM2A0);                                                         // normal port operation, OC2A disconnected.\r
-#endif  // __AVR...\r
-        IRSND_PORT  &= ~(1<<IRSND_BIT);                                                 // set IRSND_BIT to low\r
+#if   IRSND_OC2 == 0                                    // use OC2\r
+        TCCR2 &= ~(1<<COM20);                           // normal port operation, OC2 disconnected.\r
+#elif IRSND_OC2 == 1                                    // use OC2A\r
+        TCCR2A &= ~(1<<COM2A0);                         // normal port operation, OC2A disconnected.\r
+#else                                                   // use OC2B\r
+        TCCR2A &= ~(1<<COM2B0);                         // normal port operation, OC2B disconnected.\r
+#endif // IRSND_OC2\r
+        IRSND_PORT  &= ~(1<<IRSND_BIT);                 // set IRSND_BIT to low\r
 #endif // DEBUG\r
+\r
+#if IRSND_USE_CALLBACK == 1\r
+        if (irsnd_callback_ptr)\r
+        {\r
+           (*irsnd_callback_ptr) (FALSE);\r
+        }\r
+#endif // IRSND_USE_CALLBACK == 1\r
+\r
         irsnd_is_on = FALSE;\r
     }\r
 }\r
@@ -258,11 +361,11 @@ static void
 irsnd_set_freq (uint8_t freq)\r
 {\r
 #ifndef DEBUG\r
-#if defined (__AVR_ATmega32__)\r
-    OCR2 = freq;\r
+#if IRSND_OC2 == 0\r
+    OCR2 = freq;                                                                        // use register OCR2 for OC2\r
 #else\r
-    OCR2A = freq;\r
-#endif  // __AVR...\r
+    OCR2A = freq;                                                                       // use register OCR2A for OC2A and OC2B!\r
+#endif\r
 #endif // DEBUG\r
 }\r
 \r
@@ -290,6 +393,14 @@ irsnd_init (void)
 #endif // DEBUG\r
 }\r
 \r
+#if IRSND_USE_CALLBACK == 1\r
+void\r
+irsnd_set_callback_ptr (void (*cb)(uint8_t))\r
+{\r
+    irsnd_callback_ptr = cb;\r
+}\r
+#endif // IRSND_USE_CALLBACK == 1\r
+\r
 uint8_t\r
 irsnd_is_busy (void)\r
 {\r
@@ -671,6 +782,19 @@ irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait)
             irsnd_busy      = TRUE;\r
             break;\r
         }\r
+#endif\r
+#if IRSND_SUPPORT_LEGO_PROTOCOL == 1\r
+        case IRMP_LEGO_PROTOCOL:\r
+        {\r
+            uint8_t crc = 0x0F ^ ((irmp_data_p->command & 0x0F00) >> 8) ^ ((irmp_data_p->command & 0x00F0) >> 4) ^ (irmp_data_p->command & 0x000F);\r
+\r
+            irsnd_buffer[0] = (irmp_data_p->command & 0x0FF0) >> 4;                                             // CCCCCCCC\r
+            irsnd_buffer[1] = ((irmp_data_p->command & 0x000F) << 4) | crc;                                     // CCCCcccc\r
+\r
+            irsnd_protocol = IRMP_LEGO_PROTOCOL;\r
+            irsnd_busy      = TRUE;\r
+            break;\r
+        }\r
 #endif\r
         default:\r
         {\r
@@ -1073,9 +1197,9 @@ irsnd_ISR (void)
                         pause_len                   = GRUNDIG_NOKIA_IR60_BIT_LEN;\r
                         has_stop_bit                = GRUNDIG_NOKIA_IR60_STOP_BIT;\r
                         complete_data_len           = NOKIA_COMPLETE_DATA_LEN;\r
-                        n_auto_repetitions          = NOKIA_FRAMES;                                 // 2 frames\r
-                        auto_repetition_pause_len   = NOKIA_AUTO_REPETITION_PAUSE_LEN;              // 20 msec pause\r
-                        repeat_frame_pause_len      = GRUNDIG_NOKIA_IR60_FRAME_REPEAT_PAUSE_LEN;      // 117 msec pause\r
+                        n_auto_repetitions          = NOKIA_FRAMES;                                             // 2 frames\r
+                        auto_repetition_pause_len   = NOKIA_AUTO_REPETITION_PAUSE_LEN;                          // 20 msec pause\r
+                        repeat_frame_pause_len      = GRUNDIG_NOKIA_IR60_FRAME_REPEAT_PAUSE_LEN;                // 117 msec pause\r
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
@@ -1175,6 +1299,24 @@ irsnd_ISR (void)
                         break;\r
                     }\r
 #endif\r
+#if IRSND_SUPPORT_LEGO_PROTOCOL == 1\r
+                    case IRMP_LEGO_PROTOCOL:\r
+                    {\r
+                        startbit_pulse_len          = LEGO_START_BIT_PULSE_LEN;\r
+                        startbit_pause_len          = LEGO_START_BIT_PAUSE_LEN - 1;\r
+                        complete_data_len           = LEGO_COMPLETE_DATA_LEN;\r
+                        pulse_1_len                 = LEGO_PULSE_LEN;\r
+                        pause_1_len                 = LEGO_1_PAUSE_LEN - 1;\r
+                        pulse_0_len                 = LEGO_PULSE_LEN;\r
+                        pause_0_len                 = LEGO_0_PAUSE_LEN - 1;\r
+                        has_stop_bit                = LEGO_STOP_BIT;\r
+                        n_auto_repetitions          = 1;                                            // 1 frame\r
+                        auto_repetition_pause_len   = 0;\r
+                        repeat_frame_pause_len      = LEGO_FRAME_REPEAT_PAUSE_LEN;\r
+                        irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+                        break;\r
+                    }\r
+#endif\r
                     default:\r
                     {\r
                         irsnd_busy = FALSE;\r
@@ -1233,12 +1375,15 @@ irsnd_ISR (void)
 #if IRSND_SUPPORT_NIKON_PROTOCOL == 1\r
                 case IRMP_NIKON_PROTOCOL:\r
 #endif\r
+#if IRSND_SUPPORT_LEGO_PROTOCOL == 1\r
+                case IRMP_LEGO_PROTOCOL:\r
+#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_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
-    IRSND_SUPPORT_JVC_PROTOCOL == 1 || IRSND_SUPPORT_NIKON_PROTOCOL == 1\r
+    IRSND_SUPPORT_JVC_PROTOCOL == 1 || IRSND_SUPPORT_NIKON_PROTOCOL == 1 || IRSND_SUPPORT_LEGO_PROTOCOL == 1 \r
                 {\r
                     if (pulse_counter == 0)\r
                     {\r
diff --git a/irsnd.h b/irsnd.h
index b5f214bb4fece9029bd042aaa67f6c50477fb5c5..a71b397bc78a41358f873fe2a7af64cf12f0dbb2 100644 (file)
--- a/irsnd.h
+++ b/irsnd.h
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * irsnd.h\r
  *\r
- * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irsnd.h,v 1.3 2010/06/10 10:05:56 fm Exp $\r
+ * $Id: irsnd.h,v 1.4 2011/04/11 12:54:25 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -44,4 +44,8 @@ extern uint8_t                      irsnd_send_data (IRMP_DATA *, uint8_t);
  */\r
 extern uint8_t                      irsnd_ISR (void);\r
 \r
+#if IRSND_USE_CALLBACK == 1\r
+extern void                         irsnd_set_callback_ptr (void (*cb)(uint8_t));\r
+#endif // IRSND_USE_CALLBACK == 1\r
+\r
 #endif /* _WC_IRSND_H_ */\r
index 11fdb87ae9d09494688a5cd43d2394000b218446..689baaacbedf90d608a7257524fd32af17e679f0 100644 (file)
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * irsndconfig.h\r
  *\r
- * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irsndconfig.h,v 1.17 2011/01/18 13:02:15 fm Exp $\r
+ * $Id: irsndconfig.h,v 1.20 2011/04/11 13:28:12 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
  */\r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * Change F_INTERRUPTS if you change the number of interrupts per second, F_INTERRUPTS should be in the range from 10000 to 15000\r
+ * Change F_INTERRUPTS if you change the number of interrupts per second, F_INTERRUPTS should be in the range from 10000 to 20000, typically 15000\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  */\r
 #ifndef F_INTERRUPTS\r
-#define F_INTERRUPTS                            10000   // interrupts per second\r
+#define F_INTERRUPTS                            15000   // interrupts per second\r
 #endif\r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * 0 disable decoder\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  */\r
-//      Protocol                                Enable  Remarks                 F_INTERRUPTS                Program Space\r
-#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 ~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, Sharp         >= 10000                    uses ~200 bytes\r
-#define IRSND_SUPPORT_JVC_PROTOCOL              1       // JVC                  >= 10000                    uses ~150 bytes\r
-#define IRSND_SUPPORT_RC6_PROTOCOL              1       // RC6                  >= 10000                    uses ~250 bytes\r
-#define IRSND_SUPPORT_RC6A_PROTOCOL             1       // RC6A                 >= 10000                    uses ~250 bytes\r
-#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     1       // Bang&Olufsen         >= 10000                    uses ~250 bytes\r
-#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          1       // Grundig              >= 10000                    uses ~300 bytes\r
-#define IRSND_SUPPORT_NOKIA_PROTOCOL            1       // Nokia                >= 10000                    uses ~400 bytes\r
-#define IRSND_SUPPORT_NUBERT_PROTOCOL           0       // NUBERT               >= 10000                    uses ~100 bytes\r
-#define IRSND_SUPPORT_NIKON_PROTOCOL            0       // NIKON                >= 10000                    uses ~150 bytes\r
-#define IRSND_SUPPORT_FDC_PROTOCOL              0       // FDC IR keyboard      >= 10000 (better 15000)     uses ~150 bytes\r
-#define IRSND_SUPPORT_RCCAR_PROTOCOL            0       // RC CAR               >= 10000 (better 15000)     uses ~150 bytes\r
-#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
+\r
+// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space\r
+#define IRSND_SUPPORT_SIRCS_PROTOCOL            1       // Sony SIRCS           >= 10000                 ~150 bytes\r
+#define IRSND_SUPPORT_NEC_PROTOCOL              1       // NEC + APPLE          >= 10000                 ~100 bytes\r
+#define IRSND_SUPPORT_SAMSUNG_PROTOCOL          1       // Samsung + Samsung32  >= 10000                 ~300 bytes\r
+#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL       1       // Matsushita           >= 10000                 ~200 bytes\r
+#define IRSND_SUPPORT_KASEIKYO_PROTOCOL         1       // Kaseikyo             >= 10000                 ~150 bytes\r
+#define IRSND_SUPPORT_DENON_PROTOCOL            1       // DENON, Sharp         >= 10000                 ~200 bytes\r
+\r
+// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space\r
+#define IRSND_SUPPORT_RC5_PROTOCOL              0       // RC5                  >= 10000                 ~150 bytes\r
+#define IRSND_SUPPORT_RC6_PROTOCOL              0       // RC6                  >= 10000                 ~250 bytes\r
+#define IRSND_SUPPORT_RC6A_PROTOCOL             0       // RC6A                 >= 10000                 ~250 bytes\r
+#define IRSND_SUPPORT_JVC_PROTOCOL              0       // JVC                  >= 10000                 ~150 bytes\r
+#define IRSND_SUPPORT_NEC16_PROTOCOL            0       // NEC16                >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_NEC42_PROTOCOL            0       // NEC42                >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_IR60_PROTOCOL             0       // IR60 (SAB2008)       >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          0       // Grundig              >= 10000                 ~300 bytes\r
+#define IRSND_SUPPORT_SIEMENS_PROTOCOL          0       // Siemens, Gigaset     >= 15000                 ~150 bytes\r
+#define IRSND_SUPPORT_NOKIA_PROTOCOL            0       // Nokia                >= 10000                 ~400 bytes\r
+\r
+// 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_BANG_OLUFSEN_PROTOCOL     0       // Bang&Olufsen         >= 10000                 ~250 bytes\r
+#define IRSND_SUPPORT_NIKON_PROTOCOL            0       // NIKON                >= 10000                 ~150 bytes\r
+#define IRSND_SUPPORT_NETBOX_PROTOCOL           0       // Netbox keyboard      >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_IMON_PROTOCOL             0       // IMON keyboard        >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_FDC_PROTOCOL              0       // FDC IR keyboard      >= 10000 (better 15000)  ~150 bytes\r
+#define IRSND_SUPPORT_RCCAR_PROTOCOL            0       // RC CAR               >= 10000 (better 15000)  ~150 bytes\r
+#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       >= 15000                 DON'T CHANGE, NOT SUPPORTED YET!\r
+#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               >= 20000                 ~100 bytes\r
+#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            >= 20000                 ~100 bytes\r
+#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        >= 20000                 ~150 bytes\r
 \r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * Change hardware pin here:\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  */\r
-#if defined (__AVR_ATmega32__) || defined (__AVR_ATmega644P__)\r
-#define IRSND_PORT                              PORTD   // port D\r
-#define IRSND_DDR                               DDRD    // ddr D\r
-#define IRSND_BIT                               7       // OC2A\r
-#else\r
-#define IRSND_PORT                              PORTB   // port B\r
-#define IRSND_DDR                               DDRB    // ddr B\r
-#define IRSND_BIT                               3       // OC2A\r
-#endif // __AVR...\r
+#define IRSND_OC2                               1       // 0 = OC2, 1 = OC2A, 2 = OC2B, default is 1\r
 \r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Use Callbacks to indicate output signal or something else\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define IRSND_USE_CALLBACK                      0       // flag: 0 = don't use callbacks, 1 = use callbacks, default is 0\r
 \r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ *                              D O   N O T   C H A N G E   T H E   F O L L O W I N G   L I N E S   !\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
 #if IRSND_SUPPORT_SIEMENS_PROTOCOL == 1 && F_INTERRUPTS < 15000\r
 #warning F_INTERRUPTS too low, SIEMENS protocol disabled (should be at least 15000)\r
 #undef IRSND_SUPPORT_SIEMENS_PROTOCOL\r
 #if IRSND_SUPPORT_RECS80_PROTOCOL == 1 && F_INTERRUPTS < 20000\r
 #warning F_INTERRUPTS too low, RECS80 protocol disabled (should be at least 20000)\r
 #undef IRSND_SUPPORT_RECS80_PROTOCOL\r
-#define IRSND_SUPPORT_RECS80_PROTOCOL           0\r
+#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // DO NOT CHANGE! F_INTERRUPTS too low!\r
 #endif\r
 \r
 #if IRSND_SUPPORT_RECS80EXT_PROTOCOL == 1 && F_INTERRUPTS < 20000\r
 #warning F_INTERRUPTS too low, RECS80EXT protocol disabled (should be at least 20000)\r
 #undef IRSND_SUPPORT_RECS80EXT_PROTOCOL\r
-#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0\r
+#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // DO NOT CHANGE! F_INTERRUPTS too low!\r
+#endif\r
+\r
+#if IRSND_SUPPORT_LEGO_PROTOCOL == 1 && F_INTERRUPTS < 20000\r
+#warning F_INTERRUPTS too low, LEGO protocol disabled (should be at least 20000)\r
+#undef IRSND_SUPPORT_LEGO_PROTOCOL\r
+#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // DO NOT CHANGE! F_INTERRUPTS too low!\r
 #endif\r
index e5a03cb86ac9d0e331a0c73d5625ed18ea807513..def3b311ca7f3cf29d803ca8e0f30f0f37278965 100644 (file)
@@ -1,7 +1,7 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * irsndmain.c - demo main module to test irmp decoder\r
  *\r
- * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
diff --git a/main.c b/main.c
index f28cce9292ac5dac717f05087a586811c05d310b..0248d8e6d04ed6ca09c44b76214cc1e86f80df21 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,9 +1,9 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * main.c - demo main module to test irmp decoder\r
  *\r
- * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: main.c,v 1.8 2010/08/30 15:45:27 fm Exp $\r
+ * $Id: main.c,v 1.9 2011/04/11 12:54:25 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r