Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ReceiverIR.cpp@15:b56a97811380, 2019-06-06 (annotated)
- Committer:
- Jeonghoon
- Date:
- Thu Jun 06 11:16:22 2019 +0000
- Revision:
- 15:b56a97811380
- Parent:
- 14:2fafd2e7dea8
- Child:
- 16:3922b10d4606
20190606 success;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| shintamainjp | 0:ec264f4ce158 | 1 | #include "ReceiverIR.h" |
| jinyoung_KIL | 12:96209c979a7f | 2 | |
| shintamainjp | 10:c54fb1204d1e | 3 | #define LOCK() |
| shintamainjp | 10:c54fb1204d1e | 4 | #define UNLOCK() |
| jinyoung_KIL | 12:96209c979a7f | 5 | |
| shintamainjp | 0:ec264f4ce158 | 6 | #define InRange(x,y) ((((y) * 0.7) < (x)) && ((x) < ((y) * 1.3))) |
| shintamainjp | 0:ec264f4ce158 | 7 | |
| shintamainjp | 9:dcfdac59ef74 | 8 | /** |
| shintamainjp | 9:dcfdac59ef74 | 9 | * Constructor. |
| shintamainjp | 9:dcfdac59ef74 | 10 | * |
| shintamainjp | 9:dcfdac59ef74 | 11 | * @param rxpin Pin for receive IR signal. |
| shintamainjp | 9:dcfdac59ef74 | 12 | */ |
| jinyoung_KIL | 12:96209c979a7f | 13 | |
| jinyoung_KIL | 12:96209c979a7f | 14 | ReceiverIR::ReceiverIR(PinName rxpin, float _speed, PinName _pwma,PinName _pwmb, PinName _ain0, PinName _ain1, PinName _bin0, PinName _bin1) |
| jinyoung_KIL | 12:96209c979a7f | 15 | : evt(rxpin), pwma(_pwma), pwmb(_pwmb),ain1(_ain1),ain0(_ain0), bin0(_bin0),bin1(_bin1) { |
| shintamainjp | 9:dcfdac59ef74 | 16 | init_state(); |
| shintamainjp | 0:ec264f4ce158 | 17 | evt.fall(this, &ReceiverIR::isr_fall); |
| shintamainjp | 0:ec264f4ce158 | 18 | evt.rise(this, &ReceiverIR::isr_rise); |
| shintamainjp | 0:ec264f4ce158 | 19 | evt.mode(PullUp); |
| jinyoung_KIL | 12:96209c979a7f | 20 | ticker.attach_us(this, &ReceiverIR::isr_wdt, 10 * 1000); |
| Jeonghoon | 15:b56a97811380 | 21 | Speed_L = 0.45 ; |
| jinyoung_KIL | 12:96209c979a7f | 22 | //Speed_R = _speed *1.005; |
| Jeonghoon | 15:b56a97811380 | 23 | Speed_R = 0.445 ; |
| jinyoung_KIL | 13:5e445169cf83 | 24 | init_sp_l = Speed_L; |
| jinyoung_KIL | 13:5e445169cf83 | 25 | init_sp_r = Speed_R; |
| shintamainjp | 0:ec264f4ce158 | 26 | } |
| jinyoung_KIL | 12:96209c979a7f | 27 | |
| shintamainjp | 9:dcfdac59ef74 | 28 | /** |
| shintamainjp | 9:dcfdac59ef74 | 29 | * Destructor. |
| shintamainjp | 9:dcfdac59ef74 | 30 | */ |
| shintamainjp | 1:4adf16017a0f | 31 | ReceiverIR::~ReceiverIR() { |
| shintamainjp | 1:4adf16017a0f | 32 | } |
| jinyoung_KIL | 12:96209c979a7f | 33 | |
| shintamainjp | 9:dcfdac59ef74 | 34 | /** |
| shintamainjp | 9:dcfdac59ef74 | 35 | * Get state. |
| shintamainjp | 9:dcfdac59ef74 | 36 | * |
| shintamainjp | 9:dcfdac59ef74 | 37 | * @return Current state. |
| shintamainjp | 9:dcfdac59ef74 | 38 | */ |
| shintamainjp | 0:ec264f4ce158 | 39 | ReceiverIR::State ReceiverIR::getState() { |
| shintamainjp | 9:dcfdac59ef74 | 40 | LOCK(); |
| shintamainjp | 9:dcfdac59ef74 | 41 | State s = work.state; |
| shintamainjp | 9:dcfdac59ef74 | 42 | UNLOCK(); |
| shintamainjp | 0:ec264f4ce158 | 43 | return s; |
| shintamainjp | 0:ec264f4ce158 | 44 | } |
| jinyoung_KIL | 12:96209c979a7f | 45 | |
| shintamainjp | 9:dcfdac59ef74 | 46 | /** |
| shintamainjp | 9:dcfdac59ef74 | 47 | * Get data. |
| shintamainjp | 9:dcfdac59ef74 | 48 | * |
| shintamainjp | 9:dcfdac59ef74 | 49 | * @param format Pointer to format. |
| shintamainjp | 9:dcfdac59ef74 | 50 | * @param buf Buffer of a data. |
| shintamainjp | 9:dcfdac59ef74 | 51 | * @param bitlength Bit length of the buffer. |
| shintamainjp | 9:dcfdac59ef74 | 52 | * |
| shintamainjp | 9:dcfdac59ef74 | 53 | * @return Data bit length. |
| shintamainjp | 9:dcfdac59ef74 | 54 | */ |
| shintamainjp | 4:2304646f6ff5 | 55 | int ReceiverIR::getData(RemoteIR::Format *format, uint8_t *buf, int bitlength) { |
| shintamainjp | 9:dcfdac59ef74 | 56 | LOCK(); |
| jinyoung_KIL | 12:96209c979a7f | 57 | |
| shintamainjp | 4:2304646f6ff5 | 58 | if (bitlength < data.bitcount) { |
| shintamainjp | 9:dcfdac59ef74 | 59 | UNLOCK(); |
| shintamainjp | 0:ec264f4ce158 | 60 | return -1; |
| shintamainjp | 0:ec264f4ce158 | 61 | } |
| jinyoung_KIL | 12:96209c979a7f | 62 | |
| shintamainjp | 9:dcfdac59ef74 | 63 | const int nbits = data.bitcount; |
| shintamainjp | 6:e57504fc802e | 64 | const int nbytes = data.bitcount / 8 + (((data.bitcount % 8) != 0) ? 1 : 0); |
| shintamainjp | 0:ec264f4ce158 | 65 | *format = data.format; |
| shintamainjp | 5:e158c85c55ff | 66 | for (int i = 0; i < nbytes; i++) { |
| shintamainjp | 0:ec264f4ce158 | 67 | buf[i] = data.buffer[i]; |
| shintamainjp | 0:ec264f4ce158 | 68 | } |
| jinyoung_KIL | 12:96209c979a7f | 69 | |
| jinyoung_KIL | 12:96209c979a7f | 70 | move(buf); |
| shintamainjp | 0:ec264f4ce158 | 71 | init_state(); |
| jinyoung_KIL | 12:96209c979a7f | 72 | |
| shintamainjp | 9:dcfdac59ef74 | 73 | UNLOCK(); |
| shintamainjp | 9:dcfdac59ef74 | 74 | return nbits; |
| shintamainjp | 0:ec264f4ce158 | 75 | } |
| jinyoung_KIL | 12:96209c979a7f | 76 | |
| jinyoung_KIL | 12:96209c979a7f | 77 | void ReceiverIR::move(uint8_t *buf){ |
| jinyoung_KIL | 12:96209c979a7f | 78 | char buffer[64]; |
| jinyoung_KIL | 12:96209c979a7f | 79 | sprintf(buffer, "%02X%02X%02X%02X", buf[0], buf[1], buf[2], buf[3]); |
| jinyoung_KIL | 12:96209c979a7f | 80 | //start |
| jinyoung_KIL | 12:96209c979a7f | 81 | // if(!strncmp(buffer, "00FF09F6",8)){ |
| jinyoung_KIL | 12:96209c979a7f | 82 | // //pc.printf("forward!\r\n"); |
| jinyoung_KIL | 12:96209c979a7f | 83 | // start = 1; |
| jinyoung_KIL | 12:96209c979a7f | 84 | // //forward(); |
| jinyoung_KIL | 12:96209c979a7f | 85 | // } |
| jinyoung_KIL | 12:96209c979a7f | 86 | // forward |
| jinyoung_KIL | 12:96209c979a7f | 87 | if(!strncmp(buffer, "00FF18E7",8)){ |
| jinyoung_KIL | 12:96209c979a7f | 88 | //pc.printf("forward!\r\n"); |
| jinyoung_KIL | 12:96209c979a7f | 89 | forward(); |
| jinyoung_KIL | 12:96209c979a7f | 90 | } |
| jinyoung_KIL | 12:96209c979a7f | 91 | // back |
| jinyoung_KIL | 12:96209c979a7f | 92 | if(!strncmp(buffer, "00FF52AD",8)){ |
| jinyoung_KIL | 12:96209c979a7f | 93 | //pc.printf("back!\r\n"); |
| jinyoung_KIL | 12:96209c979a7f | 94 | backward(); |
| jinyoung_KIL | 12:96209c979a7f | 95 | } |
| jinyoung_KIL | 12:96209c979a7f | 96 | // left |
| jinyoung_KIL | 12:96209c979a7f | 97 | if(!strncmp(buffer, "00FF08F7",8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 98 | //pc.printf("left!\r\n"); |
| jinyoung_KIL | 13:5e445169cf83 | 99 | left(); |
| jinyoung_KIL | 12:96209c979a7f | 100 | } |
| jinyoung_KIL | 12:96209c979a7f | 101 | // right |
| jinyoung_KIL | 12:96209c979a7f | 102 | if(!strncmp(buffer, "00FF5AA5",8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 103 | //pc.printf("right!\r\n"); |
| jinyoung_KIL | 13:5e445169cf83 | 104 | right(); |
| jinyoung_KIL | 12:96209c979a7f | 105 | } |
| jinyoung_KIL | 12:96209c979a7f | 106 | // stop |
| jinyoung_KIL | 12:96209c979a7f | 107 | if(!strncmp(buffer, "00FF0CF3",8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 108 | speedup_l(); |
| jinyoung_KIL | 12:96209c979a7f | 109 | } |
| jinyoung_KIL | 12:96209c979a7f | 110 | if(!strncmp(buffer, "00FF5EA1",8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 111 | speedup_r(); |
| jinyoung_KIL | 12:96209c979a7f | 112 | } |
| jinyoung_KIL | 12:96209c979a7f | 113 | if(!strncmp(buffer, "00FF42BD",8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 114 | speeddown_l(); |
| jinyoung_KIL | 12:96209c979a7f | 115 | } |
| jinyoung_KIL | 12:96209c979a7f | 116 | if(!strncmp(buffer, "00FF4AB5",8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 117 | speeddown_r(); |
| jinyoung_KIL | 12:96209c979a7f | 118 | } |
| jinyoung_KIL | 12:96209c979a7f | 119 | if(!strncmp(buffer, "00FF1CE3",8)){ |
| jinyoung_KIL | 12:96209c979a7f | 120 | stop(); |
| jinyoung_KIL | 13:5e445169cf83 | 121 | } |
| jinyoung_KIL | 13:5e445169cf83 | 122 | if(!strncmp(buffer, "00FF45BA", 8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 123 | cal_start = 1; |
| jinyoung_KIL | 13:5e445169cf83 | 124 | } |
| jinyoung_KIL | 13:5e445169cf83 | 125 | if(!strncmp(buffer, "00FF47B8", 8)){ |
| jinyoung_KIL | 13:5e445169cf83 | 126 | cal_stop = 1; |
| jinyoung_KIL | 12:96209c979a7f | 127 | } |
| jinyoung_KIL | 12:96209c979a7f | 128 | } |
| jinyoung_KIL | 12:96209c979a7f | 129 | |
| jinyoung_KIL | 13:5e445169cf83 | 130 | void ReceiverIR::speedup_l(void){ |
| jinyoung_KIL | 13:5e445169cf83 | 131 | //Speed_L += 0.0005; |
| jinyoung_KIL | 13:5e445169cf83 | 132 | // if(Speed_L > 0.5){ |
| jinyoung_KIL | 13:5e445169cf83 | 133 | // Speed_L = 0.5; |
| jinyoung_KIL | 13:5e445169cf83 | 134 | // } |
| jinyoung_KIL | 13:5e445169cf83 | 135 | // pwma = Speed_L; |
| Jeonghoon | 15:b56a97811380 | 136 | max += 5; |
| jinyoung_KIL | 12:96209c979a7f | 137 | } |
| jinyoung_KIL | 13:5e445169cf83 | 138 | void ReceiverIR::speeddown_l(void){ |
| jinyoung_KIL | 13:5e445169cf83 | 139 | //Speed_L -= 0.0005; |
| jinyoung_KIL | 13:5e445169cf83 | 140 | // if(Speed_L < 0){ |
| jinyoung_KIL | 13:5e445169cf83 | 141 | // Speed_L = 0; |
| jinyoung_KIL | 13:5e445169cf83 | 142 | // } |
| jinyoung_KIL | 13:5e445169cf83 | 143 | // pwma = Speed_L; |
| Jeonghoon | 15:b56a97811380 | 144 | max -= 5; |
| jinyoung_KIL | 12:96209c979a7f | 145 | } |
| jinyoung_KIL | 13:5e445169cf83 | 146 | void ReceiverIR::speedup_r(void){ |
| jinyoung_KIL | 13:5e445169cf83 | 147 | // Speed_R += 0.0005; |
| jinyoung_KIL | 13:5e445169cf83 | 148 | // if(Speed_R > 0.5){ |
| jinyoung_KIL | 13:5e445169cf83 | 149 | // Speed_R = 0.5; |
| jinyoung_KIL | 13:5e445169cf83 | 150 | // } |
| jinyoung_KIL | 13:5e445169cf83 | 151 | // pwmb = Speed_R; |
| Jeonghoon | 14:2fafd2e7dea8 | 152 | |
| Jeonghoon | 14:2fafd2e7dea8 | 153 | //max += 5; |
| Jeonghoon | 15:b56a97811380 | 154 | ki += 500; |
| jinyoung_KIL | 12:96209c979a7f | 155 | } |
| jinyoung_KIL | 13:5e445169cf83 | 156 | void ReceiverIR::speeddown_r(void){ |
| jinyoung_KIL | 13:5e445169cf83 | 157 | // Speed_R -= 0.0005; |
| jinyoung_KIL | 13:5e445169cf83 | 158 | // if(Speed_R < 0){ |
| jinyoung_KIL | 13:5e445169cf83 | 159 | // Speed_R = 0; |
| jinyoung_KIL | 13:5e445169cf83 | 160 | // } |
| jinyoung_KIL | 13:5e445169cf83 | 161 | // pwmb = Speed_R; |
| Jeonghoon | 14:2fafd2e7dea8 | 162 | |
| Jeonghoon | 14:2fafd2e7dea8 | 163 | //max -= 5; |
| Jeonghoon | 15:b56a97811380 | 164 | ki -= 500; |
| jinyoung_KIL | 12:96209c979a7f | 165 | } |
| jinyoung_KIL | 12:96209c979a7f | 166 | |
| jinyoung_KIL | 12:96209c979a7f | 167 | void ReceiverIR::speed_l(float sp_l){ |
| jinyoung_KIL | 12:96209c979a7f | 168 | Speed_L = sp_l; |
| jinyoung_KIL | 13:5e445169cf83 | 169 | if(Speed_L > 0.6){ |
| jinyoung_KIL | 13:5e445169cf83 | 170 | Speed_L = 0.6; |
| jinyoung_KIL | 13:5e445169cf83 | 171 | } |
| jinyoung_KIL | 13:5e445169cf83 | 172 | pwma = Speed_L; |
| jinyoung_KIL | 12:96209c979a7f | 173 | } |
| jinyoung_KIL | 12:96209c979a7f | 174 | |
| jinyoung_KIL | 12:96209c979a7f | 175 | void ReceiverIR::speed_r(float sp_r){ |
| jinyoung_KIL | 12:96209c979a7f | 176 | Speed_R = sp_r; |
| jinyoung_KIL | 13:5e445169cf83 | 177 | if(Speed_R > 0.6){ |
| jinyoung_KIL | 13:5e445169cf83 | 178 | Speed_R = 0.6; |
| jinyoung_KIL | 13:5e445169cf83 | 179 | } |
| jinyoung_KIL | 13:5e445169cf83 | 180 | pwmb = Speed_R; |
| jinyoung_KIL | 12:96209c979a7f | 181 | } |
| jinyoung_KIL | 12:96209c979a7f | 182 | |
| jinyoung_KIL | 12:96209c979a7f | 183 | void ReceiverIR::forward(void){ |
| jinyoung_KIL | 12:96209c979a7f | 184 | pwma = Speed_L; |
| jinyoung_KIL | 12:96209c979a7f | 185 | pwmb = Speed_R; |
| jinyoung_KIL | 12:96209c979a7f | 186 | |
| jinyoung_KIL | 12:96209c979a7f | 187 | ain0 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 188 | ain1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 189 | |
| jinyoung_KIL | 12:96209c979a7f | 190 | bin0 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 191 | bin1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 192 | } |
| jinyoung_KIL | 12:96209c979a7f | 193 | void ReceiverIR::backward(void){ |
| jinyoung_KIL | 12:96209c979a7f | 194 | |
| jinyoung_KIL | 12:96209c979a7f | 195 | pwma = Speed_L; |
| jinyoung_KIL | 12:96209c979a7f | 196 | pwmb = Speed_R; |
| jinyoung_KIL | 12:96209c979a7f | 197 | |
| jinyoung_KIL | 12:96209c979a7f | 198 | ain0 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 199 | ain1 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 200 | |
| jinyoung_KIL | 12:96209c979a7f | 201 | bin0 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 202 | bin1 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 203 | } |
| jinyoung_KIL | 12:96209c979a7f | 204 | |
| jinyoung_KIL | 12:96209c979a7f | 205 | void ReceiverIR::left(void){ |
| jinyoung_KIL | 12:96209c979a7f | 206 | pwma = Speed_L*0.8; |
| jinyoung_KIL | 12:96209c979a7f | 207 | pwmb = Speed_R; |
| jinyoung_KIL | 12:96209c979a7f | 208 | |
| jinyoung_KIL | 12:96209c979a7f | 209 | ain0 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 210 | ain1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 211 | |
| jinyoung_KIL | 12:96209c979a7f | 212 | bin0 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 213 | bin1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 214 | } |
| jinyoung_KIL | 12:96209c979a7f | 215 | void ReceiverIR::right(void){ |
| jinyoung_KIL | 12:96209c979a7f | 216 | pwma = Speed_L; |
| jinyoung_KIL | 12:96209c979a7f | 217 | pwmb = Speed_R*0.85; |
| jinyoung_KIL | 12:96209c979a7f | 218 | |
| jinyoung_KIL | 12:96209c979a7f | 219 | ain0 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 220 | ain1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 221 | |
| jinyoung_KIL | 12:96209c979a7f | 222 | bin0 = 1; |
| jinyoung_KIL | 12:96209c979a7f | 223 | bin1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 224 | } |
| jinyoung_KIL | 12:96209c979a7f | 225 | void ReceiverIR::stop(void){ |
| jinyoung_KIL | 12:96209c979a7f | 226 | |
| jinyoung_KIL | 12:96209c979a7f | 227 | pwma = 0; |
| jinyoung_KIL | 12:96209c979a7f | 228 | pwmb = 0; |
| jinyoung_KIL | 12:96209c979a7f | 229 | |
| jinyoung_KIL | 12:96209c979a7f | 230 | ain0 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 231 | ain1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 232 | |
| jinyoung_KIL | 12:96209c979a7f | 233 | bin0 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 234 | bin1 = 0; |
| jinyoung_KIL | 12:96209c979a7f | 235 | } |
| shintamainjp | 0:ec264f4ce158 | 236 | |
| shintamainjp | 0:ec264f4ce158 | 237 | void ReceiverIR::init_state(void) { |
| shintamainjp | 0:ec264f4ce158 | 238 | work.c1 = -1; |
| shintamainjp | 0:ec264f4ce158 | 239 | work.c2 = -1; |
| shintamainjp | 0:ec264f4ce158 | 240 | work.c3 = -1; |
| shintamainjp | 0:ec264f4ce158 | 241 | work.d1 = -1; |
| shintamainjp | 0:ec264f4ce158 | 242 | work.d2 = -1; |
| shintamainjp | 9:dcfdac59ef74 | 243 | work.state = Idle; |
| shintamainjp | 0:ec264f4ce158 | 244 | data.format = RemoteIR::UNKNOWN; |
| shintamainjp | 0:ec264f4ce158 | 245 | data.bitcount = 0; |
| shintamainjp | 0:ec264f4ce158 | 246 | timer.stop(); |
| shintamainjp | 0:ec264f4ce158 | 247 | timer.reset(); |
| shintamainjp | 0:ec264f4ce158 | 248 | for (int i = 0; i < sizeof(data.buffer); i++) { |
| shintamainjp | 0:ec264f4ce158 | 249 | data.buffer[i] = 0; |
| shintamainjp | 0:ec264f4ce158 | 250 | } |
| shintamainjp | 0:ec264f4ce158 | 251 | } |
| jinyoung_KIL | 12:96209c979a7f | 252 | |
| shintamainjp | 0:ec264f4ce158 | 253 | void ReceiverIR::isr_wdt(void) { |
| shintamainjp | 9:dcfdac59ef74 | 254 | LOCK(); |
| shintamainjp | 0:ec264f4ce158 | 255 | static int cnt = 0; |
| shintamainjp | 9:dcfdac59ef74 | 256 | if ((Idle != work.state) || ((0 <= work.c1) || (0 <= work.c2) || (0 <= work.c3) || (0 <= work.d1) || (0 <= work.d2))) { |
| shintamainjp | 0:ec264f4ce158 | 257 | cnt++; |
| shintamainjp | 0:ec264f4ce158 | 258 | if (cnt > 50) { |
| shintamainjp | 0:ec264f4ce158 | 259 | init_state(); |
| shintamainjp | 0:ec264f4ce158 | 260 | cnt = 0; |
| shintamainjp | 0:ec264f4ce158 | 261 | } |
| shintamainjp | 0:ec264f4ce158 | 262 | } else { |
| shintamainjp | 0:ec264f4ce158 | 263 | cnt = 0; |
| shintamainjp | 0:ec264f4ce158 | 264 | } |
| shintamainjp | 9:dcfdac59ef74 | 265 | UNLOCK(); |
| shintamainjp | 0:ec264f4ce158 | 266 | } |
| jinyoung_KIL | 12:96209c979a7f | 267 | |
| shintamainjp | 0:ec264f4ce158 | 268 | void ReceiverIR::isr_fall(void) { |
| shintamainjp | 9:dcfdac59ef74 | 269 | LOCK(); |
| shintamainjp | 9:dcfdac59ef74 | 270 | switch (work.state) { |
| shintamainjp | 0:ec264f4ce158 | 271 | case Idle: |
| shintamainjp | 0:ec264f4ce158 | 272 | if (work.c1 < 0) { |
| shintamainjp | 0:ec264f4ce158 | 273 | timer.start(); |
| shintamainjp | 0:ec264f4ce158 | 274 | work.c1 = timer.read_us(); |
| shintamainjp | 0:ec264f4ce158 | 275 | } else { |
| shintamainjp | 0:ec264f4ce158 | 276 | work.c3 = timer.read_us(); |
| shintamainjp | 0:ec264f4ce158 | 277 | int a = work.c2 - work.c1; |
| shintamainjp | 0:ec264f4ce158 | 278 | int b = work.c3 - work.c2; |
| shintamainjp | 11:268cc2ab63bd | 279 | if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 8)) { |
| shintamainjp | 0:ec264f4ce158 | 280 | /* |
| shintamainjp | 0:ec264f4ce158 | 281 | * NEC. |
| shintamainjp | 0:ec264f4ce158 | 282 | */ |
| shintamainjp | 0:ec264f4ce158 | 283 | data.format = RemoteIR::NEC; |
| shintamainjp | 9:dcfdac59ef74 | 284 | work.state = Receiving; |
| shintamainjp | 0:ec264f4ce158 | 285 | data.bitcount = 0; |
| shintamainjp | 11:268cc2ab63bd | 286 | } else if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 4)) { |
| shintamainjp | 0:ec264f4ce158 | 287 | /* |
| shintamainjp | 0:ec264f4ce158 | 288 | * NEC Repeat. |
| shintamainjp | 0:ec264f4ce158 | 289 | */ |
| shintamainjp | 3:dfed23b157e6 | 290 | data.format = RemoteIR::NEC_REPEAT; |
| shintamainjp | 9:dcfdac59ef74 | 291 | work.state = Received; |
| shintamainjp | 0:ec264f4ce158 | 292 | data.bitcount = 0; |
| shintamainjp | 3:dfed23b157e6 | 293 | work.c1 = -1; |
| shintamainjp | 3:dfed23b157e6 | 294 | work.c2 = -1; |
| shintamainjp | 3:dfed23b157e6 | 295 | work.c3 = -1; |
| shintamainjp | 3:dfed23b157e6 | 296 | work.d1 = -1; |
| shintamainjp | 3:dfed23b157e6 | 297 | work.d2 = -1; |
| shintamainjp | 0:ec264f4ce158 | 298 | } else { |
| shintamainjp | 0:ec264f4ce158 | 299 | init_state(); |
| shintamainjp | 0:ec264f4ce158 | 300 | } |
| shintamainjp | 0:ec264f4ce158 | 301 | } |
| shintamainjp | 0:ec264f4ce158 | 302 | break; |
| shintamainjp | 0:ec264f4ce158 | 303 | case Receiving: |
| shintamainjp | 0:ec264f4ce158 | 304 | if (RemoteIR::NEC == data.format) { |
| shintamainjp | 0:ec264f4ce158 | 305 | work.d2 = timer.read_us(); |
| shintamainjp | 0:ec264f4ce158 | 306 | int a = work.d2 - work.d1; |
| shintamainjp | 11:268cc2ab63bd | 307 | if (InRange(a, RemoteIR::TUS_NEC * 3)) { |
| shintamainjp | 0:ec264f4ce158 | 308 | data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8)); |
| shintamainjp | 11:268cc2ab63bd | 309 | } else if (InRange(a, RemoteIR::TUS_NEC * 1)) { |
| shintamainjp | 0:ec264f4ce158 | 310 | data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8)); |
| shintamainjp | 0:ec264f4ce158 | 311 | } |
| shintamainjp | 0:ec264f4ce158 | 312 | data.bitcount++; |
| shintamainjp | 0:ec264f4ce158 | 313 | /* |
| shintamainjp | 0:ec264f4ce158 | 314 | * Set timeout for tail detection automatically. |
| shintamainjp | 0:ec264f4ce158 | 315 | */ |
| shintamainjp | 0:ec264f4ce158 | 316 | timeout.detach(); |
| shintamainjp | 11:268cc2ab63bd | 317 | timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_NEC * 5); |
| shintamainjp | 0:ec264f4ce158 | 318 | } |
| shintamainjp | 0:ec264f4ce158 | 319 | break; |
| shintamainjp | 0:ec264f4ce158 | 320 | case Received: |
| shintamainjp | 0:ec264f4ce158 | 321 | break; |
| shintamainjp | 0:ec264f4ce158 | 322 | default: |
| shintamainjp | 0:ec264f4ce158 | 323 | break; |
| shintamainjp | 0:ec264f4ce158 | 324 | } |
| shintamainjp | 9:dcfdac59ef74 | 325 | UNLOCK(); |
| shintamainjp | 0:ec264f4ce158 | 326 | } |
| jinyoung_KIL | 12:96209c979a7f | 327 | |
| shintamainjp | 0:ec264f4ce158 | 328 | void ReceiverIR::isr_rise(void) { |
| shintamainjp | 9:dcfdac59ef74 | 329 | LOCK(); |
| shintamainjp | 9:dcfdac59ef74 | 330 | switch (work.state) { |
| shintamainjp | 0:ec264f4ce158 | 331 | case Idle: |
| shintamainjp | 0:ec264f4ce158 | 332 | if (0 <= work.c1) { |
| shintamainjp | 0:ec264f4ce158 | 333 | work.c2 = timer.read_us(); |
| shintamainjp | 0:ec264f4ce158 | 334 | int a = work.c2 - work.c1; |
| shintamainjp | 0:ec264f4ce158 | 335 | } else { |
| shintamainjp | 0:ec264f4ce158 | 336 | init_state(); |
| shintamainjp | 0:ec264f4ce158 | 337 | } |
| shintamainjp | 0:ec264f4ce158 | 338 | break; |
| shintamainjp | 0:ec264f4ce158 | 339 | case Receiving: |
| shintamainjp | 0:ec264f4ce158 | 340 | if (RemoteIR::NEC == data.format) { |
| shintamainjp | 0:ec264f4ce158 | 341 | work.d1 = timer.read_us(); |
| jinyoung_KIL | 12:96209c979a7f | 342 | } |
| shintamainjp | 0:ec264f4ce158 | 343 | break; |
| shintamainjp | 0:ec264f4ce158 | 344 | case Received: |
| shintamainjp | 0:ec264f4ce158 | 345 | break; |
| shintamainjp | 0:ec264f4ce158 | 346 | default: |
| shintamainjp | 0:ec264f4ce158 | 347 | break; |
| shintamainjp | 0:ec264f4ce158 | 348 | } |
| shintamainjp | 9:dcfdac59ef74 | 349 | UNLOCK(); |
| shintamainjp | 0:ec264f4ce158 | 350 | } |
| jinyoung_KIL | 12:96209c979a7f | 351 | |
| shintamainjp | 0:ec264f4ce158 | 352 | void ReceiverIR::isr_timeout(void) { |
| shintamainjp | 9:dcfdac59ef74 | 353 | LOCK(); |
| jinyoung_KIL | 12:96209c979a7f | 354 | |
| shintamainjp | 9:dcfdac59ef74 | 355 | if (work.state == Receiving) { |
| shintamainjp | 9:dcfdac59ef74 | 356 | work.state = Received; |
| shintamainjp | 0:ec264f4ce158 | 357 | work.c1 = -1; |
| shintamainjp | 0:ec264f4ce158 | 358 | work.c2 = -1; |
| shintamainjp | 0:ec264f4ce158 | 359 | work.c3 = -1; |
| shintamainjp | 0:ec264f4ce158 | 360 | work.d1 = -1; |
| shintamainjp | 0:ec264f4ce158 | 361 | work.d2 = -1; |
| shintamainjp | 0:ec264f4ce158 | 362 | } |
| shintamainjp | 9:dcfdac59ef74 | 363 | UNLOCK(); |
| shintamainjp | 0:ec264f4ce158 | 364 | } |
| jinyoung_KIL | 12:96209c979a7f | 365 |