ボタンを押すと、 バッテリ更新を停止し、 他のボタンもロックさせる
Dependencies: RemoteIR TextLCD
Diff: main.cpp
- Revision:
- 16:ffc732a3cf92
- Parent:
- 15:5eef1955f6c2
- Child:
- 17:f7259ab2fe86
--- a/main.cpp Mon Aug 03 05:46:01 2020 +0000 +++ b/main.cpp Tue Aug 04 05:04:11 2020 +0000 @@ -101,8 +101,8 @@ void decodeIR(void const *argument); void motor(void const *argument); void changeSpeed(); -void avoidance(void const *argument); -void trace(void const *argument); +void avoidance(/*void const *argument*/); +void trace(/*void const *argument*/); void watchsurrounding(); int watch(); void bChange(); @@ -110,9 +110,11 @@ void lcdBacklight(void const *argument); Thread deco_thread(decodeIR, NULL, osPriorityRealtime); // decodeIRをスレッド化 :+3 Thread motor_thread(motor, NULL, osPriorityHigh); // motorをスレッド化 :+2 -Thread avoi_thread(avoidance, NULL, osPriorityHigh); // avoidanceをスレッド化:+2 -Thread trace_thread(trace, NULL, osPriorityHigh); // traceをスレッド化 :+2 +//Thread avoi_thread(avoidance, NULL, osPriorityHigh); // avoidanceをスレッド化:+2 +//Thread trace_thread(trace, NULL, osPriorityHigh); // traceをスレッド化 :+2 RtosTimer bTimer(lcdBacklight, osTimerPeriodic); // lcdBacklightをタイマー割り込みで設定 +Thread *avoi_thread; +Thread *trace_thread; DigitalOut led1(LED1); @@ -131,7 +133,6 @@ if(mode != SPEED){ // スピードモード以外なら beforeMode=mode; // 前回のモードに現在のモードを設定 } - //pc.printf("%0x\r\n",code); switch(code){ case 0x40bf27d8: // クイック @@ -143,11 +144,21 @@ break; case 0x40be34cb: // レグザリンク pc.printf("mode = LINE_TRACE\r\n"); + if(trace_thread->get_state() == Thread::Deleted){ + delete trace_thread; + trace_thread = new Thread(trace); + trace_thread -> set_priority(osPriorityHigh); + } mode=LINE_TRACE; // ライントレースモード display(); // ディスプレイ表示 break; case 0x40bf6e91: // 番組表 pc.printf("mode = AVOIDANCE\r\n"); + if(avoi_thread->get_state() == Thread::Deleted){ + delete avoi_thread; + avoi_thread = new Thread(avoidance); + avoi_thread -> set_priority(osPriorityHigh); + } mode=AVOIDANCE; // 障害物回避モード run = ADVANCE; // 前進 display(); // ディスプレイ表示 @@ -185,6 +196,12 @@ default: ; } + if(mode != LINE_TRACE && trace_thread->get_state() != Thread::Deleted){ + trace_thread->terminate(); + } + if(mode != AVOIDANCE && avoi_thread->get_state() != Thread::Deleted){ + avoi_thread->terminate(); + } } } if(viewTimer.read_ms()>=3000){ // スピードモードのまま3秒経過 @@ -257,9 +274,9 @@ } /* ライントレーススレッド */ -void trace(void const *argument){ +void trace(/*void const *argument*/){ while(1){ - if(mode==LINE_TRACE){ // 現在ライントレースモードなら + //if(mode==LINE_TRACE){ // 現在ライントレースモードなら //pc.printf("line trace\r\n"); /* 各センサー値読み取り */ @@ -331,22 +348,22 @@ break; } ThisThread::sleep_for(30); // 30ms待つ - }else{ + /*}else{ ThisThread::sleep_for(1); // 1ms待つ - } + }*/ } } /* 障害物回避走行スレッド */ -void avoidance(void const *argument){ +void avoidance(/*void const *argument*/){ while(1){ - if(mode == AVOIDANCE){ // 現在障害物回避モードなら + //if(mode == AVOIDANCE){ // 現在障害物回避モードなら pc.printf("avoidance\r\n"); watchsurrounding(); pc.printf("%d %d %d %d %d \r\n",SL,SLD,SC,SRD,SR); if(flag_a == 0){ // 障害物がない場合 - if(mode == AVOIDANCE) // 現在障害物回避モードなら + //if(mode == AVOIDANCE) // 現在障害物回避モードなら run = ADVANCE; // 前進 } else{ // 障害物がある場合 @@ -354,18 +371,18 @@ if(SC < 15){ // 正面15cm以内に障害物が現れた場合 run = BACK; // 後退 while(watch() < limit){ // 正面20cm以内に障害物がある間 - if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら + /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら break; - } + }*/ } run = STOP; // 停止 } if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){ // 全方向に障害物がある場合 run = LEFT; // 左折 while(i < 10){ // 進行方向確認 - if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら + /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら break; - } + } */ if(watch() > limit){ i++; @@ -407,9 +424,9 @@ run = LEFT; // 左折 while(i < 10){ // 進行方向確認 pc.printf("left\r\n"); - if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら + /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら break; - } + }*/ if(watch() > (far - 2)){ // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm) i++; // ループ+ } @@ -423,9 +440,9 @@ run = RIGHT; // 右折 while(i < 10){ // 進行方向確認 pc.printf("right\r\n"); - if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら + /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら break; - } + }*/ if(watch() > (far - 2)){ // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm) i++; // ループ+ } @@ -441,9 +458,9 @@ pc.printf("こんにちは!\r\n"); flag_a = 0; // 障害物有無フラグを0にセット pc.printf(" avoidance\r\n"); - }else{ + /*}else{ ThisThread::sleep_for(1); // 1ms待つ - } + }*/ } } @@ -637,6 +654,10 @@ /* mainスレッド */ int main() { /* 初期設定 */ + avoi_thread = new Thread(avoidance); + avoi_thread->terminate(); + trace_thread = new Thread(trace); + trace_thread->terminate(); mode = READY; // 現在待ちモード beforeMode = READY; // 前回待ちモード run = STOP; // 停止