mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2026-01-06 21:42:47 +00:00
Added panasonic and JVC protocol
Most work already done by zenwheel, but the sendPanasonic command didn't work. Sending and decoding is confirmed to work with using both the JVC and Panasonic protocol. The library has also been updated to work with Arduino IDE 1.0.
This commit is contained in:
148
IRremote.cpp
148
IRremote.cpp
@@ -9,6 +9,8 @@
|
||||
* Interrupt code based on NECIRrcv by Joe Knapp
|
||||
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
|
||||
* Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
|
||||
*
|
||||
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
|
||||
*/
|
||||
|
||||
#include "IRremote.h"
|
||||
@@ -167,7 +169,55 @@ void IRsend::sendRC6(unsigned long data, int nbits)
|
||||
}
|
||||
space(0); // Turn off at end
|
||||
}
|
||||
|
||||
void IRsend::sendPanasonic(unsigned int address, unsigned long data) {
|
||||
enableIROut(38);
|
||||
mark(PANASONIC_HDR_MARK);
|
||||
space(PANASONIC_HDR_SPACE);
|
||||
|
||||
for(int i=0;i<16;i++)
|
||||
{
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
if (address & 0x8000) {
|
||||
space(PANASONIC_ONE_SPACE);
|
||||
} else {
|
||||
space(PANASONIC_ZERO_SPACE);
|
||||
}
|
||||
address <<= 1;
|
||||
}
|
||||
for (int i=0; i < 32; i++) {
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
if (data & TOPBIT) {
|
||||
space(PANASONIC_ONE_SPACE);
|
||||
} else {
|
||||
space(PANASONIC_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
space(0);
|
||||
}
|
||||
void IRsend::sendJVC(unsigned long data, int nbits, int repeat)
|
||||
{
|
||||
enableIROut(38);
|
||||
data = data << (32 - nbits);
|
||||
if (!repeat){
|
||||
mark(JVC_HDR_MARK);
|
||||
space(JVC_HDR_SPACE);
|
||||
}
|
||||
for (int i = 0; i < nbits; i++) {
|
||||
if (data & TOPBIT) {
|
||||
mark(JVC_BIT_MARK);
|
||||
space(JVC_ONE_SPACE);
|
||||
}
|
||||
else {
|
||||
mark(JVC_BIT_MARK);
|
||||
space(JVC_ZERO_SPACE);
|
||||
}
|
||||
data <<= 1;
|
||||
}
|
||||
mark(JVC_BIT_MARK);
|
||||
space(0);
|
||||
}
|
||||
void IRsend::mark(int time) {
|
||||
// Sends an IR mark for the specified number of microseconds.
|
||||
// The mark output is modulated at the PWM frequency.
|
||||
@@ -362,6 +412,18 @@ int IRrecv::decode(decode_results *results) {
|
||||
if (decodeRC6(results)) {
|
||||
return DECODED;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
Serial.println("Attempting Panasonic decode");
|
||||
#endif
|
||||
if (decodePanasonic(results)) {
|
||||
return DECODED;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
Serial.println("Attempting JVC decode");
|
||||
#endif
|
||||
if (decodeJVC(results)) {
|
||||
return DECODED;
|
||||
}
|
||||
// decodeHash returns a hash on any input.
|
||||
// Thus, it needs to be last in the list.
|
||||
// If you add any decodes, add them before this.
|
||||
@@ -592,6 +654,90 @@ long IRrecv::decodeRC6(decode_results *results) {
|
||||
results->decode_type = RC6;
|
||||
return DECODED;
|
||||
}
|
||||
long IRrecv::decodePanasonic(decode_results *results) {
|
||||
unsigned long long data = 0;
|
||||
int offset = 1;
|
||||
|
||||
if (!MATCH_MARK(results->rawbuf[offset], PANASONIC_HDR_MARK)) {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
if (!MATCH_MARK(results->rawbuf[offset], PANASONIC_HDR_SPACE)) {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
|
||||
// decode address
|
||||
for (int i = 0; i < PANASONIC_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_BIT_MARK)) {
|
||||
return ERR;
|
||||
}
|
||||
if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ONE_SPACE)) {
|
||||
data = (data << 1) | 1;
|
||||
} else if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ZERO_SPACE)) {
|
||||
data <<= 1;
|
||||
} else {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
results->value = (unsigned long)data;
|
||||
results->panasonicAddress = (unsigned int)(data >> 32);
|
||||
results->decode_type = PANASONIC;
|
||||
results->bits = PANASONIC_BITS;
|
||||
return DECODED;
|
||||
}
|
||||
long IRrecv::decodeJVC(decode_results *results) {
|
||||
long data = 0;
|
||||
int offset = 1; // Skip first space
|
||||
// Check for repeat
|
||||
if (irparams.rawlen - 1 == 33 &&
|
||||
MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK) &&
|
||||
MATCH_MARK(results->rawbuf[irparams.rawlen-1], JVC_BIT_MARK)) {
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = JVC;
|
||||
return DECODED;
|
||||
}
|
||||
// Initial mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset], JVC_HDR_MARK)) {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
if (irparams.rawlen < 2 * JVC_BITS + 1 ) {
|
||||
return ERR;
|
||||
}
|
||||
// Initial space
|
||||
if (!MATCH_SPACE(results->rawbuf[offset], JVC_HDR_SPACE)) {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
for (int i = 0; i < JVC_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)) {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
if (MATCH_SPACE(results->rawbuf[offset], JVC_ONE_SPACE)) {
|
||||
data = (data << 1) | 1;
|
||||
}
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], JVC_ZERO_SPACE)) {
|
||||
data <<= 1;
|
||||
}
|
||||
else {
|
||||
return ERR;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
//Stop bit
|
||||
if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)){
|
||||
return ERR;
|
||||
}
|
||||
// Success
|
||||
results->bits = JVC_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = JVC;
|
||||
return DECODED;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------
|
||||
* hashdecode - decode an arbitrary IR code.
|
||||
|
||||
Reference in New Issue
Block a user