aboutsummaryrefslogtreecommitdiff
path: root/msp430/libraries/IRremote/examples
diff options
context:
space:
mode:
Diffstat (limited to 'msp430/libraries/IRremote/examples')
-rw-r--r--msp430/libraries/IRremote/examples/IRrecord/IRrecord.pde170
-rw-r--r--msp430/libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.pde28
-rw-r--r--msp430/libraries/IRremote/examples/IRrecvDump/IRrecvDump.pde74
-rw-r--r--msp430/libraries/IRremote/examples/IRrelay/IRrelay.pde85
-rw-r--r--msp430/libraries/IRremote/examples/IRsendDemo/IRsendDemo.pde26
-rw-r--r--msp430/libraries/IRremote/examples/IRtest/IRtest.pde190
6 files changed, 573 insertions, 0 deletions
diff --git a/msp430/libraries/IRremote/examples/IRrecord/IRrecord.pde b/msp430/libraries/IRremote/examples/IRrecord/IRrecord.pde
new file mode 100644
index 0000000..913d431
--- /dev/null
+++ b/msp430/libraries/IRremote/examples/IRrecord/IRrecord.pde
@@ -0,0 +1,170 @@
+/*
+ * IRrecord: record and play back IR signals as a minimal
+ * An IR detector/demodulator must be connected to the input RECV_PIN.
+ * An IR LED must be connected to the output PWM pin 3.
+ * A button must be connected to the input BUTTON_PIN; this is the
+ * send button.
+ * A visible LED can be connected to STATUS_PIN to provide status.
+ *
+ * The logic is:
+ * If the button is pressed, send the IR code.
+ * If an IR code is received, record it.
+ *
+ * Version 0.11 September, 2009
+ * Copyright 2009 Ken Shirriff
+ * http://arcfn.com
+ */
+
+#include <IRremote.h>
+
+int RECV_PIN = 11;
+int BUTTON_PIN = 5;
+int STATUS_PIN = 2;
+
+IRrecv irrecv(RECV_PIN);
+IRsend irsend;
+
+decode_results results;
+
+void setup()
+{
+ Serial.begin(9600);
+ irrecv.enableIRIn(); // Start the receiver
+ pinMode(BUTTON_PIN, INPUT);
+ pinMode(STATUS_PIN, OUTPUT);
+}
+
+// Storage for the recorded code
+int codeType = -1; // The type of code
+unsigned long codeValue; // The code value if not raw
+unsigned int rawCodes[RAWBUF]; // The durations if raw
+int codeLen; // The length of the code
+int toggle = 0; // The RC5/6 toggle state
+
+// Stores the code for later playback
+// Most of this code is just logging
+void storeCode(void* v){
+ decode_results *results = (decode_results *)v;
+//void storeCode(decode_results *results) {
+
+ codeType = results->decode_type;
+ int count = results->rawlen;
+ if (codeType == UNKNOWN) {
+ Serial.println("Received unknown code, saving as raw");
+ codeLen = results->rawlen - 1;
+ // To store raw codes:
+ // Drop first value (gap)
+ // Convert from ticks to microseconds
+ // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
+ for (int i = 1; i <= codeLen; i++) {
+ if (i % 2) {
+ // Mark
+ rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
+ Serial.print(" m");
+ }
+ else {
+ // Space
+ rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
+ Serial.print(" s");
+ }
+ Serial.print(rawCodes[i - 1], DEC);
+ }
+ Serial.println("");
+ }
+ else {
+ if (codeType == NEC) {
+ Serial.print("Received NEC: ");
+ if (results->value == REPEAT) {
+ // Don't record a NEC repeat value as that's useless.
+ Serial.println("repeat; ignoring.");
+ return;
+ }
+ }
+ else if (codeType == SONY) {
+ Serial.print("Received SONY: ");
+ }
+ else if (codeType == RC5) {
+ Serial.print("Received RC5: ");
+ }
+ else if (codeType == RC6) {
+ Serial.print("Received RC6: ");
+ }
+ else {
+ Serial.print("Unexpected codeType ");
+ Serial.print(codeType, DEC);
+ Serial.println("");
+ }
+ Serial.println(results->value, HEX);
+ codeValue = results->value;
+ codeLen = results->bits;
+ }
+}
+
+void sendCode(int repeat) {
+ if (codeType == NEC) {
+ if (repeat) {
+ irsend.sendNEC(REPEAT, codeLen);
+ Serial.println("Sent NEC repeat");
+ }
+ else {
+ irsend.sendNEC(codeValue, codeLen);
+ Serial.print("Sent NEC ");
+ Serial.println(codeValue, HEX);
+ }
+ }
+ else if (codeType == SONY) {
+ irsend.sendSony(codeValue, codeLen);
+ Serial.print("Sent Sony ");
+ Serial.println(codeValue, HEX);
+ }
+ else if (codeType == RC5 || codeType == RC6) {
+ if (!repeat) {
+ // Flip the toggle bit for a new button press
+ toggle = 1 - toggle;
+ }
+ // Put the toggle bit into the code to send
+ codeValue = codeValue & ~(1 << (codeLen - 1));
+ codeValue = codeValue | (toggle << (codeLen - 1));
+ if (codeType == RC5) {
+ Serial.print("Sent RC5 ");
+ Serial.println(codeValue, HEX);
+ irsend.sendRC5(codeValue, codeLen);
+ }
+ else {
+ irsend.sendRC6(codeValue, codeLen);
+ Serial.print("Sent RC6 ");
+ Serial.println(codeValue, HEX);
+ }
+ }
+ else if (codeType == UNKNOWN /* i.e. raw */) {
+ // Assume 38 KHz
+ irsend.sendRaw(rawCodes, codeLen, 38);
+ Serial.println("Sent raw");
+ }
+}
+
+int lastButtonState;
+
+void loop() {
+ // If button pressed, send the code.
+ int buttonState = digitalRead(BUTTON_PIN);
+ if (lastButtonState == LOW && buttonState == HIGH) {
+ Serial.println("Released");
+ irrecv.enableIRIn(); // Re-enable receiver
+ }
+
+ if (buttonState==LOW) {
+ Serial.println("Pressed, sending");
+ digitalWrite(STATUS_PIN, HIGH);
+ sendCode(lastButtonState == buttonState);
+ digitalWrite(STATUS_PIN, LOW);
+ delay(50); // Wait a bit between retransmissions
+ }
+ else if (irrecv.decode(&results)) {
+ digitalWrite(STATUS_PIN, HIGH);
+ storeCode(&results);
+ irrecv.resume(); // resume receiver
+ digitalWrite(STATUS_PIN, LOW);
+ }
+ lastButtonState = buttonState;
+} \ No newline at end of file
diff --git a/msp430/libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.pde b/msp430/libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.pde
new file mode 100644
index 0000000..14982d8
--- /dev/null
+++ b/msp430/libraries/IRremote/examples/IRrecvDemo/IRrecvDemo.pde
@@ -0,0 +1,28 @@
+/*
+ * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
+ * An IR detector/demodulator must be connected to the input RECV_PIN.
+ * Version 0.1 July, 2009
+ * Copyright 2009 Ken Shirriff
+ * http://arcfn.com
+ */
+
+#include <IRremote.h>
+
+int RECV_PIN = 11;
+
+IRrecv irrecv(RECV_PIN);
+
+decode_results results;
+
+void setup()
+{
+ Serial.begin(9600);
+ irrecv.enableIRIn(); // Start the receiver
+}
+
+void loop() {
+ if (irrecv.decode(&results)) {
+ Serial.println(results.value, HEX);
+ irrecv.resume(); // Receive the next value
+ }
+}
diff --git a/msp430/libraries/IRremote/examples/IRrecvDump/IRrecvDump.pde b/msp430/libraries/IRremote/examples/IRrecvDump/IRrecvDump.pde
new file mode 100644
index 0000000..61f200f
--- /dev/null
+++ b/msp430/libraries/IRremote/examples/IRrecvDump/IRrecvDump.pde
@@ -0,0 +1,74 @@
+/*
+ * IRremote: IRrecvDump - dump details of IR codes with IRrecv
+ * An IR detector/demodulator must be connected to the input RECV_PIN.
+ * Version 0.1 July, 2009
+ * Copyright 2009 Ken Shirriff
+ * http://arcfn.com
+ */
+
+#include <IRremote.h>
+
+int RECV_PIN = 11;
+
+IRrecv irrecv(RECV_PIN);
+
+decode_results results;
+
+void setup()
+{
+ Serial.begin(9600);
+ irrecv.enableIRIn(); // Start the receiver
+}
+
+// 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("");
+}
+
+
+void loop() {
+ if (irrecv.decode(&results)) {
+ Serial.println(results.value, HEX);
+ dump(&results);
+ irrecv.resume(); // Receive the next value
+ }
+}
diff --git a/msp430/libraries/IRremote/examples/IRrelay/IRrelay.pde b/msp430/libraries/IRremote/examples/IRrelay/IRrelay.pde
new file mode 100644
index 0000000..170a184
--- /dev/null
+++ b/msp430/libraries/IRremote/examples/IRrelay/IRrelay.pde
@@ -0,0 +1,85 @@
+/*
+ * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
+ * An IR detector/demodulator must be connected to the input RECV_PIN.
+ * Version 0.1 July, 2009
+ * Copyright 2009 Ken Shirriff
+ * http://arcfn.com
+ */
+
+#include <IRremote.h>
+
+int RECV_PIN = 11;
+int RELAY_PIN = 4;
+
+IRrecv irrecv(RECV_PIN);
+decode_results results;
+
+// 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("");
+}
+
+void setup()
+{
+ pinMode(RELAY_PIN, OUTPUT);
+ pinMode(13, OUTPUT);
+ Serial.begin(9600);
+ irrecv.enableIRIn(); // Start the receiver
+}
+
+int on = 0;
+unsigned long last = millis();
+
+void loop() {
+ if (irrecv.decode(&results)) {
+ // If it's been at least 1/4 second since the last
+ // IR received, toggle the relay
+ if (millis() - last > 250) {
+ on = !on;
+ digitalWrite(RELAY_PIN, on ? HIGH : LOW);
+ digitalWrite(13, on ? HIGH : LOW);
+ dump(&results);
+ }
+ last = millis();
+ irrecv.resume(); // Receive the next value
+ }
+}
diff --git a/msp430/libraries/IRremote/examples/IRsendDemo/IRsendDemo.pde b/msp430/libraries/IRremote/examples/IRsendDemo/IRsendDemo.pde
new file mode 100644
index 0000000..d864c82
--- /dev/null
+++ b/msp430/libraries/IRremote/examples/IRsendDemo/IRsendDemo.pde
@@ -0,0 +1,26 @@
+/*
+ * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
+ * An IR LED must be connected to Arduino PWM pin 3.
+ * Version 0.1 July, 2009
+ * Copyright 2009 Ken Shirriff
+ * http://arcfn.com
+ */
+
+#include <IRremote.h>
+
+IRsend irsend;
+
+void setup()
+{
+ Serial.begin(9600);
+}
+
+void loop() {
+ if (Serial.read() != -1) {
+ for (int i = 0; i < 3; i++) {
+ irsend.sendSony(0xa90, 12); // Sony TV power code
+ delay(100);
+ }
+ }
+}
+
diff --git a/msp430/libraries/IRremote/examples/IRtest/IRtest.pde b/msp430/libraries/IRremote/examples/IRtest/IRtest.pde
new file mode 100644
index 0000000..62743af
--- /dev/null
+++ b/msp430/libraries/IRremote/examples/IRtest/IRtest.pde
@@ -0,0 +1,190 @@
+/*
+ * 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() {
+}