IRMP - Infrared Multi Protocol Decoder\r
--------------------------------------\r
\r
-Version IRMP: 2.9.1 28.05.2015\r
-Version IRSND: 2.9.1 28.05.2015\r
+Version IRMP: 2.9.2 29.05.2015\r
+Version IRSND: 2.9.2 29.05.2015\r
\r
Dokumentation:\r
\r
*\r
* Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.174 2015/05/28 06:48:19 fm Exp $\r
+ * $Id: irmp.c,v 1.175 2015/05/29 08:23:56 fm Exp $\r
*\r
* Supported AVR mikrocontrollers:\r
*\r
#endif\r
\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || \\r
+ IRMP_SUPPORT_S100_PROTOCOL == 1 || \\r
IRMP_SUPPORT_RC6_PROTOCOL == 1 || \\r
IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1 || \\r
IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1 || \\r
#define RC5_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
#define RC5_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * RC5_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
\r
+#if IRMP_SUPPORT_BOSE_PROTOCOL == 1 // BOSE conflicts with S100, so keep tolerance for S100 minimal here:\r
+#define S100_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MIN_TOLERANCE_05 + 0.5) - 1)\r
+#define S100_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MAX_TOLERANCE_05 + 0.5) + 1)\r
+#else\r
+#define S100_START_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define S100_START_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#endif\r
+\r
+#define S100_BIT_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define S100_BIT_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * S100_BIT_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+\r
#define DENON_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * DENON_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
#define DENON_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * DENON_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
#define DENON_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
static const char proto_merlin[] PROGMEM = "MERLIN";\r
static const char proto_pentax[] PROGMEM = "PENTAX";\r
static const char proto_fan[] PROGMEM = "FAN";\r
+static const char proto_s100[] PROGMEM = "S100";\r
\r
static const char proto_radio1[] PROGMEM = "RADIO1";\r
\r
proto_merlin,\r
proto_pentax,\r
proto_fan,\r
+ proto_s100,\r
proto_radio1\r
};\r
\r
\r
#endif\r
\r
+#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
+\r
+static const PROGMEM IRMP_PARAMETER s100_param =\r
+{\r
+ IRMP_S100_PROTOCOL, // protocol: ir protocol\r
+ S100_BIT_LEN_MIN, // pulse_1_len_min: here: minimum length of short pulse\r
+ S100_BIT_LEN_MAX, // pulse_1_len_max: here: maximum length of short pulse\r
+ S100_BIT_LEN_MIN, // pause_1_len_min: here: minimum length of short pause\r
+ S100_BIT_LEN_MAX, // pause_1_len_max: here: maximum length of short pause\r
+ 0, // pulse_0_len_min: here: not used\r
+ 0, // pulse_0_len_max: here: not used\r
+ 0, // pause_0_len_min: here: not used\r
+ 0, // pause_0_len_max: here: not used\r
+ S100_ADDRESS_OFFSET, // address_offset: address offset\r
+ S100_ADDRESS_OFFSET + S100_ADDRESS_LEN, // address_end: end of address\r
+ S100_COMMAND_OFFSET, // command_offset: command offset\r
+ S100_COMMAND_OFFSET + S100_COMMAND_LEN, // command_end: end of command\r
+ S100_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
+ S100_STOP_BIT, // stop_bit: flag: frame has stop bit\r
+ S100_LSB, // lsb_first: flag: LSB first\r
+ S100_FLAGS // flags: some flags\r
+};\r
+\r
+#endif\r
+\r
#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
\r
static const PROGMEM IRMP_PARAMETER denon_param =\r
\r
#endif\r
\r
-static uint_fast8_t irmp_bit; // current bit position\r
-static IRMP_PARAMETER irmp_param;\r
+static uint_fast8_t irmp_bit; // current bit position\r
+static IRMP_PARAMETER irmp_param;\r
\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
-static IRMP_PARAMETER irmp_param2;\r
+static IRMP_PARAMETER irmp_param2;\r
#endif\r
\r
static volatile uint_fast8_t irmp_ir_detected = FALSE;\r
rtc = TRUE;\r
break;\r
#endif\r
+#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
+ case IRMP_S100_PROTOCOL:\r
+ irmp_address &= ~0x20; // clear toggle bit\r
+ rtc = TRUE;\r
+ break;\r
+#endif\r
#if IRMP_SUPPORT_IR60_PROTOCOL == 1\r
case IRMP_IR60_PROTOCOL:\r
if (irmp_command != 0x007d) // 0x007d (== 62<<1 + 1) is start instruction frame\r
static uint_fast16_t last_irmp_denon_command; // save last irmp command to recognize DENON frame repetition\r
static uint_fast16_t denon_repetition_len = 0xFFFF; // denon repetition len of 2nd auto generated frame\r
#endif\r
-#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
+#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || IRMP_SUPPORT_S100_PROTOCOL == 1\r
static uint_fast8_t rc5_cmd_bit6; // bit 6 of RC5 command is the inverted 2nd start bit\r
#endif\r
#if IRMP_SUPPORT_MANCHESTER == 1\r
#endif\r
irmp_bit = 0xff;\r
irmp_pause_time = 1; // 1st pause: set to 1, not to 0!\r
-#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
+#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || IRMP_SUPPORT_S100_PROTOCOL == 1\r
rc5_cmd_bit6 = 0; // fm 2010-03-07: bugfix: reset it after incomplete RC5 frame!\r
#endif\r
}\r
else\r
#endif // IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
\r
+#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
+ if (((irmp_pulse_time >= S100_START_BIT_LEN_MIN && irmp_pulse_time <= S100_START_BIT_LEN_MAX) ||\r
+ (irmp_pulse_time >= 2 * S100_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * S100_START_BIT_LEN_MAX)) &&\r
+ ((irmp_pause_time >= S100_START_BIT_LEN_MIN && irmp_pause_time <= S100_START_BIT_LEN_MAX) ||\r
+ (irmp_pause_time >= 2 * S100_START_BIT_LEN_MIN && irmp_pause_time <= 2 * S100_START_BIT_LEN_MAX)))\r
+ { // it's S100\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = S100, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ S100_START_BIT_LEN_MIN, S100_START_BIT_LEN_MAX,\r
+ 2 * S100_START_BIT_LEN_MIN, 2 * S100_START_BIT_LEN_MAX,\r
+ S100_START_BIT_LEN_MIN, S100_START_BIT_LEN_MAX,\r
+ 2 * S100_START_BIT_LEN_MIN, 2 * S100_START_BIT_LEN_MAX);\r
+#endif // ANALYZE\r
+\r
+ irmp_param_p = (IRMP_PARAMETER *) &s100_param;\r
+ last_pause = irmp_pause_time;\r
+\r
+ if ((irmp_pulse_time > S100_START_BIT_LEN_MAX && irmp_pulse_time <= 2 * S100_START_BIT_LEN_MAX) ||\r
+ (irmp_pause_time > S100_START_BIT_LEN_MAX && irmp_pause_time <= 2 * S100_START_BIT_LEN_MAX))\r
+ {\r
+ last_value = 0;\r
+ rc5_cmd_bit6 = 1<<6;\r
+ }\r
+ else\r
+ {\r
+ last_value = 1;\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_S100_PROTOCOL == 1\r
+\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
if (((irmp_pulse_time >= RC5_START_BIT_LEN_MIN && irmp_pulse_time <= RC5_START_BIT_LEN_MAX) ||\r
(irmp_pulse_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX)) &&\r
{\r
irmp_tmp_command |= rc5_cmd_bit6; // store bit 6\r
}\r
+#endif\r
+#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_S100_PROTOCOL)\r
+ {\r
+ irmp_tmp_command |= rc5_cmd_bit6; // store bit 6\r
+ }\r
#endif\r
irmp_command = irmp_tmp_command; // store command\r
\r
*\r
* Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.h,v 1.94 2015/05/07 06:51:10 fm Exp $\r
+ * $Id: irmp.h,v 1.95 2015/05/29 08:23:56 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
# define IRMP_SUPPORT_ORTEK_PROTOCOL 0\r
#endif\r
\r
+#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && IRMP_SUPPORT_S100_PROTOCOL == 1\r
+# warning RC5 protocol conflicts wih S100, please enable only one of both protocols\r
+# warning S100 protocol disabled\r
+# undef IRMP_SUPPORT_S100_PROTOCOL\r
+# define IRMP_SUPPORT_S100_PROTOCOL 0\r
+#endif\r
+\r
+#if IRMP_SUPPORT_NUBERT_PROTOCOL == 1 && IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+# warning NUBERT protocol conflicts wih FAN, please enable only one of both protocols\r
+# warning FAN protocol disabled\r
+# undef IRMP_SUPPORT_FAN_PROTOCOL\r
+# define IRMP_SUPPORT_FAN_PROTOCOL 0\r
+#endif\r
+\r
#if IRMP_SUPPORT_FDC_PROTOCOL == 1 && IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
# warning FDC protocol conflicts wih ORTEK, please enable only one of both protocols\r
# warning ORTEK protocol disabled\r
* Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
* Extensions for PIC 12F1820 W.Strobl 2014-07-20\r
*\r
- * $Id: irmpconfig.h,v 1.130 2015/05/28 06:46:49 fm Exp $\r
+ * $Id: irmpconfig.h,v 1.132 2015/05/29 08:24:37 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
#define IRMP_SUPPORT_BOSE_PROTOCOL 0 // BOSE >= 10000 ~150 bytes\r
#define IRMP_SUPPORT_KATHREIN_PROTOCOL 0 // Kathrein >= 10000 ~200 bytes\r
#define IRMP_SUPPORT_NUBERT_PROTOCOL 0 // NUBERT >= 10000 ~50 bytes\r
-#define IRMP_SUPPORT_FAN_PROTOCOL 1 // FAN (ventilator) >= 10000 ~50 bytes\r
+#define IRMP_SUPPORT_FAN_PROTOCOL 0 // FAN (ventilator) >= 10000 ~50 bytes\r
#define IRMP_SUPPORT_SPEAKER_PROTOCOL 0 // SPEAKER (~NUBERT) >= 10000 ~50 bytes\r
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 0 // Bang & Olufsen >= 10000 ~200 bytes\r
#define IRMP_SUPPORT_RECS80_PROTOCOL 0 // RECS80 (SAA3004) >= 15000 ~50 bytes\r
#define IRMP_SUPPORT_SAMSUNG48_PROTOCOL 0 // Samsung48 >= 10000 ~100 bytes (SAMSUNG must be enabled!)\r
#define IRMP_SUPPORT_MERLIN_PROTOCOL 0 // Merlin >= 15000 (better 20000) ~300 bytes\r
#define IRMP_SUPPORT_PENTAX_PROTOCOL 0 // Pentax >= 10000 ~150 bytes\r
+#define IRMP_SUPPORT_S100_PROTOCOL 0 // S100 >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_RADIO1_PROTOCOL 0 // RADIO, e.g. TEVION >= 10000 ~250 bytes (experimental)\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*\r
* Copyright (c) 2013-2015 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmpprotocols.h,v 1.34 2015/05/28 06:46:49 fm Exp $\r
+ * $Id: irmpprotocols.h,v 1.35 2015/05/29 08:23:56 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
#define IRMP_MERLIN_PROTOCOL 42 // Merlin (Pollin 620 185)\r
#define IRMP_PENTAX_PROTOCOL 43 // Pentax camera\r
#define IRMP_FAN_PROTOCOL 44 // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit\r
-#define IRMP_RADIO1_PROTOCOL 45 // Radio protocol (experimental status), do not use it yet!\r
+#define IRMP_S100_PROTOCOL 45 // very similar to RC5, but 14 instead of 13 data bits\r
+#define IRMP_RADIO1_PROTOCOL 46 // Radio protocol (experimental status), do not use it yet!\r
\r
-#define IRMP_N_PROTOCOLS 45 // number of supported protocols\r
+#define IRMP_N_PROTOCOLS 46 // number of supported protocols\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* timing constants:\r
#define RC5_LSB 0 // MSB...LSB\r
#define RC5_FLAGS IRMP_PARAM_FLAG_IS_MANCHESTER // flags\r
\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * S100: very similar to RC5, but 14 insted of 13 bits\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define S100_BIT_TIME 889.0e-6 // 889 usec pulse/pause\r
+#define S100_FRAME_REPEAT_PAUSE_TIME 88.9e-3 // frame repeat after 88.9ms\r
+\r
+#define S100_ADDRESS_OFFSET 1 // skip 1 bit (2nd start)\r
+#define S100_ADDRESS_LEN 6 // read 1 toggle bit (for key repetition detection) + 5 address bits\r
+#define S100_COMMAND_OFFSET 7 // skip 5 bits (2nd start + 1 toggle + 5 address)\r
+#define S100_COMMAND_LEN 7 // read 7 command bits\r
+#define S100_COMPLETE_DATA_LEN 14 // complete length\r
+#define S100_STOP_BIT 0 // has no stop bit\r
+#define S100_LSB 0 // MSB...LSB\r
+#define S100_FLAGS IRMP_PARAM_FLAG_IS_MANCHESTER // flags\r
+\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* DENON:\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284, ATmega1284P\r
* ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
*\r
- * $Id: irsnd.c,v 1.88 2015/05/27 09:33:14 fm Exp $\r
+ * $Id: irsnd.c,v 1.89 2015/05/29 08:23:56 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
# define IRSND_BIT_NUMBER 2\r
# endif // IRSND_OCx\r
\r
-#elif defined (__AVR_ATxmega128A1U__) // ATxmega128A1U \r
+#elif defined (__AVR_XMEGA__) // ATxmega\r
# if IRSND_OCx == IRSND_XMEGA_OC0A \r
# define IRSND_BIT_NUMBER 0\r
# elif IRSND_OCx == IRSND_XMEGA_OC0B\r
# elif IRSND_OCx == IRSND_XMEGA_OC1B\r
# define IRSND_BIT_NUMBER 5\r
# else\r
-# error Wrong value for IRSND_OCx, choose IRSND_OC0, IRSND_OC1A, or IRSND_OC1B in irsndconfig.h\r
+# error Wrong value for IRSND_OCx, choose IRSND_XMEGA_OC0A, IRSND_XMEGA_OC0B, IRSND_XMEGA_OC0C, IRSND_XMEGA_OC0D, IRSND_XMEGA_OC1A, or IRSND_XMEGA_OC1B in irsndconfig.h\r
# endif // IRSND_OCx\r
\r
#elif defined (PIC_C18) //Microchip C18 compiler\r
*\r
* Copyright (c) 2010-2015 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsndconfig.h,v 1.71 2015/05/28 06:46:49 fm Exp $\r
+ * $Id: irsndconfig.h,v 1.73 2015/05/29 08:24:37 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
#define IRSND_SUPPORT_LGAIR_PROTOCOL 0 // LG Air Condition >= 10000 ~150 bytes.\r
#define IRSND_SUPPORT_SAMSUNG48_PROTOCOL 0 // Samsung48 >= 10000 ~100 bytes\r
#define IRSND_SUPPORT_PENTAX_PROTOCOL 0 // Pentax >= 10000 ~150 bytes\r
+#define IRSND_SUPPORT_S100_PROTOCOL 0 // S100 >= 10000 ~150 bytes\r
\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r