*\r
* Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.79 2010/08/28 22:14:56 fm Exp $\r
+ * $Id: irmp.c,v 1.82 2010/08/31 15:22:24 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
#define IRMP_SUPPORT_MANCHESTER 0\r
#endif\r
\r
-#define IRMP_TIMEOUT_TIME 16500.0e-6 // timeout after 16.5 ms darkness\r
-#define IRMP_TIMEOUT_TIME_MS 16500L // timeout after 16.5 ms darkness\r
-\r
-#if (F_INTERRUPTS * IRMP_TIMEOUT_TIME_MS) / 1000000 >= 254\r
-typedef uint16_t PAUSE_LEN;\r
-#else\r
-typedef uint8_t PAUSE_LEN;\r
-#endif\r
-\r
-#define IRMP_TIMEOUT_LEN (PAUSE_LEN)(F_INTERRUPTS * IRMP_TIMEOUT_TIME + 0.5)\r
#define IRMP_KEY_REPETITION_LEN (uint16_t)(F_INTERRUPTS * 150.0e-3 + 0.5) // autodetect key repetition within 150 msec\r
\r
#define MIN_TOLERANCE_00 1.0 // -0%\r
#define RC6_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RC6_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
#define RC6_TOGGLE_BIT_LEN_MIN ((uint8_t)(F_INTERRUPTS * RC6_TOGGLE_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
#define RC6_TOGGLE_BIT_LEN_MAX ((uint8_t)(F_INTERRUPTS * RC6_TOGGLE_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
-#define RC6_BIT_LEN_MIN ((uint8_t)(F_INTERRUPTS * RC6_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
-#define RC6_BIT_LEN_MAX ((uint8_t)(F_INTERRUPTS * RC6_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define RC6_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * RC6_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define RC6_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RC6_BIT_TIME * MAX_TOLERANCE_30 + 0.5) + 1) // pulses: 300 - 700\r
+#define RC6_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * RC6_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1) // pauses: 300 - 600\r
+#define RC6_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RC6_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
\r
#define RECS80EXT_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * RECS80EXT_START_BIT_PULSE_TIME * MIN_TOLERANCE_00 + 0.5) - 1)\r
#define RECS80EXT_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * RECS80EXT_START_BIT_PULSE_TIME * MAX_TOLERANCE_00 + 0.5) + 1)\r
#endif\r
#define UART0_TXEN_BIT_VALUE (1<<TXEN0)\r
#define UART0_UDR UDR0\r
+#define UART0_U2X U2X0\r
\r
#else\r
\r
#endif\r
#define UART0_TXEN_BIT_VALUE (1<<TXEN)\r
#define UART0_UDR UDR\r
+#define UART0_U2X U2X\r
\r
#endif\r
\r
UART0_UBRRL = UBRRL_VALUE;\r
\r
#if USE_2X\r
- UART0_UCSRA |= (1<<U2X);\r
+ UART0_UCSRA |= (1<<UART0_U2X);\r
#else\r
- UART0_UCSRA &= ~(1<<U2X);\r
+ UART0_UCSRA &= ~(1<<UART0_U2X);\r
#endif\r
\r
UART0_UCSRC = UART0_UCSZ1_BIT_VALUE | UART0_UCSZ0_BIT_VALUE | UART0_URSEL_BIT_VALUE;\r
static PROGMEM IRMP_PARAMETER rc6_param =\r
{\r
IRMP_RC6_PROTOCOL, // protocol: ir protocol\r
- RC6_BIT_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
- RC6_BIT_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
- RC6_BIT_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
- RC6_BIT_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
+ RC6_BIT_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
+ RC6_BIT_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
+ RC6_BIT_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
+ RC6_BIT_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
1, // tricky: use this as stop bit length // pulse_0_len_min: minimum length of pulse with bit value 0\r
1, // pulse_0_len_max: maximum length of pulse with bit value 0\r
1, // pause_0_len_min: minimum length of pause with bit value 0\r
static PAUSE_LEN irmp_pause_time; // count bit time for pause\r
static uint16_t last_irmp_address = 0xFFFF; // save last irmp address to recognize key repetition\r
static uint16_t last_irmp_command = 0xFFFF; // save last irmp command to recognize key repetition\r
- static uint16_t repetition_counter; // SIRCS repeats frame 2-5 times with 45 ms pause\r
+ static uint16_t repetition_len; // SIRCS repeats frame 2-5 times with 45 ms pause\r
static uint8_t repetition_frame_number;\r
#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
static uint16_t last_irmp_denon_command; // save last irmp command to recognize DENON frame repetition\r
}\r
else\r
{\r
- if (repetition_counter < 0xFFFF) // avoid overflow of counter\r
+ if (repetition_len < 0xFFFF) // avoid overflow of counter\r
{\r
- repetition_counter++;\r
+ repetition_len++;\r
}\r
}\r
}\r
\r
if (irmp_pause_time > IRMP_TIMEOUT_LEN) // timeout?\r
{ // yes...\r
- ANALYZE_PRINTF ("error 1: pause after start bit pulse %d too long: %d\n", irmp_pulse_time, irmp_pause_time);\r
- ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ if (irmp_protocol == IRMP_JVC_PROTOCOL) // don't show eror if JVC protocol, irmp_pulse_time has been set below!\r
+ {\r
+ ;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ {\r
+ ANALYZE_PRINTF ("%8d error 1: pause after start bit pulse %d too long: %d\n", time_counter, irmp_pulse_time, irmp_pause_time);\r
+ ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
+ }\r
irmp_start_bit_detected = 0; // reset flags, let's wait for another start bit\r
irmp_pulse_time = 0;\r
irmp_pause_time = 0;\r
irmp_param2.protocol = 0;\r
#endif\r
\r
- ANALYZE_PRINTF ("start-bit: pulse = %d, pause = %d\n", irmp_pulse_time, irmp_pause_time);\r
+ ANALYZE_PRINTF ("%8d [start-bit: pulse = %2d, pause = %2d]\n", time_counter, 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
RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX);\r
irmp_param_p = (IRMP_PARAMETER *) &rc6_param;\r
last_pause = 0;\r
- last_value = 0;\r
+ last_value = 1;\r
}\r
else\r
#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
else\r
{\r
ANALYZE_PRINTF ("pulse: %3d - %3d or %3d - %3d\n", irmp_param.pulse_1_len_min, irmp_param.pulse_1_len_max,\r
- 2 * irmp_param.pulse_1_len_min, 2 * irmp_param.pulse_1_len_max);\r
+ irmp_param.pulse_1_len_max + 1, 2 * irmp_param.pulse_1_len_max);\r
ANALYZE_PRINTF ("pause: %3d - %3d or %3d - %3d\n", irmp_param.pause_1_len_min, irmp_param.pause_1_len_max,\r
- 2 * irmp_param.pause_1_len_min, 2 * irmp_param.pause_1_len_max);\r
+ irmp_param.pause_1_len_max + 1, 2 * irmp_param.pause_1_len_max);\r
}\r
\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
#if IRMP_SUPPORT_MANCHESTER == 1\r
if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER)) // Manchester\r
{\r
-#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
- if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_bit >= 3 && irmp_bit <= 5) // special bits of RC6\r
+ if (irmp_pulse_time > irmp_param.pulse_1_len_max /* && irmp_pulse_time <= 2 * irmp_param.pulse_1_len_max */)\r
{\r
- if (irmp_pulse_time > RC6_TOGGLE_BIT_LEN_MAX && irmp_pause_time > RC6_TOGGLE_BIT_LEN_MAX)\r
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_bit == 4 && irmp_pulse_time > RC6_TOGGLE_BIT_LEN_MIN) // RC6 toggle bit\r
{\r
- ANALYZE_PUTCHAR ('1');\r
- irmp_store_bit (1);\r
+ ANALYZE_PUTCHAR ('T');\r
+ if (irmp_param.complete_len == RC6_COMPLETE_DATA_LEN_LONG) // RC6 mode 6A\r
+ {\r
+ irmp_store_bit (1);\r
+ last_value = 1;\r
+ }\r
+ else // RC6 mode 0\r
+ {\r
+ irmp_store_bit (0);\r
+ last_value = 0;\r
+ }\r
+ ANALYZE_NEWLINE ();\r
}\r
+ else\r
+#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ {\r
+ ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '0' : '1');\r
+ irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1 );\r
\r
- ANALYZE_PUTCHAR ('0');\r
- irmp_store_bit (0);\r
- last_value = 0;\r
- ANALYZE_NEWLINE ();\r
- }\r
- else\r
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_bit == 4 && irmp_pulse_time > RC6_TOGGLE_BIT_LEN_MIN) // RC6 toggle bit\r
+ {\r
+ ANALYZE_PUTCHAR ('T');\r
+ irmp_store_bit (1);\r
+\r
+ if (irmp_pause_time > 2 * irmp_param.pause_1_len_max)\r
+ {\r
+ last_value = 0;\r
+ }\r
+ else\r
+ {\r
+ last_value = 1;\r
+ }\r
+ ANALYZE_NEWLINE ();\r
+ }\r
+ else\r
#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
- if (irmp_pulse_time > irmp_param.pulse_1_len_max && irmp_pulse_time <= 2 * irmp_param.pulse_1_len_max)\r
- {\r
- ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '0' : '1');\r
- irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1 );\r
- ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '1' : '0');\r
- irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0 );\r
+ {\r
+ ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '1' : '0');\r
+ irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0 );\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
- if (! irmp_param2.protocol)\r
+ if (! irmp_param2.protocol)\r
#endif\r
- {\r
- ANALYZE_NEWLINE ();\r
+ {\r
+ ANALYZE_NEWLINE ();\r
+ }\r
+ last_value = (irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0;\r
+ }\r
}\r
- last_value = (irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0;\r
}\r
else if (irmp_pulse_time >= irmp_param.pulse_1_len_min && irmp_pulse_time <= irmp_param.pulse_1_len_max)\r
{\r
manchester_value = last_value;\r
}\r
\r
-#if 0\r
-#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
- if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_bit == 1 && manchester_value == 0) // RC6 mode != 0 ???\r
- {\r
- irmp_param.complete_len = RC6_COMPLETE_DATA_LEN_LONG;\r
- }\r
-#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
-#endif // 0\r
-\r
ANALYZE_PUTCHAR (manchester_value + '0');\r
+\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
if (! irmp_param2.protocol)\r
#endif\r
{\r
ANALYZE_NEWLINE ();\r
}\r
+\r
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_bit == 1 && manchester_value == 1) // RC6 mode != 0 ???\r
+ {\r
+ ANALYZE_PRINTF ("Switching to RC6A protocol\n");\r
+ irmp_param.complete_len = RC6_COMPLETE_DATA_LEN_LONG;\r
+ irmp_param.address_offset = 5;\r
+ irmp_param.address_end = irmp_param.address_offset + 15;\r
+ irmp_param.command_offset = irmp_param.address_end + 1; // skip 1 system bit, changes like a toggle bit\r
+ irmp_param.command_end = irmp_param.command_offset + 16 - 1;\r
+ irmp_tmp_address = 1; // addr 0 - 32767 --> 32768 - 65535\r
+ }\r
+#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+\r
irmp_store_bit (manchester_value);\r
}\r
else\r
{\r
ANALYZE_PUTCHAR ('?');\r
ANALYZE_NEWLINE ();\r
- ANALYZE_PRINTF ("error 3 RC5: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+ ANALYZE_PRINTF ("error 3 manchester: timing not correct: data bit %d, pulse: %d, pause: %d\n", irmp_bit, irmp_pulse_time, irmp_pause_time);\r
ANALYZE_ONLY_NORMAL_PUTCHAR ('\n');\r
irmp_start_bit_detected = 0; // reset flags and wait for next start bit\r
irmp_pause_time = 0;\r
\r
if (irmp_start_bit_detected && irmp_bit == irmp_param.complete_len && irmp_param.stop_bit == 0) // enough bits received?\r
{\r
- if (last_irmp_command == irmp_tmp_command && repetition_counter < AUTO_FRAME_REPETITION_LEN)\r
+ if (last_irmp_command == irmp_tmp_command && repetition_len < AUTO_FRAME_REPETITION_LEN)\r
{\r
repetition_frame_number++;\r
}\r
if (irmp_param.protocol == IRMP_SIRCS_PROTOCOL && (repetition_frame_number == 1 || repetition_frame_number == 2))\r
{\r
ANALYZE_PRINTF ("code skipped: SIRCS auto repetition frame #%d, counter = %d, auto repetition len = %d\n",\r
- repetition_frame_number + 1, repetition_counter, AUTO_FRAME_REPETITION_LEN);\r
- repetition_counter = 0;\r
+ repetition_frame_number + 1, repetition_len, AUTO_FRAME_REPETITION_LEN);\r
+ repetition_len = 0;\r
}\r
else\r
#endif\r
if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && repetition_frame_number == 1)\r
{\r
ANALYZE_PRINTF ("code skipped: KASEIKYO auto repetition frame #%d, counter = %d, auto repetition len = %d\n",\r
- repetition_frame_number + 1, repetition_counter, AUTO_FRAME_REPETITION_LEN);\r
- repetition_counter = 0;\r
+ repetition_frame_number + 1, repetition_len, AUTO_FRAME_REPETITION_LEN);\r
+ repetition_len = 0;\r
}\r
else\r
#endif\r
if (irmp_param.protocol == IRMP_SAMSUNG32_PROTOCOL && (repetition_frame_number & 0x01))\r
{\r
ANALYZE_PRINTF ("code skipped: SAMSUNG32 auto repetition frame #%d, counter = %d, auto repetition len = %d\n",\r
- repetition_frame_number + 1, repetition_counter, AUTO_FRAME_REPETITION_LEN);\r
- repetition_counter = 0;\r
+ repetition_frame_number + 1, repetition_len, AUTO_FRAME_REPETITION_LEN);\r
+ repetition_len = 0;\r
}\r
else\r
#endif\r
if (irmp_param.protocol == IRMP_NUBERT_PROTOCOL && (repetition_frame_number & 0x01))\r
{\r
ANALYZE_PRINTF ("code skipped: NUBERT auto repetition frame #%d, counter = %d, auto repetition len = %d\n",\r
- repetition_frame_number + 1, repetition_counter, AUTO_FRAME_REPETITION_LEN);\r
- repetition_counter = 0;\r
+ repetition_frame_number + 1, repetition_len, AUTO_FRAME_REPETITION_LEN);\r
+ repetition_len = 0;\r
}\r
else\r
#endif\r
\r
{\r
- ANALYZE_PRINTF ("code detected, length = %d\n", irmp_bit);\r
+ ANALYZE_PRINTF ("%8d code detected, length = %d\n", time_counter, irmp_bit);\r
irmp_ir_detected = TRUE;\r
\r
#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
if (irmp_param.protocol == IRMP_NEC_PROTOCOL && irmp_bit == 0) // repetition frame\r
{\r
- if (repetition_counter < NEC_FRAME_REPEAT_PAUSE_LEN_MAX)\r
+ if (repetition_len < NEC_FRAME_REPEAT_PAUSE_LEN_MAX)\r
{\r
- ANALYZE_PRINTF ("Detected NEC repetition frame, repetition_counter = %d\n", repetition_counter);\r
+ ANALYZE_PRINTF ("Detected NEC repetition frame, repetition_len = %d\n", repetition_len);\r
irmp_tmp_address = last_irmp_address; // address is last address\r
irmp_tmp_command = last_irmp_command; // command is last command\r
irmp_flags |= IRMP_FLAG_REPETITION;\r
- repetition_counter = 0;\r
+ repetition_len = 0;\r
}\r
else\r
{\r
- ANALYZE_PRINTF ("Detected NEC repetition frame, ignoring it: timeout occured, repetition_counter = %d > %d\n",\r
- repetition_counter, NEC_FRAME_REPEAT_PAUSE_LEN_MAX);\r
+ ANALYZE_PRINTF ("Detected NEC repetition frame, ignoring it: timeout occured, repetition_len = %d > %d\n",\r
+ repetition_len, NEC_FRAME_REPEAT_PAUSE_LEN_MAX);\r
irmp_ir_detected = FALSE;\r
}\r
}\r
}\r
#endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1\r
\r
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_param.complete_len == RC6_COMPLETE_DATA_LEN_LONG) // RC6 mode = 6?\r
+ {\r
+ irmp_protocol = IRMP_RC6A_PROTOCOL;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+\r
irmp_protocol = irmp_param.protocol;\r
\r
#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
{\r
if (last_irmp_command == irmp_command &&\r
last_irmp_address == irmp_address &&\r
- repetition_counter < IRMP_KEY_REPETITION_LEN)\r
+ repetition_len < IRMP_KEY_REPETITION_LEN)\r
{\r
irmp_flags |= IRMP_FLAG_REPETITION;\r
}\r
last_irmp_address = irmp_tmp_address; // store as last address, too\r
last_irmp_command = irmp_tmp_command; // store as last command, too\r
\r
- repetition_counter = 0;\r
+ repetition_len = 0;\r
}\r
else\r
{\r
static void\r
print_timings (void)\r
{\r
- printf ("IRMP_TIMEOUT_LEN: %d\n", IRMP_TIMEOUT_LEN);\r
+ printf ("IRMP_TIMEOUT_LEN: %d [%d byte(s)]\n", IRMP_TIMEOUT_LEN, sizeof (PAUSE_LEN));\r
printf ("IRMP_KEY_REPETITION_LEN %d\n", IRMP_KEY_REPETITION_LEN);\r
puts ("");\r
printf ("PROTOCOL S S-PULSE S-PAUSE PULSE-0 PAUSE-0 PULSE-1 PAUSE-1\n");\r
DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX,\r
DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX, DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX);\r
\r
- printf ("RC6 1 %3d - %3d %3d - %3d %3d - %3d\n",\r
+ printf ("RC6 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n",\r
RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX, RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX,\r
- RC6_BIT_LEN_MIN, RC6_BIT_LEN_MAX);\r
+ RC6_BIT_PULSE_LEN_MIN, RC6_BIT_PULSE_LEN_MAX, RC6_BIT_PAUSE_LEN_MIN, RC6_BIT_PAUSE_LEN_MAX);\r
\r
printf ("RECS80EXT 1 %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d %3d - %3d\n",\r
RECS80EXT_START_BIT_PULSE_LEN_MIN, RECS80EXT_START_BIT_PULSE_LEN_MAX, RECS80EXT_START_BIT_PAUSE_LEN_MIN, RECS80EXT_START_BIT_PAUSE_LEN_MAX,\r
return (key);\r
}\r
\r
+static int analyze = FALSE;\r
+static int list = FALSE;\r
+static IRMP_DATA irmp_data;\r
+\r
+static void\r
+next_tick (void)\r
+{\r
+ if (! analyze && ! list)\r
+ {\r
+ (void) irmp_ISR ();\r
+\r
+ if (irmp_get_data (&irmp_data))\r
+ {\r
+ uint8_t key;\r
+\r
+ ANALYZE_ONLY_NORMAL_PUTCHAR (' ');\r
+\r
+ if (verbose)\r
+ {\r
+ printf ("%8d ", time_counter);\r
+ }\r
+\r
+ if (irmp_data.protocol == IRMP_FDC_PROTOCOL && (key = get_fdc_key (irmp_data.command)) != 0)\r
+ {\r
+ if ((key >= 0x20 && key < 0x7F) || key >= 0xA0)\r
+ {\r
+ printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x, asc = 0x%02x, key = '%c'\n",\r
+ irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, key, key);\r
+ }\r
+ else if (key == '\r' || key == '\t' || key == KEY_ESCAPE || (key >= 0x80 && key <= 0x9F)) // function keys\r
+ {\r
+ char * p = (char *) NULL;\r
+\r
+ switch (key)\r
+ {\r
+ case '\t' : p = "TAB"; break;\r
+ case '\r' : p = "CR"; break;\r
+ case KEY_ESCAPE : p = "ESCAPE"; break;\r
+ case KEY_MENUE : p = "MENUE"; break;\r
+ case KEY_BACK : p = "BACK"; break;\r
+ case KEY_FORWARD : p = "FORWARD"; break;\r
+ case KEY_ADDRESS : p = "ADDRESS"; break;\r
+ case KEY_WINDOW : p = "WINDOW"; break;\r
+ case KEY_1ST_PAGE : p = "1ST_PAGE"; break;\r
+ case KEY_STOP : p = "STOP"; break;\r
+ case KEY_MAIL : p = "MAIL"; break;\r
+ case KEY_FAVORITES : p = "FAVORITES"; break;\r
+ case KEY_NEW_PAGE : p = "NEW_PAGE"; break;\r
+ case KEY_SETUP : p = "SETUP"; break;\r
+ case KEY_FONT : p = "FONT"; break;\r
+ case KEY_PRINT : p = "PRINT"; break;\r
+ case KEY_ON_OFF : p = "ON_OFF"; break;\r
+\r
+ case KEY_INSERT : p = "INSERT"; break;\r
+ case KEY_DELETE : p = "DELETE"; break;\r
+ case KEY_LEFT : p = "LEFT"; break;\r
+ case KEY_HOME : p = "HOME"; break;\r
+ case KEY_END : p = "END"; break;\r
+ case KEY_UP : p = "UP"; break;\r
+ case KEY_DOWN : p = "DOWN"; break;\r
+ case KEY_PAGE_UP : p = "PAGE_UP"; break;\r
+ case KEY_PAGE_DOWN : p = "PAGE_DOWN"; break;\r
+ case KEY_RIGHT : p = "RIGHT"; break;\r
+ case KEY_MOUSE_1 : p = "KEY_MOUSE_1"; break;\r
+ case KEY_MOUSE_2 : p = "KEY_MOUSE_2"; break;\r
+ default : p = "<UNKNWON>"; break;\r
+ }\r
+\r
+ printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x, asc = 0x%02x, key = %s\n",\r
+ irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, key, p);\r
+ }\r
+ else\r
+ {\r
+ printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x, asc = 0x%02x\n",\r
+ irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, key);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x\n",\r
+ irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
int\r
main (int argc, char ** argv)\r
{\r
int i;\r
- int analyze = FALSE;\r
- int list = FALSE;\r
int ch;\r
int last_ch = 0;\r
int pulse = 0;\r
int first_pulse = TRUE;\r
int first_pause = TRUE;\r
\r
- IRMP_DATA irmp_data;\r
-\r
if (argc == 2)\r
{\r
if (! strcmp (argv[1], "-v"))\r
{\r
for (i = 0; i < (int) ((8000.0 * F_INTERRUPTS) / 10000); i++) // newline: long pause of 800 msec\r
{\r
- (void) irmp_ISR ();\r
+ next_tick ();\r
}\r
}\r
first_pulse = TRUE;\r
\r
last_ch = ch;\r
\r
- if (! analyze && ! list)\r
- {\r
- (void) irmp_ISR ();\r
-\r
- if (irmp_get_data (&irmp_data))\r
- {\r
- uint8_t key;\r
-\r
- ANALYZE_ONLY_NORMAL_PUTCHAR (' ');\r
-\r
- if (irmp_data.protocol == IRMP_FDC_PROTOCOL && (key = get_fdc_key (irmp_data.command)) != 0)\r
- {\r
- if ((key >= 0x20 && key < 0x7F) || key >= 0xA0)\r
- {\r
- printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x, asc = 0x%02x, key = '%c'\n",\r
- irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, key, key);\r
- }\r
- else if (key == '\r' || key == '\t' || key == KEY_ESCAPE || (key >= 0x80 && key <= 0x9F)) // function keys\r
- {\r
- char * p = (char *) NULL;\r
-\r
- switch (key)\r
- {\r
- case '\t' : p = "TAB"; break;\r
- case '\r' : p = "CR"; break;\r
- case KEY_ESCAPE : p = "ESCAPE"; break;\r
- case KEY_MENUE : p = "MENUE"; break;\r
- case KEY_BACK : p = "BACK"; break;\r
- case KEY_FORWARD : p = "FORWARD"; break;\r
- case KEY_ADDRESS : p = "ADDRESS"; break;\r
- case KEY_WINDOW : p = "WINDOW"; break;\r
- case KEY_1ST_PAGE : p = "1ST_PAGE"; break;\r
- case KEY_STOP : p = "STOP"; break;\r
- case KEY_MAIL : p = "MAIL"; break;\r
- case KEY_FAVORITES : p = "FAVORITES"; break;\r
- case KEY_NEW_PAGE : p = "NEW_PAGE"; break;\r
- case KEY_SETUP : p = "SETUP"; break;\r
- case KEY_FONT : p = "FONT"; break;\r
- case KEY_PRINT : p = "PRINT"; break;\r
- case KEY_ON_OFF : p = "ON_OFF"; break;\r
-\r
- case KEY_INSERT : p = "INSERT"; break;\r
- case KEY_DELETE : p = "DELETE"; break;\r
- case KEY_LEFT : p = "LEFT"; break;\r
- case KEY_HOME : p = "HOME"; break;\r
- case KEY_END : p = "END"; break;\r
- case KEY_UP : p = "UP"; break;\r
- case KEY_DOWN : p = "DOWN"; break;\r
- case KEY_PAGE_UP : p = "PAGE_UP"; break;\r
- case KEY_PAGE_DOWN : p = "PAGE_DOWN"; break;\r
- case KEY_RIGHT : p = "RIGHT"; break;\r
- case KEY_MOUSE_1 : p = "KEY_MOUSE_1"; break;\r
- case KEY_MOUSE_2 : p = "KEY_MOUSE_2"; break;\r
- default : p = "<UNKNWON>"; break;\r
- }\r
-\r
- printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x, asc = 0x%02x, key = %s\n",\r
- irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, key, p);\r
- }\r
- else\r
- {\r
- printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x, asc = 0x%02x\n",\r
- irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, key);\r
- }\r
- }\r
- else\r
- {\r
- printf ("p = %2d, a = 0x%04x, c = 0x%04x, f = 0x%02x\n",\r
- irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags);\r
- }\r
- }\r
- }\r
+ next_tick ();\r
}\r
\r
if (analyze)\r
*\r
* Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsnd.c,v 1.21 2010/08/18 12:03:26 fm Exp $\r
+ * $Id: irsnd.c,v 1.24 2010/09/02 10:22:26 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
\r
#ifdef WIN32 // test/debug on windows\r
#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
#define F_CPU 8000000L\r
typedef unsigned char uint8_t;\r
typedef unsigned short uint16_t;\r
#define RCCAR_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME + 0.5)\r
#define RCCAR_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * RCCAR_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
\r
+#define JVC_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * JVC_START_BIT_PULSE_TIME + 0.5)\r
+#define JVC_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * JVC_START_BIT_PAUSE_TIME + 0.5)\r
+#define JVC_REPEAT_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * JVC_REPEAT_START_BIT_PAUSE_TIME + 0.5)\r
+#define JVC_PULSE_LEN (uint8_t)(F_INTERRUPTS * JVC_PULSE_TIME + 0.5)\r
+#define JVC_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * JVC_1_PAUSE_TIME + 0.5)\r
+#define JVC_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * JVC_0_PAUSE_TIME + 0.5)\r
+#define JVC_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * JVC_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
+\r
static volatile uint8_t irsnd_busy;\r
static volatile uint8_t irsnd_protocol;\r
static volatile uint8_t irsnd_buffer[6];\r
}\r
#endif\r
#if IRSND_SUPPORT_NEC_PROTOCOL == 1\r
- case IRMP_NEC_PROTOCOL:\r
case IRMP_APPLE_PROTOCOL:\r
+ {\r
+ command = irmp_data_p->command | (irmp_data_p->address << 8); // store address as ID in upper byte of command\r
+ address = 0x87EE; // set fixed NEC-lookalike address (customer ID of apple)\r
+\r
+ address = bitsrevervse (address, NEC_ADDRESS_LEN);\r
+ command = bitsrevervse (command, NEC_COMMAND_LEN);\r
+\r
+ irsnd_protocol = IRMP_NEC_PROTOCOL; // APPLE protocol is NEC with id instead of inverted command\r
+\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 & 0x00FF); // CCCCCCCC\r
+\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+ case IRMP_NEC_PROTOCOL:\r
{\r
address = bitsrevervse (irmp_data_p->address, NEC_ADDRESS_LEN);\r
command = bitsrevervse (irmp_data_p->command, NEC_COMMAND_LEN);\r
irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA\r
irsnd_buffer[2] = (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
+ irsnd_protocol = IRMP_NEC_PROTOCOL; // APPLE protocol is NEC with fix bitmask instead of inverted command\r
+ irsnd_buffer[3] = 0x8B; // 10001011\r
{\r
irsnd_buffer[3] = ~((command & 0xFF00) >> 8); // cccccccc\r
}\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
default:\r
{\r
break;\r
break;\r
}\r
#endif\r
+#if IRSND_SUPPORT_JVC_PROTOCOL == 1\r
+ case IRMP_JVC_PROTOCOL:\r
+ {\r
+ if (repeat_counter != 0) // skip start bit if repetition frame\r
+ {\r
+ current_bit = 0;\r
+ }\r
+\r
+ startbit_pulse_len = JVC_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = JVC_START_BIT_PAUSE_LEN;\r
+ complete_data_len = JVC_COMPLETE_DATA_LEN;\r
+ pulse_1_len = JVC_PULSE_LEN;\r
+ pause_1_len = JVC_1_PAUSE_LEN;\r
+ pulse_0_len = JVC_PULSE_LEN;\r
+ pause_0_len = JVC_0_PAUSE_LEN;\r
+ has_stop_bit = JVC_STOP_BIT;\r
+ n_auto_repetitions = 1; // 1 frame\r
+ auto_repetition_pause_len = 0;\r
+ repeat_frame_pause_len = JVC_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_38_KHZ);\r
+\r
+ break;\r
+ }\r
+#endif\r
default:\r
{\r
irsnd_busy = FALSE;\r
#if IRSND_SUPPORT_RCCAR_PROTOCOL == 1\r
case IRMP_RCCAR_PROTOCOL:\r
#endif\r
+#if IRSND_SUPPORT_JVC_PROTOCOL == 1\r
+ case IRMP_JVC_PROTOCOL:\r
+#endif\r
\r
\r
#if IRSND_SUPPORT_SIRCS_PROTOCOL == 1 || IRSND_SUPPORT_NEC_PROTOCOL == 1 || 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
- IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1\r
+ IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 || \\r
+ IRSND_SUPPORT_JVC_PROTOCOL == 1\r
{\r
if (pulse_counter == 0)\r
{\r