]> cloudbase.mooo.com Git - irmp.git/commitdiff
Version 1.3.1: corrected command bitmask for SAMSUNG32 protocol, added GRUNDIG protoc...
authorukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Mon, 17 May 2010 10:34:46 +0000 (10:34 +0000)
committerukw <ukw@aeb2e35e-bfc4-4214-b83c-9e8de998ed28>
Mon, 17 May 2010 10:34:46 +0000 (10:34 +0000)
git-svn-id: svn://mikrocontroller.net/irmp@13 aeb2e35e-bfc4-4214-b83c-9e8de998ed28

irmp.c
irmp.exe
irmp.h
irsnd.c
irsnd.exe
irsndconfig.h

diff --git a/irmp.c b/irmp.c
index 7c1225f4e78f6b11d54b7ebb3c410622b1f4bb38..f4e2ef7c628db18348106dfa06143eb494b26ffe 100644 (file)
--- a/irmp.c
+++ b/irmp.c
@@ -3,7 +3,7 @@
  *\r
  * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmp.c,v 1.24 2010/05/16 21:58:13 fm Exp $\r
+ * $Id: irmp.c,v 1.25 2010/05/17 10:31:43 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -363,12 +363,12 @@ typedef unsigned int16  uint16_t;
 #define SAMSUNG_START_BIT_PULSE_LEN_MAX         ((uint8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
 #define SAMSUNG_START_BIT_PAUSE_LEN_MIN         ((uint8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
 #define SAMSUNG_START_BIT_PAUSE_LEN_MAX         ((uint8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
-#define SAMSUNG_PULSE_LEN_MIN                   ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1)\r
-#define SAMSUNG_PULSE_LEN_MAX                   ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
-#define SAMSUNG_1_PAUSE_LEN_MIN                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1)\r
-#define SAMSUNG_1_PAUSE_LEN_MAX                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
-#define SAMSUNG_0_PAUSE_LEN_MIN                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1)\r
-#define SAMSUNG_0_PAUSE_LEN_MAX                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1)\r
+#define SAMSUNG_PULSE_LEN_MIN                   ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
+#define SAMSUNG_PULSE_LEN_MAX                   ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
+#define SAMSUNG_1_PAUSE_LEN_MIN                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
+#define SAMSUNG_1_PAUSE_LEN_MAX                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
+#define SAMSUNG_0_PAUSE_LEN_MIN                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)\r
+#define SAMSUNG_0_PAUSE_LEN_MAX                 ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)\r
 \r
 #define MATSUSHITA_START_BIT_PULSE_LEN_MIN      ((uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
 #define MATSUSHITA_START_BIT_PULSE_LEN_MAX      ((uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
