*\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
#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
}\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
}\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
*\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
#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
#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
#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
#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
\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
#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
*\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
#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
#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
#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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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