愛莉 結城 / Mbed 2 deprecated MARY_IRReceive

Dependencies:   mbed

Committer:
yuki
Date:
Sun Aug 24 06:58:30 2014 +0000
Revision:
1:4e6dc3e5ab7c
????;

Who changed what in which revision?

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