From e9a9d3c9904b451ee5ed230700688714998c2546 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Nov 2011 02:10:12 +0100 Subject: initial version --- onkyo_ri.pde | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 onkyo_ri.pde (limited to 'onkyo_ri.pde') 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; +} -- cgit v1.2.3