summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.txt4
-rw-r--r--irmp.c162
-rw-r--r--irmp.h9
-rw-r--r--irmpconfig.h3
-rw-r--r--irmpprotocols.h37
5 files changed, 195 insertions, 20 deletions
diff --git a/README.txt b/README.txt
index f63c417..4f1ccde 100644
--- a/README.txt
+++ b/README.txt
@@ -1,8 +1,8 @@
IRMP - Infrared Multi Protocol Decoder
--------------------------------------
-Version IRMP: 2.3.9 19.03.2013
-Version IRSND: 2.3.8 12.03.2013
+Version IRMP: 2.3.10 09.04.2013
+Version IRSND: 2.3.8 12.03.2013
Dokumentation:
diff --git a/irmp.c b/irmp.c
index 7d40b62..3f313de 100644
--- a/irmp.c
+++ b/irmp.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2009-2013 Frank Meyer - frank(at)fli4l.de
*
- * $Id: irmp.c,v 1.140 2013/03/19 15:11:55 fm Exp $
+ * $Id: irmp.c,v 1.141 2013/04/09 11:55:39 fm Exp $
*
* ATMEGA88 @ 8 MHz
*
@@ -387,10 +387,10 @@
#define ORTEK_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ORTEK_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
#define ORTEK_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ORTEK_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
#define ORTEK_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ORTEK_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
-#define ORTEK_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MIN_TOLERANCE_30 + 0.5) - 1)
-#define ORTEK_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MAX_TOLERANCE_30 + 0.5) + 1)
-#define ORTEK_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MIN_TOLERANCE_30 + 0.5) - 1)
-#define ORTEK_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MAX_TOLERANCE_30 + 0.5) + 1)
+#define ORTEK_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
+#define ORTEK_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
+#define ORTEK_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
+#define ORTEK_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ORTEK_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
#define TELEFUNKEN_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * TELEFUNKEN_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
#define TELEFUNKEN_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * TELEFUNKEN_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
@@ -405,6 +405,21 @@
// autodetect TELEFUNKEN repetition frame within 50 msec:
// #define TELEFUNKEN_FRAME_REPEAT_PAUSE_LEN_MAX (uint16_t)(F_INTERRUPTS * TELEFUNKEN_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)
+#define ROOMBA_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
+#define ROOMBA_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
+#define ROOMBA_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
+#define ROOMBA_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ROOMBA_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
+#define ROOMBA_1_PAUSE_LEN ((uint8_t)(F_INTERRUPTS * ROOMBA_1_PAUSE_TIME))
+#define ROOMBA_1_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ROOMBA_1_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
+#define ROOMBA_1_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ROOMBA_1_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
+#define ROOMBA_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ROOMBA_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
+#define ROOMBA_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ROOMBA_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
+#define ROOMBA_0_PAUSE_LEN ((uint8_t)(F_INTERRUPTS * ROOMBA_0_PAUSE_TIME))
+#define ROOMBA_0_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ROOMBA_0_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
+#define ROOMBA_0_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ROOMBA_0_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
+#define ROOMBA_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * ROOMBA_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
+#define ROOMBA_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * ROOMBA_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
+
#define AUTO_FRAME_REPETITION_LEN (uint16_t)(F_INTERRUPTS * AUTO_FRAME_REPETITION_TIME + 0.5) // use uint16_t!
#ifdef ANALYZE
@@ -428,6 +443,9 @@ static int verbose;
static void (*irmp_callback_ptr) (uint8_t);
#endif // IRMP_USE_CALLBACK == 1
+#define PARITY_CHECK_OK 1
+#define PARITY_CHECK_FAILED 0
+
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* Protocol names
*---------------------------------------------------------------------------------------------------------------------------------------------------
@@ -470,8 +488,10 @@ irmp_protocol_names[IRMP_N_PROTOCOLS + 1] =
"BOSE",
"A1TVBOX",
"ORTEK",
- "TELEFUNKEN"
+ "TELEFUNKEN",
+ "ROOMBA"
};
+
#endif
/*---------------------------------------------------------------------------------------------------------------------------------------------------
@@ -1455,6 +1475,31 @@ static const PROGMEM IRMP_PARAMETER ortek_param =
#endif
+#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1
+
+static const PROGMEM IRMP_PARAMETER roomba_param =
+{
+ IRMP_ROOMBA_PROTOCOL, // protocol: ir protocol
+ ROOMBA_1_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1
+ ROOMBA_1_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1
+ ROOMBA_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1
+ ROOMBA_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1
+ ROOMBA_0_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0
+ ROOMBA_0_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0
+ ROOMBA_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0
+ ROOMBA_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0
+ ROOMBA_ADDRESS_OFFSET, // address_offset: address offset
+ ROOMBA_ADDRESS_OFFSET + ROOMBA_ADDRESS_LEN, // address_end: end of address
+ ROOMBA_COMMAND_OFFSET, // command_offset: command offset
+ ROOMBA_COMMAND_OFFSET + ROOMBA_COMMAND_LEN, // command_end: end of command
+ ROOMBA_COMPLETE_DATA_LEN, // complete_len: complete length of frame
+ ROOMBA_STOP_BIT, // stop_bit: flag: frame has stop bit
+ ROOMBA_LSB, // lsb_first: flag: LSB first
+ ROOMBA_FLAGS // flags: some flags
+};
+
+#endif
+
static uint8_t irmp_bit; // current bit position
static IRMP_PARAMETER irmp_param;
@@ -1729,6 +1774,10 @@ static uint8_t xor_check[6];
static uint8_t genre2; // save genre2 bits here, later copied to MSB in flags
#endif
+#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1
+static uint8_t parity; // number of '1' of the first 14 bits, check if even.
+#endif
+
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* store bit
* @details store bit in temp address or temp command
@@ -1741,6 +1790,44 @@ static uint8_t genre2;
static void
irmp_store_bit (uint8_t value)
{
+#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1
+ if (irmp_param.protocol == IRMP_ORTEK_PROTOCOL)
+ {
+ if (irmp_bit < 14)
+ {
+ if (value)
+ {
+ parity++;
+ }
+ }
+ else if (irmp_bit == 14)
+ {
+ if (value) // value == 1: even parity
+ {
+ if (parity & 0x01)
+ {
+ parity = PARITY_CHECK_FAILED;
+ }
+ else
+ {
+ parity = PARITY_CHECK_OK;
+ }
+ }
+ else
+ {
+ if (parity & 0x01) // value == 0: odd parity
+ {
+ parity = PARITY_CHECK_OK;
+ }
+ else
+ {
+ parity = PARITY_CHECK_FAILED;
+ }
+ }
+ }
+ }
+#endif
+
#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1
if (irmp_bit == 0 && irmp_param.protocol == IRMP_GRUNDIG_PROTOCOL)
{
@@ -2105,6 +2192,18 @@ irmp_ISR (void)
else
#endif // IRMP_SUPPORT_TELEFUNKEN_PROTOCOL == 1
+#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1
+ if (irmp_pulse_time >= ROOMBA_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_START_BIT_PULSE_LEN_MAX &&
+ irmp_pause_time >= ROOMBA_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= ROOMBA_START_BIT_PAUSE_LEN_MAX)
+ {
+ ANALYZE_PRINTF ("protocol = ROOMBA, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",
+ ROOMBA_START_BIT_PULSE_LEN_MIN, ROOMBA_START_BIT_PULSE_LEN_MAX,
+ ROOMBA_START_BIT_PAUSE_LEN_MIN, ROOMBA_START_BIT_PAUSE_LEN_MAX);
+ irmp_param_p = (IRMP_PARAMETER *) &roomba_param;
+ }
+ else
+#endif // IRMP_SUPPORT_ROOMBA_PROTOCOL == 1
+
#if IRMP_SUPPORT_NIKON_PROTOCOL == 1
if (irmp_pulse_time >= NIKON_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NIKON_START_BIT_PULSE_LEN_MAX &&
irmp_pause_time >= NIKON_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NIKON_START_BIT_PAUSE_LEN_MAX)
@@ -2442,8 +2541,9 @@ irmp_ISR (void)
ORTEK_START_BIT_PULSE_LEN_MIN, ORTEK_START_BIT_PULSE_LEN_MAX,
ORTEK_START_BIT_PAUSE_LEN_MIN, ORTEK_START_BIT_PAUSE_LEN_MAX);
irmp_param_p = (IRMP_PARAMETER *) &ortek_param;
- last_pause = 0;
- last_value = 1;
+ last_pause = 0;
+ last_value = 1;
+ parity = 0;
}
else
#endif // IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1
@@ -2737,6 +2837,23 @@ irmp_ISR (void)
}
else
#endif
+#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1
+ if (irmp_param.protocol == IRMP_ROOMBA_PROTOCOL && // Roomba has no stop bit
+ irmp_bit >= ROOMBA_COMPLETE_DATA_LEN - 1) // it's the last datab bit...
+ { // break and close this frame
+ if (irmp_pulse_time >= ROOMBA_1_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_1_PULSE_LEN_MAX)
+ {
+ irmp_pause_time = ROOMBA_1_PAUSE_LEN;
+ }
+ else if (irmp_pulse_time >= ROOMBA_0_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_0_PULSE_LEN_MAX)
+ {
+ irmp_pause_time = ROOMBA_0_PAUSE_LEN;
+ }
+
+ got_light = TRUE; // this is a lie, but helps (generates stop bit)
+ }
+ else
+#endif
#if IRMP_SUPPORT_MANCHESTER == 1
if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) &&
irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= irmp_param.complete_len - 2 && !irmp_param.stop_bit)
@@ -3292,6 +3409,17 @@ irmp_ISR (void)
else
#endif
+#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1
+ // if ORTEK protocol and the code will be repeated within 50 ms, we will ignore 2nd repetition frame
+ if (irmp_param.protocol == IRMP_ORTEK_PROTOCOL && repetition_frame_number == 1)
+ {
+ ANALYZE_PRINTF ("code skipped: ORTEK auto repetition frame #%d, counter = %d, auto repetition len = %d\n",
+ repetition_frame_number + 1, key_repetition_len, AUTO_FRAME_REPETITION_LEN);
+ key_repetition_len = 0;
+ }
+ else
+#endif
+
#if IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1
// if KASEIKYO protocol and the code will be repeated within 50 ms, we will ignore 2nd repetition frame
if (irmp_param.protocol == IRMP_KASEIKYO_PROTOCOL && repetition_frame_number == 1)
@@ -3427,6 +3555,24 @@ irmp_ISR (void)
}
#endif // IRMP_SUPPORT_KASEIKYO_PROTOCOL == 1
+#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1
+ if (irmp_param.protocol == IRMP_ORTEK_PROTOCOL)
+ {
+ if (parity == PARITY_CHECK_FAILED)
+ {
+ ANALYZE_PRINTF ("error 6: parity check failed\n");
+ irmp_ir_detected = FALSE;
+ }
+
+ if ((irmp_tmp_address & 0x03) == 0x02)
+ {
+ ANALYZE_PRINTF ("code skipped: ORTEK end of transmission frame (key release)\n");
+ irmp_ir_detected = FALSE;
+ }
+ irmp_tmp_address >>= 2;
+ }
+#endif // IRMP_SUPPORT_ORTEK_PROTOCOL == 1
+
#if IRMP_SUPPORT_RC6_PROTOCOL == 1
if (irmp_param.protocol == IRMP_RC6_PROTOCOL && irmp_param.complete_len == RC6_COMPLETE_DATA_LEN_LONG) // RC6 mode = 6?
{
diff --git a/irmp.h b/irmp.h
index 9579250..b529b06 100644
--- a/irmp.h
+++ b/irmp.h
@@ -3,7 +3,7 @@
*
* Copyright (c) 2009-2013 Frank Meyer - frank(at)fli4l.de
*
- * $Id: irmp.h,v 1.81 2013/01/17 07:33:13 fm Exp $
+ * $Id: irmp.h,v 1.82 2013/04/09 11:55:39 fm Exp $
*
* ATMEGA88 @ 8 MHz
*
@@ -70,6 +70,13 @@
# define IRMP_SUPPORT_RUWIDO_PROTOCOL 0
#endif
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1 && IRMP_SUPPORT_ROOMBA_PROTOCOL == 1
+# warning RC6 protocol conflicts wih ROOMBA, please enable only one of both protocols
+# warning ROOMBA protocol disabled
+# undef IRMP_SUPPORT_ROOMBA_PROTOCOL
+# define IRMP_SUPPORT_ROOMBA_PROTOCOL 0
+#endif
+
#if IRMP_SUPPORT_SIEMENS_PROTOCOL == 1 && F_INTERRUPTS < 15000
# warning F_INTERRUPTS too low, SIEMENS protocol disabled (should be at least 15000)
# undef IRMP_SUPPORT_SIEMENS_PROTOCOL
diff --git a/irmpconfig.h b/irmpconfig.h
index 8e274c3..a930c7f 100644
--- a/irmpconfig.h
+++ b/irmpconfig.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 2009-2013 Frank Meyer - frank(at)fli4l.de
*
- * $Id: irmpconfig.h,v 1.99 2013/03/19 15:11:55 fm Exp $
+ * $Id: irmpconfig.h,v 1.101 2013/04/09 12:02:51 fm Exp $
*
* ATMEGA88 @ 8 MHz
*
@@ -82,6 +82,7 @@
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL 0 // Telefunken 1560 >= 10000 ~150 bytes
#define IRMP_SUPPORT_FDC_PROTOCOL 0 // FDC3402 keyboard >= 10000 (better 15000) ~150 bytes (~400 in combination with RC5)
#define IRMP_SUPPORT_RCCAR_PROTOCOL 0 // RC Car >= 10000 (better 15000) ~150 bytes (~500 in combination with RC5)
+#define IRMP_SUPPORT_ROOMBA_PROTOCOL 0 // iRobot Roomba >= 10000 ~150 bytes
#define IRMP_SUPPORT_RUWIDO_PROTOCOL 0 // RUWIDO, T-Home >= 15000 ~550 bytes
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL 0 // A1 TV BOX >= 15000 (better 20000) ~300 bytes
#define IRMP_SUPPORT_LEGO_PROTOCOL 0 // LEGO Power RC >= 20000 ~150 bytes
diff --git a/irmpprotocols.h b/irmpprotocols.h
index cff2059..3b8484f 100644
--- a/irmpprotocols.h
+++ b/irmpprotocols.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 2013 Frank Meyer - frank(at)fli4l.de
*
- * $Id: irmpprotocols.h,v 1.11 2013/03/19 15:11:55 fm Exp $
+ * $Id: irmpprotocols.h,v 1.14 2013/04/09 11:59:12 fm Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -59,8 +59,9 @@
#define IRMP_A1TVBOX_PROTOCOL 32 // A1 TV Box
#define IRMP_ORTEK_PROTOCOL 33 // ORTEK - Hama
#define IRMP_TELEFUNKEN_PROTOCOL 34 // Telefunken (1560)
+#define IRMP_ROOMBA_PROTOCOL 35 // iRobot Roomba vacuum cleaner
-#define IRMP_N_PROTOCOLS 34 // number of supported protocols
+#define IRMP_N_PROTOCOLS 35 // number of supported protocols
/*---------------------------------------------------------------------------------------------------------------------------------------------------
* timing constants:
@@ -626,17 +627,17 @@ typedef uint8_t PAUSE_LEN;
#define A1TVBOX_FRAME_REPEAT_PAUSE_TIME 50.0e-3 // 50 msec pause between frames, don't know if it is correct
/*---------------------------------------------------------------------------------------------------------------------------------------------------
- * ORTEK (Hama):
+ * ORTEK (Hama): 6 address bits + 2 frame type bits + 6 command bits + 1 parity bit + 1 unknown bit + "1" + "0"
*---------------------------------------------------------------------------------------------------------------------------------------------------
*/
#define ORTEK_START_BIT_PULSE_TIME 2000.0e-6 // 2000 usec pulse
#define ORTEK_START_BIT_PAUSE_TIME 1000.0e-6 // 1000 usec pause
#define ORTEK_BIT_TIME 500.0e-6 // 500 usec pulse/pause
#define ORTEK_FRAME_REPEAT_PAUSE_TIME 45.0e-3 // frame repeat after 45ms
-#define ORTEK_ADDRESS_OFFSET 0 // skip "1" + 3 unknown bits + 1 toggle bit
-#define ORTEK_ADDRESS_LEN 6 // read 7 address bits
-#define ORTEK_COMMAND_OFFSET 8 // skip 5 bits ("1" + 3 mode + 1 toggle bit)
-#define ORTEK_COMMAND_LEN 6 // read 5 command bits
+#define ORTEK_ADDRESS_OFFSET 0 // skip 0 bits
+#define ORTEK_ADDRESS_LEN 8 // read 6 address bits + 2 special bits
+#define ORTEK_COMMAND_OFFSET 8 // skip 6 address bits + 2 special bits
+#define ORTEK_COMMAND_LEN 6 // read 6 command bits
#define ORTEK_COMPLETE_DATA_LEN 18 // complete length
#define ORTEK_STOP_BIT 0 // has no stop bit
#define ORTEK_LSB 0 // MSB...LSB
@@ -651,7 +652,7 @@ typedef uint8_t PAUSE_LEN;
#define TELEFUNKEN_PULSE_TIME 600.0e-6 // 600 usec pulse
#define TELEFUNKEN_1_PAUSE_TIME 1500.0e-6 // 1500 usec pause
#define TELEFUNKEN_0_PAUSE_TIME 600.0e-6 // 600 usec pause
-#define TELEFUNKEN_FRAME_REPEAT_PAUSE_TIME 22.0e-3 // frame repeat after 22ms
+#define TELEFUNKEN_FRAME_REPEAT_PAUSE_TIME 22.0e-3 // frame repeat after XX ms ?????
#define TELEFUNKEN_ADDRESS_OFFSET 0 // skip 0 bits
#define TELEFUNKEN_ADDRESS_LEN 0 // read 0 address bits
#define TELEFUNKEN_COMMAND_OFFSET 0 // skip 0 bits
@@ -661,6 +662,26 @@ typedef uint8_t PAUSE_LEN;
#define TELEFUNKEN_LSB 0 // LSB...MSB
#define TELEFUNKEN_FLAGS 0 // flags
+/*---------------------------------------------------------------------------------------------------------------------------------------------------
+ * ROOMBA
+ *---------------------------------------------------------------------------------------------------------------------------------------------------
+ */
+#define ROOMBA_START_BIT_PULSE_TIME 2790.0e-6 // 2790 usec pulse
+#define ROOMBA_START_BIT_PAUSE_TIME 930.0e-6 // 930 usec pause
+#define ROOMBA_0_PULSE_TIME 930.0e-6 // 930 usec pulse
+#define ROOMBA_1_PULSE_TIME 2790.0e-6 // 2790 usec pulse
+#define ROOMBA_0_PAUSE_TIME 2790.0e-6 // 2790 usec pause
+#define ROOMBA_1_PAUSE_TIME 930.0e-6 // 930 usec pause
+#define ROOMBA_FRAME_REPEAT_PAUSE_TIME 18.0e-3 // frame repeat after 18ms
+#define ROOMBA_ADDRESS_OFFSET 0 // skip 0 bits
+#define ROOMBA_ADDRESS_LEN 0 // read 0 address bits
+#define ROOMBA_COMMAND_OFFSET 0 // skip 0 bits
+#define ROOMBA_COMMAND_LEN 7 // read 7 bits
+#define ROOMBA_COMPLETE_DATA_LEN 7 // complete length
+#define ROOMBA_STOP_BIT 0 // has stop bit
+#define ROOMBA_LSB 0 // MSB...LSB
+#define ROOMBA_FLAGS 0 // flags
+
#define AUTO_FRAME_REPETITION_TIME 80.0e-3 // SIRCS/SAMSUNG32/NUBERT: automatic repetition after 25-50ms
#endif // _IRMP_PROTOCOLS_H_