@@ -1763,6 +1763,11 @@ irmp_ISR (void)
                         }\r
                         else  if (irmp_pulse_time >= SAMSUNG_PULSE_LEN_MIN && irmp_pulse_time <= SAMSUNG_PULSE_LEN_MAX)\r
                         {\r
+                            irmp_param.protocol         = IRMP_SAMSUNG32_PROTOCOL;\r
+                            irmp_param.command_offset   = SAMSUNG32_COMMAND_OFFSET;\r
+                            irmp_param.command_end      = SAMSUNG32_COMMAND_OFFSET + SAMSUNG32_COMMAND_LEN;\r
+                            irmp_param.complete_len     = SAMSUNG32_COMPLETE_DATA_LEN;\r
+\r
                             if (irmp_pause_time >= SAMSUNG_1_PAUSE_LEN_MIN && irmp_pause_time <= SAMSUNG_1_PAUSE_LEN_MAX)\r
                             {\r
                                 DEBUG_PUTCHAR ('1');\r
@@ -1779,11 +1784,6 @@ irmp_ISR (void)
                             }\r
 \r
                             DEBUG_PRINTF ("Switching to SAMSUNG32 protocol\n");\r
-\r
-                            irmp_param.protocol         = IRMP_SAMSUNG32_PROTOCOL;\r
-                            irmp_param.command_offset   = SAMSUNG32_COMMAND_OFFSET;\r
-                            irmp_param.command_end      = SAMSUNG32_COMMAND_OFFSET + SAMSUNG32_COMMAND_LEN;\r
-                            irmp_param.complete_len     = SAMSUNG32_COMPLETE_DATA_LEN;\r
                         }\r
                         else\r
                         {                                                           // timing incorrect!\r
index 93e51e72cfb9130ce4336574e3ef19ff5f87aac1..9dc5f4b6e4c9a251ad59c31f14e0bc463668b0c6 100644 (file)
Binary files a/irmp.exe and b/irmp.exe differ
diff --git a/irmp.h b/irmp.h
index 6f718f8fca0a03b18f6fd2b826a484d0365e7b5f..4233a6ff8eb9442821f79d167e7ffaa450051578 100644 (file)
--- a/irmp.h
+++ b/irmp.h
@@ -3,7 +3,7 @@
  *\r
  * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irmp.h,v 1.14 2010/05/15 17:13:07 fm Exp $\r
+ * $Id: irmp.h,v 1.15 2010/05/17 10:31:43 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -47,8 +47,8 @@ extern "C"
 #define SIRCS_1_PULSE_TIME                      1200.0e-6                     // 1200 usec pulse\r
 #define SIRCS_0_PULSE_TIME                       600.0e-6                     //  600 usec pulse\r
 #define SIRCS_PAUSE_TIME                         600.0e-6                     //  600 usec pause\r
-#define SIRCS_REPETITION_TIME                     45.0e-3                     // repetition after 45ms\r
-#define SIRCS_REPETITION_CNT                    3                             // SIRCS repeats each frame 3 times\r
+#define SIRCS_REPETITION_CNT                    3                             // SIRCS sends each frame 3 times\r
+#define SIRCS_REPETITION_TIME                     25.0e-3                     // repetition after 25ms\r
 #define SIRCS_ADDRESS_OFFSET                    15                            // skip 15 bits\r
 #define SIRCS_ADDRESS_LEN                       5                             // read up to 5 address bits\r
 #define SIRCS_COMMAND_OFFSET                    0                             // skip 0 bits\r
@@ -90,6 +90,8 @@ extern "C"
 #define SAMSUNG32_COMMAND_OFFSET                16                            // skip 16 bits\r
 #define SAMSUNG32_COMMAND_LEN                   16                            // read 16 command bits\r
 #define SAMSUNG32_COMPLETE_DATA_LEN             32                            // complete length\r
+#define SAMSUNG32_REPETITION_CNT                2                             // SAMSUNG32 sends each frame 2 times\r
+#define SAMSUNG32_REPETITION_TIME               47.0e-3                       // repetition after 47 ms\r
 \r
 #define MATSUSHITA_START_BIT_PULSE_TIME         3488.0e-6                     // 3488 usec pulse\r
 #define MATSUSHITA_START_BIT_PAUSE_TIME         3488.0e-6                     // 3488 usec pause\r
@@ -142,6 +144,7 @@ extern "C"
 #define DENON_PULSE_TIME                        275.0e-6                      //  275 usec pulse\r
 #define DENON_1_PAUSE_TIME                      1900.0e-6                     // 1900 usec pause\r
 #define DENON_0_PAUSE_TIME                      1050.0e-6                     // 1050 usec pause\r
+#define DENON_REPETITION_CNT                    2                             // DENON sends each frame 2 times\r
 #define DENON_REPETITION_TIME                     65.0e-3                     // inverted repetition after 65ms\r
 #define DENON_ADDRESS_OFFSET                    0                             // skip 0 bits\r
 #define DENON_ADDRESS_LEN                       5                             // read 5 address bits\r
@@ -183,6 +186,7 @@ extern "C"
 #define NUBERT_1_PAUSE_TIME                      340.0e-6                     //  340 usec pause\r
 #define NUBERT_0_PULSE_TIME                      500.0e-6                     //  500 usec pulse\r
 #define NUBERT_0_PAUSE_TIME                     1300.0e-6                     // 1300 usec pause\r
+#define NUBERT_REPETITION_CNT                   2                             // Nubert sends 2 frames\r
 #define NUBERT_REPETITION_TIME                  35.0e-3                       // repetition after 35ms\r
 #define NUBERT_ADDRESS_OFFSET                   0                             // skip 0 bits\r
 #define NUBERT_ADDRESS_LEN                      0                             // read 0 address bits\r
@@ -215,6 +219,8 @@ extern "C"
 \r
 #define GRUNDIG_BIT_TIME                        528.0e-6                      // 528 usec pulse/pause\r
 #define GRUNDIG_PRE_PAUSE_TIME                  2639.0e-6                     // 2639 usec pause after pre bit\r
+#define GRUNDIG_REPETITION_CNT                  2                             // SIRCS sends each frame 3 times\r
+#define GRUNDIG_REPETITION_TIME                   20.0e-3                     // repetition after 20ms\r
 #define GRUNDIG_ADDRESS_OFFSET                  0                             // skip 2 bits (2nd start + 1 toggle)\r
 #define GRUNDIG_ADDRESS_LEN                     0                             // read 5 address bits\r
 #define GRUNDIG_COMMAND_OFFSET                  1                             // skip 2 bits (1 start bit)\r
@@ -223,7 +229,7 @@ extern "C"
 #define GRUNDIG_STOP_BIT                        0                             // has no stop bit\r
 #define GRUNDIG_LSB                             1                             // MSB...LSB\r
 \r
-#define AUTO_REPETITION_TIME                    50.0e-3                       // SIRCS or SAMSUNG32: automatic repetition after 45-50ms\r
+#define AUTO_REPETITION_TIME                    50.0e-3                       // SIRCS/SAMSUNG32/NUBERT: automatic repetition after 45-50ms\r
 \r
 #define TRUE                                    1\r
 #define FALSE                                   0\r
diff --git a/irsnd.c b/irsnd.c
index fb0ac471c5e3250d718d7c80a441cff239d45cbf..eb3e29f27bc15be393b846bf31096ac9d161c957 100644 (file)
--- a/irsnd.c
+++ b/irsnd.c
@@ -3,7 +3,7 @@
  *\r
  * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id: irsnd.c,v 1.9 2010/04/28 14:58:59 fm Exp $\r
+ * $Id: irsnd.c,v 1.10 2010/05/17 10:31: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
@@ -56,7 +56,7 @@ typedef unsigned short    uint16_t;
 #define SIRCS_1_PULSE_LEN                       (uint8_t)(F_INTERRUPTS * SIRCS_1_PULSE_TIME + 0.5)\r
 #define SIRCS_0_PULSE_LEN                       (uint8_t)(F_INTERRUPTS * SIRCS_0_PULSE_TIME + 0.5)\r
 #define SIRCS_PAUSE_LEN                         (uint8_t)(F_INTERRUPTS * SIRCS_PAUSE_TIME + 0.5)\r
-#define SIRCS_REPETITION_LEN                    (uint16_t)(F_INTERRUPTS * SIRCS_REPETITION_TIME + 0.5)       // use uint16_t!\r
+#define SIRCS_REPETITION_LEN                    (uint16_t)(F_INTERRUPTS * SIRCS_REPETITION_TIME + 0.5)              // use uint16_t!\r
 \r
 #define NEC_START_BIT_PULSE_LEN                 (uint8_t)(F_INTERRUPTS * NEC_START_BIT_PULSE_TIME + 0.5)\r
 #define NEC_START_BIT_PAUSE_LEN                 (uint8_t)(F_INTERRUPTS * NEC_START_BIT_PAUSE_TIME + 0.5)\r
@@ -70,6 +70,8 @@ typedef unsigned short    uint16_t;
 #define SAMSUNG_1_PAUSE_LEN                     (uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME + 0.5)\r
 #define SAMSUNG_0_PAUSE_LEN                     (uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME + 0.5)\r
 \r
+#define SAMSUNG32_REPETITION_LEN                (uint16_t)(F_INTERRUPTS * SAMSUNG32_REPETITION_TIME + 0.5)          // use uint16_t!\r
+\r
 #define MATSUSHITA_START_BIT_PULSE_LEN          (uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME + 0.5)\r
 #define MATSUSHITA_START_BIT_PAUSE_LEN          (uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PAUSE_TIME + 0.5)\r
 #define MATSUSHITA_PULSE_LEN                    (uint8_t)(F_INTERRUPTS * MATSUSHITA_PULSE_TIME + 0.5)\r
@@ -121,6 +123,10 @@ typedef unsigned short    uint16_t;
 #define BANG_OLUFSEN_R_PAUSE_LEN                (uint8_t)(F_INTERRUPTS * BANG_OLUFSEN_R_PAUSE_TIME + 0.5)\r
 #define BANG_OLUFSEN_TRAILER_BIT_PAUSE_LEN      (uint8_t)(F_INTERRUPTS * BANG_OLUFSEN_TRAILER_BIT_PAUSE_TIME + 0.5)\r
 \r
+#define GRUNDIG_PRE_PAUSE_LEN                   (uint8_t)(F_INTERRUPTS * GRUNDIG_PRE_PAUSE_TIME + 0.5)\r
+#define GRUNDIG_BIT_LEN                         (uint8_t)(F_INTERRUPTS * GRUNDIG_BIT_TIME + 0.5)\r
+#define GRUNDIG_REPETITION_LEN                  (uint16_t)(F_INTERRUPTS * GRUNDIG_REPETITION_TIME + 0.5)       // use uint16_t!\r
+\r
 #define IRSND_FREQ_32_KHZ                       (uint8_t) ((F_CPU / 32000 / 2) - 1)\r
 #define IRSND_FREQ_36_KHZ                       (uint8_t) ((F_CPU / 36000 / 2) - 1)\r
 #define IRSND_FREQ_38_KHZ                       (uint8_t) ((F_CPU / 38000 / 2) - 1)\r
@@ -408,6 +414,20 @@ irsnd_send_data (IRMP_DATA * irmp_data_p)
             break;\r
         }\r
 #endif\r
