Added a new Brand "Kamoona" to be used for other applications that are not a known brand.

Fork of RemoteIR by Shinichiro Nakamura

Committer:
mskamoona
Date:
Tue Apr 28 06:53:27 2015 +0000
Revision:
15:793c2aa484b1
Parent:
14:257b2f794dc4
Added Kamoona Manufacturer

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