ボタンを押すと、 バッテリ更新を停止し、 他のボタンもロックさせる

Dependencies:   RemoteIR TextLCD

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;             // 停止