+#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1\r
+        case IRMP_GRUNDIG_PROTOCOL:\r
+        {\r
+            command = bitsrevervse (irmp_data_p->command, GRUNDIG_COMMAND_LEN);\r
+\r
+            irsnd_buffer[0] = 0xFF;                                                                             // S1111111\r
+            irsnd_buffer[1] = 0xC0;                                                                             // 11000000\r
+            irsnd_buffer[2] = 0x80 | (command >> 2);                                                            // SCCCCCCC\r
+            irsnd_buffer[3] = (command << 6) & 0xC0;                                                            // CC000000\r
+\r
+            irsnd_busy      = TRUE;\r
+            break;\r
+        }\r
+#endif\r
         default:\r
         {\r
             break;\r
@@ -437,8 +457,8 @@ irsnd_ISR (void)
     static uint8_t  has_stop_bit;\r
     static uint8_t  new_frame = TRUE;\r
     static uint8_t  complete_data_len;\r
-    static uint8_t  n_frames;                                                  // number of repetitions\r
-    static uint8_t  frame_counter;                                             // repetition counter\r
+    static uint8_t  n_frames;                                                       // number of repetitions\r
+    static uint8_t  frame_counter;                                                  // repetition counter\r
     static uint16_t repetition_pause;                                               // pause before repetition, uint16_t!\r
     static uint16_t repetition_pause_counter;                                       // pause before repetition, uint16_t!\r
 #if IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
@@ -464,6 +484,11 @@ irsnd_ISR (void)
                         current_bit = 16;\r
                         complete_data_len   = 2 * DENON_COMPLETE_DATA_LEN + 1;\r
                     }\r
