This is the project for the Old Model Robots for OU's Dr. Davis's Configurable Robots Research. This is being published so future robots can be set up easily.

Dependencies:   FatFileSystem MCP3008 Motor PinDetect QTR_8A SRF05 SSD1308_128x64_I2C mbed

Committer:
DrewSchaef
Date:
Wed Nov 01 15:57:59 2017 +0000
Revision:
0:bcad524c1856
Published the project to allow access for future work on the Configurable Robots Research Project(s).

Who changed what in which revision?

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