106 lines
3.4 KiB
C++
106 lines
3.4 KiB
C++
#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
|