Projet AutoStart pour projecteur LG

Dependencies:   mbed

Committer:
nnguyen
Date:
Mon Jul 03 16:17:40 2017 +0000
Revision:
0:f09b7c760de7
AutoStart

Who changed what in which revision?

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