summaryrefslogtreecommitdiffstats
path: root/onkyo_ri.pde
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2011-11-17 02:10:12 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2011-11-17 02:10:12 +0100
commite9a9d3c9904b451ee5ed230700688714998c2546 (patch)
treeec3e00be388a027e182b82fe1dbf8f0e64450bdf /onkyo_ri.pde
downloadonkyo-ri-e9a9d3c9904b451ee5ed230700688714998c2546.tar.gz
onkyo-ri-e9a9d3c9904b451ee5ed230700688714998c2546.tar.xz
onkyo-ri-e9a9d3c9904b451ee5ed230700688714998c2546.zip
initial version
Diffstat (limited to 'onkyo_ri.pde')
-rw-r--r--onkyo_ri.pde143
1 files changed, 143 insertions, 0 deletions
diff --git a/onkyo_ri.pde b/onkyo_ri.pde
new file mode 100644
index 0000000..89adcfc
--- /dev/null
+++ b/onkyo_ri.pde
@@ -0,0 +1,143 @@
+/*
+
+RI Codes:
+
+TAPE = 42157
+DVD = 31612
+CD = 71327
+PORT = 81993
+CDR = 71322
+MD = 71808
+
+*/
+
+#include "signals.h"
+
+// Digital pin #2 is the same as Pin D2 see
+// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
+#define IRpin_PIN PINB
+#define IRpin 0
+
+#define ARRAY_LEN(array) (sizeof(array)/sizeof(array[0]))
+
+#define MAXPULSE 500
+#define RESOLUTION 20
+#define FUZZINESS 20
+
+int header[] = {300, 100};
+int values[2][2] = { {100, 100}, {100, 200} };
+int trail[] = { 100 };
+uint8_t bits = 12;
+
+uint8_t raw[2];
+
+uint64_t listenForIR(void);
+int getPulseLength();
+int getPulseLengthInRange(int expected);
+
+void setup(void) {
+ Serial.begin(9600);
+ Serial.println("Ready to decode IR!");
+ pinMode(13, OUTPUT);
+}
+
+void loop(void) {
+ uint64_t code = listenForIR();
+ Serial.println(code, HEX);
+}
+
+int getPulseLength() {
+ bool high = IRpin_PIN & (1 << IRpin);
+ bool check = true;
+ int length = 0;
+
+ while (check) {
+ length++;
+ delayMicroseconds(RESOLUTION);
+
+ if (length >= MAXPULSE) {
+ return -1;
+ }
+
+ check = IRpin_PIN & (1 << IRpin);
+ if (! high) {
+ check = ! check;
+ }
+ }
+
+ return length * RESOLUTION / 10;
+}
+
+bool inRange(int value, int expected) {
+ return (abs(value - expected) <= FUZZINESS);
+}
+
+int getPulseLengthInRange(int expected) {
+ int length = getPulseLength();
+
+ if (!inRange(length, expected)) {
+ length = 0;
+ }
+
+ return length;
+}
+
+uint64_t listenForIR(void) {
+ int length;
+ uint64_t code;
+ uint8_t i;
+
+start:
+ code = 0;
+
+ for (i = 0; i < ARRAY_LEN(header); i++) {
+ length = getPulseLengthInRange(header[i]);
+
+ if ((length == 0) || (length < 0))
+ goto start;
+ }
+
+ for (uint8_t j = 0; j < bits; j++) {
+ for (i = 0; i < ARRAY_LEN(raw); i++) {
+ raw[i] = getPulseLength();
+
+ if ((raw[i] == 0) || (raw[i] < 0))
+ goto start;
+ }
+
+ bool found;
+
+ for (uint8_t k = 0; k < ARRAY_LEN(values); k++) {
+ found = true;
+
+ for (i = 0; i < ARRAY_LEN(raw); i++) {
+ if (!inRange(raw[i], values[k][i])) {
+ found = false;
+ break;
+ }
+ }
+
+ if (found) {
+ code <<= 1;
+ code += k;
+
+ break;
+ }
+ }
+
+ if (!found) {
+ Serial.println(raw[0]);
+ Serial.println(raw[1]);
+ goto start;
+ }
+ }
+
+ for (i = 0; i < ARRAY_LEN(trail); i++) {
+ length = getPulseLengthInRange(trail[i]);
+
+ if ((length == 0) || (length < 0))
+ goto start;
+ }
+
+ return code;
+}