190605

Dependents:   line_tracing

Committer:
ssuda
Date:
Sat Jun 29 14:31:17 2019 +0000
Revision:
23:f67e514c52b3
Parent:
22:3e732988bf3f
19.6.29 1:05 / add statements of <if and else if> in <tr_ready>

Who changed what in which revision?

UserRevisionLine numberNew 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)))
Jeonghoon 17:6d2532146627 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 */
Jeonghoon 17:6d2532146627 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);
ssuda 23:f67e514c52b3 21 Speed_L = 1.0;
ssuda 23:f67e514c52b3 22 Speed_R = 0.995 ;
Jeonghoon 20:bbedc231c6a9 23
Jeonghoon 21:f963ccdb48d1 24 init_sp_l = Speed_L;
Jeonghoon 21:f963ccdb48d1 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;
Jeonghoon 20:bbedc231c6a9 127 }
Jeonghoon 20:bbedc231c6a9 128 if(!strncmp(buffer, "00FF44BB", 8)){
Jeonghoon 20:bbedc231c6a9 129 max -= 5;
Jeonghoon 21:f963ccdb48d1 130
Jeonghoon 20:bbedc231c6a9 131 //method2
Jeonghoon 20:bbedc231c6a9 132 // base_spl -= 0.01;
Jeonghoon 20:bbedc231c6a9 133 // base_spr = base_spl - 0.005;
Jeonghoon 20:bbedc231c6a9 134 //
Jeonghoon 20:bbedc231c6a9 135 // if(base_spr < 0 || base_spl < 0){
Jeonghoon 20:bbedc231c6a9 136 // base_spr = 0;
Jeonghoon 20:bbedc231c6a9 137 // base_spl = 0;
Jeonghoon 20:bbedc231c6a9 138 // }
Jeonghoon 20:bbedc231c6a9 139 }
Jeonghoon 20:bbedc231c6a9 140 if(!strncmp(buffer, "00FF40BF", 8)){
Jeonghoon 20:bbedc231c6a9 141 max += 5;
Jeonghoon 21:f963ccdb48d1 142
Jeonghoon 20:bbedc231c6a9 143 //method2
Jeonghoon 20:bbedc231c6a9 144 // base_spl += 0.01;
Jeonghoon 20:bbedc231c6a9 145 // base_spr = base_spl - 0.005;
Jeonghoon 20:bbedc231c6a9 146 // if(base_spr < 0){
Jeonghoon 20:bbedc231c6a9 147 // base_spr = 0;
Jeonghoon 20:bbedc231c6a9 148 // }
Jeonghoon 20:bbedc231c6a9 149 }
Jeonghoon 20:bbedc231c6a9 150 if(!strncmp(buffer, "00FF07F8", 8)){
Jeonghoon 22:3e732988bf3f 151 s_left_turn();
Jeonghoon 20:bbedc231c6a9 152 }
Jeonghoon 20:bbedc231c6a9 153 if(!strncmp(buffer, "00FF15EA", 8)){
Jeonghoon 22:3e732988bf3f 154 s_right_turn();
Jeonghoon 20:bbedc231c6a9 155 }
Jeonghoon 20:bbedc231c6a9 156 if(!strncmp(buffer, "00FF19E6", 8)){
Jeonghoon 22:3e732988bf3f 157 left_turn();
Jeonghoon 22:3e732988bf3f 158 wait_ms(300);
Jeonghoon 22:3e732988bf3f 159 stop();
Jeonghoon 20:bbedc231c6a9 160 }
Jeonghoon 20:bbedc231c6a9 161 if(!strncmp(buffer, "00FF0DF2", 8)){
Jeonghoon 22:3e732988bf3f 162 right_turn();
Jeonghoon 22:3e732988bf3f 163 wait_ms(300);
Jeonghoon 22:3e732988bf3f 164 stop();
Jeonghoon 20:bbedc231c6a9 165 }
jinyoung_KIL 12:96209c979a7f 166 }
Jeonghoon 22:3e732988bf3f 167
Jeonghoon 22:3e732988bf3f 168 void ReceiverIR::s_left_turn(void){
Jeonghoon 22:3e732988bf3f 169 pwma = 0.13;
Jeonghoon 22:3e732988bf3f 170 pwmb = 0.11;
Jeonghoon 22:3e732988bf3f 171
Jeonghoon 22:3e732988bf3f 172 ain0 = 1;
Jeonghoon 22:3e732988bf3f 173 ain1 = 0;
Jeonghoon 22:3e732988bf3f 174
Jeonghoon 22:3e732988bf3f 175 bin0 = 0;
Jeonghoon 22:3e732988bf3f 176 bin1 = 0;
Jeonghoon 22:3e732988bf3f 177 }
Jeonghoon 22:3e732988bf3f 178
Jeonghoon 22:3e732988bf3f 179 void ReceiverIR::s_right_turn(void){
Jeonghoon 22:3e732988bf3f 180 pwma = 0.11;
Jeonghoon 22:3e732988bf3f 181 pwmb = 0.13;
Jeonghoon 22:3e732988bf3f 182
Jeonghoon 22:3e732988bf3f 183 ain0 = 0;
Jeonghoon 22:3e732988bf3f 184 ain1 = 0;
Jeonghoon 22:3e732988bf3f 185
Jeonghoon 22:3e732988bf3f 186 bin0 = 1;
Jeonghoon 22:3e732988bf3f 187 bin1 = 0;
Jeonghoon 22:3e732988bf3f 188 }
Jeonghoon 22:3e732988bf3f 189
Jeonghoon 22:3e732988bf3f 190 void ReceiverIR::left_turn(void){
Jeonghoon 22:3e732988bf3f 191 pwma = 0.10;
Jeonghoon 22:3e732988bf3f 192 pwmb = 0.10;
Jeonghoon 22:3e732988bf3f 193
Jeonghoon 22:3e732988bf3f 194 ain0 = 1;
Jeonghoon 22:3e732988bf3f 195 ain1 = 0;
Jeonghoon 22:3e732988bf3f 196
Jeonghoon 22:3e732988bf3f 197 bin0 = 0;
Jeonghoon 22:3e732988bf3f 198 bin1 = 1;
Jeonghoon 22:3e732988bf3f 199 }
Jeonghoon 22:3e732988bf3f 200
Jeonghoon 22:3e732988bf3f 201 void ReceiverIR::right_turn(void){
Jeonghoon 22:3e732988bf3f 202 pwma = 0.10;
Jeonghoon 22:3e732988bf3f 203 pwmb = 0.10;
Jeonghoon 22:3e732988bf3f 204
Jeonghoon 22:3e732988bf3f 205 ain0 = 0;
Jeonghoon 22:3e732988bf3f 206 ain1 = 1;
Jeonghoon 22:3e732988bf3f 207
Jeonghoon 22:3e732988bf3f 208 bin0 = 1;
Jeonghoon 22:3e732988bf3f 209 bin1 = 0;
Jeonghoon 22:3e732988bf3f 210 }
Jeonghoon 17:6d2532146627 211
jinyoung_KIL 13:5e445169cf83 212 void ReceiverIR::speedup_l(void){
jinyoung_KIL 13:5e445169cf83 213 //Speed_L += 0.0005;
jinyoung_KIL 13:5e445169cf83 214 // if(Speed_L > 0.5){
jinyoung_KIL 13:5e445169cf83 215 // Speed_L = 0.5;
jinyoung_KIL 13:5e445169cf83 216 // }
jinyoung_KIL 13:5e445169cf83 217 // pwma = Speed_L;
Jeonghoon 20:bbedc231c6a9 218 kp += 0.01;
jinyoung_KIL 12:96209c979a7f 219 }
jinyoung_KIL 13:5e445169cf83 220 void ReceiverIR::speeddown_l(void){
jinyoung_KIL 13:5e445169cf83 221 //Speed_L -= 0.0005;
jinyoung_KIL 13:5e445169cf83 222 // if(Speed_L < 0){
jinyoung_KIL 13:5e445169cf83 223 // Speed_L = 0;
jinyoung_KIL 13:5e445169cf83 224 // }
jinyoung_KIL 13:5e445169cf83 225 // pwma = Speed_L;
Jeonghoon 20:bbedc231c6a9 226 kp -= 0.01;
jinyoung_KIL 12:96209c979a7f 227 }
jinyoung_KIL 13:5e445169cf83 228 void ReceiverIR::speedup_r(void){
jinyoung_KIL 13:5e445169cf83 229 // Speed_R += 0.0005;
jinyoung_KIL 13:5e445169cf83 230 // if(Speed_R > 0.5){
jinyoung_KIL 13:5e445169cf83 231 // Speed_R = 0.5;
jinyoung_KIL 13:5e445169cf83 232 // }
jinyoung_KIL 13:5e445169cf83 233 // pwmb = Speed_R;
Jeonghoon 17:6d2532146627 234
Jeonghoon 14:2fafd2e7dea8 235 //max += 5;
Jeonghoon 20:bbedc231c6a9 236 kd += 0.01;
jinyoung_KIL 12:96209c979a7f 237 }
jinyoung_KIL 13:5e445169cf83 238 void ReceiverIR::speeddown_r(void){
jinyoung_KIL 13:5e445169cf83 239 // Speed_R -= 0.0005;
jinyoung_KIL 13:5e445169cf83 240 // if(Speed_R < 0){
jinyoung_KIL 13:5e445169cf83 241 // Speed_R = 0;
jinyoung_KIL 13:5e445169cf83 242 // }
jinyoung_KIL 13:5e445169cf83 243 // pwmb = Speed_R;
Jeonghoon 14:2fafd2e7dea8 244
Jeonghoon 20:bbedc231c6a9 245 // max -= 5;
Jeonghoon 20:bbedc231c6a9 246 kd -= 0.01;
jinyoung_KIL 12:96209c979a7f 247 }
Jeonghoon 17:6d2532146627 248
jinyoung_KIL 12:96209c979a7f 249 void ReceiverIR::speed_l(float sp_l){
jinyoung_KIL 12:96209c979a7f 250 Speed_L = sp_l;
jinyoung_KIL 13:5e445169cf83 251 if(Speed_L > 0.6){
jinyoung_KIL 13:5e445169cf83 252 Speed_L = 0.6;
jinyoung_KIL 13:5e445169cf83 253 }
jinyoung_KIL 13:5e445169cf83 254 pwma = Speed_L;
jinyoung_KIL 12:96209c979a7f 255 }
Jeonghoon 17:6d2532146627 256
jinyoung_KIL 12:96209c979a7f 257 void ReceiverIR::speed_r(float sp_r){
jinyoung_KIL 12:96209c979a7f 258 Speed_R = sp_r;
jinyoung_KIL 13:5e445169cf83 259 if(Speed_R > 0.6){
jinyoung_KIL 13:5e445169cf83 260 Speed_R = 0.6;
jinyoung_KIL 13:5e445169cf83 261 }
jinyoung_KIL 13:5e445169cf83 262 pwmb = Speed_R;
jinyoung_KIL 12:96209c979a7f 263 }
Jeonghoon 17:6d2532146627 264
Jeonghoon 16:3922b10d4606 265 void ReceiverIR:: forward(void){
Jeonghoon 22:3e732988bf3f 266 pwma = 0.105;
Jeonghoon 22:3e732988bf3f 267 pwmb = 0.1;
Jeonghoon 17:6d2532146627 268
jinyoung_KIL 12:96209c979a7f 269 ain0 = 1;
jinyoung_KIL 12:96209c979a7f 270 ain1 = 0;
Jeonghoon 17:6d2532146627 271
jinyoung_KIL 12:96209c979a7f 272 bin0 = 1;
jinyoung_KIL 12:96209c979a7f 273 bin1 = 0;
jinyoung_KIL 12:96209c979a7f 274 }
jinyoung_KIL 12:96209c979a7f 275 void ReceiverIR::backward(void){
jinyoung_KIL 12:96209c979a7f 276
Jeonghoon 22:3e732988bf3f 277 pwma = 0.105;
Jeonghoon 22:3e732988bf3f 278 pwmb = 0.1;
Jeonghoon 22:3e732988bf3f 279
jinyoung_KIL 12:96209c979a7f 280 ain0 = 0;
jinyoung_KIL 12:96209c979a7f 281 ain1 = 1;
Jeonghoon 17:6d2532146627 282
jinyoung_KIL 12:96209c979a7f 283 bin0 = 0;
jinyoung_KIL 12:96209c979a7f 284 bin1 = 1;
jinyoung_KIL 12:96209c979a7f 285 }
Jeonghoon 17:6d2532146627 286
jinyoung_KIL 12:96209c979a7f 287 void ReceiverIR::left(void){
Jeonghoon 22:3e732988bf3f 288 pwma = 0.105*0.8;
Jeonghoon 22:3e732988bf3f 289 pwmb = 0.1;
Jeonghoon 17:6d2532146627 290
jinyoung_KIL 12:96209c979a7f 291 ain0 = 1;
jinyoung_KIL 12:96209c979a7f 292 ain1 = 0;
Jeonghoon 17:6d2532146627 293
jinyoung_KIL 12:96209c979a7f 294 bin0 = 1;
jinyoung_KIL 12:96209c979a7f 295 bin1 = 0;
jinyoung_KIL 12:96209c979a7f 296 }
jinyoung_KIL 12:96209c979a7f 297 void ReceiverIR::right(void){
Jeonghoon 22:3e732988bf3f 298 pwma = 0.105;
Jeonghoon 22:3e732988bf3f 299 pwmb = 0.1*0.85;
Jeonghoon 17:6d2532146627 300
jinyoung_KIL 12:96209c979a7f 301 ain0 = 1;
jinyoung_KIL 12:96209c979a7f 302 ain1 = 0;
Jeonghoon 17:6d2532146627 303
jinyoung_KIL 12:96209c979a7f 304 bin0 = 1;
jinyoung_KIL 12:96209c979a7f 305 bin1 = 0;
jinyoung_KIL 12:96209c979a7f 306 }
jinyoung_KIL 12:96209c979a7f 307 void ReceiverIR::stop(void){
jinyoung_KIL 12:96209c979a7f 308
jinyoung_KIL 12:96209c979a7f 309 pwma = 0;
jinyoung_KIL 12:96209c979a7f 310 pwmb = 0;
Jeonghoon 17:6d2532146627 311
jinyoung_KIL 12:96209c979a7f 312 ain0 = 0;
jinyoung_KIL 12:96209c979a7f 313 ain1 = 0;
Jeonghoon 17:6d2532146627 314
jinyoung_KIL 12:96209c979a7f 315 bin0 = 0;
jinyoung_KIL 12:96209c979a7f 316 bin1 = 0;
jinyoung_KIL 12:96209c979a7f 317 }
Jeonghoon 17:6d2532146627 318
shintamainjp 0:ec264f4ce158 319 void ReceiverIR::init_state(void) {
shintamainjp 0:ec264f4ce158 320 work.c1 = -1;
shintamainjp 0:ec264f4ce158 321 work.c2 = -1;
shintamainjp 0:ec264f4ce158 322 work.c3 = -1;
shintamainjp 0:ec264f4ce158 323 work.d1 = -1;
shintamainjp 0:ec264f4ce158 324 work.d2 = -1;
shintamainjp 9:dcfdac59ef74 325 work.state = Idle;
shintamainjp 0:ec264f4ce158 326 data.format = RemoteIR::UNKNOWN;
shintamainjp 0:ec264f4ce158 327 data.bitcount = 0;
shintamainjp 0:ec264f4ce158 328 timer.stop();
shintamainjp 0:ec264f4ce158 329 timer.reset();
shintamainjp 0:ec264f4ce158 330 for (int i = 0; i < sizeof(data.buffer); i++) {
shintamainjp 0:ec264f4ce158 331 data.buffer[i] = 0;
shintamainjp 0:ec264f4ce158 332 }
shintamainjp 0:ec264f4ce158 333 }
jinyoung_KIL 12:96209c979a7f 334
shintamainjp 0:ec264f4ce158 335 void ReceiverIR::isr_wdt(void) {
shintamainjp 9:dcfdac59ef74 336 LOCK();
shintamainjp 0:ec264f4ce158 337 static int cnt = 0;
shintamainjp 9:dcfdac59ef74 338 if ((Idle != work.state) || ((0 <= work.c1) || (0 <= work.c2) || (0 <= work.c3) || (0 <= work.d1) || (0 <= work.d2))) {
shintamainjp 0:ec264f4ce158 339 cnt++;
shintamainjp 0:ec264f4ce158 340 if (cnt > 50) {
shintamainjp 0:ec264f4ce158 341 init_state();
shintamainjp 0:ec264f4ce158 342 cnt = 0;
shintamainjp 0:ec264f4ce158 343 }
shintamainjp 0:ec264f4ce158 344 } else {
shintamainjp 0:ec264f4ce158 345 cnt = 0;
shintamainjp 0:ec264f4ce158 346 }
shintamainjp 9:dcfdac59ef74 347 UNLOCK();
shintamainjp 0:ec264f4ce158 348 }
jinyoung_KIL 12:96209c979a7f 349
shintamainjp 0:ec264f4ce158 350 void ReceiverIR::isr_fall(void) {
shintamainjp 9:dcfdac59ef74 351 LOCK();
shintamainjp 9:dcfdac59ef74 352 switch (work.state) {
shintamainjp 0:ec264f4ce158 353 case Idle:
shintamainjp 0:ec264f4ce158 354 if (work.c1 < 0) {
shintamainjp 0:ec264f4ce158 355 timer.start();
shintamainjp 0:ec264f4ce158 356 work.c1 = timer.read_us();
shintamainjp 0:ec264f4ce158 357 } else {
shintamainjp 0:ec264f4ce158 358 work.c3 = timer.read_us();
shintamainjp 0:ec264f4ce158 359 int a = work.c2 - work.c1;
shintamainjp 0:ec264f4ce158 360 int b = work.c3 - work.c2;
shintamainjp 11:268cc2ab63bd 361 if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 8)) {
shintamainjp 0:ec264f4ce158 362 /*
shintamainjp 0:ec264f4ce158 363 * NEC.
shintamainjp 0:ec264f4ce158 364 */
shintamainjp 0:ec264f4ce158 365 data.format = RemoteIR::NEC;
shintamainjp 9:dcfdac59ef74 366 work.state = Receiving;
shintamainjp 0:ec264f4ce158 367 data.bitcount = 0;
shintamainjp 11:268cc2ab63bd 368 } else if (InRange(a, RemoteIR::TUS_NEC * 16) && InRange(b, RemoteIR::TUS_NEC * 4)) {
shintamainjp 0:ec264f4ce158 369 /*
shintamainjp 0:ec264f4ce158 370 * NEC Repeat.
shintamainjp 0:ec264f4ce158 371 */
shintamainjp 3:dfed23b157e6 372 data.format = RemoteIR::NEC_REPEAT;
shintamainjp 9:dcfdac59ef74 373 work.state = Received;
shintamainjp 0:ec264f4ce158 374 data.bitcount = 0;
shintamainjp 3:dfed23b157e6 375 work.c1 = -1;
shintamainjp 3:dfed23b157e6 376 work.c2 = -1;
shintamainjp 3:dfed23b157e6 377 work.c3 = -1;
shintamainjp 3:dfed23b157e6 378 work.d1 = -1;
shintamainjp 3:dfed23b157e6 379 work.d2 = -1;
shintamainjp 0:ec264f4ce158 380 } else {
shintamainjp 0:ec264f4ce158 381 init_state();
shintamainjp 0:ec264f4ce158 382 }
shintamainjp 0:ec264f4ce158 383 }
shintamainjp 0:ec264f4ce158 384 break;
shintamainjp 0:ec264f4ce158 385 case Receiving:
shintamainjp 0:ec264f4ce158 386 if (RemoteIR::NEC == data.format) {
shintamainjp 0:ec264f4ce158 387 work.d2 = timer.read_us();
shintamainjp 0:ec264f4ce158 388 int a = work.d2 - work.d1;
shintamainjp 11:268cc2ab63bd 389 if (InRange(a, RemoteIR::TUS_NEC * 3)) {
shintamainjp 0:ec264f4ce158 390 data.buffer[data.bitcount / 8] |= (1 << (data.bitcount % 8));
shintamainjp 11:268cc2ab63bd 391 } else if (InRange(a, RemoteIR::TUS_NEC * 1)) {
shintamainjp 0:ec264f4ce158 392 data.buffer[data.bitcount / 8] &= ~(1 << (data.bitcount % 8));
shintamainjp 0:ec264f4ce158 393 }
shintamainjp 0:ec264f4ce158 394 data.bitcount++;
shintamainjp 0:ec264f4ce158 395 /*
shintamainjp 0:ec264f4ce158 396 * Set timeout for tail detection automatically.
shintamainjp 0:ec264f4ce158 397 */
shintamainjp 0:ec264f4ce158 398 timeout.detach();
shintamainjp 11:268cc2ab63bd 399 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_NEC * 5);
shintamainjp 0:ec264f4ce158 400 }
shintamainjp 0:ec264f4ce158 401 break;
shintamainjp 0:ec264f4ce158 402 case Received:
shintamainjp 0:ec264f4ce158 403 break;
shintamainjp 0:ec264f4ce158 404 default:
shintamainjp 0:ec264f4ce158 405 break;
shintamainjp 0:ec264f4ce158 406 }
shintamainjp 9:dcfdac59ef74 407 UNLOCK();
shintamainjp 0:ec264f4ce158 408 }
jinyoung_KIL 12:96209c979a7f 409
shintamainjp 0:ec264f4ce158 410 void ReceiverIR::isr_rise(void) {
shintamainjp 9:dcfdac59ef74 411 LOCK();
shintamainjp 9:dcfdac59ef74 412 switch (work.state) {
shintamainjp 0:ec264f4ce158 413 case Idle:
shintamainjp 0:ec264f4ce158 414 if (0 <= work.c1) {
shintamainjp 0:ec264f4ce158 415 work.c2 = timer.read_us();
shintamainjp 0:ec264f4ce158 416 int a = work.c2 - work.c1;
shintamainjp 0:ec264f4ce158 417 } else {
shintamainjp 0:ec264f4ce158 418 init_state();
shintamainjp 0:ec264f4ce158 419 }
shintamainjp 0:ec264f4ce158 420 break;
shintamainjp 0:ec264f4ce158 421 case Receiving:
shintamainjp 0:ec264f4ce158 422 if (RemoteIR::NEC == data.format) {
shintamainjp 0:ec264f4ce158 423 work.d1 = timer.read_us();
jinyoung_KIL 12:96209c979a7f 424 }
shintamainjp 0:ec264f4ce158 425 break;
shintamainjp 0:ec264f4ce158 426 case Received:
shintamainjp 0:ec264f4ce158 427 break;
shintamainjp 0:ec264f4ce158 428 default:
shintamainjp 0:ec264f4ce158 429 break;
shintamainjp 0:ec264f4ce158 430 }
shintamainjp 9:dcfdac59ef74 431 UNLOCK();
shintamainjp 0:ec264f4ce158 432 }
jinyoung_KIL 12:96209c979a7f 433
shintamainjp 0:ec264f4ce158 434 void ReceiverIR::isr_timeout(void) {
shintamainjp 9:dcfdac59ef74 435 LOCK();
Jeonghoon 17:6d2532146627 436
shintamainjp 9:dcfdac59ef74 437 if (work.state == Receiving) {
shintamainjp 9:dcfdac59ef74 438 work.state = Received;
shintamainjp 0:ec264f4ce158 439 work.c1 = -1;
shintamainjp 0:ec264f4ce158 440 work.c2 = -1;
shintamainjp 0:ec264f4ce158 441 work.c3 = -1;
shintamainjp 0:ec264f4ce158 442 work.d1 = -1;
shintamainjp 0:ec264f4ce158 443 work.d2 = -1;
shintamainjp 0:ec264f4ce158 444 }
shintamainjp 9:dcfdac59ef74 445 UNLOCK();
Jeonghoon 17:6d2532146627 446 }