+                    else if (irsnd_protocol == IRMP_GRUNDIG_PROTOCOL)\r
+                    {\r
+                        current_bit = 15;\r
+                        complete_data_len   = 16 + GRUNDIG_COMPLETE_DATA_LEN;\r
+                    }\r
                 }\r
                 else\r
                 {\r
@@ -498,8 +523,8 @@ irsnd_ISR (void)
                         pause_0_len         = SIRCS_PAUSE_LEN;\r
                         has_stop_bit        = SIRCS_STOP_BIT;\r
                         complete_data_len   = SIRCS_MINIMUM_DATA_LEN;\r
-                        n_frames            = SIRCS_REPETITION_CNT;\r
-                        repetition_pause    = SIRCS_REPETITION_LEN;                     // 45 ms pause\r
+                        n_frames            = SIRCS_REPETITION_CNT;                     // 3 frames\r
+                        repetition_pause    = SIRCS_REPETITION_LEN;                     // 25ms pause\r
                         irsnd_set_freq (IRSND_FREQ_40_KHZ);\r
                         break;\r
                     }\r
@@ -515,7 +540,8 @@ irsnd_ISR (void)
                         pause_0_len         = NEC_0_PAUSE_LEN;\r
                         has_stop_bit        = NEC_STOP_BIT;\r
                         complete_data_len   = NEC_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
