Skip to content
Snippets Groups Projects
Select Git revision
  • 09687b39fa431495cf031dde7c92bbb6791fc563
  • main default protected
2 results

ir_Aiwa.cpp

  • ir_Aiwa.cpp 3.40 KiB
    #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