IR remote receiver

Dependents:   experience

Committer:
Wimpie
Date:
Sun Apr 17 17:51:34 2011 +0000
Revision:
0:62d8d73b3c38
Remote IR library with IR codes from Sony

Who changed what in which revision?

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