RemotoIR Libraryに、IRC Helicopter Propo の受信処理と、受信パルス幅測定処理を追加したものです。

Dependents:   SwiftPropoIR_TestProgram irRawDataDisplay spinner2 LPC1114_ir-spinne_main-propo

Fork of RemoteIR by Shinichiro Nakamura

Committer:
suupen
Date:
Sun Jun 23 07:23:56 2013 +0000
Revision:
12:2379e13b8b34
Parent:
11:268cc2ab63bd
Child:
13:ec76e93a4d7c
IRC Helicopter "SWIFT" Propo recive data test program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:ec264f4ce158 1 /**
shintamainjp 9:dcfdac59ef74 2 * IR receiver (Version 0.0.4)
shintamainjp 0:ec264f4ce158 3 *
shintamainjp 0:ec264f4ce158 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:ec264f4ce158 5 * http://shinta.main.jp/
suupen 12:2379e13b8b34 6 *
suupen 12:2379e13b8b34 7 * -------------------------------------------------------
suupen 12:2379e13b8b34 8 * 130616 suupen
suupen 12:2379e13b8b34 9 * IRC Helicopter "SWIFT" Propo support
suupen 12:2379e13b8b34 10 * Conditional compilation
suupen 12:2379e13b8b34 11 * "SWIFT_PROTCOL"
suupen 12:2379e13b8b34 12 * "IR_RAW_DATA_ANALYSIS"
suupen 12:2379e13b8b34 13 *--------------------------------------------------------
shintamainjp 0:ec264f4ce158 14 */
shintamainjp 0:ec264f4ce158 15
shintamainjp 0:ec264f4ce158 16 #include "ReceiverIR.h"
shintamainjp 0:ec264f4ce158 17
shintamainjp 10:c54fb1204d1e 18 #define LOCK()
shintamainjp 10:c54fb1204d1e 19 #define UNLOCK()
shintamainjp 0:ec264f4ce158 20
shintamainjp 0:ec264f4ce158 21 #define InRange(x,y) ((((y) * 0.7) < (x)) && ((x) < ((y) * 1.3)))
shintamainjp 0:ec264f4ce158 22
shintamainjp 9:dcfdac59ef74 23 /**
shintamainjp 9:dcfdac59ef74 24 * Constructor.
shintamainjp 9:dcfdac59ef74 25 *
shintamainjp 9:dcfdac59ef74 26 * @param rxpin Pin for receive IR signal.
shintamainjp 9:dcfdac59ef74 27 */
shintamainjp 0:ec264f4ce158 28 ReceiverIR::ReceiverIR(PinName rxpin) : evt(rxpin) {
shintamainjp 9:dcfdac59ef74 29 init_state();
shintamainjp 0:ec264f4ce158 30 evt.fall(this, &ReceiverIR::isr_fall);
shintamainjp 0:ec264f4ce158 31 evt.rise(this, &ReceiverIR::isr_rise);
shintamainjp 0:ec264f4ce158 32 evt.mode(PullUp);
shintamainjp 0:ec264f4ce158 33 ticker.attach_us(this, &ReceiverIR::isr_wdt, 10 * 1000);
shintamainjp 0:ec264f4ce158 34 }
shintamainjp 0:ec264f4ce158 35
shintamainjp 9:dcfdac59ef74 36 /**
shintamainjp 9:dcfdac59ef74 37 * Destructor.
shintamainjp 9:dcfdac59ef74 38 */
shintamainjp 1:4adf16017a0f 39 ReceiverIR::~ReceiverIR() {
shintamainjp 1:4adf16017a0f 40 }
shintamainjp 1:4adf16017a0f 41
shintamainjp 9:dcfdac59ef74 42 /**
shintamainjp 9:dcfdac59ef74 43 * Get state.
shintamainjp 9:dcfdac59ef74 44 *
shintamainjp 9:dcfdac59ef74 45 * @return Current state.
shintamainjp 9:dcfdac59ef74 46 */
shintamainjp 0:ec264f4ce158 47 ReceiverIR::State ReceiverIR::getState() {
shintamainjp 9:dcfdac59ef74 48 LOCK();
shintamainjp 9:dcfdac59ef74 49 State s = work.state;
shintamainjp 9:dcfdac59ef74 50 UNLOCK();
shintamainjp 0:ec264f4ce158 51 return s;
shintamainjp 0:ec264f4ce158 52 }
shintamainjp 0:ec264f4ce158 53
shintamainjp 9:dcfdac59ef74 54 /**
shintamainjp 9:dcfdac59ef74 55 * Get data.
shintamainjp 9:dcfdac59ef74 56 *
shintamainjp 9:dcfdac59ef74 57 * @param format Pointer to format.
shintamainjp 9:dcfdac59ef74 58 * @param buf Buffer of a data.
shintamainjp 9:dcfdac59ef74 59 * @param bitlength Bit length of the buffer.
shintamainjp 9:dcfdac59ef74 60 *
shintamainjp 9:dcfdac59ef74 61 * @return Data bit length.
shintamainjp 9:dcfdac59ef74 62 */
shintamainjp 4:2304646f6ff5 63 int ReceiverIR::getData(RemoteIR::Format *format, uint8_t *buf, int bitlength) {
shintamainjp 9:dcfdac59ef74 64 LOCK();
shintamainjp 0:ec264f4ce158 65
shintamainjp 4:2304646f6ff5 66 if (bitlength < data.bitcount) {
shintamainjp 9:dcfdac59ef74 67 UNLOCK();
shintamainjp 0:ec264f4ce158 68 return -1;
shintamainjp 0:ec264f4ce158 69 }
shintamainjp 0:ec264f4ce158 70
shintamainjp 9:dcfdac59ef74 71 const int nbits = data.bitcount;
shintamainjp 6:e57504fc802e 72 const int nbytes = data.bitcount / 8 + (((data.bitcount % 8) != 0) ? 1 : 0);
shintamainjp 0:ec264f4ce158 73 *format = data.format;
shintamainjp 5:e158c85c55ff 74 for (int i = 0; i < nbytes; i++) {
shintamainjp 0:ec264f4ce158 75 buf[i] = data.buffer[i];
shintamainjp 0:ec264f4ce158 76 }
shintamainjp 0:ec264f4ce158 77
shintamainjp 0:ec264f4ce158 78 init_state();
shintamainjp 0:ec264f4ce158 79
shintamainjp 9:dcfdac59ef74 80 UNLOCK();
shintamainjp 9:dcfdac59ef74 81 return nbits;
shintamainjp 0:ec264f4ce158 82 }
shintamainjp 0:ec264f4ce158 83
shintamainjp 0:ec264f4ce158 84 void ReceiverIR::init_state(void) {
shintamainjp 0:ec264f4ce158 85 work.c1 = -1;
shintamainjp 0:ec264f4ce158 86 work.c2 = -1;
shintamainjp 0:ec264f4ce158 87 work.c3 = -1;
shintamainjp 0:ec264f4ce158 88 work.d1 = -1;
shintamainjp 0:ec264f4ce158 89 work.d2 = -1;
shintamainjp 9:dcfdac59ef74 90 work.state = Idle;
shintamainjp 0:ec264f4ce158 91 data.format = RemoteIR::UNKNOWN;
shintamainjp 0:ec264f4ce158 92 data.bitcount = 0;
shintamainjp 0:ec264f4ce158 93 timer.stop();
shintamainjp 0:ec264f4ce158 94 timer.reset();
shintamainjp 0:ec264f4ce158 95 for (int i = 0; i < sizeof(data.buffer); i++) {
shintamainjp 0:ec264f4ce158 96 data.buffer[i] = 0;
shintamainjp 0:ec264f4ce158 97 }
shintamainjp 0:ec264f4ce158 98 }
shintamainjp 0:ec264f4ce158 99
shintamainjp 0:ec264f4ce158 100 void ReceiverIR::isr_wdt(void) {
shintamainjp 9:dcfdac59ef74 101 LOCK();
shintamainjp 0:ec264f4ce158 102 static int cnt = 0;
shintamainjp 9:dcfdac59ef74 103 if ((Idle != work.state) || ((0 <= work.c1) || (0 <= work.c2) || (0 <= work.c3) || (0 <= work.d1) || (0 <= work.d2))) {
shintamainjp 0:ec264f4ce158 104 cnt++;
shintamainjp 0:ec264f4ce158 105 if (cnt > 50) {
shintamainjp 11:268cc2ab63bd 106 #if 0
shintamainjp 0:ec264f4ce158 107 printf("# WDT [c1=%d, c2=%d, c3=%d, d1=%d, d2=%d, state=%d, format=%d, bitcount=%d]\n",
shintamainjp 0:ec264f4ce158 108 work.c1,
shintamainjp 0:ec264f4ce158 109 work.c2,
shintamainjp 0:ec264f4ce158 110 work.c3,
shintamainjp 0:ec264f4ce158 111 work.d1,
shintamainjp 0:ec264f4ce158 112 work.d2,
shintamainjp 9:dcfdac59ef74 113 work.state,
shintamainjp 0:ec264f4ce158 114 data.format,
shintamainjp 0:ec264f4ce158 115 data.bitcount);
shintamainjp 0:ec264f4ce158 116 #endif
shintamainjp 0:ec264f4ce158 117 init_state();
shintamainjp 0:ec264f4ce158 118 cnt = 0;
shintamainjp 0:ec264f4ce158 119 }
shintamainjp 0:ec264f4ce158 120 } else {
shintamainjp 0:ec264f4ce158 121 cnt = 0;
shintamainjp 0:ec264f4ce158 122 }
shintamainjp 9:dcfdac59ef74 123 UNLOCK();
shintamainjp 0:ec264f4ce158 124 }
shintamainjp 0:ec264f4ce158 125
shintamainjp 0:ec264f4ce158 126 void ReceiverIR::isr_fall(void) {
suupen 12:2379e13b8b34 127
suupen 12:2379e13b8b34 128 #ifdef IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 129 switch (work.state) {
suupen 12:2379e13b8b34 130 case Idle:
suupen 12:2379e13b8b34 131 if (work.c1 < 0){
suupen 12:2379e13b8b34 132 check.bitcount = 0;
suupen 12:2379e13b8b34 133 check.timecount[check.bitcount++] = 0;
suupen 12:2379e13b8b34 134 } else {
suupen 12:2379e13b8b34 135 check.timecount[check.bitcount++] = timer.read_us() & ~1;
suupen 12:2379e13b8b34 136 }
suupen 12:2379e13b8b34 137 break;
suupen 12:2379e13b8b34 138 case Receiving:
suupen 12:2379e13b8b34 139
suupen 12:2379e13b8b34 140 if ((check.bitcount < 1000)) {
suupen 12:2379e13b8b34 141 check.timecount[check.bitcount++] = timer.read_us() & ~1;
suupen 12:2379e13b8b34 142 }
suupen 12:2379e13b8b34 143 break;
suupen 12:2379e13b8b34 144 default:
suupen 12:2379e13b8b34 145 break;
suupen 12:2379e13b8b34 146 }
suupen 12:2379e13b8b34 147 #endif //IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 148
shintamainjp 9:dcfdac59ef74 149 LOCK();
shintamainjp 9:dcfdac59ef74 150 switch (work.state) {
shintamainjp 0:ec264f4ce158 151 case Idle:
shintamainjp 0:ec264f4ce158 152 if (work.c1 < 0) {
shintamainjp 0:ec264f4ce158 153 timer.start();
shintamainjp 0:ec264f4ce158 154 work.c1 = timer.read_us();
shintamainjp 0:ec264f4ce158 155 } else {
shintamainjp 0:ec264f4ce158 156 work.c3 = timer.read_us();
shintamainjp 0:ec264f4ce158 157 int a = work.c2 - work.c1;
shintamainjp 0:ec264f4ce158 158 int b = work.c3 - work.c2;
shintamainjp 11:268cc2ab63bd 159 if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 8)) {
shintamainjp 0:ec264f4ce158 160 /*
shintamainjp 0:ec264f4ce158 161 * NEC.
shintamainjp 0:ec264f4ce158 162 */
shintamainjp 0:ec264f4ce158 163 data.format = RemoteIR::NEC;
shintamainjp 9:dcfdac59ef74 164 work.state = Receiving;
shintamainjp 0:ec264f4ce158 165 data.bitcount = 0;
shintamainjp 11:268cc2ab63bd 166 } else if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 4)) {
shintamainjp 0:ec264f4ce158 167 /*
shintamainjp 0:ec264f4ce158 168 * NEC Repeat.
shintamainjp 0:ec264f4ce158 169 */
shintamainjp 3:dfed23b157e6 170 data.format = RemoteIR::NEC_REPEAT;
shintamainjp 9:dcfdac59ef74 171 work.state = Received;
shintamainjp 0:ec264f4ce158 172 data.bitcount = 0;
shintamainjp 3:dfed23b157e6 173 work.c1 = -1;
shintamainjp 3:dfed23b157e6 174 work.c2 = -1;
shintamainjp 3:dfed23b157e6 175 work.c3 = -1;
shintamainjp 3:dfed23b157e6 176 work.d1 = -1;
shintamainjp 3:dfed23b157e6 177 work.d2 = -1;
shintamainjp 11:268cc2ab63bd 178 } else if (InRange(a, RemoteIR::TUS_AEHA * 8) && InRange(b, RemoteIR::TUS_AEHA * 4)) {
shintamainjp 0:ec264f4ce158 179 /*
shintamainjp 0:ec264f4ce158 180 * AEHA.
shintamainjp 0:ec264f4ce158 181 */
shintamainjp 0:ec264f4ce158 182 data.format = RemoteIR::AEHA;
shintamainjp 9:dcfdac59ef74 183 work.state = Receiving;
shintamainjp 0:ec264f4ce158 184 data.bitcount = 0;
shintamainjp 11:268cc2ab63bd 185 } else if (InRange(a, RemoteIR::TUS_AEHA * 8) && InRange(b, RemoteIR::TUS_AEHA * 8)) {
shintamainjp 0:ec264f4ce158 186 /*
shintamainjp 0:ec264f4ce158 187 * AEHA Repeat.
shintamainjp 0:ec264f4ce158 188 */
shintamainjp 3:dfed23b157e6 189 data.format = RemoteIR::AEHA_REPEAT;
shintamainjp 9:dcfdac59ef74 190 work.state = Received;
shintamainjp 0:ec264f4ce158 191 data.bitcount = 0;
shintamainjp 3:dfed23b157e6 192 work.c1 = -1;
shintamainjp 3:dfed23b157e6 193 work.c2 = -1;
shintamainjp 3:dfed23b157e6 194 work.c3 = -1;
shintamainjp 3:dfed23b157e6 195 work.d1 = -1;
shintamainjp 3:dfed23b157e6 196 work.d2 = -1;
suupen 12:2379e13b8b34 197 #ifdef SWIFT_PROTCOL
suupen 12:2379e13b8b34 198 } else if (InRange(a, RemoteIR::TUS_SWIFT * 10) && InRange(b, RemoteIR::TUS_SWIFT * 3)) {
suupen 12:2379e13b8b34 199 /*
suupen 12:2379e13b8b34 200 * SWIFT.
suupen 12:2379e13b8b34 201 */
suupen 12:2379e13b8b34 202 data.format = RemoteIR::SWIFT;
suupen 12:2379e13b8b34 203 work.state = Receiving;
suupen 12:2379e13b8b34 204 data.bitcount = 0;
suupen 12:2379e13b8b34 205 #endif // SWIFT_PROTCOL
shintamainjp 0:ec264f4ce158 206 } else {
suupen 12:2379e13b8b34 207 #ifdef IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 208 data.format = RemoteIR::UNKNOWN;
suupen 12:2379e13b8b34 209 work.state = Receiving;
suupen 12:2379e13b8b34 210 data.bitcount = 0;
suupen 12:2379e13b8b34 211 #else // ~IR_RAW_DATA_ANALYSIS
shintamainjp 0:ec264f4ce158 212 init_state();
suupen 12:2379e13b8b34 213 #endif // IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 214 }
shintamainjp 0:ec264f4ce158 215 }
shintamainjp 0:ec264f4ce158 216 break;
shintamainjp 0:ec264f4ce158 217 case Receiving:
shintamainjp 0:ec264f4ce158 218 if (RemoteIR::NEC == data.format) {
shintamainjp 0:ec264f4ce158 219 work.d2 = timer.read_us();
shintamainjp 0:ec264f4ce158 220 int a = work.d2 - work.d1;
shintamainjp 11:268cc2ab63bd 221 if (InRange(a, RemoteIR::TUS_NEC * 3)) {
shintamainjp 0:ec264f4ce158 222 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
shintamainjp 11:268cc2ab63bd 223 } else if (InRange(a, RemoteIR::TUS_NEC * 1)) {
shintamainjp 0:ec264f4ce158 224 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
shintamainjp 0:ec264f4ce158 225 }
shintamainjp 0:ec264f4ce158 226 data.bitcount++;
shintamainjp 3:dfed23b157e6 227 #if 0
shintamainjp 0:ec264f4ce158 228 /*
shintamainjp 0:ec264f4ce158 229 * Length of NEC is always 32 bits.
shintamainjp 0:ec264f4ce158 230 */
shintamainjp 0:ec264f4ce158 231 if (32 <= data.bitcount) {
shintamainjp 0:ec264f4ce158 232 data.state = Received;
shintamainjp 0:ec264f4ce158 233 work.c1 = -1;
shintamainjp 0:ec264f4ce158 234 work.c2 = -1;
shintamainjp 0:ec264f4ce158 235 work.c3 = -1;
shintamainjp 0:ec264f4ce158 236 work.d1 = -1;
shintamainjp 0:ec264f4ce158 237 work.d2 = -1;
shintamainjp 0:ec264f4ce158 238 }
shintamainjp 0:ec264f4ce158 239 #else
shintamainjp 0:ec264f4ce158 240 /*
shintamainjp 0:ec264f4ce158 241 * Set timeout for tail detection automatically.
shintamainjp 0:ec264f4ce158 242 */
shintamainjp 0:ec264f4ce158 243 timeout.detach();
shintamainjp 11:268cc2ab63bd 244 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_NEC * 5);
shintamainjp 0:ec264f4ce158 245 #endif
shintamainjp 0:ec264f4ce158 246 } else if (RemoteIR::AEHA == data.format) {
shintamainjp 0:ec264f4ce158 247 work.d2 = timer.read_us();
shintamainjp 0:ec264f4ce158 248 int a = work.d2 - work.d1;
shintamainjp 11:268cc2ab63bd 249 if (InRange(a, RemoteIR::TUS_AEHA * 3)) {
shintamainjp 0:ec264f4ce158 250 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
shintamainjp 11:268cc2ab63bd 251 } else if (InRange(a, RemoteIR::TUS_AEHA * 1)) {
shintamainjp 0:ec264f4ce158 252 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
shintamainjp 0:ec264f4ce158 253 }
shintamainjp 0:ec264f4ce158 254 data.bitcount++;
shintamainjp 3:dfed23b157e6 255 #if 0
shintamainjp 0:ec264f4ce158 256 /*
shintamainjp 0:ec264f4ce158 257 * Typical length of AEHA is 48 bits.
shintamainjp 0:ec264f4ce158 258 * Please check a specification of your remote controller if you find a problem.
shintamainjp 0:ec264f4ce158 259 */
shintamainjp 0:ec264f4ce158 260 if (48 <= data.bitcount) {
shintamainjp 0:ec264f4ce158 261 data.state = Received;
shintamainjp 0:ec264f4ce158 262 work.c1 = -1;
shintamainjp 0:ec264f4ce158 263 work.c2 = -1;
shintamainjp 0:ec264f4ce158 264 work.c3 = -1;
shintamainjp 0:ec264f4ce158 265 work.d1 = -1;
shintamainjp 0:ec264f4ce158 266 work.d2 = -1;
shintamainjp 0:ec264f4ce158 267 }
shintamainjp 0:ec264f4ce158 268 #else
shintamainjp 0:ec264f4ce158 269 /*
shintamainjp 0:ec264f4ce158 270 * Set timeout for tail detection automatically.
shintamainjp 0:ec264f4ce158 271 */
shintamainjp 0:ec264f4ce158 272 timeout.detach();
shintamainjp 11:268cc2ab63bd 273 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_AEHA * 5);
shintamainjp 0:ec264f4ce158 274 #endif
shintamainjp 0:ec264f4ce158 275 } else if (RemoteIR::SONY == data.format) {
shintamainjp 0:ec264f4ce158 276 work.d1 = timer.read_us();
suupen 12:2379e13b8b34 277 #ifdef SWIFT_PROTCOL
suupen 12:2379e13b8b34 278 } else if (RemoteIR::SWIFT == data.format) {
suupen 12:2379e13b8b34 279 work.d2 = timer.read_us();
suupen 12:2379e13b8b34 280 int a = work.d2 - work.d1;
suupen 12:2379e13b8b34 281 if (InRange(a, RemoteIR::TUS_SWIFT * 2)) {
suupen 12:2379e13b8b34 282 data.buffer[data.bitcount / 8] |= (1 << (7 - (data.bitcount % 8)));
suupen 12:2379e13b8b34 283 } else if (InRange(a, RemoteIR::TUS_SWIFT * 1)) {
suupen 12:2379e13b8b34 284 data.buffer[data.bitcount / 8] &= ~(1 << (7 - (data.bitcount % 8)));
suupen 12:2379e13b8b34 285 }
suupen 12:2379e13b8b34 286 data.bitcount++;
suupen 12:2379e13b8b34 287 #if 0
suupen 12:2379e13b8b34 288 /*
suupen 12:2379e13b8b34 289 * Length of SWIFT is always 32 bits.
suupen 12:2379e13b8b34 290 */
suupen 12:2379e13b8b34 291 if (32 <= data.bitcount) {
suupen 12:2379e13b8b34 292 work.state = Received;
suupen 12:2379e13b8b34 293 work.c1 = -1;
suupen 12:2379e13b8b34 294 work.c2 = -1;
suupen 12:2379e13b8b34 295 work.c3 = -1;
suupen 12:2379e13b8b34 296 work.d1 = -1;
suupen 12:2379e13b8b34 297 work.d2 = -1;
suupen 12:2379e13b8b34 298 }
suupen 12:2379e13b8b34 299 #else
suupen 12:2379e13b8b34 300 /*
suupen 12:2379e13b8b34 301 * Set timeout for tail detection automatically.
suupen 12:2379e13b8b34 302 */
suupen 12:2379e13b8b34 303 timeout.detach();
suupen 12:2379e13b8b34 304 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_SWIFT * 5);
suupen 12:2379e13b8b34 305 #endif
suupen 12:2379e13b8b34 306 #endif // SWIFT_PROTCOL
suupen 12:2379e13b8b34 307
suupen 12:2379e13b8b34 308 #ifdef IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 309 } else if (RemoteIR::SWIFT == data.format) {
suupen 12:2379e13b8b34 310 /*
suupen 12:2379e13b8b34 311 * Set timeout for tail detection automatically.
suupen 12:2379e13b8b34 312 */
suupen 12:2379e13b8b34 313 timeout.detach();
suupen 12:2379e13b8b34 314 timeout.attach_us(this, &ReceiverIR::isr_timeout, (work.c3 - work.c2) * 5);
suupen 12:2379e13b8b34 315 #endif // IR_RAW_DATA_ANALYSIS
shintamainjp 0:ec264f4ce158 316 }
shintamainjp 0:ec264f4ce158 317 break;
shintamainjp 0:ec264f4ce158 318 case Received:
shintamainjp 0:ec264f4ce158 319 break;
shintamainjp 0:ec264f4ce158 320 default:
shintamainjp 0:ec264f4ce158 321 break;
shintamainjp 0:ec264f4ce158 322 }
shintamainjp 9:dcfdac59ef74 323 UNLOCK();
shintamainjp 0:ec264f4ce158 324 }
shintamainjp 0:ec264f4ce158 325
shintamainjp 0:ec264f4ce158 326 void ReceiverIR::isr_rise(void) {
suupen 12:2379e13b8b34 327
suupen 12:2379e13b8b34 328 #ifdef IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 329 switch (work.state) {
suupen 12:2379e13b8b34 330 case Idle:
suupen 12:2379e13b8b34 331 case Receiving:
suupen 12:2379e13b8b34 332 check.timecount[check.bitcount++] = timer.read_us() | 1;
suupen 12:2379e13b8b34 333 break;
suupen 12:2379e13b8b34 334 default:
suupen 12:2379e13b8b34 335 break;
suupen 12:2379e13b8b34 336 }
suupen 12:2379e13b8b34 337 #endif //IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 338
shintamainjp 9:dcfdac59ef74 339 LOCK();
shintamainjp 9:dcfdac59ef74 340 switch (work.state) {
shintamainjp 0:ec264f4ce158 341 case Idle:
shintamainjp 0:ec264f4ce158 342 if (0 <= work.c1) {
shintamainjp 0:ec264f4ce158 343 work.c2 = timer.read_us();
shintamainjp 0:ec264f4ce158 344 int a = work.c2 - work.c1;
shintamainjp 11:268cc2ab63bd 345 if (InRange(a, RemoteIR::TUS_SONY * 4)) {
shintamainjp 0:ec264f4ce158 346 data.format = RemoteIR::SONY;
shintamainjp 9:dcfdac59ef74 347 work.state = Receiving;
shintamainjp 0:ec264f4ce158 348 data.bitcount = 0;
shintamainjp 0:ec264f4ce158 349 } else {
shintamainjp 0:ec264f4ce158 350 static const int MINIMUM_LEADER_WIDTH = 150;
shintamainjp 0:ec264f4ce158 351 if (a < MINIMUM_LEADER_WIDTH) {
shintamainjp 0:ec264f4ce158 352 init_state();
shintamainjp 0:ec264f4ce158 353 }
shintamainjp 0:ec264f4ce158 354 }
shintamainjp 0:ec264f4ce158 355 } else {
shintamainjp 0:ec264f4ce158 356 init_state();
shintamainjp 0:ec264f4ce158 357 }
shintamainjp 0:ec264f4ce158 358 break;
shintamainjp 0:ec264f4ce158 359 case Receiving:
shintamainjp 0:ec264f4ce158 360 if (RemoteIR::NEC == data.format) {
shintamainjp 0:ec264f4ce158 361 work.d1 = timer.read_us();
shintamainjp 0:ec264f4ce158 362 } else if (RemoteIR::AEHA == data.format) {
shintamainjp 0:ec264f4ce158 363 work.d1 = timer.read_us();
suupen 12:2379e13b8b34 364 #ifdef SWIFT_PROTCOL
suupen 12:2379e13b8b34 365 } else if (RemoteIR::SWIFT == data.format) {
suupen 12:2379e13b8b34 366 work.d1 = timer.read_us();
suupen 12:2379e13b8b34 367 #endif // SWIFT_PROTCOL
shintamainjp 0:ec264f4ce158 368 } else if (RemoteIR::SONY == data.format) {
shintamainjp 0:ec264f4ce158 369 work.d2 = timer.read_us();
shintamainjp 0:ec264f4ce158 370 int a = work.d2 - work.d1;
shintamainjp 11:268cc2ab63bd 371 if (InRange(a, RemoteIR::TUS_SONY * 2)) {
shintamainjp 0:ec264f4ce158 372 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
shintamainjp 11:268cc2ab63bd 373 } else if (InRange(a, RemoteIR::TUS_SONY * 1)) {
shintamainjp 0:ec264f4ce158 374 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
shintamainjp 0:ec264f4ce158 375 }
shintamainjp 0:ec264f4ce158 376 data.bitcount++;
shintamainjp 3:dfed23b157e6 377 #if 0
shintamainjp 0:ec264f4ce158 378 /*
shintamainjp 9:dcfdac59ef74 379 * How do I know the correct length? (6bits, 12bits, 15bits, 20bits...)
shintamainjp 0:ec264f4ce158 380 * By a model only?
shintamainjp 0:ec264f4ce158 381 * Please check a specification of your remote controller if you find a problem.
shintamainjp 0:ec264f4ce158 382 */
shintamainjp 0:ec264f4ce158 383 if (12 <= data.bitcount) {
shintamainjp 0:ec264f4ce158 384 data.state = Received;
shintamainjp 0:ec264f4ce158 385 work.c1 = -1;
shintamainjp 0:ec264f4ce158 386 work.c2 = -1;
shintamainjp 0:ec264f4ce158 387 work.c3 = -1;
shintamainjp 0:ec264f4ce158 388 work.d1 = -1;
shintamainjp 0:ec264f4ce158 389 work.d2 = -1;
shintamainjp 0:ec264f4ce158 390 }
shintamainjp 0:ec264f4ce158 391 #else
shintamainjp 0:ec264f4ce158 392 /*
shintamainjp 0:ec264f4ce158 393 * Set timeout for tail detection automatically.
shintamainjp 0:ec264f4ce158 394 */
shintamainjp 0:ec264f4ce158 395 timeout.detach();
shintamainjp 11:268cc2ab63bd 396 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_SONY * 4);
shintamainjp 0:ec264f4ce158 397 #endif
shintamainjp 0:ec264f4ce158 398 }
shintamainjp 0:ec264f4ce158 399 break;
shintamainjp 0:ec264f4ce158 400 case Received:
shintamainjp 0:ec264f4ce158 401 break;
shintamainjp 0:ec264f4ce158 402 default:
shintamainjp 0:ec264f4ce158 403 break;
shintamainjp 0:ec264f4ce158 404 }
shintamainjp 9:dcfdac59ef74 405 UNLOCK();
shintamainjp 0:ec264f4ce158 406 }
shintamainjp 0:ec264f4ce158 407
shintamainjp 0:ec264f4ce158 408 void ReceiverIR::isr_timeout(void) {
shintamainjp 9:dcfdac59ef74 409 LOCK();
shintamainjp 9:dcfdac59ef74 410 #if 0
shintamainjp 9:dcfdac59ef74 411 printf("# TIMEOUT [c1=%d, c2=%d, c3=%d, d1=%d, d2=%d, state=%d, format=%d, bitcount=%d]\n",
shintamainjp 9:dcfdac59ef74 412 work.c1,
shintamainjp 9:dcfdac59ef74 413 work.c2,
shintamainjp 9:dcfdac59ef74 414 work.c3,
shintamainjp 9:dcfdac59ef74 415 work.d1,
shintamainjp 9:dcfdac59ef74 416 work.d2,
shintamainjp 9:dcfdac59ef74 417 work.state,
shintamainjp 9:dcfdac59ef74 418 data.format,
shintamainjp 9:dcfdac59ef74 419 data.bitcount);
shintamainjp 9:dcfdac59ef74 420 #endif
suupen 12:2379e13b8b34 421
suupen 12:2379e13b8b34 422 #ifdef IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 423 #if 1 //debug
suupen 12:2379e13b8b34 424 for ( int i = 0; i < check.bitcount; i++){
suupen 12:2379e13b8b34 425 printf("%02d : %06d , %06d , %04d \n",
suupen 12:2379e13b8b34 426 i,
suupen 12:2379e13b8b34 427 check.timecount[i],
suupen 12:2379e13b8b34 428 check.timecount[i + 1],
suupen 12:2379e13b8b34 429 (check.timecount[i + 1] - check.timecount[i]));
suupen 12:2379e13b8b34 430
suupen 12:2379e13b8b34 431 if( (i % 2) != 0){printf("\n");}
suupen 12:2379e13b8b34 432 }
suupen 12:2379e13b8b34 433 printf("\n");
suupen 12:2379e13b8b34 434 #endif //debug
suupen 12:2379e13b8b34 435 #endif //IR_RAW_DATA_ANALYSIS
suupen 12:2379e13b8b34 436
shintamainjp 9:dcfdac59ef74 437 if (work.state == Receiving) {
shintamainjp 9:dcfdac59ef74 438 work.state = Received;
shintamainjp 0:ec264f4ce158 439 work.c1 = -1;
shintamainjp 0:ec264f4ce158 440 work.c2 = -1;
shintamainjp 0:ec264f4ce158 441 work.c3 = -1;
shintamainjp 0:ec264f4ce158 442 work.d1 = -1;
shintamainjp 0:ec264f4ce158 443 work.d2 = -1;
shintamainjp 0:ec264f4ce158 444 }
shintamainjp 9:dcfdac59ef74 445 UNLOCK();
shintamainjp 0:ec264f4ce158 446 }
suupen 12:2379e13b8b34 447
suupen 12:2379e13b8b34 448