IRC Helicopter "HonyBee" Propo decode test program

Dependencies:   RemoteIR mbed

これは、赤外線コントロールヘリコプター"HonyBee"のPropoからの送信データを解析して、PCに表示させるテストプログラムです。 詳しくは、 http://suupen-make.blogspot.jp/2013/06/irc-helicopter-honybeembedtest-program.html を参照してください。

Committer:
suupen
Date:
Sun Jun 23 07:28:06 2013 +0000
Revision:
0:f9e49220c97a
IRC Helicopter "HonyBee" Propo decode test program

Who changed what in which revision?

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