C言語でメニュー画面を製作しています。コードの不備など教えていただきたいです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: C言語でメニュー画面を製作しています。コードの不備など教えていただきたいです。

Re: C言語でメニュー画面を製作しています。コードの不備など教えていただきたいです。

#4

by みけCAT » 7年前

while(1)は無限ループであり、break;なども無いので、
これではmain_task関数内の処理に戻れず、ENTER_BUTTONの処理が実行できなくなってしまいます。
これは取り除き、MainMenu関数などの先頭ではなくmain_task関数の先頭でMainMenuSceneを初期化するようにするといいでしょう。

ただし、よく見るとMainMenu関数は1度しか呼ばれないため、この修正をしても”>”は動かないでしょう。
私は各関数の役割をよくわかっていません。
もしかしたら、while(1)は入れたままにし、ボタンが押されたらbreakする処理を追加する方がいいのかもしれません。

Re: C言語でメニュー画面を製作しています。コードの不備など教えていただきたいです。

#3

by いろは2 » 7年前

回答ありがとうござます。
前回のプログラムを修正し下記の文をwhile(1)でくくったところ”>”が動かない問題は解決し動くようにはなりました。
ですが、ボタンを押して際に画面が切り替わることがなくなってしまいました。
画面切替は常に動いていて欲しいので、main_task関数に入れています。
自分の考えですとマルチタスク処理で常にmain_taskは動いているので常に動いていて欲しいプログラムを入れておけば便利なのかと考えていましたが動作しないようです。
何か他に方法が考えられる場合はアドバイスなどもらえるとありがたいです。

