]> cloudbase.mooo.com Git - irmp.git/blobdiff - irsnd.c
Version 2.3.9: added ORTEK and TELEFUNKEN protocol
[irmp.git] / irsnd.c
diff --git a/irsnd.c b/irsnd.c
index f2ab4d8532a800214586197b4e91a277f2f43d03..fd0112299e4375884b50909fa3cca7522f492fec 100644 (file)
--- a/irsnd.c
+++ b/irsnd.c
@@ -1,19 +1,19 @@
 /*---------------------------------------------------------------------------------------------------------------------------------------------------\r
  * @file irsnd.c\r
  *\r
- * Copyright (c) 2010-2012 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2013 Frank Meyer - frank(at)fli4l.de\r
  *\r
  * Supported mikrocontrollers:\r
  *\r
  * ATtiny87,  ATtiny167\r
  * ATtiny45,  ATtiny85\r
- * ATtiny84\r
+ * ATtiny44   ATtiny84\r
  * ATmega8,   ATmega16,  ATmega32\r
  * ATmega162\r
- * ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284\r
+ * ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284, ATmega1284P\r
  * ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P\r
  *\r
- * $Id: irsnd.c,v 1.64 2012/12/06 08:49:33 fm Exp $\r
+ * $Id: irsnd.c,v 1.68 2013/03/12 12:49:59 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
@@ -33,7 +33,7 @@
  *  ATmega pin definition of OC2 / OC2A / OC2B / OC0 / OC0A / OC0B\r
  *---------------------------------------------------------------------------------------------------------------------------------------------------\r
  */\r
-#if defined (__AVR_ATtiny84__)                                      // ATtiny84 uses OC0A = PB2 or OC0B = PA7\r
+#if defined (__AVR_ATtiny44__) || defined (__AVR_ATtiny84__)        // ATtiny44/84 uses OC0A = PB2 or OC0B = PA7\r
 #  if IRSND_OCx == IRSND_OC0A                                       // OC0A\r
 #    define IRSND_PORT_LETTER                       B\r
 #    define IRSND_BIT_NUMBER                        2\r
 #define SIEMENS_BIT_LEN                         (uint8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_BIT_PULSE_TIME + 0.5)\r
 #define SIEMENS_FRAME_REPEAT_PAUSE_LEN          (uint16_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_FRAME_REPEAT_PAUSE_TIME + 0.5)  // use uint16_t!\r
 \r
-\r
 #ifdef PIC_C18                                  // PIC C18\r
 #  define IRSND_FREQ_TYPE                       uint8_t\r
 #  define IRSND_FREQ_30_KHZ                     (IRSND_FREQ_TYPE) ((F_CPU / 30000  / 2 / Pre_Scaler / PIC_Scaler) - 1)\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
+#define A1TVBOX_START_BIT_PULSE_LEN             (uint8_t)(F_INTERRUPTS * A1TVBOX_START_BIT_PULSE_TIME + 0.5)\r
+#define A1TVBOX_START_BIT_PAUSE_LEN             (uint8_t)(F_INTERRUPTS * A1TVBOX_START_BIT_PAUSE_TIME + 0.5)\r
+#define A1TVBOX_BIT_PULSE_LEN                   (uint8_t)(F_INTERRUPTS * A1TVBOX_BIT_PULSE_TIME + 0.5)\r
+#define A1TVBOX_BIT_PAUSE_LEN                   (uint8_t)(F_INTERRUPTS * A1TVBOX_BIT_PAUSE_TIME + 0.5)\r
+#define A1TVBOX_FRAME_REPEAT_PAUSE_LEN          (uint16_t)(F_INTERRUPTS * A1TVBOX_FRAME_REPEAT_PAUSE_TIME + 0.5)            // use uint16_t!\r
+#define A1TVBOX_FRAME_REPEAT_PAUSE_LEN          (uint16_t)(F_INTERRUPTS * A1TVBOX_FRAME_REPEAT_PAUSE_TIME + 0.5)            // use uint16_t!\r
+\r
 static volatile uint8_t                         irsnd_busy = 0;\r
 static volatile uint8_t                         irsnd_protocol = 0;\r
 static volatile uint8_t                         irsnd_buffer[6] = {0};\r
@@ -1085,8 +1091,17 @@ irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait)
 \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_protocol = IRMP_LEGO_PROTOCOL;\r
             irsnd_busy      = TRUE;\r
             break;\r
         }\r
@@ -1729,6 +1744,22 @@ irsnd_ISR (void)
                         irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
                         break;\r
                     }\r
