Infrared remote library for Arduino: send and receive infrared signals with multiple protocols Port from Arduino-IRremote https://github.com/z3t0/Arduino-IRremote

Dependents:   Lilnija_29012017 NucleoF042K6_IRReceiver

Revision:
0:70c8e56bac45
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ir_Aiwa.cpp	Sat Jan 23 06:16:48 2016 +0000
@@ -0,0 +1,105 @@
+#include "IRremote.h"
+#include "IRremoteInt.h"
+
+//==============================================================================
+//                         AAA   IIIII  W   W   AAA
+//                        A   A    I    W   W  A   A
+//                        AAAAA    I    W W W  AAAAA
+//                        A   A    I    W W W  A   A
+//                        A   A  IIIII   WWW   A   A
+//==============================================================================
+
+// Based off the RC-T501 RCU
+// Lirc file http://lirc.sourceforge.net/remotes/aiwa/RC-T501
+
+#define AIWA_RC_T501_HZ            38
+#define AIWA_RC_T501_BITS          15
+#define AIWA_RC_T501_PRE_BITS      26
+#define AIWA_RC_T501_POST_BITS      1
+#define AIWA_RC_T501_SUM_BITS    (AIWA_RC_T501_PRE_BITS + AIWA_RC_T501_BITS + AIWA_RC_T501_POST_BITS)
+#define AIWA_RC_T501_HDR_MARK    8800
+#define AIWA_RC_T501_HDR_SPACE   4500
+#define AIWA_RC_T501_BIT_MARK     500
+#define AIWA_RC_T501_ONE_SPACE    600
+#define AIWA_RC_T501_ZERO_SPACE  1700
+
+//+=============================================================================
+#if SEND_AIWA_RC_T501
+void  IRsend::sendAiwaRCT501 (int code)
+{
+	unsigned long  pre = 0x0227EEC0;  // 26-bits
+
+	// Set IR carrier frequency
+	enableIROut(AIWA_RC_T501_HZ);
+
+	// Header
+	mark(AIWA_RC_T501_HDR_MARK);
+	space(AIWA_RC_T501_HDR_SPACE);
+
+	// Send "pre" data
+	for (unsigned long  mask = 1UL << (26 - 1);  mask;  mask >>= 1) {
+		mark(AIWA_RC_T501_BIT_MARK);
+		if (pre & mask)  space(AIWA_RC_T501_ONE_SPACE) ;
+		else             space(AIWA_RC_T501_ZERO_SPACE) ;
+	}
+
+//-v- THIS CODE LOOKS LIKE IT MIGHT BE WRONG - CHECK!
+//    it only send 15bits and ignores the top bit
+//    then uses TOPBIT which is 0x80000000 to check the bit code
+//    I suspect TOPBIT should be changed to 0x00008000
+
+	// Skip first code bit
+	code <<= 1;
+	// Send code
+	for (int  i = 0;  i < 15;  i++) {
+		mark(AIWA_RC_T501_BIT_MARK);
+		if (code & 0x80000000)  space(AIWA_RC_T501_ONE_SPACE) ;
+		else                    space(AIWA_RC_T501_ZERO_SPACE) ;
+		code <<= 1;
+	}
+
+//-^- THIS CODE LOOKS LIKE IT MIGHT BE WRONG - CHECK!
+
+	// POST-DATA, 1 bit, 0x0
+	mark(AIWA_RC_T501_BIT_MARK);
+	space(AIWA_RC_T501_ZERO_SPACE);
+
+	mark(AIWA_RC_T501_BIT_MARK);
+	space(0);
+}
+#endif
+
+//+=============================================================================
+#if DECODE_AIWA_RC_T501
+bool  IRrecv::decodeAiwaRCT501 (decode_results *results)
+{
+	int  data   = 0;
+	int  offset = 1;
+
+	// Check SIZE
+	if (irparams.rawlen < 2 * (AIWA_RC_T501_SUM_BITS) + 4)  return false ;
+
+	// Check HDR Mark/Space
+	if (!MATCH_MARK (results->rawbuf[offset++], AIWA_RC_T501_HDR_MARK ))  return false ;
+	if (!MATCH_SPACE(results->rawbuf[offset++], AIWA_RC_T501_HDR_SPACE))  return false ;
+
+	offset += 26;  // skip pre-data - optional
+	while(offset < irparams.rawlen - 4) {
+		if (MATCH_MARK(results->rawbuf[offset], AIWA_RC_T501_BIT_MARK))  offset++ ;
+		else                                                             return false ;
+
+		// ONE & ZERO
+		if      (MATCH_SPACE(results->rawbuf[offset], AIWA_RC_T501_ONE_SPACE))   data = (data << 1) | 1 ;
+		else if (MATCH_SPACE(results->rawbuf[offset], AIWA_RC_T501_ZERO_SPACE))  data = (data << 1) | 0 ;
+		else                                                                     break ;  // End of one & zero detected
+		offset++;
+	}
+
+	results->bits = (offset - 1) / 2;
+	if (results->bits < 42)  return false ;
+
+	results->value       = data;
+	results->decode_type = AIWA_RC_T501;
+	return true;
+}
+#endif