*\r
* Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.106 2011/08/16 07:51:19 fm Exp $\r
+ * $Id: irmp.c,v 1.108 2011/09/09 11:59:39 fm Exp $\r
*\r
* ATMEGA88 @ 8 MHz\r
*\r
- * Typical manufacturers:\r
+ * Supported mikrocontrollers:\r
+ *\r
+ * ATtiny45, ATtiny85\r
+ * ATtiny84\r
+ * ATmega8, ATmega16, ATmega32\r
+ * ATmega162\r
+ * ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284\r
+ * ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
+ *\r
+ * Typical manufacturers of remote controls:\r
*\r
* SIRCS - Sony\r
* NEC - NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, and many other Japanese manufacturers\r
#define IRMP_SUPPORT_MANCHESTER 0\r
#endif\r
\r
-#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1 || \\r
- IRMP_SUPPORT_MERLIN_PROTOCOL == 1 || \\r
- IRMP_SUPPORT_IMON_PROTOCOL == 1 \r
+#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
#define IRMP_SUPPORT_SERIAL 1\r
#else\r
#define IRMP_SUPPORT_SERIAL 0\r
#define LEGO_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
#define LEGO_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * LEGO_0_PAUSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
\r
-#define MERLIN_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
-#define MERLIN_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
-#define MERLIN_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
-#define MERLIN_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * MERLIN_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
-#define MERLIN_PULSE_LEN ((uint8_t)(F_INTERRUPTS * MERLIN_PULSE_TIME))\r
-#define MERLIN_PAUSE_LEN ((uint8_t)(F_INTERRUPTS * MERLIN_PAUSE_TIME))\r
-#define MERLIN_PULSE_REST_LEN ((uint8_t)(F_INTERRUPTS * MERLIN_PULSE_TIME / 4))\r
-#define MERLIN_PAUSE_REST_LEN ((uint8_t)(F_INTERRUPTS * MERLIN_PAUSE_TIME / 4))\r
-\r
-#define IMON_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
-#define IMON_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
-#define IMON_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
-#define IMON_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * IMON_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
-#define IMON_PULSE_LEN ((uint8_t)(F_INTERRUPTS * IMON_PULSE_TIME))\r
-#define IMON_PAUSE_LEN ((uint8_t)(F_INTERRUPTS * IMON_PAUSE_TIME))\r
-#define IMON_PULSE_REST_LEN ((uint8_t)(F_INTERRUPTS * IMON_PULSE_TIME / 4))\r
-#define IMON_PAUSE_REST_LEN ((uint8_t)(F_INTERRUPTS * IMON_PAUSE_TIME / 4))\r
-\r
#define AUTO_FRAME_REPETITION_LEN (uint16_t)(F_INTERRUPTS * AUTO_FRAME_REPETITION_TIME + 0.5) // use uint16_t!\r
\r
#ifdef ANALYZE\r
-#define ANALYZE_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
-#define ANALYZE_ONLY_NORMAL_PUTCHAR(a) { if (! silent && !verbose) { putchar (a); } }\r
-#define ANALYZE_PRINTF(...) { if (verbose) { printf (__VA_ARGS__); } }\r
-#define ANALYZE_NEWLINE() { if (verbose) { putchar ('\n'); } }\r
-static int silent;\r
-static int time_counter;\r
-static int verbose;\r
+#define ANALYZE_PUTCHAR(a) { if (! silent) { putchar (a); } }\r
+#define ANALYZE_ONLY_NORMAL_PUTCHAR(a) { if (! silent && !verbose) { putchar (a); } }\r
+#define ANALYZE_PRINTF(...) { if (verbose) { printf (__VA_ARGS__); } }\r
+#define ANALYZE_NEWLINE() { if (verbose) { putchar ('\n'); } }\r
+static int silent;\r
+static int time_counter;\r
+static int verbose;\r
#else\r
#define ANALYZE_PUTCHAR(a)\r
#define ANALYZE_ONLY_NORMAL_PUTCHAR(a)\r
#define ANALYZE_NEWLINE()\r
#endif\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+static void (*irmp_callback_ptr) (uint8_t);\r
+#endif // IRMP_USE_CALLBACK == 1\r
+\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* Protocol names\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
"NEC16",\r
"NEC42",\r
"LEGO",\r
- "THOMSON",\r
- "MERLIN"\r
+ "THOMSON"\r
};\r
#endif\r
\r
NEC_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
NEC_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
NEC42_ADDRESS_OFFSET, // address_offset: address offset\r
- NEC42_ADDRESS_OFFSET + NEC_ADDRESS_LEN, // address_end: end of address\r
+ NEC42_ADDRESS_OFFSET + NEC42_ADDRESS_LEN, // address_end: end of address\r
NEC42_COMMAND_OFFSET, // command_offset: command offset\r
- NEC42_COMMAND_OFFSET + NEC_COMMAND_LEN, // command_end: end of command\r
+ NEC42_COMMAND_OFFSET + NEC42_COMMAND_LEN, // command_end: end of command\r
NEC42_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
NEC_STOP_BIT, // stop_bit: flag: frame has stop bit\r
NEC_LSB, // lsb_first: flag: LSB first\r
\r
#endif\r
\r
-#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
-\r
-static const PROGMEM IRMP_PARAMETER merlin_param =\r
-{\r
- IRMP_MERLIN_PROTOCOL, // protocol: ir protocol\r
- MERLIN_PULSE_LEN, // pulse_1_len_min: minimum length of pulse with bit value 1, here: exact value\r
- MERLIN_PULSE_REST_LEN, // pulse_1_len_max: maximum length of pulse with bit value 1, here: rest value\r
- MERLIN_PAUSE_LEN, // pause_1_len_min: minimum length of pause with bit value 1, here: exact value\r
- MERLIN_PAUSE_REST_LEN, // pause_1_len_max: maximum length of pause with bit value 1, here: rest value\r
- MERLIN_PULSE_LEN, // pulse_0_len_min: minimum length of pulse with bit value 0, here: exact value\r
- MERLIN_PULSE_REST_LEN, // pulse_0_len_max: maximum length of pulse with bit value 0, here: rest value\r
- MERLIN_PAUSE_LEN, // pause_0_len_min: minimum length of pause with bit value 0, here: exact value\r
- MERLIN_PAUSE_REST_LEN, // pause_0_len_max: maximum length of pause with bit value 0, here: rest value\r
- MERLIN_ADDRESS_OFFSET, // address_offset: address offset\r
- MERLIN_ADDRESS_OFFSET + MERLIN_ADDRESS_LEN, // address_end: end of address\r
- MERLIN_COMMAND_OFFSET, // command_offset: command offset\r
- MERLIN_COMMAND_OFFSET + MERLIN_COMMAND_LEN, // command_end: end of command\r
- MERLIN_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
- MERLIN_STOP_BIT, // stop_bit: flag: frame has stop bit\r
- MERLIN_LSB, // lsb_first: flag: LSB first\r
- MERLIN_FLAGS // flags: some flags\r
-};\r
-\r
-#endif\r
-\r
#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
\r
static const PROGMEM IRMP_PARAMETER thomson_param =\r
\r
#endif\r
\r
-#if IRMP_SUPPORT_IMON_PROTOCOL == 1\r
-\r
-static const PROGMEM IRMP_PARAMETER imon_param =\r
-{\r
- IRMP_IMON_PROTOCOL, // protocol: ir protocol\r
- IMON_PULSE_LEN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
- IMON_PULSE_REST_LEN, // pulse_1_len_max: maximum length of pulse with bit value 1\r
- IMON_PAUSE_LEN, // pause_1_len_min: minimum length of pause with bit value 1\r
- IMON_PAUSE_REST_LEN, // pause_1_len_max: maximum length of pause with bit value 1\r
- IMON_PULSE_LEN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
- IMON_PULSE_REST_LEN, // pulse_0_len_max: maximum length of pulse with bit value 0\r
- IMON_PAUSE_LEN, // pause_0_len_min: minimum length of pause with bit value 0\r
- IMON_PAUSE_REST_LEN, // pause_0_len_max: maximum length of pause with bit value 0\r
- IMON_ADDRESS_OFFSET, // address_offset: address offset\r
- IMON_ADDRESS_OFFSET + IMON_ADDRESS_LEN, // address_end: end of address\r
- IMON_COMMAND_OFFSET, // command_offset: command offset\r
- IMON_COMMAND_OFFSET + IMON_COMMAND_LEN, // command_end: end of command\r
- IMON_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
- IMON_STOP_BIT, // stop_bit: flag: frame has stop bit\r
- IMON_LSB, // lsb_first: flag: LSB first\r
- IMON_FLAGS // flags: some flags\r
-};\r
-\r
-#endif\r
-\r
static uint8_t irmp_bit; // current bit position\r
static IRMP_PARAMETER irmp_param;\r
\r
// return irmp_busy_flag;\r
// }\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+void\r
+irmp_set_callback_ptr (void (*cb)(uint8_t))\r
+{\r
+ irmp_callback_ptr = cb;\r
+}\r
+#endif // IRMP_USE_CALLBACK == 1\r
+\r
// these statics must not be volatile, because they are only used by irmp_store_bit(), which is called by irmp_ISR()\r
static uint16_t irmp_tmp_address; // ir address\r
static uint16_t irmp_tmp_command; // ir command\r
\r
irmp_input = input(IRMP_PIN);\r
\r
+#if IRMP_USE_CALLBACK == 1\r
+ if (irmp_callback_ptr)\r
+ {\r
+ static uint8_t last_inverted_input;\r
+\r
+ if (last_inverted_input != !irmp_input)\r
+ {\r
+ (*irmp_callback_ptr) (! irmp_input);\r
+ last_inverted_input = !irmp_input;\r
+ }\r
+ }\r
+#endif // IRMP_USE_CALLBACK == 1\r
+\r
irmp_log(irmp_input); // log ir signal, if IRMP_LOGGING defined\r
\r
if (! irmp_ir_detected) // ir code already detected?\r
else\r
#endif // IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
\r
-#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
- if (irmp_pulse_time >= MERLIN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MERLIN_START_BIT_PULSE_LEN_MAX &&\r
- irmp_pause_time >= MERLIN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MERLIN_START_BIT_PAUSE_LEN_MAX)\r
- { // it's MERLIN\r
- ANALYZE_PRINTF ("protocol = MERLIN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
- MERLIN_START_BIT_PULSE_LEN_MIN, MERLIN_START_BIT_PULSE_LEN_MAX,\r
- MERLIN_START_BIT_PAUSE_LEN_MIN, MERLIN_START_BIT_PAUSE_LEN_MAX);\r
- irmp_param_p = (IRMP_PARAMETER *) &merlin_param;\r
- }\r
- else\r
-#endif // IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
-\r
#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
if (irmp_pulse_time >= LEGO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= LEGO_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= LEGO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= LEGO_START_BIT_PAUSE_LEN_MAX)\r
else\r
#endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
\r
-#if IRMP_SUPPORT_IMON_PROTOCOL == 1\r
- if (irmp_pulse_time >= IMON_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= IMON_START_BIT_PULSE_LEN_MAX &&\r
- irmp_pause_time >= IMON_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= IMON_START_BIT_PAUSE_LEN_MAX)\r
- { // it's IMON\r
- ANALYZE_PRINTF ("protocol = IMON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
- IMON_START_BIT_PULSE_LEN_MIN, IMON_START_BIT_PULSE_LEN_MAX,\r
- IMON_START_BIT_PAUSE_LEN_MIN, IMON_START_BIT_PAUSE_LEN_MAX);\r
- irmp_param_p = (IRMP_PARAMETER *) &imon_param;\r
- }\r
- else\r
-#endif // IRMP_SUPPORT_IMON_PROTOCOL == 1\r
-\r
{\r
ANALYZE_PRINTF ("protocol = UNKNOWN\n");\r
// irmp_busy_flag = FALSE;\r
got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
}\r
else\r
-#if 1\r
- // MERLIN generates no stop bit, here is the timeout condition:\r
- if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) && irmp_param.protocol == IRMP_MERLIN_PROTOCOL &&\r
- irmp_pause_time >= MERLIN_PULSE_LEN * (MERLIN_COMPLETE_DATA_LEN - irmp_bit))\r
- {\r
- got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
- }\r
- else\r
-#endif\r
#endif\r
#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
if (irmp_param.protocol == IRMP_GRUNDIG_PROTOCOL && !irmp_param.stop_bit)\r
#endif // IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
irmp_bit == 8 && irmp_pause_time >= NEC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NEC_START_BIT_PAUSE_LEN_MAX)\r
{\r
-printf ("! %d %d !\n", irmp_pause_time, NEC_START_BIT_PAUSE_LEN_MAX);\r
ANALYZE_PRINTF ("Switching to NEC16 protocol\n");\r
- irmp_param.protocol = IRMP_NEC16_PROTOCOL;\r
+ irmp_param.protocol = IRMP_NEC16_PROTOCOL;\r
irmp_param.address_offset = NEC16_ADDRESS_OFFSET;\r
irmp_param.address_end = NEC16_ADDRESS_OFFSET + NEC16_ADDRESS_LEN;\r
irmp_param.command_offset = NEC16_COMMAND_OFFSET;\r