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

ir_Template.cpp

Blame
  • ir_Template.cpp 5.55 KiB
    /*
    Assuming the protocol we are adding is for the (imaginary) manufacturer:  Shuzu
    
    Our fantasy protocol is a standard protocol, so we can use this standard
    template without too much work. Some protocols are quite unique and will require
    considerably more work in this file! It is way beyond the scope of this text to
    explain how to reverse engineer "unusual" IR protocols. But, unless you own an
    oscilloscope, the starting point is probably to use the rawDump.ino sketch and
    try to spot the pattern!
    
    Before you start, make sure the IR library is working OK:
      # Open up the Arduino IDE
      # Load up the rawDump.ino example sketch
      # Run it
    
    Now we can start to add our new protocol...
    
    1. Copy this file to : ir_Shuzu.cpp
    
    2. Replace all occurrences of "Shuzu" with the name of your protocol.
    
    3. Tweak the #defines to suit your protocol.
    
    4. If you're lucky, tweaking the #defines will make the default send() function
       work.
    
    5. Again, if you're lucky, tweaking the #defines will have made the default
       decode() function work.
    
    You have written the code to support your new protocol!
    
    Now you must do a few things to add it to the IRremote system:
    
    1. Open IRremote.h and make the following changes:
       REMEMEBER to change occurences of "SHUZU" with the name of your protocol
    
       A. At the top, in the section "Supported Protocols", add:
          #define DECODE_SHUZU  1
          #define SEND_SHUZU    1
    
       B. In the section "enumerated list of all supported formats", add:
          SHUZU,
          to the end of the list (notice there is a comma after the protocol name)
    
       C. Further down in "Main class for receiving IR", add:
          //......................................................................
          #if DECODE_SHUZU
              bool  decodeShuzu (decode_results *results) ;
          #endif
    
       D. Further down in "Main class for sending IR", add:
          //......................................................................
          #if SEND_SHUZU
              void  sendShuzu (unsigned long data,  int nbits) ;
          #endif
    
       E. Save your changes and close the file
    
    2. Now open irRecv.cpp and make the following change:
    
       A. In the function IRrecv::decode(), add:
          #ifdef DECODE_NEC
              DBG_PRINTLN("Attempting Shuzu decode");
              if (decodeShuzu(results))  return true ;
          #endif
    
       B. Save your changes and close the file
    
    You will probably want to add your new protocol to the example sketch
    
    3. Open MyDocuments\Arduino\libraries\IRremote\examples\IRrecvDumpV2.ino
    
       A. In the encoding() function, add:
          case SHUZU:    Serial.print("SHUZU");     break ;
    
    Now open the Arduino IDE, load up the rawDump.ino sketch, and run it.
    Hopefully it will compile and upload.
    If it doesn't, you've done something wrong. Check your work.
    If you can't get it to work - seek help from somewhere.
    
    If you get this far, I will assume you have successfully added your new protocol
    There is one last thing to do.
    
    1. Delete this giant instructional comment.
    
    2. Send a copy of your work to us so we can include it in the library and
       others may benefit from your hard work and maybe even write a song about how
       great you are for helping them! :)
    
    Regards,
      BlueChip
    */
    
    #include "IRremote.h"
    #include "IRremoteInt.h"
    
    //==============================================================================
    //
    //
    //                              S H U Z U
    //
    //
    //==============================================================================
    
    #define BITS          32  // The number of bits in the command
    
    #define HDR_MARK    1000  // The length of the Header:Mark
    #define HDR_SPACE   2000  // The lenght of the Header:Space
    
    #define BIT_MARK    3000  // The length of a Bit:Mark
    #define ONE_SPACE   4000  // The length of a Bit:Space for 1's
    #define ZERO_SPACE  5000  // The length of a Bit:Space for 0's
    
    #define OTHER       1234  // Other things you may need to define
    
    //+=============================================================================
    //
    #if SEND_SHUZU
    void  IRsend::sendShuzu (unsigned long data,  int nbits)
    {
    	// Set IR carrier frequency
    	enableIROut(38);
    
    	// Header
    	mark (HDR_MARK);
    	space(HDR_SPACE);
    
    	// Data
    	for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
    		if (data & mask) {
    			mark (BIT_MARK);
    			space(ONE_SPACE);
    		} else {
    			mark (BIT_MARK);
    			space(ZERO_SPACE);
    		}
    	}
    
    	// Footer
    	mark(BIT_MARK);
        space(0);  // Always end with the LED off
    }
    #endif
    
    //+=============================================================================
    //
    #if DECODE_SHUZU
    bool  IRrecv::decodeShuzu (decode_results *results)
    {
    	unsigned long  data   = 0;  // Somewhere to build our code
    	int            offset = 1;  // Skip the Gap reading
    
    	// Check we have the right amount of data
    	if (irparams.rawlen != 1 + 2 + (2 * BITS) + 1)  return false ;
    
    	// Check initial Mark+Space match
    	if (!MATCH_MARK (results->rawbuf[offset++], HDR_MARK ))  return false ;
    	if (!MATCH_SPACE(results->rawbuf[offset++], HDR_SPACE))  return false ;
    
    	// Read the bits in
    	for (int i = 0;  i < SHUZU_BITS;  i++) {
    		// Each bit looks like: MARK + SPACE_1 -> 1
    		//                 or : MARK + SPACE_0 -> 0
    		if (!MATCH_MARK(results->rawbuf[offset++], BIT_MARK))  return false ;
    
    		// IR data is big-endian, so we shuffle it in from the right:
    		if      (MATCH_SPACE(results->rawbuf[offset], ONE_SPACE))   data = (data << 1) | 1 ;
    		else if (MATCH_SPACE(results->rawbuf[offset], ZERO_SPACE))  data = (data << 1) | 0 ;
    		else                                                        return false ;
    		offset++;
    	}
    
    	// Success
    	results->bits        = BITS;
    	results->value       = data;
    	results->decode_type = SHUZU;
    	return true;
    }
    #endif