Skip to content
Snippets Groups Projects
Select Git revision
  • main
1 result

ir_LG.cpp

Blame
  • ir_LG.cpp 2.34 KiB
    #include "IRremote.h"
    #include "IRremoteInt.h"
    
    //==============================================================================
    //                               L       GGGG
    //                               L      G
    //                               L      G  GG
    //                               L      G   G
    //                               LLLLL   GGG
    //==============================================================================
    
    #define LG_BITS 28
    
    #define LG_HDR_MARK 8000
    #define LG_HDR_SPACE 4000
    #define LG_BIT_MARK 600
    #define LG_ONE_SPACE 1600
    #define LG_ZERO_SPACE 550
    #define LG_RPT_LENGTH 60000
    
    //+=============================================================================
    #if DECODE_LG
    bool  IRrecv::decodeLG (decode_results *results)
    {
        long  data   = 0;
        int   offset = 1; // Skip first space
    
    	// Check we have the right amount of data
        if (irparams.rawlen < (2 * LG_BITS) + 1 )  return false ;
    
        // Initial mark/space
        if (!MATCH_MARK(results->rawbuf[offset++], LG_HDR_MARK))  return false ;
        if (!MATCH_SPACE(results->rawbuf[offset++], LG_HDR_SPACE))  return false ;
    
        for (int i = 0;  i < LG_BITS;  i++) {
            if (!MATCH_MARK(results->rawbuf[offset++], LG_BIT_MARK))  return false ;
    
            if      (MATCH_SPACE(results->rawbuf[offset], LG_ONE_SPACE))   data = (data << 1) | 1 ;
            else if (MATCH_SPACE(results->rawbuf[offset], LG_ZERO_SPACE))  data = (data << 1) | 0 ;
            else                                                           return false ;
            offset++;
        }
    
        // Stop bit
        if (!MATCH_MARK(results->rawbuf[offset], LG_BIT_MARK))   return false ;
    
        // Success
        results->bits        = LG_BITS;
        results->value       = data;
        results->decode_type = LG;
        return true;
    }
    #endif
    
    //+=============================================================================
    #if SEND_LG
    void  IRsend::sendLG (unsigned long data,  int nbits)
    {
        // Set IR carrier frequency
        enableIROut(38);
    
        // Header
        mark(LG_HDR_MARK);
        space(LG_HDR_SPACE);
        mark(LG_BIT_MARK);
    
        // Data
        for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
            if (data & mask) {
                space(LG_ONE_SPACE);
                mark(LG_BIT_MARK);
            } else {
                space(LG_ZERO_SPACE);
                mark(LG_BIT_MARK);
            }
        }
        space(0);  // Always end with the LED off
    }
    #endif