メニュー画面を作りそこからいろんな機能へと繋がるようなソフトを作成しておりますが、プログラムが思ったように動かず悪戦苦闘しています。
理想像と頭の中で考えているプログラムは、
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;
}
}
}
}