mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2025-12-13 09:56:16 +00:00
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.
191 lines
4.5 KiB
C++
191 lines
4.5 KiB
C++
/*
|
|
* IRremote: IRtest unittest
|
|
* Version 0.1 July, 2009
|
|
* Copyright 2009 Ken Shirriff
|
|
* http://arcfn.com
|
|
*
|
|
* Note: to run these tests, edit IRremote/IRremote.h to add "#define TEST"
|
|
* You must then recompile the library by removing IRremote.o and restarting
|
|
* the arduino IDE.
|
|
*/
|
|
|
|
#include <IRremote.h>
|
|
#include <IRremoteInt.h>
|
|
|
|
// Dumps out the decode_results structure.
|
|
// Call this after IRrecv::decode()
|
|
// void * to work around compiler issue
|
|
//void dump(void *v) {
|
|
// decode_results *results = (decode_results *)v
|
|
void dump(decode_results *results) {
|
|
int count = results->rawlen;
|
|
if (results->decode_type == UNKNOWN) {
|
|
Serial.println("Could not decode message");
|
|
}
|
|
else {
|
|
if (results->decode_type == NEC) {
|
|
Serial.print("Decoded NEC: ");
|
|
}
|
|
else if (results->decode_type == SONY) {
|
|
Serial.print("Decoded SONY: ");
|
|
}
|
|
else if (results->decode_type == RC5) {
|
|
Serial.print("Decoded RC5: ");
|
|
}
|
|
else if (results->decode_type == RC6) {
|
|
Serial.print("Decoded RC6: ");
|
|
}
|
|
Serial.print(results->value, HEX);
|
|
Serial.print(" (");
|
|
Serial.print(results->bits, DEC);
|
|
Serial.println(" bits)");
|
|
}
|
|
Serial.print("Raw (");
|
|
Serial.print(count, DEC);
|
|
Serial.print("): ");
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
if ((i % 2) == 1) {
|
|
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
|
}
|
|
else {
|
|
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
|
|
}
|
|
Serial.print(" ");
|
|
}
|
|
Serial.println("");
|
|
}
|
|
|
|
IRrecv irrecv(0);
|
|
decode_results results;
|
|
|
|
class IRsendDummy :
|
|
public IRsend
|
|
{
|
|
public:
|
|
// For testing, just log the marks/spaces
|
|
#define SENDLOG_LEN 128
|
|
int sendlog[SENDLOG_LEN];
|
|
int sendlogcnt;
|
|
IRsendDummy() :
|
|
IRsend() {
|
|
}
|
|
void reset() {
|
|
sendlogcnt = 0;
|
|
}
|
|
void mark(int time) {
|
|
sendlog[sendlogcnt] = time;
|
|
if (sendlogcnt < SENDLOG_LEN) sendlogcnt++;
|
|
}
|
|
void space(int time) {
|
|
sendlog[sendlogcnt] = -time;
|
|
if (sendlogcnt < SENDLOG_LEN) sendlogcnt++;
|
|
}
|
|
// Copies the dummy buf into the interrupt buf
|
|
void useDummyBuf() {
|
|
int last = SPACE;
|
|
irparams.rcvstate = STATE_STOP;
|
|
irparams.rawlen = 1; // Skip the gap
|
|
for (int i = 0 ; i < sendlogcnt; i++) {
|
|
if (sendlog[i] < 0) {
|
|
if (last == MARK) {
|
|
// New space
|
|
irparams.rawbuf[irparams.rawlen++] = (-sendlog[i] - MARK_EXCESS) / USECPERTICK;
|
|
last = SPACE;
|
|
}
|
|
else {
|
|
// More space
|
|
irparams.rawbuf[irparams.rawlen - 1] += -sendlog[i] / USECPERTICK;
|
|
}
|
|
}
|
|
else if (sendlog[i] > 0) {
|
|
if (last == SPACE) {
|
|
// New mark
|
|
irparams.rawbuf[irparams.rawlen++] = (sendlog[i] + MARK_EXCESS) / USECPERTICK;
|
|
last = MARK;
|
|
}
|
|
else {
|
|
// More mark
|
|
irparams.rawbuf[irparams.rawlen - 1] += sendlog[i] / USECPERTICK;
|
|
}
|
|
}
|
|
}
|
|
if (irparams.rawlen % 2) {
|
|
irparams.rawlen--; // Remove trailing space
|
|
}
|
|
}
|
|
};
|
|
|
|
IRsendDummy irsenddummy;
|
|
|
|
void verify(unsigned long val, int bits, int type) {
|
|
irsenddummy.useDummyBuf();
|
|
irrecv.decode(&results);
|
|
Serial.print("Testing ");
|
|
Serial.print(val, HEX);
|
|
if (results.value == val && results.bits == bits && results.decode_type == type) {
|
|
Serial.println(": OK");
|
|
}
|
|
else {
|
|
Serial.println(": Error");
|
|
dump(&results);
|
|
}
|
|
}
|
|
|
|
void testNEC(unsigned long val, int bits) {
|
|
irsenddummy.reset();
|
|
irsenddummy.sendNEC(val, bits);
|
|
verify(val, bits, NEC);
|
|
}
|
|
void testSony(unsigned long val, int bits) {
|
|
irsenddummy.reset();
|
|
irsenddummy.sendSony(val, bits);
|
|
verify(val, bits, SONY);
|
|
}
|
|
void testRC5(unsigned long val, int bits) {
|
|
irsenddummy.reset();
|
|
irsenddummy.sendRC5(val, bits);
|
|
verify(val, bits, RC5);
|
|
}
|
|
void testRC6(unsigned long val, int bits) {
|
|
irsenddummy.reset();
|
|
irsenddummy.sendRC6(val, bits);
|
|
verify(val, bits, RC6);
|
|
}
|
|
|
|
void test() {
|
|
Serial.println("NEC tests");
|
|
testNEC(0x00000000, 32);
|
|
testNEC(0xffffffff, 32);
|
|
testNEC(0xaaaaaaaa, 32);
|
|
testNEC(0x55555555, 32);
|
|
testNEC(0x12345678, 32);
|
|
Serial.println("Sony tests");
|
|
testSony(0xfff, 12);
|
|
testSony(0x000, 12);
|
|
testSony(0xaaa, 12);
|
|
testSony(0x555, 12);
|
|
testSony(0x123, 12);
|
|
Serial.println("RC5 tests");
|
|
testRC5(0xfff, 12);
|
|
testRC5(0x000, 12);
|
|
testRC5(0xaaa, 12);
|
|
testRC5(0x555, 12);
|
|
testRC5(0x123, 12);
|
|
Serial.println("RC6 tests");
|
|
testRC6(0xfffff, 20);
|
|
testRC6(0x00000, 20);
|
|
testRC6(0xaaaaa, 20);
|
|
testRC6(0x55555, 20);
|
|
testRC6(0x12345, 20);
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(9600);
|
|
test();
|
|
}
|
|
|
|
void loop() {
|
|
}
|