|
- #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
|