@@ -531,7 +557,8 @@ irsnd_ISR (void)
                         pause_0_len         = SAMSUNG_0_PAUSE_LEN;\r
                         has_stop_bit        = SAMSUNG_STOP_BIT;\r
                         complete_data_len   = SAMSUNG_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
@@ -546,7 +573,8 @@ irsnd_ISR (void)
                         pause_0_len         = SAMSUNG_0_PAUSE_LEN;\r
                         has_stop_bit        = SAMSUNG_STOP_BIT;\r
                         complete_data_len   = SAMSUNG32_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = SAMSUNG32_REPETITION_CNT;                 // 2 frames\r
+                        repetition_pause    = SAMSUNG32_REPETITION_LEN;                 // 47 ms pause\r
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
@@ -562,7 +590,8 @@ irsnd_ISR (void)
                         pause_0_len         = MATSUSHITA_0_PAUSE_LEN;\r
                         has_stop_bit        = MATSUSHITA_STOP_BIT;\r
                         complete_data_len   = MATSUSHITA_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         irsnd_set_freq (IRSND_FREQ_36_KHZ);\r
                         break;\r
                     }\r
@@ -578,7 +607,8 @@ irsnd_ISR (void)
                         pause_0_len         = RECS80_0_PAUSE_LEN;\r
                         has_stop_bit        = RECS80_STOP_BIT;\r
                         complete_data_len   = RECS80_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
@@ -594,7 +624,8 @@ irsnd_ISR (void)
                         pause_0_len         = RECS80EXT_0_PAUSE_LEN;\r
                         has_stop_bit        = RECS80EXT_STOP_BIT;\r
                         complete_data_len   = RECS80EXT_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
@@ -610,7 +641,8 @@ irsnd_ISR (void)
                         pause_0_len         = RC5_BIT_LEN;\r
                         has_stop_bit        = RC5_STOP_BIT;\r
                         complete_data_len   = RC5_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         irsnd_set_freq (IRSND_FREQ_36_KHZ);\r
                         break;\r
                     }\r
@@ -626,8 +658,8 @@ irsnd_ISR (void)
                         pause_0_len         = DENON_0_PAUSE_LEN;\r
                         has_stop_bit        = DENON_STOP_BIT;\r
                         complete_data_len   = DENON_COMPLETE_DATA_LEN;\r
