使用红外接收库的一个demo code

Dependencies:   mbed

Fork of IR_remote by Armando Casalino

Committer:
adaphoto
Date:
Thu Jun 21 01:20:35 2018 +0000
Revision:
4:326b8df3add2
?????????demo code

Who changed what in which revision?

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