*\r
* Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.17 2010/04/16 09:23:29 fm Exp $\r
+ * $Id: irmp.c,v 1.20 2010/04/19 13:42:17 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
* SIRCS - Sony\r
* NEC - NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, and many other Japanese manufacturers\r
* SAMSUNG - Samsung\r
+ * SAMSUNG32 - Samsung\r
* MATSUSHITA - Matsushita\r
* KASEIKYO - Panasonic, Denon & other Japanese manufacturers (members of "Japan's Association for Electric Home Application")\r
* RECS80 - Philips, Nokia, Thomson, Nordmende, Telefunken, Saba\r
#define AUTO_REPETITION_LEN (uint16_t)(F_INTERRUPTS * AUTO_REPETITION_TIME + 0.5) // use uint16_t!\r
\r
#ifdef DEBUG\r
-#define DEBUG_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
-#define DEBUG_PRINTF(...) { if (! silent) { printf (__VA_ARGS__); } }\r
+#define DEBUG_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
+#define DEBUG_PRINTF(...) { if (! silent) { printf (__VA_ARGS__); } }\r
static int silent;\r
#else\r
#define DEBUG_PUTCHAR(a)\r
#define UART_BAUD 9600L\r
\r
// calculate real baud rate:\r
-#define UBRR_VAL ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1) // round\r
-#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // real baudrate\r
+#define UBRR_VAL ((F_CPU + UART_BAUD * 8) / (UART_BAUD * 16) - 1) // round\r
+#define BAUD_REAL (F_CPU / (16 * (UBRR_VAL + 1))) // real baudrate\r
\r
#ifdef CODEVISION\r
-#if ((BAUD_REAL*1000)/UART_BAUD-1000) > 10\r
+#if ((BAUD_REAL * 1000) / UART_BAUD - 1000) > 10\r
# error Error of baud rate of RS232 UARTx is more than 1%. That is too high!\r
#endif\r
\r
#else // not CODEVISION\r
\r
-#define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD-1000) // error in promille\r
+#define BAUD_ERROR ((BAUD_REAL * 1000) / UART_BAUD - 1000) // error in promille\r
\r
#if ((BAUD_ERROR > 10) || (-BAUD_ERROR < 10))\r
# error Error of baud rate of RS232 UARTx is more than 1%. That is too high!\r
void\r
irmp_uart_init (void)\r
{\r
- UCSR0B |= (1<<TXEN0); // activate UART0 TX\r
- UBRR0H = UBRR_VAL >> 8; // store baudrate (upper byte)\r
- UBRR0L = UBRR_VAL & 0xFF; // store baudrate (lower byte)\r
+ UCSR0B |= (1<<TXEN0); // activate UART0 TX\r
+ UBRR0H = UBRR_VAL >> 8; // store baudrate (upper byte)\r
+ UBRR0L = UBRR_VAL & 0xFF; // store baudrate (lower byte)\r
}\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* Log IR signal\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-#define c_startcycles 2 // min count of zeros before start of logging\r
-#define c_endBits 1000 // log buffer size\r
-#define c_datalen 700 // number of sequenced highbits to detect end\r
+#define c_startcycles 2 // min count of zeros before start of logging\r
+#define c_endBits 1000 // log buffer size\r
+#define c_datalen 700 // number of sequenced highbits to detect end\r
\r
static void\r
irmp_logIr (uint8_t val)\r
{\r
- static uint8_t s_data[c_datalen]; // logging buffer\r
- static uint16_t s_dataIdx; // number of written bits\r
- static uint8_t s_startcycles; // current number of start-zeros\r
- static uint16_t s_ctr; // counts sequenced highbits - to detect end\r
+ static uint8_t s_data[c_datalen]; // logging buffer\r
+ static uint16_t s_dataIdx; // number of written bits\r
+ static uint8_t s_startcycles; // current number of start-zeros\r
+ static uint16_t s_ctr; // counts sequenced highbits - to detect end\r
\r
- if ((val == 0) && (s_startcycles < c_startcycles) && !s_dataIdx) // prevent that single random zeros init logging\r
+ if ((val == 0) && (s_startcycles < c_startcycles) && !s_dataIdx) // prevent that single random zeros init logging\r
{\r
++s_startcycles;\r
}\r
{\r
s_startcycles = 0;\r
\r
- if ( (val == 0) // start or continue logging on "0"\r
- || ((val == 1) && (s_dataIdx != 0))) // "1" cannot init logging\r
+ if ( (val == 0) // start or continue logging on "0"\r
+ || ((val == 1) && (s_dataIdx != 0))) // "1" cannot init logging\r
{\r
if (val)\r
- { // set or clear bit in bitarray\r
+ { // set or clear bit in bitarray\r
s_data[(s_dataIdx / 8)] |= (1<<(s_dataIdx % 8));\r
}\r
else\r
++s_dataIdx;\r
\r
if (val)\r
- { // if high received then look at log-stop condition\r
+ { // if high received then look at log-stop condition\r
++s_ctr;\r
\r
if (s_ctr > c_endBits)\r
- { // if stop condition (200 sequenced ones) meets, output on uart\r
+ { // if stop condition (200 sequenced ones) meets, output on uart\r
uint16_t i;\r
\r
for (i = 0; i < c_startcycles; ++i)\r
{\r
- irmp_uart_putc ('0'); // the ignored starting zeros\r
+ irmp_uart_putc ('0'); // the ignored starting zeros\r
}\r
\r
- for (i = 0;i < (s_dataIdx - c_endBits + 20) / 8; ++i) // transform bitset into uart chars\r
+ for (i = 0;i < (s_dataIdx - c_endBits + 20) / 8; ++i) // transform bitset into uart chars\r
{\r
uint8_t d = s_data[i];\r
uint8_t j;\r
NEC_LSB\r
};\r
\r
+static PROGMEM IRMP_PARAMETER nec_rep_param =\r
+{\r
+ IRMP_NEC_PROTOCOL,\r
+ NEC_PULSE_LEN_MIN,\r
+ NEC_PULSE_LEN_MAX,\r
+ NEC_1_PAUSE_LEN_MIN,\r
+ NEC_1_PAUSE_LEN_MAX,\r
+ NEC_PULSE_LEN_MIN,\r
+ NEC_PULSE_LEN_MAX,\r
+ NEC_0_PAUSE_LEN_MIN,\r
+ NEC_0_PAUSE_LEN_MAX,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ NEC_STOP_BIT,\r
+ NEC_LSB\r
+};\r
+\r
#endif\r
\r
#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
}\r
else\r
{ // receiving first data pulse!\r
+ IRMP_PARAMETER * irmp_param_p = (IRMP_PARAMETER *) 0;\r
+\r
DEBUG_PRINTF ("start-bit: pulse = %d, pause = %d\n", irmp_pulse_time, irmp_pause_time);\r
\r
#if IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
if (irmp_pulse_time >= SIRCS_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SIRCS_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= SIRCS_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SIRCS_START_BIT_PAUSE_LEN_MAX)\r
- { // it's SIRCS\r
+ { // it's SIRCS\r
DEBUG_PRINTF ("protocol = SIRCS, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
SIRCS_START_BIT_PULSE_LEN_MIN, SIRCS_START_BIT_PULSE_LEN_MAX,\r
SIRCS_START_BIT_PAUSE_LEN_MIN, SIRCS_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &sircs_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) (IRMP_PARAMETER *) &sircs_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
\r
#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
- ((irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX) ||\r
- (irmp_pause_time >= NEC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_REPEAT_START_BIT_PAUSE_LEN_MAX)))\r
- { // it's NEC\r
- if (irmp_pause_time <= NEC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
- {\r
- DEBUG_PRINTF ("protocol = NEC (repetition frame), start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
- NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
- NEC_REPEAT_START_BIT_PAUSE_LEN_MIN, NEC_REPEAT_START_BIT_PAUSE_LEN_MAX);\r
- }\r
- else\r
- {\r
- DEBUG_PRINTF ("protocol = NEC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
- NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
- NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX);\r
- }\r
-\r
- memcpy_P (&irmp_param, &nec_param, sizeof (IRMP_PARAMETER));\r
-\r
- if (irmp_pause_time <= NEC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
- {\r
- irmp_param.address_offset = 0;\r
- irmp_param.address_end = 0;\r
- irmp_param.command_offset = 0;\r
- irmp_param.command_end = 0;\r
- irmp_param.complete_len = 0;\r
- }\r
+ irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+ DEBUG_PRINTF ("protocol = NEC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
+ NEC_START_BIT_PAUSE_LEN_MIN, NEC_START_BIT_PAUSE_LEN_MAX);\r
+ irmp_param_p = (IRMP_PARAMETER *) &nec_param;\r
+ }\r
+ else if (irmp_pulse_time >= NEC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NEC_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= NEC_REPEAT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_REPEAT_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's NEC\r
+ DEBUG_PRINTF ("protocol = NEC (repetition frame), start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ NEC_START_BIT_PULSE_LEN_MIN, NEC_START_BIT_PULSE_LEN_MAX,\r
+ NEC_REPEAT_START_BIT_PAUSE_LEN_MIN, NEC_REPEAT_START_BIT_PAUSE_LEN_MAX);\r
+\r
+ irmp_param_p = (IRMP_PARAMETER *) &nec_rep_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
if (irmp_pulse_time >= SAMSUNG_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SAMSUNG_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= SAMSUNG_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SAMSUNG_START_BIT_PAUSE_LEN_MAX)\r
- { // it's SAMSUNG\r
+ { // it's SAMSUNG\r
DEBUG_PRINTF ("protocol = SAMSUNG, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
SAMSUNG_START_BIT_PULSE_LEN_MIN, SAMSUNG_START_BIT_PULSE_LEN_MAX,\r
SAMSUNG_START_BIT_PAUSE_LEN_MIN, SAMSUNG_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &samsung_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &samsung_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
#if IRMP_SUPPORT_MATSUSHITA_PROTOCOL == 1\r
if (irmp_pulse_time >= MATSUSHITA_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MATSUSHITA_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= MATSUSHITA_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MATSUSHITA_START_BIT_PAUSE_LEN_MAX)\r
- { // it's MATSUSHITA\r
+ { // it's MATSUSHITA\r
DEBUG_PRINTF ("protocol = MATSUSHITA, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
MATSUSHITA_START_BIT_PULSE_LEN_MIN, MATSUSHITA_START_BIT_PULSE_LEN_MAX,\r
MATSUSHITA_START_BIT_PAUSE_LEN_MIN, MATSUSHITA_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &matsushita_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &matsushita_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_MATSUSHITA_PROTOCOL == 1\r
#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
if (irmp_pulse_time >= KASEIKYO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= KASEIKYO_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= KASEIKYO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= KASEIKYO_START_BIT_PAUSE_LEN_MAX)\r
- { // it's KASEIKYO\r
+ { // it's KASEIKYO\r
DEBUG_PRINTF ("protocol = KASEIKYO, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
KASEIKYO_START_BIT_PULSE_LEN_MIN, KASEIKYO_START_BIT_PULSE_LEN_MAX,\r
KASEIKYO_START_BIT_PAUSE_LEN_MIN, KASEIKYO_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &kaseikyo_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &kaseikyo_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
#if IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
if (irmp_pulse_time >= RECS80_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RECS80_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= RECS80_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RECS80_START_BIT_PAUSE_LEN_MAX)\r
- { // it's RECS80\r
+ { // it's RECS80\r
DEBUG_PRINTF ("protocol = RECS80, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
RECS80_START_BIT_PULSE_LEN_MIN, RECS80_START_BIT_PULSE_LEN_MAX,\r
RECS80_START_BIT_PAUSE_LEN_MIN, RECS80_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &recs80_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &recs80_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
(irmp_pulse_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX)) &&\r
((irmp_pause_time >= RC5_START_BIT_LEN_MIN && irmp_pause_time <= RC5_START_BIT_LEN_MAX) ||\r
(irmp_pause_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pause_time <= 2 * RC5_START_BIT_LEN_MAX)))\r
- { // it's RC5\r
+ { // it's RC5\r
DEBUG_PRINTF ("protocol = RC5, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX);\r
- memcpy_P (&irmp_param, &rc5_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &rc5_param;\r
last_pause = irmp_pause_time;\r
\r
if ((irmp_pulse_time > RC5_START_BIT_LEN_MAX && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX) ||\r
DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX,\r
DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX,\r
DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &denon_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &denon_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
DEBUG_PRINTF ("protocol = RC6, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX,\r
RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &rc6_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &rc6_param;\r
last_pause = 0;\r
last_value = 0;\r
}\r
#if IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
if (irmp_pulse_time >= RECS80EXT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RECS80EXT_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= RECS80EXT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RECS80EXT_START_BIT_PAUSE_LEN_MAX)\r
- { // it's RECS80EXT\r
+ { // it's RECS80EXT\r
DEBUG_PRINTF ("protocol = RECS80EXT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
RECS80EXT_START_BIT_PULSE_LEN_MIN, RECS80EXT_START_BIT_PULSE_LEN_MAX,\r
RECS80EXT_START_BIT_PAUSE_LEN_MIN, RECS80EXT_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &recs80ext_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &recs80ext_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
#if IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
if (irmp_pulse_time >= NUBERT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NUBERT_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= NUBERT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NUBERT_START_BIT_PAUSE_LEN_MAX)\r
- { // it's NUBERT\r
+ { // it's NUBERT\r
DEBUG_PRINTF ("protocol = NUBERT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
NUBERT_START_BIT_PULSE_LEN_MIN, NUBERT_START_BIT_PULSE_LEN_MAX,\r
NUBERT_START_BIT_PAUSE_LEN_MIN, NUBERT_START_BIT_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &nubert_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &nubert_param;\r
}\r
else\r
#endif // IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
if (irmp_pulse_time >= BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN && irmp_pulse_time <= BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX &&\r
irmp_pause_time >= BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX)\r
- { // it's BANG_OLUFSEN\r
+ { // it's BANG_OLUFSEN\r
DEBUG_PRINTF ("protocol = BANG_OLUFSEN\n");\r
DEBUG_PRINTF ("start bit 1 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX,\r
DEBUG_PRINTF ("start bit 4 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
BANG_OLUFSEN_START_BIT4_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PULSE_LEN_MAX,\r
BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MAX);\r
- memcpy_P (&irmp_param, &bang_olufsen_param, sizeof (IRMP_PARAMETER));\r
+ irmp_param_p = (IRMP_PARAMETER *) &bang_olufsen_param;\r
last_value = 0;\r
}\r
else\r
\r
if (irmp_start_bit_detected)\r
{\r
+ memcpy_P (&irmp_param, irmp_param_p, sizeof (IRMP_PARAMETER));\r
+\r
DEBUG_PRINTF ("pulse_1: %3d - %3d\n", irmp_param.pulse_1_len_min, irmp_param.pulse_1_len_max);\r
DEBUG_PRINTF ("pause_1: %3d - %3d\n", irmp_param.pause_1_len_min, irmp_param.pause_1_len_max);\r
+\r
#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
if (irmp_param.protocol == IRMP_RC6_PROTOCOL)\r
{\r
#endif\r
DEBUG_PRINTF ("pulse_0: %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
DEBUG_PRINTF ("pause_0: %3d - %3d\n", irmp_param.pause_0_len_min, irmp_param.pause_0_len_max);\r
+\r
#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
if (irmp_param.protocol == IRMP_BANG_OLUFSEN_PROTOCOL)\r
{\r
#endif\r
\r
DEBUG_PRINTF ("command_offset: %2d\n", irmp_param.command_offset);\r
- DEBUG_PRINTF ("command_len: %3d\n", irmp_param.command_end - irmp_param.command_offset);\r
- DEBUG_PRINTF ("complete_len: %3d\n", irmp_param.complete_len);\r
- DEBUG_PRINTF ("stop_bit: %3d\n", irmp_param.stop_bit);\r
+ DEBUG_PRINTF ("command_len: %3d\n", irmp_param.command_end - irmp_param.command_offset);\r
+ DEBUG_PRINTF ("complete_len: %3d\n", irmp_param.complete_len);\r
+ DEBUG_PRINTF ("stop_bit: %3d\n", irmp_param.stop_bit);\r
}\r
\r
irmp_bit = 0;\r
irmp_pause_time > SIRCS_PAUSE_LEN_MAX && // minimum is 12\r
irmp_bit >= 12 - 1) // pause too long?\r
{ // yes, break and close this frame\r
- irmp_param.complete_len = irmp_bit + 1; // set new complete length\r
+ irmp_param.complete_len = irmp_bit + 1; // set new complete length\r
got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
irmp_param.command_end = irmp_param.command_offset + irmp_bit + 1; // correct command length\r
irmp_pause_time = SIRCS_PAUSE_LEN_MAX - 1; // correct pause length\r
irmp_pause_time > 2 * RC5_BIT_LEN_MAX && irmp_bit >= RC5_COMPLETE_DATA_LEN - 2 && !irmp_param.stop_bit)\r
{ // special rc5 decoder\r
got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
- irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.stop_bit = TRUE; // set flag\r
}\r
else\r
#endif\r
irmp_pause_time > 2 * RC6_BIT_LEN_MAX && irmp_bit >= irmp_param.complete_len - 2 && !irmp_param.stop_bit)\r
{ // special rc6 decoder\r
got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
- irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.stop_bit = TRUE; // set flag\r
}\r
else\r
#endif\r
DEBUG_PRINTF ("[bit %2d: pulse = %3d, pause = %3d] ", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
- if (irmp_param.protocol == IRMP_RC5_PROTOCOL) // special rc5 decoder\r
+ if (irmp_param.protocol == IRMP_RC5_PROTOCOL) // special rc5 decoder\r
{\r
if (irmp_pulse_time > RC5_BIT_LEN_MAX && irmp_pulse_time <= 2 * RC5_BIT_LEN_MAX)\r
{\r
wait_for_space = 0;\r
}\r
else\r
-#endif\r
+#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
\r
#if IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
if (irmp_param.protocol == IRMP_SAMSUNG_PROTOCOL && irmp_bit == 16) // Samsung: 16th bit\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
-\r
- irmp_pulse_time = 1; // set counter to 1, not 0\r
}\r
else\r
#endif // IRMP_SUPPORT_SAMSUNG_PROTOCOL\r
{\r
if (irmp_pulse_time >= BANG_OLUFSEN_PULSE_LEN_MIN && irmp_pulse_time <= BANG_OLUFSEN_PULSE_LEN_MAX)\r
{\r
- if (irmp_bit == 1) // Bang & Olufsen: 3rd bit\r
+ if (irmp_bit == 1) // Bang & Olufsen: 3rd bit\r
{\r
if (irmp_pause_time >= BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX)\r
{\r
else\r
{ // timing incorrect!\r
DEBUG_PRINTF ("error 3a B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
- irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
+ irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
-\r
- irmp_pulse_time = 1; // set counter to 1, not 0\r
}\r
- else if (irmp_bit == 19) // Bang & Olufsen: trailer bit\r
+ else if (irmp_bit == 19) // Bang & Olufsen: trailer bit\r
{\r
if (irmp_pause_time >= BANG_OLUFSEN_TRAILER_BIT_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_TRAILER_BIT_PAUSE_LEN_MAX)\r
{\r
irmp_bit++;\r
}\r
else\r
- { // timing incorrect!\r
+ { // timing incorrect!\r
DEBUG_PRINTF ("error 3b B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
- irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
+ irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
-\r
- irmp_pulse_time = 1; // set counter to 1, not 0\r
}\r
else\r
{\r
- if (irmp_pause_time >= irmp_param.pause_1_len_min && irmp_pause_time <= irmp_param.pause_1_len_max)\r
- { // pulse & pause timings correct for "1"?\r
+ if (irmp_pause_time >= BANG_OLUFSEN_1_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_1_PAUSE_LEN_MAX)\r
+ { // pulse & pause timings correct for "1"?\r
DEBUG_PUTCHAR ('1');\r
DEBUG_PUTCHAR ('\n');\r
irmp_store_bit (1);\r
last_value = 1;\r
wait_for_space = 0;\r
}\r
- else if (irmp_pause_time >= irmp_param.pause_0_len_min && irmp_pause_time <= irmp_param.pause_0_len_max)\r
- { // pulse & pause timings correct for "0"?\r
+ else if (irmp_pause_time >= BANG_OLUFSEN_0_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_0_PAUSE_LEN_MAX)\r
+ { // pulse & pause timings correct for "0"?\r
DEBUG_PUTCHAR ('0');\r
DEBUG_PUTCHAR ('\n');\r
irmp_store_bit (0);\r
wait_for_space = 0;\r
}\r
else\r
- { // timing incorrect!\r
+ { // timing incorrect!\r
DEBUG_PRINTF ("error 3c B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
- irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
+ irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
}\r
}\r
else\r
- { // timing incorrect!\r
+ { // timing incorrect!\r
DEBUG_PRINTF ("error 3d B&O: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
- irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
+ irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
}\r
}\r
*\r
* Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsnd.c,v 1.7 2010/04/14 13:21:39 fm Exp $\r
+ * $Id: irsnd.c,v 1.9 2010/04/28 14:58: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
#endif // WIN32\r
#endif // unix\r
\r
-#include "irmpconfig.h"\r
#include "irmp.h"\r
+#include "irsndconfig.h"\r
#include "irsnd.h"\r
\r
-/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * Change settings from 1 to 0 if you want to disable one or more encoders.\r
- * This saves program space.\r
- * 1 enable decoder\r
- * 0 disable decoder\r
- *---------------------------------------------------------------------------------------------------------------------------------------------------\r
- */\r
-#define IRSND_SUPPORT_SIRCS_PROTOCOL 1 // flag: support SIRCS uses ~150 bytes\r
-#define IRSND_SUPPORT_NEC_PROTOCOL 1 // flag: support NEC uses ~100 bytes\r
-#define IRSND_SUPPORT_SAMSUNG_PROTOCOL 1 // flag: support Samsung + Samsung32 uses ~300 bytes\r
-#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL 1 // flag: support Matsushita uses ~150 bytes\r
-#define IRSND_SUPPORT_KASEIKYO_PROTOCOL 0 // flag: support Kaseikyo NOT SUPPORTED YET!\r
-#define IRSND_SUPPORT_RECS80_PROTOCOL 1 // flag: support RECS80 uses ~100 bytes\r
-#define IRSND_SUPPORT_RC5_PROTOCOL 1 // flag: support RC5 uses ~250 bytes\r
-#define IRSND_SUPPORT_DENON_PROTOCOL 1 // flag: support DENON uses ~200 bytes\r
-#define IRSND_SUPPORT_RC6_PROTOCOL 0 // flag: support RC6 NOT SUPPORTED YET!\r
-#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
-\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
-\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
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
+#endif // __AVR...\r
#endif // DEBUG\r
irsnd_is_on = TRUE;\r
}\r
TCCR2 &= ~(1<<COM20); // normal port operation, OC2A disconnected.\r
#else\r
TCCR2A &= ~(1<<COM2A0); // normal port operation, OC2A disconnected.\r
-#endif // __AVR...\r
+#endif // __AVR...\r
IRSND_PORT &= ~(1<<IRSND_BIT); // set IRSND_BIT to low\r
#endif // DEBUG\r
irsnd_is_on = FALSE;\r
OCR2 = freq;\r
#else\r
OCR2A = freq;\r
-#endif // __AVR...\r
+#endif // __AVR...\r
#endif // DEBUG\r
}\r
\r
#else\r
TCCR2A = (1<<WGM21); // CTC mode\r
TCCR2B |= (1<<CS20); // 0x01, start Timer 2, no prescaling\r
-#endif // __AVR... \r
+#endif // __AVR... \r
\r
irsnd_set_freq (IRSND_FREQ_36_KHZ); // default frequency\r
#endif // DEBUG\r
{\r
command = bitsrevervse (irmp_data_p->command, SIRCS_MINIMUM_DATA_LEN);\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = (command & 0x0FF0) >> 4; // CCCCCCCC\r
irsnd_buffer[1] = (command & 0x000F) << 4; // CCCC0000\r
irsnd_busy = TRUE;\r
#endif\r
#if IRSND_SUPPORT_NEC_PROTOCOL == 1\r
case IRMP_NEC_PROTOCOL:\r
+ case IRMP_APPLE_PROTOCOL:\r
{\r
address = bitsrevervse (irmp_data_p->address, NEC_ADDRESS_LEN);\r
command = bitsrevervse (irmp_data_p->command, NEC_COMMAND_LEN);\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
irsnd_buffer[2] = (command & 0xFF00) >> 8; // CCCCCCCC\r
- irsnd_buffer[3] = ~((command & 0xFF00) >> 8); // cccccccc\r
+\r
+ if (irsnd_protocol == IRMP_APPLE_PROTOCOL)\r
+ {\r
+ irsnd_protocol = IRMP_NEC_PROTOCOL; // APPLE protocol is NEC with fix bitmask instead of inverted command\r
+ irsnd_buffer[3] = 0x8B; // 10001011\r
+ }\r
+ else\r
+ {\r
+ irsnd_buffer[3] = ~((command & 0xFF00) >> 8); // cccccccc\r
+ }\r
+\r
irsnd_busy = TRUE;\r
break;\r
}\r
address = bitsrevervse (irmp_data_p->address, SAMSUNG_ADDRESS_LEN);\r
command = bitsrevervse (irmp_data_p->command, SAMSUNG_COMMAND_LEN);\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
irsnd_buffer[2] = (command & 0x00F0) | ((command & 0xF000) >> 12); // IIIICCCC\r
address = bitsrevervse (irmp_data_p->address, SAMSUNG_ADDRESS_LEN);\r
command = bitsrevervse (irmp_data_p->command, SAMSUNG32_COMMAND_LEN);\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA\r
irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
irsnd_buffer[2] = (command & 0xFF00) >> 8; // CCCCCCCC\r
address = bitsrevervse (irmp_data_p->address, MATSUSHITA_ADDRESS_LEN);\r
command = bitsrevervse (irmp_data_p->command, MATSUSHITA_COMMAND_LEN);\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = (command & 0x0FF0) >> 4; // CCCCCCCC\r
irsnd_buffer[1] = ((command & 0x000F) << 4) | ((address & 0x0F00) >> 8); // CCCCAAAA\r
irsnd_buffer[2] = (address & 0x00FF); // AAAAAAAA\r
{\r
toggle_bit_recs80 = toggle_bit_recs80 ? 0x00 : 0x40;\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = 0x80 | toggle_bit_recs80 | ((irmp_data_p->address & 0x0007) << 3) |\r
((irmp_data_p->command & 0x0038) >> 3); // STAAACCC\r
irsnd_buffer[1] = (irmp_data_p->command & 0x07) << 5; // CCC00000\r
{\r
toggle_bit_recs80ext = toggle_bit_recs80ext ? 0x00 : 0x40;\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = 0x80 | toggle_bit_recs80ext | ((irmp_data_p->address & 0x000F) << 2) |\r
((irmp_data_p->command & 0x0030) >> 4); // STAAAACC\r
irsnd_buffer[1] = (irmp_data_p->command & 0x0F) << 4; // CCCC0000\r
{\r
toggle_bit_rc5 = toggle_bit_rc5 ? 0x00 : 0x40;\r
\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = ((irmp_data_p->command & 0x40) ? 0x00 : 0x80) | toggle_bit_rc5 |\r
((irmp_data_p->address & 0x001F) << 1) | ((irmp_data_p->command & 0x20) >> 5); // CTAAAAAC\r
irsnd_buffer[1] = (irmp_data_p->command & 0x1F) << 3; // CCCCC000\r
#if IRSND_SUPPORT_DENON_PROTOCOL == 1\r
case IRMP_DENON_PROTOCOL:\r
{\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = ((irmp_data_p->address & 0x1F) << 3) | ((irmp_data_p->command & 0x0380) >> 7); // AAAAACCC\r
irsnd_buffer[1] = (irmp_data_p->command & 0x7F) << 1; // CCCCCCC0\r
irsnd_buffer[2] = ((irmp_data_p->address & 0x1F) << 3) | (((~irmp_data_p->command) & 0x0380) >> 7); // AAAAACCC\r
#if IRSND_SUPPORT_NUBERT_PROTOCOL == 1\r
case IRMP_NUBERT_PROTOCOL:\r
{\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = irmp_data_p->command >> 2; // CCCCCCCC\r
irsnd_buffer[1] = (irmp_data_p->command & 0x0003) << 6; // CC000000\r
irsnd_busy = TRUE;\r
#if IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
case IRMP_BANG_OLUFSEN_PROTOCOL:\r
{\r
- irsnd_protocol = irmp_data_p->protocol;\r
irsnd_buffer[0] = irmp_data_p->command >> 11; // SXSCCCCC\r
irsnd_buffer[1] = irmp_data_p->command >> 3; // CCCCCCCC\r
irsnd_buffer[2] = (irmp_data_p->command & 0x0007) << 5; // CCC00000\r