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 transmitter (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 "TransmitterIR.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 /**
Wimpie 0:62d8d73b3c38 14 * Constructor.
Wimpie 0:62d8d73b3c38 15 *
Wimpie 0:62d8d73b3c38 16 * @param txpin Pin for transmit IR signal.
Wimpie 0:62d8d73b3c38 17 */
Wimpie 0:62d8d73b3c38 18 TransmitterIR::TransmitterIR(PinName txpin) : tx(txpin) {
Wimpie 0:62d8d73b3c38 19 tx.write(0.0);
Wimpie 0:62d8d73b3c38 20 tx.period_us(26.3);
Wimpie 0:62d8d73b3c38 21
Wimpie 0:62d8d73b3c38 22 work.state = Idle;
Wimpie 0:62d8d73b3c38 23 work.bitcount = 0;
Wimpie 0:62d8d73b3c38 24 work.leader = 0;
Wimpie 0:62d8d73b3c38 25 work.data = 0;
Wimpie 0:62d8d73b3c38 26 work.trailer = 0;
Wimpie 0:62d8d73b3c38 27
Wimpie 0:62d8d73b3c38 28 data.format = RemoteIR::UNKNOWN;
Wimpie 0:62d8d73b3c38 29 data.bitlength = 0;
Wimpie 0:62d8d73b3c38 30 }
Wimpie 0:62d8d73b3c38 31
Wimpie 0:62d8d73b3c38 32 /**
Wimpie 0:62d8d73b3c38 33 * Destructor.
Wimpie 0:62d8d73b3c38 34 */
Wimpie 0:62d8d73b3c38 35 TransmitterIR::~TransmitterIR() {
Wimpie 0:62d8d73b3c38 36 }
Wimpie 0:62d8d73b3c38 37
Wimpie 0:62d8d73b3c38 38 /**
Wimpie 0:62d8d73b3c38 39 * Get state.
Wimpie 0:62d8d73b3c38 40 *
Wimpie 0:62d8d73b3c38 41 * @return Current state.
Wimpie 0:62d8d73b3c38 42 */
Wimpie 0:62d8d73b3c38 43 TransmitterIR::State TransmitterIR::getState(void) {
Wimpie 0:62d8d73b3c38 44 LOCK();
Wimpie 0:62d8d73b3c38 45 State s = work.state;
Wimpie 0:62d8d73b3c38 46 UNLOCK();
Wimpie 0:62d8d73b3c38 47 return s;
Wimpie 0:62d8d73b3c38 48 }
Wimpie 0:62d8d73b3c38 49
Wimpie 0:62d8d73b3c38 50 /**
Wimpie 0:62d8d73b3c38 51 * Set data.
Wimpie 0:62d8d73b3c38 52 *
Wimpie 0:62d8d73b3c38 53 * @param format Format.
Wimpie 0:62d8d73b3c38 54 * @param buf Buffer of a data.
Wimpie 0:62d8d73b3c38 55 * @param bitlength Bit length of the data.
Wimpie 0:62d8d73b3c38 56 *
Wimpie 0:62d8d73b3c38 57 * @return Data bit length.
Wimpie 0:62d8d73b3c38 58 */
Wimpie 0:62d8d73b3c38 59 int TransmitterIR::setData(RemoteIR::Format format, uint8_t *buf, int bitlength) {
Wimpie 0:62d8d73b3c38 60 LOCK();
Wimpie 0:62d8d73b3c38 61 if (work.state != Idle) {
Wimpie 0:62d8d73b3c38 62 UNLOCK();
Wimpie 0:62d8d73b3c38 63 return -1;
Wimpie 0:62d8d73b3c38 64 }
Wimpie 0:62d8d73b3c38 65
Wimpie 0:62d8d73b3c38 66 work.state = Leader;
Wimpie 0:62d8d73b3c38 67 work.bitcount = 0;
Wimpie 0:62d8d73b3c38 68 work.leader = 0;
Wimpie 0:62d8d73b3c38 69 work.data = 0;
Wimpie 0:62d8d73b3c38 70 work.trailer = 0;
Wimpie 0:62d8d73b3c38 71
Wimpie 0:62d8d73b3c38 72 data.format = format;
Wimpie 0:62d8d73b3c38 73 data.bitlength = bitlength;
Wimpie 0:62d8d73b3c38 74 const int n = bitlength / 8 + (((bitlength % 8) != 0) ? 1 : 0);
Wimpie 0:62d8d73b3c38 75 for (int i = 0; i < n; i++) {
Wimpie 0:62d8d73b3c38 76 data.buffer[i] = buf[i];
Wimpie 0:62d8d73b3c38 77 }
Wimpie 0:62d8d73b3c38 78
Wimpie 0:62d8d73b3c38 79 switch (format) {
Wimpie 0:62d8d73b3c38 80 case RemoteIR::NEC:
Wimpie 0:62d8d73b3c38 81 ticker.detach();
Wimpie 0:62d8d73b3c38 82 ticker.attach_us(this, &TransmitterIR::tick, RemoteIR::TUS_NEC);
Wimpie 0:62d8d73b3c38 83 break;
Wimpie 0:62d8d73b3c38 84 case RemoteIR::AEHA:
Wimpie 0:62d8d73b3c38 85 ticker.detach();
Wimpie 0:62d8d73b3c38 86 ticker.attach_us(this, &TransmitterIR::tick, RemoteIR::TUS_AEHA);
Wimpie 0:62d8d73b3c38 87 break;
Wimpie 0:62d8d73b3c38 88 case RemoteIR::SONY:
Wimpie 0:62d8d73b3c38 89 ticker.detach();
Wimpie 0:62d8d73b3c38 90 ticker.attach_us(this, &TransmitterIR::tick, RemoteIR::TUS_SONY);
Wimpie 0:62d8d73b3c38 91 break;
Wimpie 0:62d8d73b3c38 92 }
Wimpie 0:62d8d73b3c38 93
Wimpie 0:62d8d73b3c38 94 UNLOCK();
Wimpie 0:62d8d73b3c38 95 return bitlength;
Wimpie 0:62d8d73b3c38 96 }
Wimpie 0:62d8d73b3c38 97
Wimpie 0:62d8d73b3c38 98 void TransmitterIR::tick(void) {
Wimpie 0:62d8d73b3c38 99 LOCK();
Wimpie 0:62d8d73b3c38 100 switch (work.state) {
Wimpie 0:62d8d73b3c38 101 case Idle:
Wimpie 0:62d8d73b3c38 102 work.bitcount = 0;
Wimpie 0:62d8d73b3c38 103 work.leader = 0;
Wimpie 0:62d8d73b3c38 104 work.data = 0;
Wimpie 0:62d8d73b3c38 105 work.trailer = 0;
Wimpie 0:62d8d73b3c38 106 break;
Wimpie 0:62d8d73b3c38 107 case Leader:
Wimpie 0:62d8d73b3c38 108 if (data.format == RemoteIR::NEC) {
Wimpie 0:62d8d73b3c38 109 /*
Wimpie 0:62d8d73b3c38 110 * NEC.
Wimpie 0:62d8d73b3c38 111 */
Wimpie 0:62d8d73b3c38 112 static const int LEADER_NEC_HEAD = 16;
Wimpie 0:62d8d73b3c38 113 static const int LEADER_NEC_TAIL = 8;
Wimpie 0:62d8d73b3c38 114 if (work.leader < LEADER_NEC_HEAD) {
Wimpie 0:62d8d73b3c38 115 tx.write(0.5);
Wimpie 0:62d8d73b3c38 116 } else {
Wimpie 0:62d8d73b3c38 117 tx.write(0.0);
Wimpie 0:62d8d73b3c38 118 }
Wimpie 0:62d8d73b3c38 119 work.leader++;
Wimpie 0:62d8d73b3c38 120 if ((LEADER_NEC_HEAD + LEADER_NEC_TAIL) <= work.leader) {
Wimpie 0:62d8d73b3c38 121 work.state = Data;
Wimpie 0:62d8d73b3c38 122 }
Wimpie 0:62d8d73b3c38 123 } else if (data.format == RemoteIR::AEHA) {
Wimpie 0:62d8d73b3c38 124 /*
Wimpie 0:62d8d73b3c38 125 * AEHA.
Wimpie 0:62d8d73b3c38 126 */
Wimpie 0:62d8d73b3c38 127 static const int LEADER_AEHA_HEAD = 8;
Wimpie 0:62d8d73b3c38 128 static const int LEADER_AEHA_TAIL = 4;
Wimpie 0:62d8d73b3c38 129 if (work.leader < LEADER_AEHA_HEAD) {
Wimpie 0:62d8d73b3c38 130 tx.write(0.5);
Wimpie 0:62d8d73b3c38 131 } else {
Wimpie 0:62d8d73b3c38 132 tx.write(0.0);
Wimpie 0:62d8d73b3c38 133 }
Wimpie 0:62d8d73b3c38 134 work.leader++;
Wimpie 0:62d8d73b3c38 135 if ((LEADER_AEHA_HEAD + LEADER_AEHA_TAIL) <= work.leader) {
Wimpie 0:62d8d73b3c38 136 work.state = Data;
Wimpie 0:62d8d73b3c38 137 }
Wimpie 0:62d8d73b3c38 138 } else if (data.format == RemoteIR::SONY) {
Wimpie 0:62d8d73b3c38 139 /*
Wimpie 0:62d8d73b3c38 140 * SONY.
Wimpie 0:62d8d73b3c38 141 */
Wimpie 0:62d8d73b3c38 142 static const int LEADER_SONY_HEAD = 4;
Wimpie 0:62d8d73b3c38 143 static const int LEADER_SONY_TAIL = 0;
Wimpie 0:62d8d73b3c38 144 if (work.leader < LEADER_SONY_HEAD) {
Wimpie 0:62d8d73b3c38 145 tx.write(0.5);
Wimpie 0:62d8d73b3c38 146 } else {
Wimpie 0:62d8d73b3c38 147 tx.write(0.0);
Wimpie 0:62d8d73b3c38 148 }
Wimpie 0:62d8d73b3c38 149 work.leader++;
Wimpie 0:62d8d73b3c38 150 if ((LEADER_SONY_HEAD + LEADER_SONY_TAIL) <= work.leader) {
Wimpie 0:62d8d73b3c38 151 work.state = Data;
Wimpie 0:62d8d73b3c38 152 }
Wimpie 0:62d8d73b3c38 153 } else {
Wimpie 0:62d8d73b3c38 154 }
Wimpie 0:62d8d73b3c38 155 break;
Wimpie 0:62d8d73b3c38 156 case Data:
Wimpie 0:62d8d73b3c38 157 if (data.format == RemoteIR::NEC) {
Wimpie 0:62d8d73b3c38 158 /*
Wimpie 0:62d8d73b3c38 159 * NEC.
Wimpie 0:62d8d73b3c38 160 */
Wimpie 0:62d8d73b3c38 161 if (work.data == 0) {
Wimpie 0:62d8d73b3c38 162 tx.write(0.5);
Wimpie 0:62d8d73b3c38 163 work.data++;
Wimpie 0:62d8d73b3c38 164 } else {
Wimpie 0:62d8d73b3c38 165 tx.write(0.0);
Wimpie 0:62d8d73b3c38 166 if (0 != (data.buffer[work.bitcount / 8] & (1 << work.bitcount % 8))) {
Wimpie 0:62d8d73b3c38 167 if (3 <= work.data) {
Wimpie 0:62d8d73b3c38 168 work.bitcount++;
Wimpie 0:62d8d73b3c38 169 work.data = 0;
Wimpie 0:62d8d73b3c38 170 } else {
Wimpie 0:62d8d73b3c38 171 work.data++;
Wimpie 0:62d8d73b3c38 172 }
Wimpie 0:62d8d73b3c38 173 } else {
Wimpie 0:62d8d73b3c38 174 if (1 <= work.data) {
Wimpie 0:62d8d73b3c38 175 work.bitcount++;
Wimpie 0:62d8d73b3c38 176 work.data = 0;
Wimpie 0:62d8d73b3c38 177 } else {
Wimpie 0:62d8d73b3c38 178 work.data++;
Wimpie 0:62d8d73b3c38 179 }
Wimpie 0:62d8d73b3c38 180 }
Wimpie 0:62d8d73b3c38 181 }
Wimpie 0:62d8d73b3c38 182 if (data.bitlength <= work.bitcount) {
Wimpie 0:62d8d73b3c38 183 work.state = Trailer;
Wimpie 0:62d8d73b3c38 184 }
Wimpie 0:62d8d73b3c38 185 } else if (data.format == RemoteIR::AEHA) {
Wimpie 0:62d8d73b3c38 186 /*
Wimpie 0:62d8d73b3c38 187 * AEHA.
Wimpie 0:62d8d73b3c38 188 */
Wimpie 0:62d8d73b3c38 189 if (work.data == 0) {
Wimpie 0:62d8d73b3c38 190 tx.write(0.5);
Wimpie 0:62d8d73b3c38 191 work.data++;
Wimpie 0:62d8d73b3c38 192 } else {
Wimpie 0:62d8d73b3c38 193 tx.write(0.0);
Wimpie 0:62d8d73b3c38 194 if (0 != (data.buffer[work.bitcount / 8] & (1 << work.bitcount % 8))) {
Wimpie 0:62d8d73b3c38 195 if (3 <= work.data) {
Wimpie 0:62d8d73b3c38 196 work.bitcount++;
Wimpie 0:62d8d73b3c38 197 work.data = 0;
Wimpie 0:62d8d73b3c38 198 } else {
Wimpie 0:62d8d73b3c38 199 work.data++;
Wimpie 0:62d8d73b3c38 200 }
Wimpie 0:62d8d73b3c38 201 } else {
Wimpie 0:62d8d73b3c38 202 if (1 <= work.data) {
Wimpie 0:62d8d73b3c38 203 work.bitcount++;
Wimpie 0:62d8d73b3c38 204 work.data = 0;
Wimpie 0:62d8d73b3c38 205 } else {
Wimpie 0:62d8d73b3c38 206 work.data++;
Wimpie 0:62d8d73b3c38 207 }
Wimpie 0:62d8d73b3c38 208 }
Wimpie 0:62d8d73b3c38 209 }
Wimpie 0:62d8d73b3c38 210 if (data.bitlength <= work.bitcount) {
Wimpie 0:62d8d73b3c38 211 work.state = Trailer;
Wimpie 0:62d8d73b3c38 212 }
Wimpie 0:62d8d73b3c38 213 } else if (data.format == RemoteIR::SONY) {
Wimpie 0:62d8d73b3c38 214 /*
Wimpie 0:62d8d73b3c38 215 * SONY.
Wimpie 0:62d8d73b3c38 216 */
Wimpie 0:62d8d73b3c38 217 if (work.data == 0) {
Wimpie 0:62d8d73b3c38 218 tx.write(0.0);
Wimpie 0:62d8d73b3c38 219 work.data++;
Wimpie 0:62d8d73b3c38 220 } else {
Wimpie 0:62d8d73b3c38 221 tx.write(0.5);
Wimpie 0:62d8d73b3c38 222 if (0 != (data.buffer[work.bitcount / 8] & (1 << work.bitcount % 8))) {
Wimpie 0:62d8d73b3c38 223 if (2 <= work.data) {
Wimpie 0:62d8d73b3c38 224 work.bitcount++;
Wimpie 0:62d8d73b3c38 225 work.data = 0;
Wimpie 0:62d8d73b3c38 226 } else {
Wimpie 0:62d8d73b3c38 227 work.data++;
Wimpie 0:62d8d73b3c38 228 }
Wimpie 0:62d8d73b3c38 229 } else {
Wimpie 0:62d8d73b3c38 230 if (1 <= work.data) {
Wimpie 0:62d8d73b3c38 231 work.bitcount++;
Wimpie 0:62d8d73b3c38 232 work.data = 0;
Wimpie 0:62d8d73b3c38 233 } else {
Wimpie 0:62d8d73b3c38 234 work.data++;
Wimpie 0:62d8d73b3c38 235 }
Wimpie 0:62d8d73b3c38 236 }
Wimpie 0:62d8d73b3c38 237 }
Wimpie 0:62d8d73b3c38 238 if (data.bitlength <= work.bitcount) {
Wimpie 0:62d8d73b3c38 239 work.state = Trailer;
Wimpie 0:62d8d73b3c38 240 }
Wimpie 0:62d8d73b3c38 241 } else {
Wimpie 0:62d8d73b3c38 242 }
Wimpie 0:62d8d73b3c38 243 break;
Wimpie 0:62d8d73b3c38 244 case Trailer:
Wimpie 0:62d8d73b3c38 245 if (data.format == RemoteIR::NEC) {
Wimpie 0:62d8d73b3c38 246 /*
Wimpie 0:62d8d73b3c38 247 * NEC.
Wimpie 0:62d8d73b3c38 248 */
Wimpie 0:62d8d73b3c38 249 static const int TRAILER_NEC_HEAD = 1;
Wimpie 0:62d8d73b3c38 250 static const int TRAILER_NEC_TAIL = 2;
Wimpie 0:62d8d73b3c38 251 if (work.trailer < TRAILER_NEC_HEAD) {
Wimpie 0:62d8d73b3c38 252 tx.write(0.5);
Wimpie 0:62d8d73b3c38 253 } else {
Wimpie 0:62d8d73b3c38 254 tx.write(0.0);
Wimpie 0:62d8d73b3c38 255 }
Wimpie 0:62d8d73b3c38 256 work.trailer++;
Wimpie 0:62d8d73b3c38 257 if ((TRAILER_NEC_HEAD + TRAILER_NEC_TAIL) <= work.trailer) {
Wimpie 0:62d8d73b3c38 258 work.state = Idle;
Wimpie 0:62d8d73b3c38 259 //ticker.detach();
Wimpie 0:62d8d73b3c38 260 }
Wimpie 0:62d8d73b3c38 261 } else if (data.format == RemoteIR::AEHA) {
Wimpie 0:62d8d73b3c38 262 /*
Wimpie 0:62d8d73b3c38 263 * AEHA.
Wimpie 0:62d8d73b3c38 264 */
Wimpie 0:62d8d73b3c38 265 static const int TRAILER_AEHA_HEAD = 1;
Wimpie 0:62d8d73b3c38 266 static const int TRAILER_AEHA_TAIL = 8000 / RemoteIR::TUS_AEHA;
Wimpie 0:62d8d73b3c38 267 if (work.trailer < TRAILER_AEHA_HEAD) {
Wimpie 0:62d8d73b3c38 268 tx.write(0.5);
Wimpie 0:62d8d73b3c38 269 } else {
Wimpie 0:62d8d73b3c38 270 tx.write(0.0);
Wimpie 0:62d8d73b3c38 271 }
Wimpie 0:62d8d73b3c38 272 work.trailer++;
Wimpie 0:62d8d73b3c38 273 if ((TRAILER_AEHA_HEAD + TRAILER_AEHA_TAIL) <= work.trailer) {
Wimpie 0:62d8d73b3c38 274 work.state = Idle;
Wimpie 0:62d8d73b3c38 275 //ticker.detach();
Wimpie 0:62d8d73b3c38 276 }
Wimpie 0:62d8d73b3c38 277 } else if (data.format == RemoteIR::SONY) {
Wimpie 0:62d8d73b3c38 278 /*
Wimpie 0:62d8d73b3c38 279 * SONY.
Wimpie 0:62d8d73b3c38 280 */
Wimpie 0:62d8d73b3c38 281 static const int TRAILER_SONY_HEAD = 0;
Wimpie 0:62d8d73b3c38 282 static const int TRAILER_SONY_TAIL = 0;
Wimpie 0:62d8d73b3c38 283 if (work.trailer < TRAILER_SONY_HEAD) {
Wimpie 0:62d8d73b3c38 284 tx.write(0.5);
Wimpie 0:62d8d73b3c38 285 } else {
Wimpie 0:62d8d73b3c38 286 tx.write(0.0);
Wimpie 0:62d8d73b3c38 287 }
Wimpie 0:62d8d73b3c38 288 work.trailer++;
Wimpie 0:62d8d73b3c38 289 if ((TRAILER_SONY_HEAD + TRAILER_SONY_TAIL) <= work.trailer) {
Wimpie 0:62d8d73b3c38 290 work.state = Idle;
Wimpie 0:62d8d73b3c38 291 //ticker.detach();
Wimpie 0:62d8d73b3c38 292 }
Wimpie 0:62d8d73b3c38 293 } else {
Wimpie 0:62d8d73b3c38 294 }
Wimpie 0:62d8d73b3c38 295 break;
Wimpie 0:62d8d73b3c38 296 default:
Wimpie 0:62d8d73b3c38 297 break;
Wimpie 0:62d8d73b3c38 298 }
Wimpie 0:62d8d73b3c38 299 UNLOCK();
Wimpie 0:62d8d73b3c38 300 }