使用红外接收库的一个demo code

Dependencies:   mbed

Fork of IR_remote by Armando Casalino

Committer:
adaphoto
Date:
Thu Jun 21 01:20:35 2018 +0000
Revision:
4:326b8df3add2
?????????demo code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adaphoto 4:326b8df3add2 1 /**
adaphoto 4:326b8df3add2 2 * IR receiver (Version 0.0.4)
adaphoto 4:326b8df3add2 3 *
adaphoto 4:326b8df3add2 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
adaphoto 4:326b8df3add2 5 * http://shinta.main.jp/
adaphoto 4:326b8df3add2 6 */
adaphoto 4:326b8df3add2 7
adaphoto 4:326b8df3add2 8 #include "ReceiverIR.h"
adaphoto 4:326b8df3add2 9
adaphoto 4:326b8df3add2 10 #define LOCK()
adaphoto 4:326b8df3add2 11 #define UNLOCK()
adaphoto 4:326b8df3add2 12
adaphoto 4:326b8df3add2 13 #define InRange(x,y) ((((y) * 0.7) < (x)) && ((x) < ((y) * 1.3)))
adaphoto 4:326b8df3add2 14
adaphoto 4:326b8df3add2 15 /**
adaphoto 4:326b8df3add2 16 * Constructor.
adaphoto 4:326b8df3add2 17 *
adaphoto 4:326b8df3add2 18 * @param rxpin Pin for receive IR signal.
adaphoto 4:326b8df3add2 19 */
adaphoto 4:326b8df3add2 20 ReceiverIR::ReceiverIR(PinName rxpin) : evt(rxpin) {
adaphoto 4:326b8df3add2 21 init_state();
adaphoto 4:326b8df3add2 22 evt.fall(this, &ReceiverIR::isr_fall);
adaphoto 4:326b8df3add2 23 evt.rise(this, &ReceiverIR::isr_rise);
adaphoto 4:326b8df3add2 24 evt.mode(PullUp);
adaphoto 4:326b8df3add2 25 ticker.attach_us(this, &ReceiverIR::isr_wdt, 10 * 1000);
adaphoto 4:326b8df3add2 26 }
adaphoto 4:326b8df3add2 27
adaphoto 4:326b8df3add2 28 /**
adaphoto 4:326b8df3add2 29 * Destructor.
adaphoto 4:326b8df3add2 30 */
adaphoto 4:326b8df3add2 31 ReceiverIR::~ReceiverIR() {
adaphoto 4:326b8df3add2 32 }
adaphoto 4:326b8df3add2 33
adaphoto 4:326b8df3add2 34 /**
adaphoto 4:326b8df3add2 35 * Get state.
adaphoto 4:326b8df3add2 36 *
adaphoto 4:326b8df3add2 37 * @return Current state.
adaphoto 4:326b8df3add2 38 */
adaphoto 4:326b8df3add2 39 ReceiverIR::State ReceiverIR::getState() {
adaphoto 4:326b8df3add2 40 LOCK();
adaphoto 4:326b8df3add2 41 State s = work.state;
adaphoto 4:326b8df3add2 42 UNLOCK();
adaphoto 4:326b8df3add2 43 return s;
adaphoto 4:326b8df3add2 44 }
adaphoto 4:326b8df3add2 45
adaphoto 4:326b8df3add2 46 /**
adaphoto 4:326b8df3add2 47 * Get data.
adaphoto 4:326b8df3add2 48 *
adaphoto 4:326b8df3add2 49 * @param format Pointer to format.
adaphoto 4:326b8df3add2 50 * @param buf Buffer of a data.
adaphoto 4:326b8df3add2 51 * @param bitlength Bit length of the buffer.
adaphoto 4:326b8df3add2 52 *
adaphoto 4:326b8df3add2 53 * @return Data bit length.
adaphoto 4:326b8df3add2 54 */
adaphoto 4:326b8df3add2 55 int ReceiverIR::getData(RemoteIR::Format *format, uint8_t *buf, int bitlength) {
adaphoto 4:326b8df3add2 56 LOCK();
adaphoto 4:326b8df3add2 57
adaphoto 4:326b8df3add2 58 if (bitlength < data.bitcount) {
adaphoto 4:326b8df3add2 59 UNLOCK();
adaphoto 4:326b8df3add2 60 return -1;
adaphoto 4:326b8df3add2 61 }
adaphoto 4:326b8df3add2 62
adaphoto 4:326b8df3add2 63 const int nbits = data.bitcount;
adaphoto 4:326b8df3add2 64 const int nbytes = data.bitcount / 8 + (((data.bitcount % 8) != 0) ? 1 : 0);
adaphoto 4:326b8df3add2 65 *format = data.format;
adaphoto 4:326b8df3add2 66 for (int i = 0; i < nbytes; i++) {
adaphoto 4:326b8df3add2 67 buf[i] = data.buffer[i];
adaphoto 4:326b8df3add2 68 }
adaphoto 4:326b8df3add2 69
adaphoto 4:326b8df3add2 70 init_state();
adaphoto 4:326b8df3add2 71
adaphoto 4:326b8df3add2 72 UNLOCK();
adaphoto 4:326b8df3add2 73 return nbits;
adaphoto 4:326b8df3add2 74 }
adaphoto 4:326b8df3add2 75
adaphoto 4:326b8df3add2 76 void ReceiverIR::init_state(void) {
adaphoto 4:326b8df3add2 77 work.c1 = -1;
adaphoto 4:326b8df3add2 78 work.c2 = -1;
adaphoto 4:326b8df3add2 79 work.c3 = -1;
adaphoto 4:326b8df3add2 80 work.d1 = -1;
adaphoto 4:326b8df3add2 81 work.d2 = -1;
adaphoto 4:326b8df3add2 82 work.state = Idle;
adaphoto 4:326b8df3add2 83 data.format = RemoteIR::UNKNOWN;
adaphoto 4:326b8df3add2 84 data.bitcount = 0;
adaphoto 4:326b8df3add2 85 timer.stop();
adaphoto 4:326b8df3add2 86 timer.reset();
adaphoto 4:326b8df3add2 87 for (int i = 0; i < sizeof(data.buffer); i++) {
adaphoto 4:326b8df3add2 88 data.buffer[i] = 0;
adaphoto 4:326b8df3add2 89 }
adaphoto 4:326b8df3add2 90 }
adaphoto 4:326b8df3add2 91
adaphoto 4:326b8df3add2 92 void ReceiverIR::isr_wdt(void) {
adaphoto 4:326b8df3add2 93 LOCK();
adaphoto 4:326b8df3add2 94 static int cnt = 0;
adaphoto 4:326b8df3add2 95 if ((Idle != work.state) || ((0 <= work.c1) || (0 <= work.c2) || (0 <= work.c3) || (0 <= work.d1) || (0 <= work.d2))) {
adaphoto 4:326b8df3add2 96 cnt++;
adaphoto 4:326b8df3add2 97 if (cnt > 50) {
adaphoto 4:326b8df3add2 98 #if 0
adaphoto 4:326b8df3add2 99 printf("# WDT [c1=%d, c2=%d, c3=%d, d1=%d, d2=%d, state=%d, format=%d, bitcount=%d]\n",
adaphoto 4:326b8df3add2 100 work.c1,
adaphoto 4:326b8df3add2 101 work.c2,
adaphoto 4:326b8df3add2 102 work.c3,
adaphoto 4:326b8df3add2 103 work.d1,
adaphoto 4:326b8df3add2 104 work.d2,
adaphoto 4:326b8df3add2 105 work.state,
adaphoto 4:326b8df3add2 106 data.format,
adaphoto 4:326b8df3add2 107 data.bitcount);
adaphoto 4:326b8df3add2 108 #endif
adaphoto 4:326b8df3add2 109 init_state();
adaphoto 4:326b8df3add2 110 cnt = 0;
adaphoto 4:326b8df3add2 111 }
adaphoto 4:326b8df3add2 112 } else {
adaphoto 4:326b8df3add2 113 cnt = 0;
adaphoto 4:326b8df3add2 114 }
adaphoto 4:326b8df3add2 115 UNLOCK();
adaphoto 4:326b8df3add2 116 }
adaphoto 4:326b8df3add2 117
adaphoto 4:326b8df3add2 118 void ReceiverIR::isr_fall(void) {
adaphoto 4:326b8df3add2 119 LOCK();
adaphoto 4:326b8df3add2 120 switch (work.state) {
adaphoto 4:326b8df3add2 121 case Idle:
adaphoto 4:326b8df3add2 122 if (work.c1 < 0) {
adaphoto 4:326b8df3add2 123 timer.start();
adaphoto 4:326b8df3add2 124 work.c1 = timer.read_us();
adaphoto 4:326b8df3add2 125 } else {
adaphoto 4:326b8df3add2 126 work.c3 = timer.read_us();
adaphoto 4:326b8df3add2 127 int a = work.c2 - work.c1;
adaphoto 4:326b8df3add2 128 int b = work.c3 - work.c2;
adaphoto 4:326b8df3add2 129 if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 8)) {
adaphoto 4:326b8df3add2 130 /*
adaphoto 4:326b8df3add2 131 * NEC.
adaphoto 4:326b8df3add2 132 */
adaphoto 4:326b8df3add2 133 data.format = RemoteIR::NEC;
adaphoto 4:326b8df3add2 134 work.state = Receiving;
adaphoto 4:326b8df3add2 135 data.bitcount = 0;
adaphoto 4:326b8df3add2 136 } else if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 4)) {
adaphoto 4:326b8df3add2 137 /*
adaphoto 4:326b8df3add2 138 * NEC Repeat.
adaphoto 4:326b8df3add2 139 */
adaphoto 4:326b8df3add2 140 data.format = RemoteIR::NEC_REPEAT;
adaphoto 4:326b8df3add2 141 work.state = Received;
adaphoto 4:326b8df3add2 142 data.bitcount = 0;
adaphoto 4:326b8df3add2 143 work.c1 = -1;
adaphoto 4:326b8df3add2 144 work.c2 = -1;
adaphoto 4:326b8df3add2 145 work.c3 = -1;
adaphoto 4:326b8df3add2 146 work.d1 = -1;
adaphoto 4:326b8df3add2 147 work.d2 = -1;
adaphoto 4:326b8df3add2 148 } else if (InRange(a, RemoteIR::TUS_AEHA * 8) && InRange(b, RemoteIR::TUS_AEHA * 4)) {
adaphoto 4:326b8df3add2 149 /*
adaphoto 4:326b8df3add2 150 * AEHA.
adaphoto 4:326b8df3add2 151 */
adaphoto 4:326b8df3add2 152 data.format = RemoteIR::AEHA;
adaphoto 4:326b8df3add2 153 work.state = Receiving;
adaphoto 4:326b8df3add2 154 data.bitcount = 0;
adaphoto 4:326b8df3add2 155 } else if (InRange(a, RemoteIR::TUS_AEHA * 8) && InRange(b, RemoteIR::TUS_AEHA * 8)) {
adaphoto 4:326b8df3add2 156 /*
adaphoto 4:326b8df3add2 157 * AEHA Repeat.
adaphoto 4:326b8df3add2 158 */
adaphoto 4:326b8df3add2 159 data.format = RemoteIR::AEHA_REPEAT;
adaphoto 4:326b8df3add2 160 work.state = Received;
adaphoto 4:326b8df3add2 161 data.bitcount = 0;
adaphoto 4:326b8df3add2 162 work.c1 = -1;
adaphoto 4:326b8df3add2 163 work.c2 = -1;
adaphoto 4:326b8df3add2 164 work.c3 = -1;
adaphoto 4:326b8df3add2 165 work.d1 = -1;
adaphoto 4:326b8df3add2 166 work.d2 = -1;
adaphoto 4:326b8df3add2 167 } else {
adaphoto 4:326b8df3add2 168 init_state();
adaphoto 4:326b8df3add2 169 }
adaphoto 4:326b8df3add2 170 }
adaphoto 4:326b8df3add2 171 break;
adaphoto 4:326b8df3add2 172 case Receiving:
adaphoto 4:326b8df3add2 173 if (RemoteIR::NEC == data.format) {
adaphoto 4:326b8df3add2 174 work.d2 = timer.read_us();
adaphoto 4:326b8df3add2 175 int a = work.d2 - work.d1;
adaphoto 4:326b8df3add2 176 if (InRange(a, RemoteIR::TUS_NEC * 3)) {
adaphoto 4:326b8df3add2 177 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
adaphoto 4:326b8df3add2 178 } else if (InRange(a, RemoteIR::TUS_NEC * 1)) {
adaphoto 4:326b8df3add2 179 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
adaphoto 4:326b8df3add2 180 }
adaphoto 4:326b8df3add2 181 data.bitcount++;
adaphoto 4:326b8df3add2 182 #if 0
adaphoto 4:326b8df3add2 183 /*
adaphoto 4:326b8df3add2 184 * Length of NEC is always 32 bits.
adaphoto 4:326b8df3add2 185 */
adaphoto 4:326b8df3add2 186 if (32 <= data.bitcount) {
adaphoto 4:326b8df3add2 187 data.state = Received;
adaphoto 4:326b8df3add2 188 work.c1 = -1;
adaphoto 4:326b8df3add2 189 work.c2 = -1;
adaphoto 4:326b8df3add2 190 work.c3 = -1;
adaphoto 4:326b8df3add2 191 work.d1 = -1;
adaphoto 4:326b8df3add2 192 work.d2 = -1;
adaphoto 4:326b8df3add2 193 }
adaphoto 4:326b8df3add2 194 #else
adaphoto 4:326b8df3add2 195 /*
adaphoto 4:326b8df3add2 196 * Set timeout for tail detection automatically.
adaphoto 4:326b8df3add2 197 */
adaphoto 4:326b8df3add2 198 timeout.detach();
adaphoto 4:326b8df3add2 199 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_NEC * 5);
adaphoto 4:326b8df3add2 200 #endif
adaphoto 4:326b8df3add2 201 } else if (RemoteIR::AEHA == data.format) {
adaphoto 4:326b8df3add2 202 work.d2 = timer.read_us();
adaphoto 4:326b8df3add2 203 int a = work.d2 - work.d1;
adaphoto 4:326b8df3add2 204 if (InRange(a, RemoteIR::TUS_AEHA * 3)) {
adaphoto 4:326b8df3add2 205 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
adaphoto 4:326b8df3add2 206 } else if (InRange(a, RemoteIR::TUS_AEHA * 1)) {
adaphoto 4:326b8df3add2 207 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
adaphoto 4:326b8df3add2 208 }
adaphoto 4:326b8df3add2 209 data.bitcount++;
adaphoto 4:326b8df3add2 210 #if 0
adaphoto 4:326b8df3add2 211 /*
adaphoto 4:326b8df3add2 212 * Typical length of AEHA is 48 bits.
adaphoto 4:326b8df3add2 213 * Please check a specification of your remote controller if you find a problem.
adaphoto 4:326b8df3add2 214 */
adaphoto 4:326b8df3add2 215 if (48 <= data.bitcount) {
adaphoto 4:326b8df3add2 216 data.state = Received;
adaphoto 4:326b8df3add2 217 work.c1 = -1;
adaphoto 4:326b8df3add2 218 work.c2 = -1;
adaphoto 4:326b8df3add2 219 work.c3 = -1;
adaphoto 4:326b8df3add2 220 work.d1 = -1;
adaphoto 4:326b8df3add2 221 work.d2 = -1;
adaphoto 4:326b8df3add2 222 }
adaphoto 4:326b8df3add2 223 #else
adaphoto 4:326b8df3add2 224 /*
adaphoto 4:326b8df3add2 225 * Set timeout for tail detection automatically.
adaphoto 4:326b8df3add2 226 */
adaphoto 4:326b8df3add2 227 timeout.detach();
adaphoto 4:326b8df3add2 228 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_AEHA * 5);
adaphoto 4:326b8df3add2 229 #endif
adaphoto 4:326b8df3add2 230 } else if (RemoteIR::SONY == data.format) {
adaphoto 4:326b8df3add2 231 work.d1 = timer.read_us();
adaphoto 4:326b8df3add2 232 }
adaphoto 4:326b8df3add2 233 break;
adaphoto 4:326b8df3add2 234 case Received:
adaphoto 4:326b8df3add2 235 break;
adaphoto 4:326b8df3add2 236 default:
adaphoto 4:326b8df3add2 237 break;
adaphoto 4:326b8df3add2 238 }
adaphoto 4:326b8df3add2 239 UNLOCK();
adaphoto 4:326b8df3add2 240 }
adaphoto 4:326b8df3add2 241
adaphoto 4:326b8df3add2 242 void ReceiverIR::isr_rise(void) {
adaphoto 4:326b8df3add2 243 LOCK();
adaphoto 4:326b8df3add2 244 switch (work.state) {
adaphoto 4:326b8df3add2 245 case Idle:
adaphoto 4:326b8df3add2 246 if (0 <= work.c1) {
adaphoto 4:326b8df3add2 247 work.c2 = timer.read_us();
adaphoto 4:326b8df3add2 248 int a = work.c2 - work.c1;
adaphoto 4:326b8df3add2 249 if (InRange(a, RemoteIR::TUS_SONY * 4)) {
adaphoto 4:326b8df3add2 250 data.format = RemoteIR::SONY;
adaphoto 4:326b8df3add2 251 work.state = Receiving;
adaphoto 4:326b8df3add2 252 data.bitcount = 0;
adaphoto 4:326b8df3add2 253 } else {
adaphoto 4:326b8df3add2 254 static const int MINIMUM_LEADER_WIDTH = 150;
adaphoto 4:326b8df3add2 255 if (a < MINIMUM_LEADER_WIDTH) {
adaphoto 4:326b8df3add2 256 init_state();
adaphoto 4:326b8df3add2 257 }
adaphoto 4:326b8df3add2 258 }
adaphoto 4:326b8df3add2 259 } else {
adaphoto 4:326b8df3add2 260 init_state();
adaphoto 4:326b8df3add2 261 }
adaphoto 4:326b8df3add2 262 break;
adaphoto 4:326b8df3add2 263 case Receiving:
adaphoto 4:326b8df3add2 264 if (RemoteIR::NEC == data.format) {
adaphoto 4:326b8df3add2 265 work.d1 = timer.read_us();
adaphoto 4:326b8df3add2 266 } else if (RemoteIR::AEHA == data.format) {
adaphoto 4:326b8df3add2 267 work.d1 = timer.read_us();
adaphoto 4:326b8df3add2 268 } else if (RemoteIR::SONY == data.format) {
adaphoto 4:326b8df3add2 269 work.d2 = timer.read_us();
adaphoto 4:326b8df3add2 270 int a = work.d2 - work.d1;
adaphoto 4:326b8df3add2 271 if (InRange(a, RemoteIR::TUS_SONY * 2)) {
adaphoto 4:326b8df3add2 272 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
adaphoto 4:326b8df3add2 273 } else if (InRange(a, RemoteIR::TUS_SONY * 1)) {
adaphoto 4:326b8df3add2 274 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
adaphoto 4:326b8df3add2 275 }
adaphoto 4:326b8df3add2 276 data.bitcount++;
adaphoto 4:326b8df3add2 277 #if 0
adaphoto 4:326b8df3add2 278 /*
adaphoto 4:326b8df3add2 279 * How do I know the correct length? (6bits, 12bits, 15bits, 20bits...)
adaphoto 4:326b8df3add2 280 * By a model only?
adaphoto 4:326b8df3add2 281 * Please check a specification of your remote controller if you find a problem.
adaphoto 4:326b8df3add2 282 */
adaphoto 4:326b8df3add2 283 if (12 <= data.bitcount) {
adaphoto 4:326b8df3add2 284 data.state = Received;
adaphoto 4:326b8df3add2 285 work.c1 = -1;
adaphoto 4:326b8df3add2 286 work.c2 = -1;
adaphoto 4:326b8df3add2 287 work.c3 = -1;
adaphoto 4:326b8df3add2 288 work.d1 = -1;
adaphoto 4:326b8df3add2 289 work.d2 = -1;
adaphoto 4:326b8df3add2 290 }
adaphoto 4:326b8df3add2 291 #else
adaphoto 4:326b8df3add2 292 /*
adaphoto 4:326b8df3add2 293 * Set timeout for tail detection automatically.
adaphoto 4:326b8df3add2 294 */
adaphoto 4:326b8df3add2 295 timeout.detach();
adaphoto 4:326b8df3add2 296 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_SONY * 4);
adaphoto 4:326b8df3add2 297 #endif
adaphoto 4:326b8df3add2 298 }
adaphoto 4:326b8df3add2 299 break;
adaphoto 4:326b8df3add2 300 case Received:
adaphoto 4:326b8df3add2 301 break;
adaphoto 4:326b8df3add2 302 default:
adaphoto 4:326b8df3add2 303 break;
adaphoto 4:326b8df3add2 304 }
adaphoto 4:326b8df3add2 305 UNLOCK();
adaphoto 4:326b8df3add2 306 }
adaphoto 4:326b8df3add2 307
adaphoto 4:326b8df3add2 308 void ReceiverIR::isr_timeout(void) {
adaphoto 4:326b8df3add2 309 LOCK();
adaphoto 4:326b8df3add2 310 #if 0
adaphoto 4:326b8df3add2 311 printf("# TIMEOUT [c1=%d, c2=%d, c3=%d, d1=%d, d2=%d, state=%d, format=%d, bitcount=%d]\n",
adaphoto 4:326b8df3add2 312 work.c1,
adaphoto 4:326b8df3add2 313 work.c2,
adaphoto 4:326b8df3add2 314 work.c3,
adaphoto 4:326b8df3add2 315 work.d1,
adaphoto 4:326b8df3add2 316 work.d2,
adaphoto 4:326b8df3add2 317 work.state,
adaphoto 4:326b8df3add2 318 data.format,
adaphoto 4:326b8df3add2 319 data.bitcount);
adaphoto 4:326b8df3add2 320 #endif
adaphoto 4:326b8df3add2 321 if (work.state == Receiving) {
adaphoto 4:326b8df3add2 322 work.state = Received;
adaphoto 4:326b8df3add2 323 work.c1 = -1;
adaphoto 4:326b8df3add2 324 work.c2 = -1;
adaphoto 4:326b8df3add2 325 work.c3 = -1;
adaphoto 4:326b8df3add2 326 work.d1 = -1;
adaphoto 4:326b8df3add2 327 work.d2 = -1;
adaphoto 4:326b8df3add2 328 }
adaphoto 4:326b8df3add2 329 UNLOCK();
adaphoto 4:326b8df3add2 330 }