180 lines
5.5 KiB
C++
180 lines
5.5 KiB
C++
|
/*
|
||
|
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
|