-                        n_frames            = 2;\r
-                        repetition_pause    = DENON_REPETITION_LEN;                     // 65 ms pause after 1st frame (15 bits)\r
+                        n_frames            = DENON_REPETITION_CNT;                     // 2 frames, 2nd with inverted command\r
+                        repetition_pause    = DENON_REPETITION_LEN;                     // 65 ms pause after 1st frame\r
                         irsnd_set_freq (IRSND_FREQ_32_KHZ);\r
                         break;\r
                     }\r
@@ -643,8 +675,8 @@ irsnd_ISR (void)
                         pause_0_len         = NUBERT_0_PAUSE_LEN;\r
                         has_stop_bit        = NUBERT_STOP_BIT;\r
                         complete_data_len   = NUBERT_COMPLETE_DATA_LEN;\r
-                        n_frames            = 2;\r
-                        repetition_pause    = NUBERT_REPETITION_LEN;                     // 35 ms pause\r
+                        n_frames            = NUBERT_REPETITION_CNT;                    // 2 frames\r
+                        repetition_pause    = NUBERT_REPETITION_LEN;                    // 35 ms pause\r
                         irsnd_set_freq (IRSND_FREQ_36_KHZ);\r
                         break;\r
                     }\r
@@ -660,11 +692,29 @@ irsnd_ISR (void)
                         pause_0_len         = BANG_OLUFSEN_0_PAUSE_LEN;\r
                         has_stop_bit        = BANG_OLUFSEN_STOP_BIT;\r
                         complete_data_len   = BANG_OLUFSEN_COMPLETE_DATA_LEN;\r
-                        n_frames            = 1;\r
+                        n_frames            = 1;                                        // 1 frame\r
+                        repetition_pause    = 0;\r
                         last_bit_value      = 0;\r
                         irsnd_set_freq (IRSND_FREQ_455_KHZ);\r
                         break;\r
                     }\r
+#endif\r
+#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1\r
+                    case IRMP_GRUNDIG_PROTOCOL:\r
+                    {\r
+                        startbit_pulse_len  = GRUNDIG_BIT_LEN;\r
+                        startbit_pause_len  = GRUNDIG_PRE_PAUSE_LEN;\r
+                        pulse_1_len         = GRUNDIG_BIT_LEN;\r
+                        pause_1_len         = GRUNDIG_BIT_LEN;\r
+                        pulse_0_len         = GRUNDIG_BIT_LEN;\r
+                        pause_0_len         = GRUNDIG_BIT_LEN;\r
+                        has_stop_bit        = GRUNDIG_STOP_BIT;\r
+                        complete_data_len   = GRUNDIG_COMPLETE_DATA_LEN;\r
+                        n_frames            = GRUNDIG_REPETITION_CNT;           // 2 frames\r
+                        repetition_pause    = GRUNDIG_REPETITION_LEN;           // 20msec pause\r
+                        irsnd_set_freq (IRSND_FREQ_36_KHZ);\r
+                        break;\r
+                    }\r
 #endif\r
                     default:\r
                     {\r
@@ -929,6 +979,123 @@ irsnd_ISR (void)
                     break;\r
                 }\r
 #endif // IRSND_SUPPORT_RC5_PROTOCOL\r
