Mikanum/IRremote/ir_Template.cpp

180 lines
5.5 KiB
C++
Raw Permalink Normal View History

2023-01-19 08:45:51 +01:00
/*
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