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.
Dependencies: RemoteIR TextLCD
Revision 16:ffc732a3cf92, committed 2020-08-04
- Comitter:
- nishimura_taku_pet
- Date:
- Tue Aug 04 05:04:11 2020 +0000
- Parent:
- 15:5eef1955f6c2
- Commit message:
- thread delete
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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; // 停止