+#if IRSND_SUPPORT_RUWIDO_PROTOCOL == 1\r
+ case IRMP_RUWIDO_PROTOCOL:\r
+ {\r
+ irsnd_buffer[0] = ((irmp_data_p->address & 0x01FF) >> 1); // AAAAAAAA\r
+ irsnd_buffer[1] = ((irmp_data_p->address & 0x0001) << 7) | ((irmp_data_p->command & 0x7F)); // ACCCCCCC\r
+ irsnd_buffer[2] = ((~irmp_data_p->command & 0x01) << 7); // c\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_FDC_PROTOCOL == 1\r
+ case IRMP_FDC_PROTOCOL:\r
+ {\r
+ address = bitsrevervse (irmp_data_p->address, FDC_ADDRESS_LEN);\r
+ command = bitsrevervse (irmp_data_p->command, FDC_COMMAND_LEN);\r
+\r
+ irsnd_buffer[0] = (address & 0xFF); // AAAAAAAA\r
+ irsnd_buffer[1] = 0; // 00000000\r
+ irsnd_buffer[2] = 0; // 0000RRRR\r
+ irsnd_buffer[3] = (command & 0xFF); // CCCCCCCC\r
+ irsnd_buffer[4] = ~(command & 0xFF); // cccccccc\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_RCCAR_PROTOCOL == 1\r
+ case IRMP_RCCAR_PROTOCOL:\r
+ {\r
+ address = bitsrevervse (irmp_data_p->address, 2); // A0 A1\r
+ command = bitsrevervse (irmp_data_p->command, RCCAR_COMMAND_LEN - 2); // D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 V\r
+\r
+ irsnd_buffer[0] = ((command & 0x06) << 5) | ((address & 0x0003) << 4) | ((command & 0x0780) >> 7); // C0 C1 A0 A1 D0 D1 D2 D3\r
+ irsnd_buffer[1] = ((command & 0x78) << 1) | ((command & 0x0001) << 3); // D4 D5 D6 D7 V 0 0 0\r
+\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_JVC_PROTOCOL == 1\r
+ case IRMP_JVC_PROTOCOL:\r
+ {\r
+ address = bitsrevervse (irmp_data_p->address, JVC_ADDRESS_LEN);\r
+ command = bitsrevervse (irmp_data_p->command, JVC_COMMAND_LEN);\r
+\r
+ irsnd_buffer[0] = ((address & 0x000F) << 4) | (command & 0x0F00) >> 8; // AAAACCCC\r
+ irsnd_buffer[1] = (command & 0x00FF); // CCCCCCCC\r
+\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NIKON_PROTOCOL == 1\r
+ case IRMP_NIKON_PROTOCOL:\r
+ {\r
+ irsnd_buffer[0] = (irmp_data_p->command & 0x0003) << 6; // CC\r
+ 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
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_A1TVBOX_PROTOCOL == 1\r
+ case IRMP_A1TVBOX_PROTOCOL:\r
+ {\r
+ irsnd_buffer[0] = 0x80 | (irmp_data_p->address >> 2); // 10AAAAAA\r
+ irsnd_buffer[1] = (irmp_data_p->address << 6) | (irmp_data_p->command >> 2); // AACCCCCC\r
+ irsnd_buffer[2] = (irmp_data_p->command << 6); // CC\r
+\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_ROOMBA_PROTOCOL == 1\r
+ case IRMP_ROOMBA_PROTOCOL:\r
+ {\r
+ irsnd_buffer[0] = (irmp_data_p->command & 0x7F) << 1; // CCCCCCC.\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_PENTAX_PROTOCOL == 1\r
+ case IRMP_PENTAX_PROTOCOL:\r
+ {\r
+ irsnd_buffer[0] = (irmp_data_p->command & 0x3F) << 2; // CCCCCC..\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_ACP24_PROTOCOL == 1\r
+# define ACP_SET_BIT(acp24_bitno, c, irmp_bitno) \\r
+ do \\r
+ { \\r
+ if ((c) & (1<<(irmp_bitno))) \\r
+ { \\r
+ irsnd_buffer[((acp24_bitno)>>3)] |= 1 << (((7 - (acp24_bitno)) & 0x07)); \\r
+ } \\r
+ } while (0)\r
+\r
+ case IRMP_ACP24_PROTOCOL:\r
+ {\r
+ uint16_t cmd = irmp_data_p->command;\r
+ uint8_t i;\r
+\r
+ address = bitsrevervse (irmp_data_p->address, ACP24_ADDRESS_LEN);\r
+\r
+ for (i = 0; i < 8; i++)\r
+ {\r
+ irsnd_buffer[i] = 0x00; // CCCCCCCC\r
+ }\r
+\r
+ // ACP24-Frame:\r
+ // 1 2 3 4 5 6\r
+ // 0123456789012345678901234567890123456789012345678901234567890123456789\r
+ // N VVMMM ? ??? t vmA x y TTTT\r
+ //\r
+ // irmp_data_p->command:\r
+ //\r
+ // 5432109876543210\r
+ // NAVVvMMMmtxyTTTT\r
+\r
+ ACP_SET_BIT( 0, cmd, 15);\r
+ ACP_SET_BIT(24, cmd, 14);\r
+ ACP_SET_BIT( 2, cmd, 13);\r
+ ACP_SET_BIT( 3, cmd, 12);\r
+ ACP_SET_BIT(22, cmd, 11);\r
+ ACP_SET_BIT( 4, cmd, 10);\r
+ ACP_SET_BIT( 5, cmd, 9);\r
+ ACP_SET_BIT( 6, cmd, 8);\r
+ ACP_SET_BIT(23, cmd, 7);\r
+ ACP_SET_BIT(20, cmd, 6);\r
+ ACP_SET_BIT(26, cmd, 5);\r
+ ACP_SET_BIT(44, cmd, 4);\r
+ ACP_SET_BIT(66, cmd, 3);\r
+ ACP_SET_BIT(67, cmd, 2);\r
+ ACP_SET_BIT(68, cmd, 1);\r
+ ACP_SET_BIT(69, cmd, 0);\r
+\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
+\r
+ default:\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return irsnd_busy;\r
+}\r
+\r
+void\r
+irsnd_stop (void)\r
+{\r
+ irsnd_repeat = 0;\r
+}\r
+\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * ISR routine\r
+ * @details ISR routine, called 10000 times per second\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+uint8_t\r
+irsnd_ISR (void)\r
+{\r
+ static uint8_t send_trailer = FALSE;\r
+ static uint8_t current_bit = 0xFF;\r
+ static uint8_t pulse_counter = 0;\r
+ static IRSND_PAUSE_LEN pause_counter = 0;\r
+ static uint8_t startbit_pulse_len = 0;\r
+ static IRSND_PAUSE_LEN startbit_pause_len = 0;\r
+ static uint8_t pulse_1_len = 0;\r
+ static uint8_t pause_1_len = 0;\r
+ static uint8_t pulse_0_len = 0;\r
+ static uint8_t pause_0_len = 0;\r
+ static uint8_t has_stop_bit = 0;\r
+ static uint8_t new_frame = TRUE;\r
+ static uint8_t complete_data_len = 0;\r
+ static uint8_t n_repeat_frames = 0; // number of repetition frames\r
+ static uint8_t n_auto_repetitions = 0; // number of auto_repetitions\r
+ static uint8_t auto_repetition_counter = 0; // auto_repetition counter\r
+ static uint16_t auto_repetition_pause_len = 0; // pause before auto_repetition, uint16_t!\r
+ static uint16_t auto_repetition_pause_counter = 0; // pause before auto_repetition, uint16_t!\r
+ static uint8_t repeat_counter = 0; // repeat counter\r
+ static uint16_t repeat_frame_pause_len = 0; // pause before repeat, uint16_t!\r
+ static uint16_t packet_repeat_pause_counter = 0; // pause before repeat, uint16_t!\r
+#if IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
+ static uint8_t last_bit_value;\r
+#endif\r
+ static uint8_t pulse_len = 0xFF;\r
+ static IRSND_PAUSE_LEN pause_len = 0xFF;\r
+\r
+ if (irsnd_busy)\r
+ {\r
+ if (current_bit == 0xFF && new_frame) // start of transmission...\r
+ {\r
+ if (auto_repetition_counter > 0)\r
+ {\r
+ auto_repetition_pause_counter++;\r
+\r
+ if (auto_repetition_pause_counter >= auto_repetition_pause_len)\r
+ {\r
+ auto_repetition_pause_counter = 0;\r
+\r
+#if IRSND_SUPPORT_DENON_PROTOCOL == 1\r
+ if (irsnd_protocol == IRMP_DENON_PROTOCOL) // n'th denon frame\r
+ {\r
+ current_bit = 16;\r
+ complete_data_len = 2 * DENON_COMPLETE_DATA_LEN + 1;\r
+ }\r
+ else\r
+#endif\r
+#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1\r
+ if (irsnd_protocol == IRMP_GRUNDIG_PROTOCOL) // n'th grundig frame\r
+ {\r
+ current_bit = 15;\r
+ complete_data_len = 16 + GRUNDIG_COMPLETE_DATA_LEN;\r
+ }\r
+ else\r
+#endif\r
+#if IRSND_SUPPORT_IR60_PROTOCOL == 1\r
+ if (irsnd_protocol == IRMP_IR60_PROTOCOL) // n'th IR60 frame\r
+ {\r
+ current_bit = 7;\r
+ complete_data_len = 2 * IR60_COMPLETE_DATA_LEN + 1;\r
+ }\r
+ else\r
+#endif\r
+#if IRSND_SUPPORT_NOKIA_PROTOCOL == 1\r
+ if (irsnd_protocol == IRMP_NOKIA_PROTOCOL) // n'th nokia frame\r
+ {\r
+ if (auto_repetition_counter + 1 < n_auto_repetitions)\r
+ {\r
+ current_bit = 23;\r
+ complete_data_len = 24 + NOKIA_COMPLETE_DATA_LEN;\r
+ }\r
+ else // nokia stop frame\r
+ {\r
+ current_bit = 0xFF;\r
+ complete_data_len = NOKIA_COMPLETE_DATA_LEN;\r
+ }\r
+ }\r
+ else\r
+#endif\r
+ {\r
+ ;\r
+ }\r
+ }\r
+ else\r
+ {\r
+#ifdef ANALYZE\r
+ if (irsnd_is_on)\r
+ {\r
+ putchar ('0');\r
+ }\r
+ else\r
+ {\r
+ putchar ('1');\r
+ }\r
+#endif\r
+ return irsnd_busy;\r
+ }\r
+ }\r
+ else if (packet_repeat_pause_counter < repeat_frame_pause_len)\r
+ {\r
+ packet_repeat_pause_counter++;\r
+#ifdef ANALYZE\r
+ if (irsnd_is_on)\r
+ {\r
+ putchar ('0');\r
+ }\r
+ else\r
+ {\r
+ putchar ('1');\r
+ }\r
+#endif\r
+ return irsnd_busy;\r
+ }\r
+ else\r
+ {\r
+ if (send_trailer)\r
+ {\r
+ irsnd_busy = FALSE;\r
+ send_trailer = FALSE;\r
+ return irsnd_busy;\r
+ }\r
+\r
+ n_repeat_frames = irsnd_repeat;\r
+\r
+ if (n_repeat_frames == IRSND_ENDLESS_REPETITION)\r
+ {\r
+ n_repeat_frames = 255;\r
+ }\r
+\r
+ packet_repeat_pause_counter = 0;\r
+ pulse_counter = 0;\r
+ pause_counter = 0;\r
+\r
+ switch (irsnd_protocol)\r
+ {\r
+#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1\r
+ case IRMP_SIRCS_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = SIRCS_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = SIRCS_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = SIRCS_1_PULSE_LEN;\r
+ pause_1_len = SIRCS_PAUSE_LEN - 1;\r
+ pulse_0_len = SIRCS_0_PULSE_LEN;\r
+ pause_0_len = SIRCS_PAUSE_LEN - 1;\r
+ has_stop_bit = SIRCS_STOP_BIT;\r
+ complete_data_len = SIRCS_MINIMUM_DATA_LEN + sircs_additional_bitlen;\r
+ n_auto_repetitions = (repeat_counter == 0) ? SIRCS_FRAMES : 1; // 3 frames auto repetition if first frame\r
+ auto_repetition_pause_len = SIRCS_AUTO_REPETITION_PAUSE_LEN; // 25ms pause\r
+ repeat_frame_pause_len = SIRCS_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_40_KHZ);\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NEC_PROTOCOL == 1\r
+ case IRMP_NEC_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = NEC_START_BIT_PULSE_LEN;\r
+\r
+ if (repeat_counter > 0)\r
+ {\r
+ startbit_pause_len = NEC_REPEAT_START_BIT_PAUSE_LEN - 1;\r
+ complete_data_len = 0;\r
+ }\r
+ else\r
+ {\r
+ startbit_pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ complete_data_len = NEC_COMPLETE_DATA_LEN;\r
+ }\r
+\r
+ pulse_1_len = NEC_PULSE_LEN;\r
+ pause_1_len = NEC_1_PAUSE_LEN - 1;\r
+ pulse_0_len = NEC_PULSE_LEN;\r
+ pause_0_len = NEC_0_PAUSE_LEN - 1;\r
+ has_stop_bit = NEC_STOP_BIT;\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = NEC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NEC16_PROTOCOL == 1\r
+ case IRMP_NEC16_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = NEC_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = NEC_PULSE_LEN;\r
+ pause_1_len = NEC_1_PAUSE_LEN - 1;\r
+ pulse_0_len = NEC_PULSE_LEN;\r
+ pause_0_len = NEC_0_PAUSE_LEN - 1;\r
+ has_stop_bit = NEC_STOP_BIT;\r
+ complete_data_len = NEC16_COMPLETE_DATA_LEN + 1; // 1 more: sync bit\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = NEC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_NEC42_PROTOCOL == 1\r
+ case IRMP_NEC42_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = NEC_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = NEC_PULSE_LEN;\r
+ pause_1_len = NEC_1_PAUSE_LEN - 1;\r
+ pulse_0_len = NEC_PULSE_LEN;\r
+ pause_0_len = NEC_0_PAUSE_LEN - 1;\r
+ has_stop_bit = NEC_STOP_BIT;\r
+ complete_data_len = NEC42_COMPLETE_DATA_LEN;\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = NEC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+ break;\r
+ }\r
+#endif\r
+#if IRSND_SUPPORT_LGAIR_PROTOCOL == 1\r
+ case IRMP_LGAIR_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = NEC_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = NEC_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = NEC_PULSE_LEN;\r
+ pause_1_len = NEC_1_PAUSE_LEN - 1;\r
+ pulse_0_len = NEC_PULSE_LEN;\r
+ pause_0_len = NEC_0_PAUSE_LEN - 1;\r
+ has_stop_bit = NEC_STOP_BIT;\r
+ complete_data_len = LGAIR_COMPLETE_DATA_LEN;\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = NEC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r