IRMP - Infrared Multi Protocol Decoder\r
--------------------------------------\r
\r
-Version IRMP: 3.0.0 2016-01-12\r
-Version IRSND: 3.0.0 2016-01-12\r
+Version IRMP: 3.0.2 2016-09-09\r
+Version IRSND: 3.0.2 2016-09-09\r
\r
Documentation:\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * irmp-main-avr-uart.cpp - demo main module to test IRMP decoder on AVR with UART\r
+ * irmp-main-avr-uart.c - demo main module to test IRMP decoder on AVR with UART\r
*\r
* Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp-main-avr-uart.c,v 1.1 2016/01/12 11:55:05 fm Exp $\r
+ * $Id: irmp-main-avr-uart.c,v 1.2 2016/09/09 08:01:11 fm Exp $\r
*\r
* This demo module is runnable on AVRs with UART\r
*\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* irmp-main-avr.c - demo main module to test IRMP decoder on AVR\r
*\r
- * Copyright (c) 2009-2017 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp-main-avr.c,v 1.1 2016/01/12 11:55:05 fm Exp $\r
+ * $Id: irmp-main-avr.c,v 1.2 2016/01/12 21:15:16 fm Exp $\r
*\r
* This demo module is runnable on AVRs\r
*\r
\r
Test program IRMP for ESP8266 2015-11-16 Wolfgang Strobl, Bonn\r
\r
+$Id: irmp-main-esp8266.c,v 1.2 2016/01/12 21:15:16 fm Exp $\r
+\r
IRMP ported to ESP8266, testet with MOD-WIFI-ESP8266-DEV on\r
ESP8266-EVB evaluation board. https://www.olimex.com/Products/IoT/ESP8266-EVB/\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * main_pic12f1840.c - example main module for PIC 12f1840\r
+ * irmp-main-pic-12F1840.c - example main module for PIC 12f1840\r
* \r
* IR decoder using IRMP\r
*\r
* (c) 2014 Wolfgang Strobl (news4 at mystrobl.de) 2014-03-12:2014-07-20\r
*\r
+ * $Id: irmp-main-pic-12F1840.c,v 1.4 2016/09/09 08:01:11 fm Exp $\r
+ *\r
* This demo module is runnable on a Microchip PIC 12F1840\r
*\r
* To be used with IRMP by Frank Meyer (frank(at)fli4l.de)\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * main.c - demo main module to test IRMP decoder on PIC18F4520 with XC8 compiler\r
+ * irmp-main-pic-xc8.c - demo main module to test IRMP decoder on PIC18F4520 with XC8 compiler\r
*\r
* Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp-main-pic-xc8.c,v 1.1 2016/01/12 11:55:05 fm Exp $\r
+ * $Id: irmp-main-pic-xc8.c,v 1.2 2016/09/09 08:01:11 fm Exp $\r
*\r
* This demo module is runnable on PIC18F4520 with XC8 compiler\r
*\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* irmp-main-stm32.c - demo main module to test IRMP decoder on STM32\r
*\r
- * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp-main-stm32.c,v 1.1 2016/01/12 11:55:05 fm Exp $\r
+ * $Id: irmp-main-stm32.c,v 1.2 2016/01/12 21:15:16 fm Exp $\r
*\r
* This demo module is runnable on STM32\r
*\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* irmp.c - infrared multi-protocol decoder, supports several remote control protocols\r
*\r
- * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.c,v 1.184 2016/01/12 11:53:34 fm Exp $\r
+ * $Id: irmp.c,v 1.187 2016/09/09 07:53:29 fm Exp $\r
*\r
* Supported AVR mikrocontrollers:\r
*\r
#define KASEIKYO_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
#define KASEIKYO_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * KASEIKYO_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
\r
+#define MITSU_HEAVY_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define MITSU_HEAVY_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define MITSU_HEAVY_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
+#define MITSU_HEAVY_START_BIT_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
+#define MITSU_HEAVY_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_PULSE_TIME * MIN_TOLERANCE_40 + 0.5) - 1)\r
+#define MITSU_HEAVY_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)\r
+#define MITSU_HEAVY_1_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define MITSU_HEAVY_1_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+#define MITSU_HEAVY_0_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)\r
+#define MITSU_HEAVY_0_PAUSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * MITSU_HEAVY_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)\r
+\r
#define PANASONIC_START_BIT_PULSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
#define PANASONIC_START_BIT_PULSE_LEN_MAX ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)\r
#define PANASONIC_START_BIT_PAUSE_LEN_MIN ((uint_fast8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)\r
static const char proto_acp24[] PROGMEM = "ACP24";\r
static const char proto_technics[] PROGMEM = "TECHNICS";\r
static const char proto_panasonic[] PROGMEM = "PANASONIC";\r
+static const char proto_mitsu_heavy[] PROGMEM = "MITSU_HEAVY";\r
\r
static const char proto_radio1[] PROGMEM = "RADIO1";\r
\r
proto_acp24,\r
proto_technics,\r
proto_panasonic,\r
+ proto_mitsu_heavy,\r
proto_radio1\r
};\r
\r
\r
#endif\r
\r
+#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+\r
+static const PROGMEM IRMP_PARAMETER mitsu_heavy_param =\r
+{\r
+ IRMP_MITSU_HEAVY_PROTOCOL, // protocol: ir protocol\r
+ MITSU_HEAVY_PULSE_LEN_MIN, // pulse_1_len_min: minimum length of pulse with bit value 1\r
+ MITSU_HEAVY_PULSE_LEN_MAX, // pulse_1_len_max: maximum length of pulse with bit value 1\r
+ MITSU_HEAVY_1_PAUSE_LEN_MIN, // pause_1_len_min: minimum length of pause with bit value 1\r
+ MITSU_HEAVY_1_PAUSE_LEN_MAX, // pause_1_len_max: maximum length of pause with bit value 1\r
+ MITSU_HEAVY_PULSE_LEN_MIN, // pulse_0_len_min: minimum length of pulse with bit value 0\r
+ MITSU_HEAVY_PULSE_LEN_MAX, // pulse_0_len_max: maximum length of pulse with bit value 0\r
+ MITSU_HEAVY_0_PAUSE_LEN_MIN, // pause_0_len_min: minimum length of pause with bit value 0\r
+ MITSU_HEAVY_0_PAUSE_LEN_MAX, // pause_0_len_max: maximum length of pause with bit value 0\r
+ MITSU_HEAVY_ADDRESS_OFFSET, // address_offset: address offset\r
+ MITSU_HEAVY_ADDRESS_OFFSET + MITSU_HEAVY_ADDRESS_LEN, // address_end: end of address\r
+ MITSU_HEAVY_COMMAND_OFFSET, // command_offset: command offset\r
+ MITSU_HEAVY_COMMAND_OFFSET + MITSU_HEAVY_COMMAND_LEN, // command_end: end of command\r
+ MITSU_HEAVY_COMPLETE_DATA_LEN, // complete_len: complete length of frame\r
+ MITSU_HEAVY_STOP_BIT, // stop_bit: flag: frame has stop bit\r
+ MITSU_HEAVY_LSB, // lsb_first: flag: LSB first\r
+ MITSU_HEAVY_FLAGS // flags: some flags\r
+};\r
+\r
+#endif\r
+\r
#if IRMP_SUPPORT_RECS80_PROTOCOL == 1\r
\r
static const PROGMEM IRMP_PARAMETER recs80_param =\r
static uint_fast8_t parity; // number of '1' of the first 14 bits, check if even.\r
#endif\r
\r
+#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+static uint_fast8_t check; // number of '1' of the first 14 bits, check if even.\r
+static uint_fast8_t mitsu_parity; // number of '1' of the first 14 bits, check if even.\r
+#endif\r
+\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* store bit\r
* @details store bit in temp address or temp command\r
{\r
if (irmp_bit >= 20 && irmp_bit < 24)\r
{\r
- irmp_tmp_command |= (((uint_fast16_t) (value)) << (irmp_bit - 8)); // store 4 system bits (genre 1) in upper nibble with LSB first\r
+ irmp_tmp_command |= (((uint_fast16_t) (value)) << (irmp_bit - 8)); // store 4 system bits (genre 1) in upper nibble with LSB first\r
}\r
else if (irmp_bit >= 24 && irmp_bit < 28)\r
{\r
- genre2 |= (((uint_fast8_t) (value)) << (irmp_bit - 20)); // store 4 system bits (genre 2) in upper nibble with LSB first\r
+ genre2 |= (((uint_fast8_t) (value)) << (irmp_bit - 20)); // store 4 system bits (genre 2) in upper nibble with LSB first\r
}\r
\r
if (irmp_bit < KASEIKYO_COMPLETE_DATA_LEN)\r
}\r
else\r
#endif\r
+\r
+#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_MITSU_HEAVY_PROTOCOL) // squeeze 64 bits into 16 bits:\r
+ {\r
+ if (irmp_bit == 72 )\r
+ { // irmp_tmp_address, irmp_tmp_command received: check parity & compress\r
+ mitsu_parity = PARITY_CHECK_OK;\r
+\r
+ check = irmp_tmp_address >> 8; // inverted upper byte == lower byte?\r
+ check = ~ check;\r
+\r
+ if (check == (irmp_tmp_address & 0xFF))\r
+ { // ok:\r
+ irmp_tmp_address <<= 8; // throw away upper byte\r
+ }\r
+ else\r
+ {\r
+ mitsu_parity = PARITY_CHECK_FAILED;\r
+ }\r
+\r
+ check = irmp_tmp_command >> 8; // inverted upper byte == lower byte?\r
+ check = ~ check;\r
+ if (check == (irmp_tmp_command & 0xFF))\r
+ { // ok: pack together\r
+ irmp_tmp_address |= irmp_tmp_command & 0xFF; // byte 1, byte2 in irmp_tmp_address, irmp_tmp_command can be used for byte 3\r
+ }\r
+ else\r
+ {\r
+ mitsu_parity = PARITY_CHECK_FAILED;\r
+ }\r
+ irmp_tmp_command = 0;\r
+ }\r
+\r
+ if (irmp_bit >= 72 )\r
+ { // receive 3. word in irmp_tmp_command\r
+ irmp_tmp_command <<= 1;\r
+ irmp_tmp_command |= value;\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL\r
{\r
;\r
}\r
else\r
#endif // IRMP_SUPPORT_PANASONIC_PROTOCOL == 1\r
\r
+#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+ if (irmp_pulse_time >= MITSU_HEAVY_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MITSU_HEAVY_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= MITSU_HEAVY_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MITSU_HEAVY_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's MITSU_HEAVY\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = MITSU_HEAVY, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ MITSU_HEAVY_START_BIT_PULSE_LEN_MIN, MITSU_HEAVY_START_BIT_PULSE_LEN_MAX,\r
+ MITSU_HEAVY_START_BIT_PAUSE_LEN_MIN, MITSU_HEAVY_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &mitsu_heavy_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+\r
#if IRMP_SUPPORT_RADIO1_PROTOCOL == 1\r
if (irmp_pulse_time >= RADIO1_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RADIO1_START_BIT_PULSE_LEN_MAX &&\r
irmp_pause_time >= RADIO1_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RADIO1_START_BIT_PAUSE_LEN_MAX)\r
}\r
#endif // IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
\r
+#if IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_MITSU_HEAVY_PROTOCOL)\r
+ {\r
+ check = irmp_tmp_command >> 8; // inverted upper byte == lower byte?\r
+ check = ~ check;\r
+ if (check == (irmp_tmp_command & 0xFF)) { //ok:\r
+ irmp_tmp_command &= 0xFF;\r
+ }\r
+ else mitsu_parity = PARITY_CHECK_FAILED;\r
+ if (mitsu_parity == PARITY_CHECK_FAILED)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("error 7: parity check failed\n");\r
+#endif // ANALYZE\r
+ irmp_ir_detected = FALSE;\r
+ }\r
+ }\r
+#endif // IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL\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
{\r
static uint8_t key_table[128] =\r
{\r
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F\r
- 0, '^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 0xDF, '´', 0, '\b',\r
- '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 0xFC, '+', 0, 0, 'a',\r
- 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0xF6, 0xE4, '#', '\r', 0, '<', 'y', 'x',\r
- 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, 0, 0, ' ', 0, 0,\r
-\r
- 0, '°', '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '`', 0, '\b',\r
- '\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 0xDC, '*', 0, 0, 'A',\r
- 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0xD6, 0xC4, '\'', '\r', 0, '>', 'Y', 'X',\r
- 'C', 'V', 'B', 'N', 'M', ';', ':', '_', 0, 0, 0, 0, 0, ' ', 0, 0\r
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F\r
+ 0, '^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 0xDF, '´', 0, '\b',\r
+ '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 0xFC, '+', 0, 0, 'a',\r
+ 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0xF6, 0xE4, '#', '\r', 0, '<', 'y', 'x',\r
+ 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, 0, 0, ' ', 0, 0,\r
+\r
+ 0, '°', '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '`', 0, '\b',\r
+ '\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 0xDC, '*', 0, 0, 'A',\r
+ 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0xD6, 0xC4, '\'', '\r', 0, '>', 'Y', 'X',\r
+ 'C', 'V', 'B', 'N', 'M', ';', ':', '_', 0, 0, 0, 0, 0, ' ', 0, 0\r
};\r
static uint_fast8_t state;\r
\r
{\r
switch (cmd)\r
{\r
- case 0x0003: key = '²'; break;\r
+ case 0x0003: key = 0xB2; break; // upper 2\r
case 0x0008: key = '{'; break;\r
case 0x0009: key = '['; break;\r
case 0x000A: key = ']'; break;\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* irmp.h\r
*\r
- * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmp.h,v 1.101 2015/11/18 08:27:50 fm Exp $\r
+ * $Id: irmp.h,v 1.103 2016/09/09 07:53:29 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_ROOMBA_PROTOCOL 0\r
#endif\r
\r
+#if IRMP_SUPPORT_PANASONIC_PROTOCOL == 1 && IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+# warning PANASONIC protocol conflicts wih MITSU_HEAVY, please enable only one of both protocols\r
+# warning MITSU_HEAVY protocol disabled\r
+# undef IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL\r
+# define IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL 0\r
+#endif\r
+\r
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
# warning RC5 protocol conflicts wih ORTEK, please enable only one of both protocols\r
# warning ORTEK protocol disabled\r
*\r
* DO NOT INCLUDE THIS FILE, WILL BE INCLUDED BY IRMP.H!\r
*\r
- * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
* Extensions for PIC 12F1820 W.Strobl 2014-07-20\r
*\r
- * $Id: irmpconfig.h,v 1.146 2016/01/12 11:53:34 fm Exp $\r
+ * $Id: irmpconfig.h,v 1.148 2016/09/09 07:53:29 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_ACP24_PROTOCOL 0 // ACP24 >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_TECHNICS_PROTOCOL 0 // TECHNICS >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_PANASONIC_PROTOCOL 0 // PANASONIC Beamer >= 10000 ~250 bytes\r
+#define IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL 0 // Mitsubishi Aircond >= 10000 ~250 bytes\r
#define IRMP_SUPPORT_RADIO1_PROTOCOL 0 // RADIO, e.g. TEVION >= 10000 ~250 bytes (experimental)\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*\r
* DO NOT INCLUDE THIS FILE, WILL BE INCLUDED BY IRMP.H or IRSND.H!\r
*\r
- * Copyright (c) 2013-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2013-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmpprotocols.h,v 1.44 2015/11/30 09:31:54 fm Exp $\r
+ * $Id: irmpprotocols.h,v 1.46 2016/09/09 07:53:29 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_ACP24_PROTOCOL 46 // Stiebel Eltron ACP24 air conditioner\r
#define IRMP_TECHNICS_PROTOCOL 47 // Technics, similar to Matsushita, but 22 instead of 24 bits\r
#define IRMP_PANASONIC_PROTOCOL 48 // Panasonic (Beamer), start bits similar to KASEIKYO\r
+#define IRMP_MITSU_HEAVY_PROTOCOL 49 // Mitsubishi-Heavy Aircondition, similar timing as Panasonic beamer\r
\r
-#define IRMP_RADIO1_PROTOCOL 49 // Radio protocol (experimental status), do not use it yet!\r
+#define IRMP_RADIO1_PROTOCOL 50 // Radio protocol (experimental status), do not use it yet!\r
\r
-#define IRMP_N_PROTOCOLS 50 // number of supported protocols\r
+#define IRMP_N_PROTOCOLS 51 // number of supported protocols\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* timing constants:\r
* PANASONIC (Beamer), start bit timings similar to KASEIKYO\r
*---------------------------------------------------------------------------------------------------------------------------------------------------\r
*/\r
-#define PANASONIC_START_BIT_PULSE_TIME 3600.0e-6 // 3600 usec pulse\r
-#define PANASONIC_START_BIT_PAUSE_TIME 1600.0e-6 // 1690 usec pause\r
-#define PANASONIC_PULSE_TIME 565.0e-6 // 565 usec pulse\r
-#define PANASONIC_1_PAUSE_TIME 1140.0e-6 // 1140 usec pause\r
-#define PANASONIC_0_PAUSE_TIME 316.0e-6 // 316 usec pause\r
-#define PANASONIC_AUTO_REPETITION_PAUSE_TIME 40.0e-3 // repetition after 40 ms?\r
-#define PANASONIC_FRAME_REPEAT_PAUSE_TIME 40.0e-3 // frame repeat after 40 ms\r
-#define PANASONIC_ADDRESS_OFFSET 24 // skip 24 bits: 010000000000010000000001\r
-#define PANASONIC_ADDRESS_LEN 16 // read 16 address bits\r
-#define PANASONIC_COMMAND_OFFSET 40 // skip 40 bits\r
-#define PANASONIC_COMMAND_LEN 16 // read 16 command bits\r
-#define PANASONIC_COMPLETE_DATA_LEN 56 // complete length\r
-#define PANASONIC_STOP_BIT 1 // has stop bit\r
-#define PANASONIC_LSB 1 // LSB...MSB?\r
-#define PANASONIC_FRAMES 1 // PANASONIC sends 1 frame\r
-#define PANASONIC_FLAGS 0 // flags\r
+#define PANASONIC_START_BIT_PULSE_TIME 3600.0e-6 // 3600 usec pulse\r
+#define PANASONIC_START_BIT_PAUSE_TIME 1600.0e-6 // 1690 usec pause\r
+#define PANASONIC_PULSE_TIME 565.0e-6 // 565 usec pulse\r
+#define PANASONIC_1_PAUSE_TIME 1140.0e-6 // 1140 usec pause\r
+#define PANASONIC_0_PAUSE_TIME 316.0e-6 // 316 usec pause\r
+#define PANASONIC_AUTO_REPETITION_PAUSE_TIME 40.0e-3 // repetition after 40 ms?\r
+#define PANASONIC_FRAME_REPEAT_PAUSE_TIME 40.0e-3 // frame repeat after 40 ms\r
+#define PANASONIC_ADDRESS_OFFSET 24 // skip 24 bits: 010000000000010000000001\r
+#define PANASONIC_ADDRESS_LEN 16 // read 16 address bits\r
+#define PANASONIC_COMMAND_OFFSET 40 // skip 40 bits\r
+#define PANASONIC_COMMAND_LEN 16 // read 16 command bits\r
+#define PANASONIC_COMPLETE_DATA_LEN 56 // complete length\r
+#define PANASONIC_STOP_BIT 1 // has stop bit\r
+#define PANASONIC_LSB 1 // LSB...MSB?\r
+#define PANASONIC_FRAMES 1 // PANASONIC sends 1 frame\r
+#define PANASONIC_FLAGS 0 // flags\r
+\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * MITSUBISHI-Heavy Aircondition, timings similar to PANASONIC beamer\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
+#define MITSU_HEAVY_START_BIT_PULSE_TIME 3200.0e-6 // 3600 usec pulse\r
+#define MITSU_HEAVY_START_BIT_PAUSE_TIME 1560.0e-6 // 1690 usec pause\r
+#define MITSU_HEAVY_PULSE_TIME 400.0e-6 // 565 usec pulse\r
+#define MITSU_HEAVY_1_PAUSE_TIME 1200.0e-6 // 1140 usec pause\r
+#define MITSU_HEAVY_0_PAUSE_TIME 430.0e-6 // 316 usec pause\r
+#define MITSU_HEAVY_FRAME_REPEAT_PAUSE_TIME 40.0e-3 // frame repeat after 40 ms\r
+#define MITSU_HEAVY_ADDRESS_OFFSET 40 // skip 24 bits: 010000000000010000000001\r
+#define MITSU_HEAVY_ADDRESS_LEN 16 // read 16 address bits\r
+#define MITSU_HEAVY_COMMAND_OFFSET 56 // skip 40 bits\r
+#define MITSU_HEAVY_COMMAND_LEN 16 // read 16 command bits\r
+#define MITSU_HEAVY_COMPLETE_DATA_LEN 88 // complete length\r
+#define MITSU_HEAVY_STOP_BIT 1 // has stop bit\r
+#define MITSU_HEAVY_LSB 0 // LSB...MSB?\r
+#define MITSU_HEAVY_FRAMES 1 // PANASONIC sends 1 frame\r
+#define MITSU_HEAVY_FLAGS 0 // flags\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* RECS80:\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* irmpsystem.h - system specific includes and defines\r
*\r
- * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2009-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irmpsystem.h,v 1.22 2016/01/12 11:53:34 fm Exp $\r
+ * $Id: irmpsystem.h,v 1.24 2016/09/09 07:53:29 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
#if defined(PIC_CCS) || defined(PIC_C18) || defined(ARM_STM32) || defined(STELLARIS_ARM_CORTEX_M4)\r
typedef unsigned char uint8_t;\r
typedef unsigned short uint16_t;\r
+typedef unsigned char uint_fast8_t;\r
+typedef unsigned short uint_fast16_t;\r
#endif\r
\r
#if defined (PIC_C18) // PIC C18 or XC8 compiler\r
# define FALSE 0\r
#endif\r
\r
-typedef struct __attribute__ ((__packed__))\r
+#if defined(PIC_C18)\r
+#define IRMP_PACKED_STRUCT\r
+#else\r
+#define IRMP_PACKED_STRUCT __attribute__ ((__packed__))\r
+#endif\r
+\r
+typedef struct IRMP_PACKED_STRUCT\r
{\r
uint8_t protocol; // protocol, e.g. NEC_PROTOCOL\r
uint16_t address; // address\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
- * irsndmain.c - demo main module to test IRSND encoder on AVRs\r
+ * irsnd-main-avr.c - demo main module to test IRSND encoder on AVRs\r
*\r
* Copyright (c) 2010-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
+ * $Id: irsnd-main-avr.c,v 1.3 2016/09/09 08:01:11 fm Exp $\r
+ *\r
* ATMEGA88 @ 8 MHz internal RC Osc with BODLEVEL 4.3V: lfuse: 0xE2 hfuse: 0xDC efuse: 0xF9\r
* ATMEGA88 @ 8 MHz external Crystal Osc with BODLEVEL 4.3V: lfuse: 0xFF hfuse: 0xDC efuse: 0xF9\r
*\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* @file irsnd.c\r
*\r
- * Copyright (c) 2010-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
* Supported AVR mikrocontrollers:\r
*\r
* ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284, ATmega1284P\r
* ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P\r
*\r
- * $Id: irsnd.c,v 1.99 2015/12/16 14:12:17 fm Exp $\r
+ * $Id: irsnd.c,v 1.101 2016/09/09 07:53:29 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
//Nothing here to do here -> See irsndconfig.h\r
#elif defined (ARM_STM32) //STM32\r
//Nothing here to do here -> See irsndconfig.h\r
-#elif defined (TEENSY_ARM_CORTEX_M4) // Teensy3\r
-# if !digitalPinHasPWM(IRSND_PIN)\r
-# error need pin with PWM output.\r
-# endif\r
+/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ * Macro digitalPinHasPWM bothers PIC_C18 compiler, but why?\r
+ *\r
+ * #elif defined (TEENSY_ARM_CORTEX_M4) // Teensy3\r
+ * # if !digitalPinHasPWM(IRSND_PIN)\r
+ * # error need pin with PWM output.\r
+ * # endif\r
+ *---------------------------------------------------------------------------------------------------------------------------------------------------\r
+ */\r
#else\r
# if !defined (unix) && !defined (WIN32)\r
# error mikrocontroller not defined, please fill in definitions here.\r
#define KASEIKYO_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * KASEIKYO_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t!\r
#define KASEIKYO_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * KASEIKYO_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
\r
-#define PANASONIC_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PULSE_TIME + 0.5)\r
-#define PANASONIC_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PAUSE_TIME + 0.5)\r
-#define PANASONIC_PULSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_PULSE_TIME + 0.5)\r
-#define PANASONIC_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_1_PAUSE_TIME + 0.5)\r
-#define PANASONIC_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_0_PAUSE_TIME + 0.5)\r
-#define PANASONIC_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * PANASONIC_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t!\r
-#define PANASONIC_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * PANASONIC_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
+#define PANASONIC_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PULSE_TIME + 0.5)\r
+#define PANASONIC_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_START_BIT_PAUSE_TIME + 0.5)\r
+#define PANASONIC_PULSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_PULSE_TIME + 0.5)\r
+#define PANASONIC_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_1_PAUSE_TIME + 0.5)\r
+#define PANASONIC_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * PANASONIC_0_PAUSE_TIME + 0.5)\r
+#define PANASONIC_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * PANASONIC_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t!\r
+#define PANASONIC_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * PANASONIC_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
+\r
+#define MITSU_HEAVY_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PULSE_TIME + 0.5)\r
+#define MITSU_HEAVY_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MITSU_HEAVY_START_BIT_PAUSE_TIME + 0.5)\r
+#define MITSU_HEAVY_PULSE_LEN (uint8_t)(F_INTERRUPTS * MITSU_HEAVY_PULSE_TIME + 0.5)\r
+#define MITSU_HEAVY_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MITSU_HEAVY_1_PAUSE_TIME + 0.5)\r
+#define MITSU_HEAVY_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MITSU_HEAVY_0_PAUSE_TIME + 0.5)\r
+#define MITSU_HEAVY_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * MITSU_HEAVY_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t!\r
\r
#define RECS80_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME + 0.5)\r
#define RECS80_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME + 0.5)\r
\r
static volatile uint8_t irsnd_busy = 0;\r
static volatile uint8_t irsnd_protocol = 0;\r
-static volatile uint8_t irsnd_buffer[9] = {0};\r
+static volatile uint8_t irsnd_buffer[11] = {0};\r
static volatile uint8_t irsnd_repeat = 0;\r
static volatile uint8_t irsnd_is_on = FALSE;\r
\r
break;\r
}\r
#endif\r
+#if IRSND_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+ case IRMP_MITSU_HEAVY_PROTOCOL:\r
+ {\r
+ address = irmp_data_p->address;\r
+ command = irmp_data_p->command;\r
+\r
+ irsnd_buffer[0] = 0x4A;\r
+ irsnd_buffer[1] = 0x75;\r
+ irsnd_buffer[2] = 0xC3;\r
+ irsnd_buffer[3] = 0x64;\r
+ irsnd_buffer[4] = 0x9B;\r
+ irsnd_buffer[5] = ~(address & 0xFF00) >> 8;\r
+ irsnd_buffer[6] = (address & 0xFF00) >> 8;\r
+ irsnd_buffer[7] = ~(address & 0x00FF);\r
+ irsnd_buffer[8] = (address & 0x00FF);\r
+ irsnd_buffer[9] = ~(command & 0x00FF);\r
+ irsnd_buffer[10] = (command & 0x00FF);\r
+\r
+ irsnd_busy = TRUE;\r
+ break;\r
+ }\r
+#endif\r
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1\r
case IRMP_RECS80_PROTOCOL:\r
{\r
break;\r
}\r
#endif\r
+#if IRSND_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+ case IRMP_MITSU_HEAVY_PROTOCOL:\r
+ {\r
+ startbit_pulse_len = MITSU_HEAVY_START_BIT_PULSE_LEN;\r
+ startbit_pause_len = MITSU_HEAVY_START_BIT_PAUSE_LEN - 1;\r
+ pulse_1_len = MITSU_HEAVY_PULSE_LEN;\r
+ pause_1_len = MITSU_HEAVY_1_PAUSE_LEN - 1;\r
+ pulse_0_len = MITSU_HEAVY_PULSE_LEN;\r
+ pause_0_len = MITSU_HEAVY_0_PAUSE_LEN - 1;\r
+ has_stop_bit = MITSU_HEAVY_STOP_BIT;\r
+ complete_data_len = MITSU_HEAVY_COMPLETE_DATA_LEN;\r
+ n_auto_repetitions = MITSU_HEAVY_FRAMES; // 1 frame\r
+ auto_repetition_pause_len = 0;;\r
+ repeat_frame_pause_len = MITSU_HEAVY_FRAME_REPEAT_PAUSE_LEN;\r
+ irsnd_set_freq (IRSND_FREQ_40_KHZ);\r
+ break;\r
+ }\r
+#endif\r
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1\r
case IRMP_RECS80_PROTOCOL:\r
{\r
#if IRSND_SUPPORT_PANASONIC_PROTOCOL == 1\r
case IRMP_PANASONIC_PROTOCOL:\r
#endif\r
+#if IRSND_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
+ case IRMP_MITSU_HEAVY_PROTOCOL:\r
+#endif\r
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1\r
case IRMP_RECS80_PROTOCOL:\r
#endif\r
IRSND_SUPPORT_NUBERT_PROTOCOL == 1 || IRSND_SUPPORT_FAN_PROTOCOL == 1 || IRSND_SUPPORT_SPEAKER_PROTOCOL == 1 || IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 || \\r
IRSND_SUPPORT_FDC_PROTOCOL == 1 || IRSND_SUPPORT_RCCAR_PROTOCOL == 1 || IRSND_SUPPORT_JVC_PROTOCOL == 1 || IRSND_SUPPORT_NIKON_PROTOCOL == 1 || \\r
IRSND_SUPPORT_LEGO_PROTOCOL == 1 || IRSND_SUPPORT_THOMSON_PROTOCOL == 1 || IRSND_SUPPORT_ROOMBA_PROTOCOL == 1 || IRSND_SUPPORT_TELEFUNKEN_PROTOCOL == 1 || \\r
- IRSND_SUPPORT_PENTAX_PROTOCOL == 1 || IRSND_SUPPORT_ACP24_PROTOCOL == 1 || IRSND_SUPPORT_PANASONIC_PROTOCOL == 1 || IRSND_SUPPORT_BOSE_PROTOCOL == 1\r
+ IRSND_SUPPORT_PENTAX_PROTOCOL == 1 || IRSND_SUPPORT_ACP24_PROTOCOL == 1 || IRSND_SUPPORT_PANASONIC_PROTOCOL == 1 || IRSND_SUPPORT_BOSE_PROTOCOL == 1 || \\r
+ IRSND_SUPPORT_MITSU_HEAVY_PROTOCOL == 1\r
{\r
if (pulse_counter == 0)\r
{\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
* irsnd.h\r
*\r
- * Copyright (c) 2010-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsnd.h,v 1.23 2015/11/18 08:27:50 fm Exp $\r
+ * $Id: irsnd.h,v 1.24 2016/01/12 21:15:16 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
* DO NOT INCLUDE THIS FILE, WILL BE INCLUDED BY IRSND.H!\r
*\r
- * Copyright (c) 2010-2015 Frank Meyer - frank(at)fli4l.de\r
+ * Copyright (c) 2010-2016 Frank Meyer - frank(at)fli4l.de\r
*\r
- * $Id: irsndconfig.h,v 1.86 2015/11/18 08:27:50 fm Exp $\r
+ * $Id: irsndconfig.h,v 1.88 2016/09/09 07:53:29 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_ACP24_PROTOCOL 0 // ACP24 >= 10000 ~150 bytes\r
#define IRSND_SUPPORT_TECHNICS_PROTOCOL 0 // TECHNICS >= 10000 DON'T CHANGE, NOT SUPPORTED YET!\r
#define IRSND_SUPPORT_PANASONIC_PROTOCOL 0 // PANASONIC Beamer >= 10000 ~150 bytes\r
+#define IRSND_SUPPORT_MITSU_HEAVY_PROTOCOL 0 // Mitsubishi-Heavy Aircondition, similar Timing to Panasonic beamer\r
\r
\r
/*---------------------------------------------------------------------------------------------------------------------------------------------------\r