+#endif\r
+#if IRSND_SUPPORT_A1TVBOX_PROTOCOL == 1\r
+                    case IRMP_A1TVBOX_PROTOCOL:\r
+                    {\r
+                        startbit_pulse_len          = A1TVBOX_BIT_PULSE_LEN;                        // don't use A1TVBOX_START_BIT_PULSE_LEN\r
+                        startbit_pause_len          = A1TVBOX_BIT_PAUSE_LEN;                        // don't use A1TVBOX_START_BIT_PAUSE_LEN\r
+                        pulse_len                   = A1TVBOX_BIT_PULSE_LEN;\r
+                        pause_len                   = A1TVBOX_BIT_PAUSE_LEN;\r
+                        has_stop_bit                = A1TVBOX_STOP_BIT;\r
+                        complete_data_len           = A1TVBOX_COMPLETE_DATA_LEN + 1;                // we send stop bit as data\r
+                        n_auto_repetitions          = 1;                                            // 1 frame\r
+                        auto_repetition_pause_len   = 0;\r
+                        repeat_frame_pause_len      = A1TVBOX_FRAME_REPEAT_PAUSE_LEN;\r
+                        irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+                        break;\r
+                    }\r
 #endif\r
                     default:\r
                     {\r
@@ -1801,7 +1832,6 @@ irsnd_ISR (void)
                 case IRMP_LEGO_PROTOCOL:\r
 #endif\r
 \r
-\r
 #if IRSND_SUPPORT_SIRCS_PROTOCOL == 1  || IRSND_SUPPORT_NEC_PROTOCOL == 1 || IRSND_SUPPORT_NEC16_PROTOCOL == 1 || IRSND_SUPPORT_NEC42_PROTOCOL == 1 || \\r
     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
@@ -2012,9 +2042,12 @@ irsnd_ISR (void)
 #if IRSND_SUPPORT_NOKIA_PROTOCOL == 1\r
                 case IRMP_NOKIA_PROTOCOL:\r
 #endif\r
+#if IRSND_SUPPORT_A1TVBOX_PROTOCOL == 1\r
+                case IRMP_A1TVBOX_PROTOCOL:\r
+#endif\r
 \r
 #if IRSND_SUPPORT_RC5_PROTOCOL == 1 || IRSND_SUPPORT_RC6_PROTOCOL == 1 || IRSND_SUPPORT_RC6A_PROTOCOL == 1 || IRSND_SUPPORT_SIEMENS_PROTOCOL == 1 || \\r
-    IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1 || IRSND_SUPPORT_IR60_PROTOCOL == 1 || IRSND_SUPPORT_NOKIA_PROTOCOL == 1\r
+    IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1 || IRSND_SUPPORT_IR60_PROTOCOL == 1 || IRSND_SUPPORT_NOKIA_PROTOCOL == 1 || IRSND_SUPPORT_A1TVBOX_PROTOCOL == 1\r
                 {\r
                     if (pulse_counter == pulse_len && pause_counter == pause_len)\r
                     {\r
@@ -2094,7 +2127,19 @@ irsnd_ISR (void)
                                     pulse_len = startbit_pulse_len;\r
                                     pause_len = startbit_pause_len;\r
                                 }\r
+                                else\r
 #endif\r
+#if IRSND_SUPPORT_A1TVBOX_PROTOCOL == 1\r
+                                if (irsnd_protocol == IRMP_A1TVBOX_PROTOCOL)\r
+                                {\r
+                                    current_bit = 0;\r
+                                }\r
+                                else\r
+#endif\r
+                                {\r
+                                    ;\r
+                                }\r
+\r
                                 first_pulse = TRUE;\r
                             }\r
                             else                                                                        // send n'th bit\r
@@ -2138,6 +2183,8 @@ irsnd_ISR (void)
 \r
                         if (first_pulse)\r
                         {\r
+                            // printf ("first_pulse: current_bit: %d  %d < %d  %d < %d\n", current_bit, pause_counter, pause_len, pulse_counter, pulse_len);\r
+\r
                             if (pulse_counter < pulse_len)\r
                             {\r
                                 if (pulse_counter == 0)\r
@@ -2157,7 +2204,7 @@ irsnd_ISR (void)
                         }\r
                         else\r
                         {\r
-                            // printf ("current_bit: %d  %d < %d  %d < %d\n", current_bit, pause_counter, pause_len, pulse_counter, pulse_len);\r
+                            // printf ("first_pause: current_bit: %d  %d < %d  %d < %d\n", current_bit, pause_counter, pause_len, pulse_counter, pulse_len);\r
 \r
                             if (pause_counter < pause_len)\r
                             {\r