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