コード:

	while(1){
		switch(MainMenuScene){
			case eMotorCntrol:
				ev3_lcd_draw_string(">",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case ePortView:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(">",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case eComingSoon:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(">",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
					break;
			case eComingSoon2:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(">",0,Y_menu4);
				break;
		}

		while(ev3_button_is_pressed(DOWN_BUTTON)){
			tslp_tsk(250);
			MainMenuScene = (MainMenuScene+1)%5;
				if(MainMenuScene == eMainMenu){
					MainMenuScene = eMotorCntrol;
			}
		}
		while(ev3_button_is_pressed(UP_BUTTON)){
			tslp_tsk(250);
			MainMenuScene = (MainMenuScene+(5-1))%5;
				if(MainMenuScene == eMainMenu){
					MainMenuScene = eMotorCntrolMenu;
			}
		}
	}
コード全体。

コード:

#include "ev3api.h"
#include "app.h"

#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif

#define Port1 	EV3_PORT_1
#define Port2 	EV3_PORT_2
#define Port3 	EV3_PORT_3
#define Port4 	EV3_PORT_4

#define PortA	EV3_PORT_A
#define PortB	EV3_PORT_B
#define PortC	EV3_PORT_C
#define PortD	EV3_PORT_D

//メインニューの集合。
typedef enum{
	eMainMenu,
	eMotorCntrol,
	ePortView,
	eComingSoon,
	eComingSoon2,
}eMainMenuScene;

typedef enum{
	eMotorCntrolMenu,
	ePortA,
	ePortB,
	ePortC,
	ePortD,
}eMotorControlScene;

int MainMenuScene = eMainMenu;
int MotorControlScene = eMotorCntrolMenu;
int Power;

//メニュー画面の座標。
int X_menu = 20;
int Y_menu1 = 25;
int Y_menu2 = 45;
int Y_menu3 = 65;
int Y_menu4 = 85;

//モーターコントロールの表示座標。
int X_motor = 50;
int Y_motor = 50; 
int X_power = 20;
int Y_power = 60;

void MainMenu(){

	MainMenuScene = eMotorCntrol;

	ev3_lcd_draw_string("MotorControl      ",X_menu,Y_menu1);
	ev3_lcd_draw_string("ComingSoon        ",X_menu,Y_menu2);
	ev3_lcd_draw_string("ComingSoon        ",X_menu,Y_menu3);
	ev3_lcd_draw_string("ComingSoon        ",X_menu,Y_menu4);

	while(1){
		switch(MainMenuScene){
			case eMotorCntrol:
				ev3_lcd_draw_string(">",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case ePortView:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(">",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case eComingSoon:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(">",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
					break;
			case eComingSoon2:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(">",0,Y_menu4);
				break;
		}

		while(ev3_button_is_pressed(DOWN_BUTTON)){
			tslp_tsk(250);
			MainMenuScene = (MainMenuScene+1)%5;
				if(MainMenuScene == eMainMenu){
					MainMenuScene = eMotorCntrol;
			}
		}
		while(ev3_button_is_pressed(UP_BUTTON)){
			tslp_tsk(250);
			MainMenuScene = (MainMenuScene+(5-1))%5;
				if(MainMenuScene == eMainMenu){
					MainMenuScene = eMotorCntrolMenu;
			}
		}
	}
}

void MotorControlMenu(){

	tslp_tsk(150);

	Power = 50;

	MotorControlScene = ePortA;

	ev3_lcd_draw_string("PortA Control     ",X_menu,Y_menu1);
	ev3_lcd_draw_string("PortB Control     ",X_menu,Y_menu2);
	ev3_lcd_draw_string("PortC Control     ",X_menu,Y_menu3);
	ev3_lcd_draw_string("PortD Control     ",X_menu,Y_menu4);


	while(1){
		switch(MotorControlScene){
			case ePortA:
				ev3_lcd_draw_string(">",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case ePortB:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(">",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case ePortC:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(">",0,Y_menu3);
				ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case ePortD:
			ev3_lcd_draw_string(" ",0,Y_menu1);
			ev3_lcd_draw_string(" ",0,Y_menu2);
			ev3_lcd_draw_string(" ",0,Y_menu3);
			ev3_lcd_draw_string(">",0,Y_menu4);
				break;
		}
		while(ev3_button_is_pressed(DOWN_BUTTON)){
			tslp_tsk(250);
			MotorControlScene = (MotorControlScene+1)%5;
				if(MotorControlScene == eMotorCntrolMenu){
					MotorControlScene = ePortA;
			}
		}
		while(ev3_button_is_pressed(UP_BUTTON)){
			tslp_tsk(250);
			MotorControlScene = (MotorControlScene+(5-1))%5;
				if(MotorControlScene == eMotorCntrolMenu){
					MotorControlScene = PortA;
			}
		}
	}
}

void PortAControl(){
	char UP_POWER[32];

	ev3_lcd_draw_string("                   ",0,Y_menu1);
	ev3_lcd_draw_string("                   ",0,Y_menu2);
	ev3_lcd_draw_string("                   ",0,Y_menu3);
	ev3_lcd_draw_string("                   ",0,Y_menu4);

	tslp_tsk(1);

	ev3_lcd_draw_string("PortAControl       ",X_motor,Y_power);
	sprintf(UP_POWER,"Power : %d     ",Power);
	ev3_lcd_draw_string(UP_POWER,X_power,Y_power);

	if(ev3_button_is_pressed(RIGHT_BUTTON)){
		Power += 5;
		if(Power == 105){
			Power = 0;
		}
	}
	if(ev3_button_is_pressed(LEFT_BUTTON)){
		Power -= 5;
		if(Power == -5){
			Power = 100;
		}
	}

	while(ev3_button_is_pressed(UP_BUTTON)){
		ev3_motor_set_power(PortA,Power);
	}
	ev3_motor_stop(PortA,true);

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		ev3_motor_set_power(PortA,Power * -1);
	}
	ev3_motor_stop(PortA,true);

	if(ev3_button_is_pressed(BACK_BUTTON)){
		MotorControlScene = eMotorCntrolMenu;
	}
}

void PortBControl(){

}

void PortCControl(){

}

void PortDControl(){

}

void PortView(){
	//Port1,2,3,4の光の返ってくる値を出す。
}

void LineTraceMenu(){
	//LineTraceの方法への分岐。
}

void ProportionLineTrace(){

}

void OnOffLineTrace(){

}

void main_task(intptr_t unused) {
	ev3_motor_config(PortA,LARGE_MOTOR);
	ev3_motor_config(PortB,LARGE_MOTOR);
	ev3_motor_config(PortC,LARGE_MOTOR);
	ev3_motor_config(PortD,LARGE_MOTOR);

	ev3_sensor_config(Port1,COLOR_SENSOR);
	ev3_sensor_config(Port2,COLOR_SENSOR);
	ev3_sensor_config(Port3,COLOR_SENSOR);
	ev3_sensor_config(Port4,COLOR_SENSOR);
	ev3_lcd_set_font(EV3_FONT_MEDIUM);

	if(MainMenuScene == eMainMenu){
		MainMenu();
	}
	
	while(1){
		if(ev3_button_is_pressed(ENTER_BUTTON)){
			switch(MainMenuScene){
				case eMotorCntrol:
					MotorControlMenu();
					break;
				case ePortView:
					PortView();
					break;
				default:
					break;
			}
		}
		if(ev3_button_is_pressed(ENTER_BUTTON)){
			switch(MotorControlScene){
				case ePortA:
					PortAControl();
					break;
				case ePortB:
					PortBControl();
					break;
				case ePortC:
					PortCControl();
					break;
				case ePortD:
					PortDControl();
					break;
				default:
					break;
			}
		}
	}
}

Re: C言語でメニュー画面を製作しています。コードの不備など教えていただきたいです。

#2

by みけCAT » 7年前

いろは2 さんが書きました:
7年前
選択用の”>”が動かない問題
MotorControlMenu関数やMainMenu関数において、
それぞれ最初で”>”の位置を決めている変数MotorControlSceneやMainMenuSceneに固定の値を代入してしまっているので、
その後ボタンの入力によりこれらの変数の値を変えても”>”の位置には影響を与えない、ということですね。

C言語でメニュー画面を製作しています。コードの不備など教えていただきたいです。

#1

by いろは2 » 7年前

TOPPERS Ev3 C APIを使用しLEGO MIND STORM EV3をC言語で開発しています。
メニュー画面を作りそこからいろんな機能へと繋がるようなソフトを作成しておりますが、プログラムが思ったように動かず悪戦苦闘しています。
理想像と頭の中で考えているプログラムは、
enumでメニュー画面、モーターコントロール画面のシーンをそれぞれ定義し、MainMenuScene,MotorControlSceneが定義された値になった時に画面が移るようにしています。
シーンが移り関数内のコードを実行している様子は見せるのですが、選択用の”>”が動かない問題などバグ?のようなものが様々残ってしまています。
コードをコンパイルする際は特にエラーなど吐かないので現状の私の知識では対処できません。
Ev3のAPIを使用していることや、マシン独自の動きなどありますが、C言語の基本においてこの文は書いたらおかしいよ。動くはずがないよ。などありましたらご指摘していただけると助かります。よろしくお願いします。

何か説明に不備がありましたら追記しますのでよろしくお願いします。

コード:

#include "ev3api.h"
#include "app.h"

#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif

#define Port1 	EV3_PORT_1
#define Port2 	EV3_PORT_2
#define Port3 	EV3_PORT_3
#define Port4 	EV3_PORT_4

#define PortA	EV3_PORT_A
#define PortB	EV3_PORT_B
#define PortC	EV3_PORT_C
#define PortD	EV3_PORT_D

//メインニューの集合。
typedef enum{
	eMainMenu,
	eMotorCntrol,
	ePortView,
	eComingSoon,
	eComingSoon2,
}eMainMenuScene;

typedef enum{
	eMotorCntrolMenu,
	ePortA,
	ePortB,
	ePortC,
	ePortD,
}eMotorControlScene;

int MainMenuScene = eMainMenu;
int MotorControlScene = eMotorCntrolMenu;
int Power;

//メニュー画面の座標。
int X_menu = 20;
int Y_menu1 = 25;
int Y_menu2 = 45;
int Y_menu3 = 65;
int Y_menu4 = 85;

//モーターコントロールの表示座標。
int X_motor = 50;
int Y_motor = 50; 
int X_power = 20;
int Y_power = 60;

void PortAControl(){
	char UP_POWER[32];

	ev3_lcd_draw_string("                   ",0,Y_menu1);
	ev3_lcd_draw_string("                   ",0,Y_menu2);
	ev3_lcd_draw_string("                   ",0,Y_menu3);
	ev3_lcd_draw_string("                   ",0,Y_menu4);

	tslp_tsk(1);

	ev3_lcd_draw_string("PortAControl       ",X_motor,Y_power);
	sprintf(UP_POWER,"Power : %d     ",Power);
	ev3_lcd_draw_string(UP_POWER,X_power,Y_power);

	if(ev3_button_is_pressed(RIGHT_BUTTON)){
		Power += 5;
		if(Power == 105){
			Power = 0;
		}
	}
	if(ev3_button_is_pressed(LEFT_BUTTON)){
		Power -= 5;
		if(Power == -5){
			Power = 100;
		}
	}

	while(ev3_button_is_pressed(UP_BUTTON)){
		ev3_motor_set_power(PortA,Power);
	}
	ev3_motor_stop(PortA,true);

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		ev3_motor_set_power(PortA,Power * -1);
	}
	ev3_motor_stop(PortA,true);

	if(ev3_button_is_pressed(BACK_BUTTON)){
	MotorControlScene = eMotorCntrolMenu;
	}
}

void PortBControl(){

}

void PortCControl(){

}

void PortDControl(){

}

void PortView(){
	//Port1,2,3,4の光の返ってくる値を出す。
}

void LineTraceMenu(){
	//LineTraceの方法への分岐。
}

void ProportionLineTrace(){

}

void OnOffLineTrace(){

}

void MotorControlMenu(){

	tslp_tsk(150);

	MotorControlScene = ePortA;

	Power = 50;

	ev3_lcd_draw_string("PortAControl     ",X_menu,Y_menu1);
	ev3_lcd_draw_string("PortBControl     ",X_menu,Y_menu2);
	ev3_lcd_draw_string("PortCControl     ",X_menu,Y_menu3);
	ev3_lcd_draw_string("PortDControl     ",X_menu,Y_menu4);

	switch(MotorControlScene){
		case ePortA:
			ev3_lcd_draw_string(">",0,Y_menu1);
			ev3_lcd_draw_string(" ",0,Y_menu2);
			ev3_lcd_draw_string(" ",0,Y_menu3);
			ev3_lcd_draw_string(" ",0,Y_menu4);
			break;
		case ePortB:
			ev3_lcd_draw_string(" ",0,Y_menu1);
			ev3_lcd_draw_string(">",0,Y_menu2);
			ev3_lcd_draw_string(" ",0,Y_menu3);
			ev3_lcd_draw_string(" ",0,Y_menu4);
			break;
		case ePortC:
			ev3_lcd_draw_string(" ",0,Y_menu1);
			ev3_lcd_draw_string(" ",0,Y_menu2);
			ev3_lcd_draw_string(">",0,Y_menu3);
			ev3_lcd_draw_string(" ",0,Y_menu4);
			break;
		case ePortD:
		ev3_lcd_draw_string(" ",0,Y_menu1);
		ev3_lcd_draw_string(" ",0,Y_menu2);
		ev3_lcd_draw_string(" ",0,Y_menu3);
		ev3_lcd_draw_string(">",0,Y_menu4);
			break;
	}
	while(ev3_button_is_pressed(DOWN_BUTTON)){
		tslp_tsk(250);
		MotorControlScene = (MotorControlScene+1)%5;
			if(MotorControlScene == eMotorCntrolMenu){
				MotorControlScene = ePortA;
		}
	}
	while(ev3_button_is_pressed(UP_BUTTON)){
		tslp_tsk(250);
		MotorControlScene = (MotorControlScene+(5-1))%5;
			if(MotorControlScene == eMotorCntrolMenu){
				MotorControlScene = PortA;
		}
	}
}

void MainMenu(){

	MainMenuScene = eMotorCntrol;

	ev3_lcd_draw_string("MotorControl      ",X_menu,Y_menu1);
	ev3_lcd_draw_string("ComingSoon        ",X_menu,Y_menu2);
	ev3_lcd_draw_string("ComingSoon        ",X_menu,Y_menu3);
	ev3_lcd_draw_string("ComingSoon        ",X_menu,Y_menu4);

	switch(MainMenuScene){
		case eMotorCntrol:
			ev3_lcd_draw_string(">",0,Y_menu1);
			ev3_lcd_draw_string(" ",0,Y_menu2);
			ev3_lcd_draw_string(" ",0,Y_menu3);
			ev3_lcd_draw_string(" ",0,Y_menu4);
			break;
		case ePortView:
			ev3_lcd_draw_string(" ",0,Y_menu1);
			ev3_lcd_draw_string(">",0,Y_menu2);
			ev3_lcd_draw_string(" ",0,Y_menu3);
			ev3_lcd_draw_string(" ",0,Y_menu4);
			break;
		case eComingSoon:
			ev3_lcd_draw_string(" ",0,Y_menu1);
			ev3_lcd_draw_string(" ",0,Y_menu2);
			ev3_lcd_draw_string(">",0,Y_menu3);
			ev3_lcd_draw_string(" ",0,Y_menu4);
				break;
			case eComingSoon2:
				ev3_lcd_draw_string(" ",0,Y_menu1);
				ev3_lcd_draw_string(" ",0,Y_menu2);
				ev3_lcd_draw_string(" ",0,Y_menu3);
				ev3_lcd_draw_string(">",0,Y_menu4);
				break;
	}

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		tslp_tsk(250);
		MainMenuScene = (MainMenuScene+1)%5;
			if(MainMenuScene == eMainMenu){
				MainMenuScene = eMotorCntrol;
		}
	}
	while(ev3_button_is_pressed(UP_BUTTON)){
		tslp_tsk(250);
		MainMenuScene = (MainMenuScene+(5-1))%5;
			if(MainMenuScene == eMainMenu){
				MainMenuScene = eMotorCntrolMenu;
		}
	}

}

void main_task(intptr_t unused) {
	ev3_motor_config(PortA,LARGE_MOTOR);
	ev3_motor_config(PortB,LARGE_MOTOR);
	ev3_motor_config(PortC,LARGE_MOTOR);
	ev3_motor_config(PortD,LARGE_MOTOR);

	ev3_sensor_config(Port1,COLOR_SENSOR);
	ev3_sensor_config(Port2,COLOR_SENSOR);
	ev3_sensor_config(Port3,COLOR_SENSOR);
	ev3_sensor_config(Port4,COLOR_SENSOR);
	ev3_lcd_set_font(EV3_FONT_MEDIUM);

	while(1){
		if(MainMenuScene == eMainMenu){
			MainMenu();
		}
		if(ev3_button_is_pressed(ENTER_BUTTON)){
			switch(MotorControlScene){
				case ePortA:
					PortAControl();
					break;
				case ePortB:
					PortBControl();
					break;
				case ePortC:
					PortCControl();
					break;
				case ePortD:
					PortDControl();
					break;
				default:
					break;
			}
		}
		if(ev3_button_is_pressed(ENTER_BUTTON)){
			switch(MainMenuScene){
				case eMotorCntrol:
					MotorControlMenu();
					break;
				case ePortView:
					PortView();
					break;
				default:
					break;
			}
		}
	}
}
余談ですが、以前私が作った下記載のコードですと問題なく動くようです。

コード:

#include "ev3api.h"
#include "app.h"

#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif

#define Port1 	EV3_PORT_1
#define Port2 	EV3_PORT_2
#define Port3 	EV3_PORT_3
#define Port4 	EV3_PORT_4

#define PortA	EV3_PORT_A
#define PortB	EV3_PORT_B
#define PortC	EV3_PORT_C
#define PortD	EV3_PORT_D

typedef enum{
	eScene_MainMenu,

	eScene_PortA,
	eScene_PortB,
	eScene_PortC,
	eScene_PortD,
	//eScene_PortView,
}eScene;

int Scene = eScene_MainMenu;

int Power;

int waittime = 150;

void UpdateScene(){
	if(ev3_button_is_pressed(UP_BUTTON)){
		Scene = (Scene + 1)%eScene_PortD;
	}
	if(ev3_button_is_pressed(DOWN_BUTTON)){
		Scene = (Scene + (eScene_PortD-1))%eScene_PortD;
	}
	/*if(ev3_button_is_pressed(ENTER_BUTTON)){
		Scene = eScene_PortView;
	}*/
}

void MainMenu(){
	Power = 50;
	ev3_lcd_draw_string("PortAControl     ",20,25);
	ev3_lcd_draw_string("PortBControl     ",20,45);
	ev3_lcd_draw_string("PortCControl     ",20,65);
	ev3_lcd_draw_string("PortDControl     ",20,85);
}

void PortA_Menu(){
	tslp_tsk(waittime);

	char GO_Power_Count[32];

	ev3_lcd_draw_string("                   ",0,25);
	ev3_lcd_draw_string("PortA              ",0,45);
	ev3_lcd_draw_string("                   ",0,65);
	ev3_lcd_draw_string("                   ",0,85);

	sprintf(GO_Power_Count,"Power : %d   ",Power);
	ev3_lcd_draw_string(GO_Power_Count,0,95);

	if(ev3_button_is_pressed(RIGHT_BUTTON)){
		Power += 5;
		if(Power == 100){
			Power = 5;
		}
	}
	if(ev3_button_is_pressed(LEFT_BUTTON)){
		Power -= 5;
		if(Power == 0){
			Power = 95;
		}
	}

	while(ev3_button_is_pressed(UP_BUTTON)){
		ev3_motor_set_power(PortA,Power);
	}
	ev3_motor_stop(PortA,true);

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		ev3_motor_set_power(PortA,Power * -1);
	}
	ev3_motor_stop(PortA,true);

	if(ev3_button_is_pressed(BACK_BUTTON)){
		Scene = eScene_MainMenu;
	}            
}

void PortB_Menu(){
	tslp_tsk(waittime);

	char GO_Power_Count[32];

	ev3_lcd_draw_string("                   ",0,25);
	ev3_lcd_draw_string("PortB              ",0,45);
	ev3_lcd_draw_string("                   ",0,65);
	ev3_lcd_draw_string("                   ",0,85);

	sprintf(GO_Power_Count,"Power : %d   ",Power);
	ev3_lcd_draw_string(GO_Power_Count,0,95);

	if(ev3_button_is_pressed(RIGHT_BUTTON)){
		Power += 5;
		if(Power == 100){
			Power = 5;
		}
	}
	if(ev3_button_is_pressed(LEFT_BUTTON)){
		Power -= 5;
		if(Power == 0){
			Power = 95;
		}
	}

	while(ev3_button_is_pressed(UP_BUTTON)){
		ev3_motor_set_power(PortB,Power);
	}
	ev3_motor_stop(PortB,true);

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		ev3_motor_set_power(PortB,Power * -1);
	}
	ev3_motor_stop(PortB,true);

	if(ev3_button_is_pressed(BACK_BUTTON)){
		Scene = eScene_MainMenu;
	}
}

void PortC_Menu(){
	tslp_tsk(waittime);

	char GO_Power_Count[32];

	ev3_lcd_draw_string("                   ",0,25);
	ev3_lcd_draw_string("PortC              ",0,45);
	ev3_lcd_draw_string("                   ",0,65);
	ev3_lcd_draw_string("                   ",0,85);

	sprintf(GO_Power_Count,"Power : %d   ",Power);
	ev3_lcd_draw_string(GO_Power_Count,0,95);

	if(ev3_button_is_pressed(RIGHT_BUTTON)){
		Power += 5;
		if(Power == 100){
			Power = 5;
		}
	}
	if(ev3_button_is_pressed(LEFT_BUTTON)){
		Power -= 5;
		if(Power == 0){
			Power = 95;
		}
	}

	while(ev3_button_is_pressed(UP_BUTTON)){
		ev3_motor_set_power(PortC,Power);
		}
	ev3_motor_stop(PortC,true);

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		ev3_motor_set_power(PortC,Power * -1);
	}
	ev3_motor_stop(PortC,true);

	if(ev3_button_is_pressed(BACK_BUTTON)){
		Scene = eScene_MainMenu;
	}
}

void PortD_Menu(){
	tslp_tsk(waittime);

	char GO_Power_Count[32];

	ev3_lcd_draw_string("                   ",0,25);
	ev3_lcd_draw_string("                   ",0,45);
	ev3_lcd_draw_string("PortD              ",0,65);
	ev3_lcd_draw_string("                   ",0,85);

	sprintf(GO_Power_Count,"Power : %d   ",Power);
	ev3_lcd_draw_string(GO_Power_Count,0,95);

	if(ev3_button_is_pressed(RIGHT_BUTTON)){
		Power += 5;
		if(Power == 100){
			Power = 5;
		}
	}
	if(ev3_button_is_pressed(LEFT_BUTTON)){
		Power -= 5;
		if(Power == 0){
			Power = 95;
		}
	}

	while(ev3_button_is_pressed(UP_BUTTON)){
		ev3_motor_set_power(PortD,Power);
	}
	ev3_motor_stop(PortD,true);

	while(ev3_button_is_pressed(DOWN_BUTTON)){
		ev3_motor_set_power(PortD,Power * -1);
	}
	ev3_motor_stop(PortD,true);

	if(ev3_button_is_pressed(BACK_BUTTON)){
		Scene = eScene_MainMenu;
	}
}

/*
void PortView(){

	int Port1Value = ev3_color_sensor_get_ambient(Port1);
	int Port2Value = ev3_color_sensor_get_ambient(Port2);
	int Port3Value = ev3_color_sensor_get_ambient(Port3);
	int Port4Value = ev3_color_sensor_get_ambient(Port4);

	char Port1Text[32];
	char Port2Text[32];
	char Port3Text[32];
	char Port4Text[32];

	sprintf(Port1Text,"AmbientValue : %d   ",Port1Value);
	sprintf(Port2Text,"AmbientValue : %d   ",Port2Value);
	sprintf(Port3Text,"AmbientValue : %d   ",Port3Value);
	sprintf(Port4Text,"AmbientValue : %d   ",Port4Value);

	ev3_lcd_draw_string(Port1Text,0,20);
	ev3_lcd_draw_string(Port2Text,0,40);
	ev3_lcd_draw_string(Port3Text,0,60);
	ev3_lcd_draw_string(Port4Text,0,80);

	if(ev3_button_is_pressed(BACK_BUTTON)){
	Scene = eScene_MainMenu;
	}
}
*/

void main_task(intptr_t unused){
	ev3_motor_config( PortA , LARGE_MOTOR );
	ev3_motor_config( PortB , LARGE_MOTOR );
	ev3_motor_config( PortC , LARGE_MOTOR );
	ev3_motor_config( PortD , LARGE_MOTOR );
	ev3_sensor_config( Port1 , COLOR_SENSOR );
	ev3_sensor_config( Port2 , COLOR_SENSOR );
	ev3_sensor_config( Port3 , COLOR_SENSOR );
	ev3_sensor_config( Port4 , COLOR_SENSOR );
	ev3_lcd_set_font(EV3_FONT_MEDIUM);


	while(1){
		if(Scene == eScene_MainMenu){
			UpdateScene();

		switch(Scene){
			case eScene_MainMenu:
				MainMenu();
			case eScene_PortA:
				ev3_lcd_draw_string(">",0,25);
				ev3_lcd_draw_string(" ",0,45);
				ev3_lcd_draw_string(" ",0,65);
				ev3_lcd_draw_string(" ",0,85);
				break;
			case eScene_PortB:
				ev3_lcd_draw_string(" ",0,25);
				ev3_lcd_draw_string(">",0,45);
				ev3_lcd_draw_string(" ",0,65);
				ev3_lcd_draw_string(" ",0,85);
				break;
			case eScene_PortC:
				ev3_lcd_draw_string(" ",0,25);
				ev3_lcd_draw_string(" ",0,45);
				ev3_lcd_draw_string(">",0,65);
				ev3_lcd_draw_string(" ",0,85);
				break;
			case eScene_PortD:
				ev3_lcd_draw_string(" ",0,25);
				ev3_lcd_draw_string(" ",0,45);
				ev3_lcd_draw_string(" ",0,65);
				ev3_lcd_draw_string(">",0,85);
				break;
			//case eScene_PortView:
				//PortView();
			default:
				break;
			}
		}
		if(ev3_button_is_pressed(ENTER_BUTTON)){
			switch(Scene){
				case eScene_MainMenu:
					MainMenu();
					break;
				case eScene_PortA:
					PortA_Menu();
					break;
				case eScene_PortB:
					PortB_Menu();
					break;
				case eScene_PortC:
					PortC_Menu();
					break;
				case eScene_PortD:
					PortD_Menu();
					break;
				//case eScene_PortView:
					//PortView();
				default:
					break;
			}
		}
	}
}

ページトップ