ChoroQ

Committer:
shintamainjp
Date:
Sun Sep 19 23:49:38 2010 +0000
Revision:
1:97921a2adf78
Parent:
0:2a40e6db61c2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:2a40e6db61c2 1 /**
shintamainjp 0:2a40e6db61c2 2 * CHORO Q HYBRID transmitter (Version 0.0.1)
shintamainjp 0:2a40e6db61c2 3 *
shintamainjp 0:2a40e6db61c2 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:2a40e6db61c2 5 * http://shinta.main.jp/
shintamainjp 0:2a40e6db61c2 6 */
shintamainjp 0:2a40e6db61c2 7
shintamainjp 0:2a40e6db61c2 8 #include "TransmitterChoroQ.h"
shintamainjp 0:2a40e6db61c2 9
shintamainjp 0:2a40e6db61c2 10 #define LOCK()
shintamainjp 0:2a40e6db61c2 11 #define UNLOCK()
shintamainjp 0:2a40e6db61c2 12
shintamainjp 0:2a40e6db61c2 13 /**
shintamainjp 0:2a40e6db61c2 14 * Constructor.
shintamainjp 0:2a40e6db61c2 15 *
shintamainjp 0:2a40e6db61c2 16 * @param txpin Pin for transmit IR signal.
shintamainjp 0:2a40e6db61c2 17 */
shintamainjp 0:2a40e6db61c2 18 TransmitterChoroQ::TransmitterChoroQ(PinName txpin) : tx(txpin) {
shintamainjp 0:2a40e6db61c2 19 tx.write(0.0);
shintamainjp 0:2a40e6db61c2 20 tx.period_us(26.3);
shintamainjp 0:2a40e6db61c2 21
shintamainjp 0:2a40e6db61c2 22 work.state = Idle;
shintamainjp 0:2a40e6db61c2 23 work.bitcount = 0;
shintamainjp 0:2a40e6db61c2 24 work.leader = 0;
shintamainjp 0:2a40e6db61c2 25 work.data = 0;
shintamainjp 0:2a40e6db61c2 26 work.trailer = 0;
shintamainjp 0:2a40e6db61c2 27
shintamainjp 0:2a40e6db61c2 28 data.bitlength = 0;
shintamainjp 0:2a40e6db61c2 29 }
shintamainjp 0:2a40e6db61c2 30
shintamainjp 0:2a40e6db61c2 31 /**
shintamainjp 0:2a40e6db61c2 32 * Destructor.
shintamainjp 0:2a40e6db61c2 33 */
shintamainjp 0:2a40e6db61c2 34 TransmitterChoroQ::~TransmitterChoroQ() {
shintamainjp 0:2a40e6db61c2 35 }
shintamainjp 0:2a40e6db61c2 36
shintamainjp 0:2a40e6db61c2 37 /**
shintamainjp 0:2a40e6db61c2 38 * Get state.
shintamainjp 0:2a40e6db61c2 39 *
shintamainjp 0:2a40e6db61c2 40 * @return Current state.
shintamainjp 0:2a40e6db61c2 41 */
shintamainjp 0:2a40e6db61c2 42 TransmitterChoroQ::State TransmitterChoroQ::getState(void) {
shintamainjp 0:2a40e6db61c2 43 LOCK();
shintamainjp 0:2a40e6db61c2 44 State s = work.state;
shintamainjp 0:2a40e6db61c2 45 UNLOCK();
shintamainjp 0:2a40e6db61c2 46 return s;
shintamainjp 0:2a40e6db61c2 47 }
shintamainjp 0:2a40e6db61c2 48
shintamainjp 0:2a40e6db61c2 49 /**
shintamainjp 0:2a40e6db61c2 50 * Set data.
shintamainjp 0:2a40e6db61c2 51 *
shintamainjp 0:2a40e6db61c2 52 * @param format Format.
shintamainjp 0:2a40e6db61c2 53 * @param buf Buffer of a data.
shintamainjp 0:2a40e6db61c2 54 * @param bitlength Bit length of the data.
shintamainjp 0:2a40e6db61c2 55 *
shintamainjp 0:2a40e6db61c2 56 * @return Data bit length.
shintamainjp 0:2a40e6db61c2 57 */
shintamainjp 0:2a40e6db61c2 58 int TransmitterChoroQ::setData(uint8_t *buf, int bitlength) {
shintamainjp 0:2a40e6db61c2 59 LOCK();
shintamainjp 0:2a40e6db61c2 60 if (work.state != Idle) {
shintamainjp 0:2a40e6db61c2 61 UNLOCK();
shintamainjp 0:2a40e6db61c2 62 return -1;
shintamainjp 0:2a40e6db61c2 63 }
shintamainjp 0:2a40e6db61c2 64
shintamainjp 0:2a40e6db61c2 65 work.state = Leader;
shintamainjp 0:2a40e6db61c2 66 work.bitcount = 0;
shintamainjp 0:2a40e6db61c2 67 work.leader = 0;
shintamainjp 0:2a40e6db61c2 68 work.data = 0;
shintamainjp 0:2a40e6db61c2 69 work.trailer = 0;
shintamainjp 0:2a40e6db61c2 70
shintamainjp 0:2a40e6db61c2 71 data.bitlength = bitlength;
shintamainjp 0:2a40e6db61c2 72 const int n = bitlength / 8 + (((bitlength % 8) != 0) ? 1 : 0);
shintamainjp 0:2a40e6db61c2 73 for (int i = 0; i < n; i++) {
shintamainjp 0:2a40e6db61c2 74 data.buffer[i] = buf[i];
shintamainjp 0:2a40e6db61c2 75 }
shintamainjp 0:2a40e6db61c2 76
shintamainjp 1:97921a2adf78 77 static const double correction = 1.20;
shintamainjp 0:2a40e6db61c2 78 ticker.detach();
shintamainjp 1:97921a2adf78 79 ticker.attach_us(this, &TransmitterChoroQ::tick, TUS_TAKARATOMY * correction);
shintamainjp 0:2a40e6db61c2 80
shintamainjp 0:2a40e6db61c2 81 UNLOCK();
shintamainjp 0:2a40e6db61c2 82 return bitlength;
shintamainjp 0:2a40e6db61c2 83 }
shintamainjp 0:2a40e6db61c2 84
shintamainjp 0:2a40e6db61c2 85 void TransmitterChoroQ::tick(void) {
shintamainjp 0:2a40e6db61c2 86 LOCK();
shintamainjp 0:2a40e6db61c2 87 switch (work.state) {
shintamainjp 0:2a40e6db61c2 88 case Idle:
shintamainjp 0:2a40e6db61c2 89 work.bitcount = 0;
shintamainjp 0:2a40e6db61c2 90 work.leader = 0;
shintamainjp 0:2a40e6db61c2 91 work.data = 0;
shintamainjp 0:2a40e6db61c2 92 work.trailer = 0;
shintamainjp 0:2a40e6db61c2 93 break;
shintamainjp 0:2a40e6db61c2 94 case Leader:
shintamainjp 0:2a40e6db61c2 95 /*
shintamainjp 0:2a40e6db61c2 96 * TAKARA TOMY.
shintamainjp 0:2a40e6db61c2 97 */
shintamainjp 0:2a40e6db61c2 98 static const int LEADER_SONY_HEAD = 4;
shintamainjp 0:2a40e6db61c2 99 static const int LEADER_SONY_TAIL = 0;
shintamainjp 0:2a40e6db61c2 100 if (work.leader < LEADER_SONY_HEAD) {
shintamainjp 0:2a40e6db61c2 101 tx.write(0.5);
shintamainjp 0:2a40e6db61c2 102 } else {
shintamainjp 0:2a40e6db61c2 103 tx.write(0.0);
shintamainjp 0:2a40e6db61c2 104 }
shintamainjp 0:2a40e6db61c2 105 work.leader++;
shintamainjp 0:2a40e6db61c2 106 if ((LEADER_SONY_HEAD + LEADER_SONY_TAIL) <= work.leader) {
shintamainjp 0:2a40e6db61c2 107 work.state = Data;
shintamainjp 0:2a40e6db61c2 108 }
shintamainjp 0:2a40e6db61c2 109 break;
shintamainjp 0:2a40e6db61c2 110 case Data:
shintamainjp 0:2a40e6db61c2 111 /*
shintamainjp 0:2a40e6db61c2 112 * TAKARA TOMY.
shintamainjp 0:2a40e6db61c2 113 */
shintamainjp 0:2a40e6db61c2 114 if (work.data == 0) {
shintamainjp 0:2a40e6db61c2 115 tx.write(0.0);
shintamainjp 0:2a40e6db61c2 116 work.data++;
shintamainjp 0:2a40e6db61c2 117 } else {
shintamainjp 0:2a40e6db61c2 118 tx.write(0.5);
shintamainjp 0:2a40e6db61c2 119 if (0 != (data.buffer[work.bitcount / 8] & (1 << work.bitcount % 8))) {
shintamainjp 0:2a40e6db61c2 120 if (2 <= work.data) {
shintamainjp 0:2a40e6db61c2 121 work.bitcount++;
shintamainjp 0:2a40e6db61c2 122 work.data = 0;
shintamainjp 0:2a40e6db61c2 123 } else {
shintamainjp 0:2a40e6db61c2 124 work.data++;
shintamainjp 0:2a40e6db61c2 125 }
shintamainjp 0:2a40e6db61c2 126 } else {
shintamainjp 0:2a40e6db61c2 127 if (1 <= work.data) {
shintamainjp 0:2a40e6db61c2 128 work.bitcount++;
shintamainjp 0:2a40e6db61c2 129 work.data = 0;
shintamainjp 0:2a40e6db61c2 130 } else {
shintamainjp 0:2a40e6db61c2 131 work.data++;
shintamainjp 0:2a40e6db61c2 132 }
shintamainjp 0:2a40e6db61c2 133 }
shintamainjp 0:2a40e6db61c2 134 }
shintamainjp 0:2a40e6db61c2 135 if (data.bitlength <= work.bitcount) {
shintamainjp 0:2a40e6db61c2 136 work.state = Trailer;
shintamainjp 0:2a40e6db61c2 137 }
shintamainjp 0:2a40e6db61c2 138 break;
shintamainjp 0:2a40e6db61c2 139 case Trailer:
shintamainjp 0:2a40e6db61c2 140 /*
shintamainjp 0:2a40e6db61c2 141 * TAKARA TOMY.
shintamainjp 0:2a40e6db61c2 142 */
shintamainjp 0:2a40e6db61c2 143 static const int TRAILER_SONY_HEAD = 0;
shintamainjp 0:2a40e6db61c2 144 static const int TRAILER_SONY_TAIL = 0;
shintamainjp 0:2a40e6db61c2 145 if (work.trailer < TRAILER_SONY_HEAD) {
shintamainjp 0:2a40e6db61c2 146 tx.write(0.5);
shintamainjp 0:2a40e6db61c2 147 } else {
shintamainjp 0:2a40e6db61c2 148 tx.write(0.0);
shintamainjp 0:2a40e6db61c2 149 }
shintamainjp 0:2a40e6db61c2 150 work.trailer++;
shintamainjp 0:2a40e6db61c2 151 if ((TRAILER_SONY_HEAD + TRAILER_SONY_TAIL) <= work.trailer) {
shintamainjp 0:2a40e6db61c2 152 work.state = Idle;
shintamainjp 0:2a40e6db61c2 153 //ticker.detach();
shintamainjp 0:2a40e6db61c2 154 }
shintamainjp 0:2a40e6db61c2 155 break;
shintamainjp 0:2a40e6db61c2 156 default:
shintamainjp 0:2a40e6db61c2 157 break;
shintamainjp 0:2a40e6db61c2 158 }
shintamainjp 0:2a40e6db61c2 159 UNLOCK();
shintamainjp 0:2a40e6db61c2 160 }