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

ir_Sony.cpp

Blame
  • ir_Sony.cpp 2.66 KiB
    #include "IRremote.h"
    #include "IRremoteInt.h"
    
    //==============================================================================
    //                           SSSS   OOO   N   N  Y   Y
    //                          S      O   O  NN  N   Y Y
    //                           SSS   O   O  N N N    Y
    //                              S  O   O  N  NN    Y
    //                          SSSS    OOO   N   N    Y
    //==============================================================================
    
    #define SONY_BITS                   12
    #define SONY_HDR_MARK             2400
    #define SONY_HDR_SPACE             600
    #define SONY_ONE_MARK             1200
    #define SONY_ZERO_MARK             600
    #define SONY_RPT_LENGTH          45000
    #define SONY_DOUBLE_SPACE_USECS    500  // usually ssee 713 - not using ticks as get number wrapround
    
    //+=============================================================================
    #if SEND_SONY
    void  IRsend::sendSony (unsigned long data,  int nbits)
    {
    	// Set IR carrier frequency
    	enableIROut(40);
    
    	// Header
    	mark(SONY_HDR_MARK);
    	space(SONY_HDR_SPACE);
    
    	// Data
    	for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
    		if (data & mask) {
    			mark(SONY_ONE_MARK);
    			space(SONY_HDR_SPACE);
    		} else {
    			mark(SONY_ZERO_MARK);
    			space(SONY_HDR_SPACE);
        	}
      	}
    
    	// We will have ended with LED off
    }
    #endif
    
    //+=============================================================================
    #if DECODE_SONY
    bool  IRrecv::decodeSony (decode_results *results)
    {
    	long  data   = 0;
    	int   offset = 0;  // Dont skip first space, check its size
    
    	if (irparams.rawlen < (2 * SONY_BITS) + 2)  return false ;
    
    	// Some Sony's deliver repeats fast after first
    	// unfortunately can't spot difference from of repeat from two fast clicks
    	if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) {
    		// Serial.print("IR Gap found: ");
    		results->bits = 0;
    		results->value = REPEAT;
    
    #	ifdef DECODE_SANYO
    		results->decode_type = SANYO;
    #	else
    		results->decode_type = UNKNOWN;
    #	endif
    
    	    return true;
    	}
    	offset++;
    
    	// Initial mark
    	if (!MATCH_MARK(results->rawbuf[offset++], SONY_HDR_MARK))  return false ;
    
    	while (offset + 1 < irparams.rawlen) {
    		if (!MATCH_SPACE(results->rawbuf[offset++], SONY_HDR_SPACE))  break ;
    
    		if      (MATCH_MARK(results->rawbuf[offset], SONY_ONE_MARK))   data = (data << 1) | 1 ;
    		else if (MATCH_MARK(results->rawbuf[offset], SONY_ZERO_MARK))  data = (data << 1) | 0 ;
    		else                                                           return false ;
    		offset++;
    	}
    
    	// Success
    	results->bits = (offset - 1) / 2;
    	if (results->bits < 12) {
    		results->bits = 0;
    		return false;
    	}
    	results->value       = data;
    	results->decode_type = SONY;
    	return true;
    }
    #endif