+\r
+#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1\r
+                case IRMP_GRUNDIG_PROTOCOL:\r
+                {\r
+                    uint8_t next_bit = FALSE;\r
+\r
+                    if (current_bit == 0xFF || current_bit == 15)                         // start bit of 1st or 2nd frame\r
+                    {\r
+                        if (pulse_counter == 0)\r
+                        {\r
+                            pulse_len = startbit_pulse_len;\r
+                            pause_len = startbit_pause_len;\r
+                        }\r
+\r
+                        if (pulse_counter < pulse_len)\r
+                        {\r
+                            if (pulse_counter == 0)\r
+                            {\r
+                                irsnd_on ();\r
+                            }\r
+                            pulse_counter++;\r
+                        }\r
+                        else if (pause_counter < pause_len)\r
+                        {\r
+                            if (pause_counter == 0)\r
+                            {\r
+                                irsnd_off ();\r
+                            }\r
+                            pause_counter++;\r
+                        }\r
+                        else\r
+                        {\r
+                            current_bit++;\r
+                            pulse_counter = 0;\r
+                            pause_counter = 0;\r
+                        }\r
+                    }\r
+                    else                                                                        // send n'th bit\r
+                    {\r
+                        uint8_t first_pulse;\r
+\r
+                        first_pulse = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? TRUE : FALSE;\r
+\r
+                        if (first_pulse)\r
+                        {\r
+                            if (pulse_counter < GRUNDIG_BIT_LEN)\r
+                            {\r
+                                if (pulse_counter == 0)\r
+                                {\r
+                                    irsnd_on ();\r
+                                }\r
+                                pulse_counter++;\r
+                            }\r
+                            else if (pause_counter < GRUNDIG_BIT_LEN)\r
+                            {\r
+                                if (pause_counter == 0)\r
+                                {\r
+                                    irsnd_off ();\r
+                                }\r
+                                pause_counter++;\r
+                            }\r
+                            else\r
+                            {\r
+                                next_bit = TRUE;\r
+                            }\r
+                        }\r
+                        else\r
+                        {\r
+                            if (pause_counter < GRUNDIG_BIT_LEN)\r
+                            {\r
+                                if (pause_counter == 0)\r
+                                {\r
+                                    irsnd_off ();\r
+                                }\r
+                                pause_counter++;\r
+                            }\r
+                            else if (pulse_counter < GRUNDIG_BIT_LEN)\r
+                            {\r
+                                if (pulse_counter == 0)\r
+                                {\r
+                                    irsnd_on ();\r
+                                }\r
+                                pulse_counter++;\r
+                            }\r
+                            else\r
+                            {\r
+                                next_bit = TRUE;\r
+                            }\r
+                        }\r
+\r
+                        if (next_bit)\r
+                        {\r
+                            current_bit++;\r
+\r
+                            if (current_bit >= complete_data_len)\r
+                            {\r
+                                current_bit = 0xFF;\r
+                                frame_counter++;\r
+\r
+                                if (frame_counter == n_frames)\r
+                                {\r
+                                    irsnd_busy = FALSE;\r
+                                    frame_counter = 0;\r
+                                }\r
+\r
+                                new_frame = TRUE;\r
+                                irsnd_off ();\r
+                            }\r
+\r
+                            pulse_counter = 0;\r
+                            pause_counter = 0;\r
+                        }\r
+                    }\r
+                    break;\r
+                }\r
+#endif // IRSND_SUPPORT_GRUNDIG_PROTOCOL\r
+\r
                 default:\r
                 {\r
                     irsnd_busy = FALSE;\r
index bec88b33768fd8f6057532d9803f8b5e4a0c29a6..5bce0d73e4606cfaff8cae55630e45ff989a7ebb 100644 (file)
Binary files a/irsnd.exe and b/irsnd.exe differ
index 597a1a9eb014068cc687bab004a44d417a4f3c13..81772bf1ed901f6f2071b72d7076d4081763cd8e 100644 (file)
@@ -3,7 +3,7 @@
  *\r
  * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
  *\r
- * $Id$\r
+ * $Id: irsndconfig.h,v 1.2 2010/05/17 10:31:43 fm Exp $\r
  *\r
  * ATMEGA88 @ 8 MHz\r
  *\r
@@ -33,6 +33,7 @@
 #define IRSND_SUPPORT_RECS80EXT_PROTOCOL        1       // flag: support RECS80EXT              uses ~100 bytes\r
 #define IRSND_SUPPORT_NUBERT_PROTOCOL           1       // flag: support NUBERT                 uses ~100 bytes\r
 #define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     1       // flag: support Bang&Olufsen           uses ~250 bytes\r
+#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          1       // flag: support Grundig                uses ~250 bytes\r
 \r
 \r
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r