annotate service/busyboxArduino/IRremote/IRremote.cpp @ 155:e88308cea843

add IRremote Ignore-this: c295c68f923af8d072841f1d7c1e5ab8
author drewp@bigasterisk.com
date Mon, 19 Jan 2015 17:55:26 -0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
155
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1 /*
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
2 * IRremote
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
3 * Version 0.11 August, 2009
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
4 * Copyright 2009 Ken Shirriff
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
5 * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
6 *
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
7 * Modified by Paul Stoffregen <paul@pjrc.com> to support other boards and timers
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
8 * Modified by Mitra Ardron <mitra@mitra.biz>
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
9 * Added Sanyo and Mitsubishi controllers
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
10 * Modified Sony to spot the repeat codes that some Sony's send
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
11 *
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
12 * Interrupt code based on NECIRrcv by Joe Knapp
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
13 * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
14 * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
15 *
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
16 * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
17 * LG added by Darryl Smith (based on the JVC protocol)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
18 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
19
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
20 #include "IRremote.h"
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
21 #include "IRremoteInt.h"
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
22
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
23 // Provides ISR
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
24 #include <avr/interrupt.h>
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
25
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
26 volatile irparams_t irparams;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
27
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
28 // These versions of MATCH, MATCH_MARK, and MATCH_SPACE are only for debugging.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
29 // To use them, set DEBUG in IRremoteInt.h
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
30 // Normally macros are used for efficiency
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
31 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
32 int MATCH(int measured, int desired) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
33 Serial.print("Testing: ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
34 Serial.print(TICKS_LOW(desired), DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
35 Serial.print(" <= ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
36 Serial.print(measured, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
37 Serial.print(" <= ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
38 Serial.println(TICKS_HIGH(desired), DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
39 return measured >= TICKS_LOW(desired) && measured <= TICKS_HIGH(desired);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
40 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
41
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
42 int MATCH_MARK(int measured_ticks, int desired_us) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
43 Serial.print("Testing mark ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
44 Serial.print(measured_ticks * USECPERTICK, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
45 Serial.print(" vs ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
46 Serial.print(desired_us, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
47 Serial.print(": ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
48 Serial.print(TICKS_LOW(desired_us + MARK_EXCESS), DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
49 Serial.print(" <= ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
50 Serial.print(measured_ticks, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
51 Serial.print(" <= ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
52 Serial.println(TICKS_HIGH(desired_us + MARK_EXCESS), DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
53 return measured_ticks >= TICKS_LOW(desired_us + MARK_EXCESS) && measured_ticks <= TICKS_HIGH(desired_us + MARK_EXCESS);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
54 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
55
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
56 int MATCH_SPACE(int measured_ticks, int desired_us) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
57 Serial.print("Testing space ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
58 Serial.print(measured_ticks * USECPERTICK, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
59 Serial.print(" vs ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
60 Serial.print(desired_us, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
61 Serial.print(": ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
62 Serial.print(TICKS_LOW(desired_us - MARK_EXCESS), DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
63 Serial.print(" <= ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
64 Serial.print(measured_ticks, DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
65 Serial.print(" <= ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
66 Serial.println(TICKS_HIGH(desired_us - MARK_EXCESS), DEC);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
67 return measured_ticks >= TICKS_LOW(desired_us - MARK_EXCESS) && measured_ticks <= TICKS_HIGH(desired_us - MARK_EXCESS);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
68 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
69 #else
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
70 int MATCH(int measured, int desired) {return measured >= TICKS_LOW(desired) && measured <= TICKS_HIGH(desired);}
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
71 int MATCH_MARK(int measured_ticks, int desired_us) {return MATCH(measured_ticks, (desired_us + MARK_EXCESS));}
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
72 int MATCH_SPACE(int measured_ticks, int desired_us) {return MATCH(measured_ticks, (desired_us - MARK_EXCESS));}
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
73 // Debugging versions are in IRremote.cpp
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
74 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
75
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
76 void IRsend::sendNEC(unsigned long data, int nbits)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
77 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
78 enableIROut(38);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
79 mark(NEC_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
80 space(NEC_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
81 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
82 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
83 mark(NEC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
84 space(NEC_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
85 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
86 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
87 mark(NEC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
88 space(NEC_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
89 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
90 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
91 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
92 mark(NEC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
93 space(0);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
94 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
95
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
96 void IRsend::sendSony(unsigned long data, int nbits) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
97 enableIROut(40);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
98 mark(SONY_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
99 space(SONY_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
100 data = data << (32 - nbits);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
101 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
102 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
103 mark(SONY_ONE_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
104 space(SONY_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
105 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
106 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
107 mark(SONY_ZERO_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
108 space(SONY_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
109 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
110 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
111 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
112 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
113
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
114 void IRsend::sendRaw(unsigned int buf[], int len, int hz)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
115 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
116 enableIROut(hz);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
117 for (int i = 0; i < len; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
118 if (i & 1) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
119 space(buf[i]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
120 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
121 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
122 mark(buf[i]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
123 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
124 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
125 space(0); // Just to be sure
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
126 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
127
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
128 // Note: first bit must be a one (start bit)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
129 void IRsend::sendRC5(unsigned long data, int nbits)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
130 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
131 enableIROut(36);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
132 data = data << (32 - nbits);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
133 mark(RC5_T1); // First start bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
134 space(RC5_T1); // Second start bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
135 mark(RC5_T1); // Second start bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
136 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
137 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
138 space(RC5_T1); // 1 is space, then mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
139 mark(RC5_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
140 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
141 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
142 mark(RC5_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
143 space(RC5_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
144 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
145 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
146 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
147 space(0); // Turn off at end
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
148 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
149
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
150 // Caller needs to take care of flipping the toggle bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
151 void IRsend::sendRC6(unsigned long data, int nbits)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
152 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
153 enableIROut(36);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
154 data = data << (32 - nbits);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
155 mark(RC6_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
156 space(RC6_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
157 mark(RC6_T1); // start bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
158 space(RC6_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
159 int t;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
160 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
161 if (i == 3) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
162 // double-wide trailer bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
163 t = 2 * RC6_T1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
164 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
165 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
166 t = RC6_T1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
167 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
168 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
169 mark(t);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
170 space(t);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
171 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
172 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
173 space(t);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
174 mark(t);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
175 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
176
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
177 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
178 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
179 space(0); // Turn off at end
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
180 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
181 void IRsend::sendPanasonic(unsigned int address, unsigned long data) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
182 enableIROut(35);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
183 mark(PANASONIC_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
184 space(PANASONIC_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
185
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
186 for(int i=0;i<16;i++)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
187 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
188 mark(PANASONIC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
189 if (address & 0x8000) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
190 space(PANASONIC_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
191 } else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
192 space(PANASONIC_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
193 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
194 address <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
195 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
196 for (int i=0; i < 32; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
197 mark(PANASONIC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
198 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
199 space(PANASONIC_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
200 } else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
201 space(PANASONIC_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
202 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
203 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
204 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
205 mark(PANASONIC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
206 space(0);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
207 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
208 void IRsend::sendJVC(unsigned long data, int nbits, int repeat)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
209 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
210 enableIROut(38);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
211 data = data << (32 - nbits);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
212 if (!repeat){
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
213 mark(JVC_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
214 space(JVC_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
215 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
216 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
217 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
218 mark(JVC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
219 space(JVC_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
220 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
221 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
222 mark(JVC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
223 space(JVC_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
224 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
225 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
226 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
227 mark(JVC_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
228 space(0);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
229 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
230
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
231 void IRsend::sendSAMSUNG(unsigned long data, int nbits)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
232 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
233 enableIROut(38);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
234 mark(SAMSUNG_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
235 space(SAMSUNG_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
236 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
237 if (data & TOPBIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
238 mark(SAMSUNG_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
239 space(SAMSUNG_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
240 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
241 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
242 mark(SAMSUNG_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
243 space(SAMSUNG_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
244 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
245 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
246 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
247 mark(SAMSUNG_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
248 space(0);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
249 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
250
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
251 void IRsend::mark(int time) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
252 // Sends an IR mark for the specified number of microseconds.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
253 // The mark output is modulated at the PWM frequency.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
254 TIMER_ENABLE_PWM; // Enable pin 3 PWM output
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
255 if (time > 0) delayMicroseconds(time);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
256 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
257
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
258 /* Leave pin off for time (given in microseconds) */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
259 void IRsend::space(int time) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
260 // Sends an IR space for the specified number of microseconds.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
261 // A space is no output, so the PWM output is disabled.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
262 TIMER_DISABLE_PWM; // Disable pin 3 PWM output
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
263 if (time > 0) delayMicroseconds(time);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
264 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
265
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
266 void IRsend::enableIROut(int khz) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
267 // Enables IR output. The khz value controls the modulation frequency in kilohertz.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
268 // The IR output will be on pin 3 (OC2B).
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
269 // This routine is designed for 36-40KHz; if you use it for other values, it's up to you
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
270 // to make sure it gives reasonable results. (Watch out for overflow / underflow / rounding.)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
271 // TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
272 // controlling the duty cycle.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
273 // There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
274 // To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
275 // A few hours staring at the ATmega documentation and this will all make sense.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
276 // See my Secrets of Arduino PWM at http://arcfn.com/2009/07/secrets-of-arduino-pwm.html for details.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
277
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
278
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
279 // Disable the Timer2 Interrupt (which is used for receiving IR)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
280 TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
281
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
282 pinMode(TIMER_PWM_PIN, OUTPUT);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
283 digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
284
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
285 // COM2A = 00: disconnect OC2A
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
286 // COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
287 // WGM2 = 101: phase-correct PWM with OCRA as top
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
288 // CS2 = 000: no prescaling
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
289 // The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
290 TIMER_CONFIG_KHZ(khz);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
291 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
292
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
293 IRrecv::IRrecv(int recvpin)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
294 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
295 irparams.recvpin = recvpin;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
296 irparams.blinkflag = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
297 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
298
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
299 // initialization
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
300 void IRrecv::enableIRIn() {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
301 cli();
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
302 // setup pulse clock timer interrupt
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
303 //Prescale /8 (16M/8 = 0.5 microseconds per tick)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
304 // Therefore, the timer interval can range from 0.5 to 128 microseconds
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
305 // depending on the reset value (255 to 0)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
306 TIMER_CONFIG_NORMAL();
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
307
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
308 //Timer2 Overflow Interrupt Enable
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
309 TIMER_ENABLE_INTR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
310
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
311 TIMER_RESET;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
312
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
313 sei(); // enable interrupts
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
314
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
315 // initialize state machine variables
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
316 irparams.rcvstate = STATE_IDLE;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
317 irparams.rawlen = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
318
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
319 // set pin modes
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
320 pinMode(irparams.recvpin, INPUT);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
321 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
322
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
323 // enable/disable blinking of pin 13 on IR processing
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
324 void IRrecv::blink13(int blinkflag)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
325 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
326 irparams.blinkflag = blinkflag;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
327 if (blinkflag)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
328 pinMode(BLINKLED, OUTPUT);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
329 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
330
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
331 // TIMER2 interrupt code to collect raw data.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
332 // Widths of alternating SPACE, MARK are recorded in rawbuf.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
333 // Recorded in ticks of 50 microseconds.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
334 // rawlen counts the number of entries recorded so far.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
335 // First entry is the SPACE between transmissions.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
336 // As soon as a SPACE gets long, ready is set, state switches to IDLE, timing of SPACE continues.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
337 // As soon as first MARK arrives, gap width is recorded, ready is cleared, and new logging starts
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
338 ISR(TIMER_INTR_NAME)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
339 {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
340 TIMER_RESET;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
341
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
342 uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
343
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
344 irparams.timer++; // One more 50us tick
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
345 if (irparams.rawlen >= RAWBUF) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
346 // Buffer overflow
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
347 irparams.rcvstate = STATE_STOP;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
348 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
349 switch(irparams.rcvstate) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
350 case STATE_IDLE: // In the middle of a gap
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
351 if (irdata == MARK) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
352 if (irparams.timer < GAP_TICKS) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
353 // Not big enough to be a gap.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
354 irparams.timer = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
355 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
356 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
357 // gap just ended, record duration and start recording transmission
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
358 irparams.rawlen = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
359 irparams.rawbuf[irparams.rawlen++] = irparams.timer;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
360 irparams.timer = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
361 irparams.rcvstate = STATE_MARK;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
362 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
363 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
364 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
365 case STATE_MARK: // timing MARK
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
366 if (irdata == SPACE) { // MARK ended, record time
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
367 irparams.rawbuf[irparams.rawlen++] = irparams.timer;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
368 irparams.timer = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
369 irparams.rcvstate = STATE_SPACE;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
370 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
371 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
372 case STATE_SPACE: // timing SPACE
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
373 if (irdata == MARK) { // SPACE just ended, record it
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
374 irparams.rawbuf[irparams.rawlen++] = irparams.timer;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
375 irparams.timer = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
376 irparams.rcvstate = STATE_MARK;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
377 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
378 else { // SPACE
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
379 if (irparams.timer > GAP_TICKS) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
380 // big SPACE, indicates gap between codes
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
381 // Mark current code as ready for processing
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
382 // Switch to STOP
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
383 // Don't reset timer; keep counting space width
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
384 irparams.rcvstate = STATE_STOP;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
385 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
386 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
387 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
388 case STATE_STOP: // waiting, measuring gap
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
389 if (irdata == MARK) { // reset gap timer
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
390 irparams.timer = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
391 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
392 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
393 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
394
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
395 if (irparams.blinkflag) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
396 if (irdata == MARK) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
397 BLINKLED_ON(); // turn pin 13 LED on
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
398 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
399 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
400 BLINKLED_OFF(); // turn pin 13 LED off
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
401 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
402 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
403 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
404
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
405 void IRrecv::resume() {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
406 irparams.rcvstate = STATE_IDLE;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
407 irparams.rawlen = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
408 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
409
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
410
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
411
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
412 // Decodes the received IR message
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
413 // Returns 0 if no data ready, 1 if data ready.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
414 // Results of decoding are stored in results
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
415 int IRrecv::decode(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
416 results->rawbuf = irparams.rawbuf;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
417 results->rawlen = irparams.rawlen;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
418 if (irparams.rcvstate != STATE_STOP) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
419 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
420 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
421 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
422 Serial.println("Attempting NEC decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
423 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
424 if (decodeNEC(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
425 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
426 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
427 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
428 Serial.println("Attempting Sony decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
429 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
430 if (decodeSony(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
431 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
432 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
433 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
434 Serial.println("Attempting Sanyo decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
435 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
436 if (decodeSanyo(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
437 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
438 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
439 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
440 Serial.println("Attempting Mitsubishi decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
441 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
442 if (decodeMitsubishi(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
443 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
444 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
445 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
446 Serial.println("Attempting RC5 decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
447 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
448 if (decodeRC5(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
449 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
450 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
451 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
452 Serial.println("Attempting RC6 decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
453 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
454 if (decodeRC6(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
455 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
456 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
457 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
458 Serial.println("Attempting Panasonic decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
459 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
460 if (decodePanasonic(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
461 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
462 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
463 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
464 Serial.println("Attempting LG decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
465 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
466 if (decodeLG(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
467 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
468 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
469 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
470 Serial.println("Attempting JVC decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
471 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
472 if (decodeJVC(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
473 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
474 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
475 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
476 Serial.println("Attempting SAMSUNG decode");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
477 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
478 if (decodeSAMSUNG(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
479 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
480 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
481 // decodeHash returns a hash on any input.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
482 // Thus, it needs to be last in the list.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
483 // If you add any decodes, add them before this.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
484 if (decodeHash(results)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
485 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
486 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
487 // Throw away and start over
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
488 resume();
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
489 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
490 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
491
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
492 // NECs have a repeat only 4 items long
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
493 long IRrecv::decodeNEC(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
494 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
495 int offset = 1; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
496 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
497 if (!MATCH_MARK(results->rawbuf[offset], NEC_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
498 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
499 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
500 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
501 // Check for repeat
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
502 if (irparams.rawlen == 4 &&
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
503 MATCH_SPACE(results->rawbuf[offset], NEC_RPT_SPACE) &&
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
504 MATCH_MARK(results->rawbuf[offset+1], NEC_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
505 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
506 results->value = REPEAT;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
507 results->decode_type = NEC;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
508 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
509 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
510 if (irparams.rawlen < 2 * NEC_BITS + 4) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
511 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
512 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
513 // Initial space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
514 if (!MATCH_SPACE(results->rawbuf[offset], NEC_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
515 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
516 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
517 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
518 for (int i = 0; i < NEC_BITS; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
519 if (!MATCH_MARK(results->rawbuf[offset], NEC_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
520 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
521 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
522 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
523 if (MATCH_SPACE(results->rawbuf[offset], NEC_ONE_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
524 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
525 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
526 else if (MATCH_SPACE(results->rawbuf[offset], NEC_ZERO_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
527 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
528 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
529 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
530 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
531 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
532 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
533 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
534 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
535 results->bits = NEC_BITS;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
536 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
537 results->decode_type = NEC;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
538 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
539 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
540
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
541 long IRrecv::decodeSony(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
542 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
543 if (irparams.rawlen < 2 * SONY_BITS + 2) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
544 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
545 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
546 int offset = 0; // Dont skip first space, check its size
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
547
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
548 // Some Sony's deliver repeats fast after first
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
549 // unfortunately can't spot difference from of repeat from two fast clicks
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
550 if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
551 // Serial.print("IR Gap found: ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
552 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
553 results->value = REPEAT;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
554 results->decode_type = SANYO;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
555 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
556 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
557 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
558
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
559 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
560 if (!MATCH_MARK(results->rawbuf[offset], SONY_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
561 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
562 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
563 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
564
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
565 while (offset + 1 < irparams.rawlen) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
566 if (!MATCH_SPACE(results->rawbuf[offset], SONY_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
567 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
568 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
569 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
570 if (MATCH_MARK(results->rawbuf[offset], SONY_ONE_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
571 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
572 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
573 else if (MATCH_MARK(results->rawbuf[offset], SONY_ZERO_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
574 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
575 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
576 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
577 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
578 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
579 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
580 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
581
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
582 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
583 results->bits = (offset - 1) / 2;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
584 if (results->bits < 12) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
585 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
586 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
587 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
588 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
589 results->decode_type = SONY;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
590 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
591 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
592
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
593 // I think this is a Sanyo decoder - serial = SA 8650B
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
594 // Looks like Sony except for timings, 48 chars of data and time/space different
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
595 long IRrecv::decodeSanyo(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
596 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
597 if (irparams.rawlen < 2 * SANYO_BITS + 2) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
598 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
599 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
600 int offset = 0; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
601 // Initial space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
602 /* Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
603 Serial.print("IR Gap: ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
604 Serial.println( results->rawbuf[offset]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
605 Serial.println( "test against:");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
606 Serial.println(results->rawbuf[offset]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
607 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
608 if (results->rawbuf[offset] < SANYO_DOUBLE_SPACE_USECS) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
609 // Serial.print("IR Gap found: ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
610 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
611 results->value = REPEAT;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
612 results->decode_type = SANYO;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
613 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
614 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
615 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
616
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
617 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
618 if (!MATCH_MARK(results->rawbuf[offset], SANYO_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
619 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
620 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
621 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
622
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
623 // Skip Second Mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
624 if (!MATCH_MARK(results->rawbuf[offset], SANYO_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
625 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
626 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
627 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
628
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
629 while (offset + 1 < irparams.rawlen) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
630 if (!MATCH_SPACE(results->rawbuf[offset], SANYO_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
631 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
632 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
633 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
634 if (MATCH_MARK(results->rawbuf[offset], SANYO_ONE_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
635 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
636 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
637 else if (MATCH_MARK(results->rawbuf[offset], SANYO_ZERO_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
638 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
639 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
640 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
641 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
642 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
643 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
644 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
645
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
646 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
647 results->bits = (offset - 1) / 2;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
648 if (results->bits < 12) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
649 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
650 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
651 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
652 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
653 results->decode_type = SANYO;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
654 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
655 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
656
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
657 // Looks like Sony except for timings, 48 chars of data and time/space different
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
658 long IRrecv::decodeMitsubishi(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
659 // Serial.print("?!? decoding Mitsubishi:");Serial.print(irparams.rawlen); Serial.print(" want "); Serial.println( 2 * MITSUBISHI_BITS + 2);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
660 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
661 if (irparams.rawlen < 2 * MITSUBISHI_BITS + 2) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
662 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
663 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
664 int offset = 0; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
665 // Initial space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
666 /* Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
667 Serial.print("IR Gap: ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
668 Serial.println( results->rawbuf[offset]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
669 Serial.println( "test against:");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
670 Serial.println(results->rawbuf[offset]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
671 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
672 /* Not seeing double keys from Mitsubishi
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
673 if (results->rawbuf[offset] < MITSUBISHI_DOUBLE_SPACE_USECS) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
674 // Serial.print("IR Gap found: ");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
675 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
676 results->value = REPEAT;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
677 results->decode_type = MITSUBISHI;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
678 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
679 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
680 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
681 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
682
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
683 // Typical
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
684 // 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
685
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
686 // Initial Space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
687 if (!MATCH_MARK(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
688 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
689 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
690 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
691 while (offset + 1 < irparams.rawlen) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
692 if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ONE_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
693 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
694 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
695 else if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ZERO_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
696 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
697 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
698 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
699 // Serial.println("A"); Serial.println(offset); Serial.println(results->rawbuf[offset]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
700 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
701 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
702 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
703 if (!MATCH_SPACE(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
704 // Serial.println("B"); Serial.println(offset); Serial.println(results->rawbuf[offset]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
705 break;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
706 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
707 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
708 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
709
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
710 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
711 results->bits = (offset - 1) / 2;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
712 if (results->bits < MITSUBISHI_BITS) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
713 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
714 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
715 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
716 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
717 results->decode_type = MITSUBISHI;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
718 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
719 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
720
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
721
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
722 // Gets one undecoded level at a time from the raw buffer.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
723 // The RC5/6 decoding is easier if the data is broken into time intervals.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
724 // E.g. if the buffer has MARK for 2 time intervals and SPACE for 1,
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
725 // successive calls to getRClevel will return MARK, MARK, SPACE.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
726 // offset and used are updated to keep track of the current position.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
727 // t1 is the time interval for a single bit in microseconds.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
728 // Returns -1 for error (measured time interval is not a multiple of t1).
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
729 int IRrecv::getRClevel(decode_results *results, int *offset, int *used, int t1) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
730 if (*offset >= results->rawlen) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
731 // After end of recorded buffer, assume SPACE.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
732 return SPACE;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
733 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
734 int width = results->rawbuf[*offset];
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
735 int val = ((*offset) % 2) ? MARK : SPACE;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
736 int correction = (val == MARK) ? MARK_EXCESS : - MARK_EXCESS;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
737
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
738 int avail;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
739 if (MATCH(width, t1 + correction)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
740 avail = 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
741 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
742 else if (MATCH(width, 2*t1 + correction)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
743 avail = 2;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
744 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
745 else if (MATCH(width, 3*t1 + correction)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
746 avail = 3;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
747 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
748 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
749 return -1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
750 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
751
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
752 (*used)++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
753 if (*used >= avail) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
754 *used = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
755 (*offset)++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
756 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
757 #ifdef DEBUG
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
758 if (val == MARK) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
759 Serial.println("MARK");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
760 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
761 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
762 Serial.println("SPACE");
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
763 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
764 #endif
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
765 return val;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
766 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
767
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
768 long IRrecv::decodeRC5(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
769 if (irparams.rawlen < MIN_RC5_SAMPLES + 2) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
770 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
771 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
772 int offset = 1; // Skip gap space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
773 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
774 int used = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
775 // Get start bits
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
776 if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
777 if (getRClevel(results, &offset, &used, RC5_T1) != SPACE) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
778 if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
779 int nbits;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
780 for (nbits = 0; offset < irparams.rawlen; nbits++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
781 int levelA = getRClevel(results, &offset, &used, RC5_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
782 int levelB = getRClevel(results, &offset, &used, RC5_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
783 if (levelA == SPACE && levelB == MARK) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
784 // 1 bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
785 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
786 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
787 else if (levelA == MARK && levelB == SPACE) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
788 // zero bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
789 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
790 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
791 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
792 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
793 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
794 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
795
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
796 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
797 results->bits = nbits;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
798 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
799 results->decode_type = RC5;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
800 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
801 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
802
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
803 long IRrecv::decodeRC6(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
804 if (results->rawlen < MIN_RC6_SAMPLES) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
805 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
806 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
807 int offset = 1; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
808 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
809 if (!MATCH_MARK(results->rawbuf[offset], RC6_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
810 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
811 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
812 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
813 if (!MATCH_SPACE(results->rawbuf[offset], RC6_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
814 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
815 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
816 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
817 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
818 int used = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
819 // Get start bit (1)
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
820 if (getRClevel(results, &offset, &used, RC6_T1) != MARK) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
821 if (getRClevel(results, &offset, &used, RC6_T1) != SPACE) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
822 int nbits;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
823 for (nbits = 0; offset < results->rawlen; nbits++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
824 int levelA, levelB; // Next two levels
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
825 levelA = getRClevel(results, &offset, &used, RC6_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
826 if (nbits == 3) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
827 // T bit is double wide; make sure second half matches
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
828 if (levelA != getRClevel(results, &offset, &used, RC6_T1)) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
829 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
830 levelB = getRClevel(results, &offset, &used, RC6_T1);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
831 if (nbits == 3) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
832 // T bit is double wide; make sure second half matches
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
833 if (levelB != getRClevel(results, &offset, &used, RC6_T1)) return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
834 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
835 if (levelA == MARK && levelB == SPACE) { // reversed compared to RC5
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
836 // 1 bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
837 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
838 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
839 else if (levelA == SPACE && levelB == MARK) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
840 // zero bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
841 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
842 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
843 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
844 return ERR; // Error
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
845 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
846 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
847 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
848 results->bits = nbits;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
849 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
850 results->decode_type = RC6;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
851 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
852 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
853 long IRrecv::decodePanasonic(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
854 unsigned long long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
855 int offset = 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
856
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
857 if (!MATCH_MARK(results->rawbuf[offset], PANASONIC_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
858 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
859 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
860 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
861 if (!MATCH_MARK(results->rawbuf[offset], PANASONIC_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
862 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
863 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
864 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
865
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
866 // decode address
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
867 for (int i = 0; i < PANASONIC_BITS; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
868 if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
869 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
870 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
871 if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ONE_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
872 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
873 } else if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ZERO_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
874 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
875 } else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
876 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
877 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
878 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
879 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
880 results->value = (unsigned long)data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
881 results->panasonicAddress = (unsigned int)(data >> 32);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
882 results->decode_type = PANASONIC;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
883 results->bits = PANASONIC_BITS;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
884 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
885 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
886
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
887 long IRrecv::decodeLG(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
888 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
889 int offset = 1; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
890
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
891 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
892 if (!MATCH_MARK(results->rawbuf[offset], LG_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
893 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
894 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
895 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
896 if (irparams.rawlen < 2 * LG_BITS + 1 ) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
897 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
898 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
899 // Initial space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
900 if (!MATCH_SPACE(results->rawbuf[offset], LG_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
901 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
902 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
903 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
904 for (int i = 0; i < LG_BITS; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
905 if (!MATCH_MARK(results->rawbuf[offset], LG_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
906 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
907 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
908 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
909 if (MATCH_SPACE(results->rawbuf[offset], LG_ONE_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
910 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
911 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
912 else if (MATCH_SPACE(results->rawbuf[offset], LG_ZERO_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
913 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
914 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
915 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
916 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
917 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
918 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
919 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
920 //Stop bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
921 if (!MATCH_MARK(results->rawbuf[offset], LG_BIT_MARK)){
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
922 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
923 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
924 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
925 results->bits = LG_BITS;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
926 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
927 results->decode_type = LG;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
928 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
929 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
930
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
931
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
932 long IRrecv::decodeJVC(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
933 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
934 int offset = 1; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
935 // Check for repeat
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
936 if (irparams.rawlen - 1 == 33 &&
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
937 MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK) &&
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
938 MATCH_MARK(results->rawbuf[irparams.rawlen-1], JVC_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
939 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
940 results->value = REPEAT;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
941 results->decode_type = JVC;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
942 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
943 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
944 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
945 if (!MATCH_MARK(results->rawbuf[offset], JVC_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
946 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
947 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
948 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
949 if (irparams.rawlen < 2 * JVC_BITS + 1 ) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
950 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
951 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
952 // Initial space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
953 if (!MATCH_SPACE(results->rawbuf[offset], JVC_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
954 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
955 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
956 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
957 for (int i = 0; i < JVC_BITS; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
958 if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
959 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
960 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
961 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
962 if (MATCH_SPACE(results->rawbuf[offset], JVC_ONE_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
963 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
964 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
965 else if (MATCH_SPACE(results->rawbuf[offset], JVC_ZERO_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
966 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
967 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
968 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
969 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
970 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
971 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
972 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
973 //Stop bit
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
974 if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)){
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
975 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
976 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
977 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
978 results->bits = JVC_BITS;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
979 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
980 results->decode_type = JVC;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
981 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
982 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
983
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
984 // SAMSUNGs have a repeat only 4 items long
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
985 long IRrecv::decodeSAMSUNG(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
986 long data = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
987 int offset = 1; // Skip first space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
988 // Initial mark
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
989 if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG_HDR_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
990 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
991 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
992 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
993 // Check for repeat
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
994 if (irparams.rawlen == 4 &&
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
995 MATCH_SPACE(results->rawbuf[offset], SAMSUNG_RPT_SPACE) &&
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
996 MATCH_MARK(results->rawbuf[offset+1], SAMSUNG_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
997 results->bits = 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
998 results->value = REPEAT;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
999 results->decode_type = SAMSUNG;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1000 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1001 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1002 if (irparams.rawlen < 2 * SAMSUNG_BITS + 4) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1003 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1004 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1005 // Initial space
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1006 if (!MATCH_SPACE(results->rawbuf[offset], SAMSUNG_HDR_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1007 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1008 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1009 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1010 for (int i = 0; i < SAMSUNG_BITS; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1011 if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG_BIT_MARK)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1012 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1013 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1014 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1015 if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ONE_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1016 data = (data << 1) | 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1017 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1018 else if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ZERO_SPACE)) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1019 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1020 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1021 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1022 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1023 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1024 offset++;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1025 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1026 // Success
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1027 results->bits = SAMSUNG_BITS;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1028 results->value = data;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1029 results->decode_type = SAMSUNG;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1030 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1031 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1032
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1033 /* -----------------------------------------------------------------------
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1034 * hashdecode - decode an arbitrary IR code.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1035 * Instead of decoding using a standard encoding scheme
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1036 * (e.g. Sony, NEC, RC5), the code is hashed to a 32-bit value.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1037 *
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1038 * The algorithm: look at the sequence of MARK signals, and see if each one
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1039 * is shorter (0), the same length (1), or longer (2) than the previous.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1040 * Do the same with the SPACE signals. Hszh the resulting sequence of 0's,
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1041 * 1's, and 2's to a 32-bit value. This will give a unique value for each
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1042 * different code (probably), for most code systems.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1043 *
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1044 * http://arcfn.com/2010/01/using-arbitrary-remotes-with-arduino.html
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1045 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1046
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1047 // Compare two tick values, returning 0 if newval is shorter,
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1048 // 1 if newval is equal, and 2 if newval is longer
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1049 // Use a tolerance of 20%
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1050 int IRrecv::compare(unsigned int oldval, unsigned int newval) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1051 if (newval < oldval * .8) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1052 return 0;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1053 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1054 else if (oldval < newval * .8) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1055 return 2;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1056 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1057 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1058 return 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1059 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1060 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1061
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1062 // Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1063 #define FNV_PRIME_32 16777619
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1064 #define FNV_BASIS_32 2166136261
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1065
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1066 /* Converts the raw code values into a 32-bit hash code.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1067 * Hopefully this code is unique for each button.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1068 * This isn't a "real" decoding, just an arbitrary value.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1069 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1070 long IRrecv::decodeHash(decode_results *results) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1071 // Require at least 6 samples to prevent triggering on noise
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1072 if (results->rawlen < 6) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1073 return ERR;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1074 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1075 long hash = FNV_BASIS_32;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1076 for (int i = 1; i+2 < results->rawlen; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1077 int value = compare(results->rawbuf[i], results->rawbuf[i+2]);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1078 // Add value into the hash
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1079 hash = (hash * FNV_PRIME_32) ^ value;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1080 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1081 results->value = hash;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1082 results->bits = 32;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1083 results->decode_type = UNKNOWN;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1084 return DECODED;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1085 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1086
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1087 /* Sharp and DISH support by Todd Treece ( http://unionbridge.org/design/ircommand )
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1088
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1089 The Dish send function needs to be repeated 4 times, and the Sharp function
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1090 has the necessary repeat built in because of the need to invert the signal.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1091
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1092 Sharp protocol documentation:
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1093 http://www.sbprojects.com/knowledge/ir/sharp.htm
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1094
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1095 Here are the LIRC files that I found that seem to match the remote codes
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1096 from the oscilloscope:
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1097
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1098 Sharp LCD TV:
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1099 http://lirc.sourceforge.net/remotes/sharp/GA538WJSA
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1100
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1101 DISH NETWORK (echostar 301):
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1102 http://lirc.sourceforge.net/remotes/echostar/301_501_3100_5100_58xx_59xx
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1103
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1104 For the DISH codes, only send the last for characters of the hex.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1105 i.e. use 0x1C10 instead of 0x0000000000001C10 which is listed in the
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1106 linked LIRC file.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1107 */
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1108
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1109 void IRsend::sendSharpRaw(unsigned long data, int nbits) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1110 enableIROut(38);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1111
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1112 // Sending codes in bursts of 3 (normal, inverted, normal) makes transmission
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1113 // much more reliable. That's the exact behaviour of CD-S6470 remote control.
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1114 for (int n = 0; n < 3; n++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1115 for (int i = 1 << (nbits-1); i > 0; i>>=1) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1116 if (data & i) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1117 mark(SHARP_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1118 space(SHARP_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1119 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1120 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1121 mark(SHARP_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1122 space(SHARP_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1123 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1124 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1125
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1126 mark(SHARP_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1127 space(SHARP_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1128 delay(40);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1129
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1130 data = data ^ SHARP_TOGGLE_MASK;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1131 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1132 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1133
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1134 // Sharp send compatible with data obtained through decodeSharp
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1135 void IRsend::sendSharp(unsigned int address, unsigned int command) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1136 sendSharpRaw((address << 10) | (command << 2) | 2, 15);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1137 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1138
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1139 void IRsend::sendDISH(unsigned long data, int nbits) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1140 enableIROut(56);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1141 mark(DISH_HDR_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1142 space(DISH_HDR_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1143 for (int i = 0; i < nbits; i++) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1144 if (data & DISH_TOP_BIT) {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1145 mark(DISH_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1146 space(DISH_ONE_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1147 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1148 else {
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1149 mark(DISH_BIT_MARK);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1150 space(DISH_ZERO_SPACE);
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1151 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1152 data <<= 1;
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1153 }
e88308cea843 add IRremote
drewp@bigasterisk.com
parents:
diff changeset
1154 }