IRC Helicopter "HonyBee" Propo decode test program

Dependencies:   RemoteIR mbed

これは、赤外線コントロールヘリコプター"HonyBee"のPropoからの送信データを解析して、PCに表示させるテストプログラムです。 詳しくは、 http://suupen-make.blogspot.jp/2013/06/irc-helicopter-honybeembedtest-program.html を参照してください。

Committer:
suupen
Date:
Sun Jun 23 07:28:06 2013 +0000
Revision:
0:f9e49220c97a
IRC Helicopter "HonyBee" Propo decode test program

Who changed what in which revision?

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