void main_task()

in src/app.cpp [57:216]


void main_task(intptr_t unused)
{
    signed char forward;      /* 前後進命令 */
    signed char turn;         /* 旋回命令 */
    signed char pwm_L, pwm_R; /* 左右モータPWM出力 */
    char msg[32];
    int brightness; /* 地面の明るさ */

    /* センサー入力ポートの設定 */
    ev3_sensor_config(sonar_sensor, ULTRASONIC_SENSOR);
    ev3_sensor_config(color_sensor, COLOR_SENSOR);
    ev3_color_sensor_get_reflect(color_sensor); /* 反射率モード */
    ev3_sensor_config(touch_sensor, TOUCH_SENSOR);
    ev3_sensor_config(gyro_sensor, GYRO_SENSOR);
    /* モーター出力ポートの設定 */
    ev3_motor_config(left_motor, LARGE_MOTOR);
    ev3_motor_config(right_motor, LARGE_MOTOR);
    ev3_motor_config(tail_motor, LARGE_MOTOR);
    ev3_motor_reset_counts(tail_motor);

    /* Open Bluetooth file */
    bt = ev3_serial_open_file(EV3_SERIAL_BT);
    assert(bt != NULL);

    /* Bluetooth通信タスクの起動 */
    act_tsk(BT_TASK);
    

#if 1 /* 片山先生がいなければ0にする */
    /* 片山先生のお顔 */
    memfile_t memfile_img;
    ev3_memfile_load("/ev3rt/res/katayama.bmp", &memfile_img);
    memfile_t memfile_wav;
    ev3_memfile_load("/ev3rt/res/nogi.wav", &memfile_wav);
    //ev3_memfile_load("/ev3rt/res/dorakue.wav", &memfile_wav);
    image_t image;
    ev3_image_load(&memfile_img, &image);
    ev3_lcd_draw_image(&image, 0, 0);
    ev3_speaker_set_volume(10);
    ev3_speaker_play_file(&memfile_wav, SOUND_MANUAL_STOP);
#endif

    ev3_led_set_color(LED_ORANGE); /* 初期化完了通知 */

    int buff = 0;
    /* スタート待機 */
    while(1)
    {
        tail_control(TAIL_ANGLE_STAND_UP + buff); /* 完全停止用角度に制御 */
        brightness = ev3_color_sensor_get_reflect(color_sensor); /* 光センサの値取得 */           

        /* LCDにしっぽの角度と光センサの値を出力する */
        sprintf(msg, "Tail_Angle: %d, Brightness: %d", TAIL_ANGLE_STAND_UP + buff, brightness);
        msg_f(msg, 0);

        if(ev3_button_is_pressed(LEFT_BUTTON)){
            buff--;
            tslp_tsk(500); /* 500msecウェイト */
        }

        if(ev3_button_is_pressed(RIGHT_BUTTON)){
            buff++;
            tslp_tsk(500); /* 500msecウェイト */            
        }

        if (bt_cmd == 1)
        {
            break; /* リモートスタート */
        }
        if (ev3_touch_sensor_is_pressed(touch_sensor) == 1)
        {
            break; /* タッチセンサが押された */
        }
        tslp_tsk(10); /* 10msecウェイト */
    }

    /* 走行モーターエンコーダーリセット */
    ev3_motor_reset_counts(left_motor);
    ev3_motor_reset_counts(right_motor);

    /* ジャイロセンサーリセット */
    ev3_gyro_sensor_reset(gyro_sensor);
    balancer.init(GYRO_OFFSET);                // <1>

    ev3_led_set_color(LED_GREEN); /* スタート通知 */

    /**
    * Main loop for the self-balance control algorithm
    */
    bool isSonerAlert = false;    
    while(1)
    {
        int32_t motor_ang_l, motor_ang_r;
        int gyro, volt;
        if (ev3_button_is_pressed(BACK_BUTTON)) break;

        tail_control(TAIL_ANGLE_DRIVE); /* バランス走行用角度に制御 */

        if (sonar_alert() == 1) /* 障害物検知 */
        {
            //if(isSonerAlert == false)ev3_speaker_play_tone (NOTE_FS6, 100);
            isSonerAlert = true;
            forward = turn = 0; /* 障害物を検知したら停止 */
        }
        else
        {
            brightness = ev3_color_sensor_get_reflect(color_sensor);            

            setLineTracePwm(brightness, forward, turn); /* 前後進命令, 旋回命令の設定 */

            //if(isSonerAlert == true)ev3_speaker_play_tone (NOTE_GS6, 100);            
            isSonerAlert = false;
            /* LCDに光センサの明るさ値を出力する */
            //sprintf(msg, "Brightness: %d", brightness);
            //msg_f(msg, 3);  
        }

        /* 倒立振子制御API に渡すパラメータを取得する */
        motor_ang_l = ev3_motor_get_counts(left_motor);
        motor_ang_r = ev3_motor_get_counts(right_motor);
        gyro = ev3_gyro_sensor_get_rate(gyro_sensor);
        volt = ev3_battery_voltage_mV();

        /* 倒立振子制御APIを呼び出し、倒立走行するための */
        /* 左右モータ出力値を得る */
        balancer.setCommand(forward, turn);   // <1>
        balancer.update(gyro, motor_ang_r, motor_ang_l, volt); // <2>
        pwm_L = balancer.getPwmRight();       // <3>
        pwm_R = balancer.getPwmLeft();        // <3>

        /* EV3ではモーター停止時のブレーキ設定が事前にできないため */
        /* 出力0時に、その都度設定する */
        if (pwm_L == 0)
        {
             ev3_motor_stop(left_motor, true);
        }
        else
        {
            ev3_motor_set_power(left_motor, (int)pwm_L);
        }

        if (pwm_R == 0)
        {
             ev3_motor_stop(right_motor, true);
        }
        else
        {
            ev3_motor_set_power(right_motor, (int)pwm_R);
        }

        tslp_tsk(4); /* 4msec周期起動 */
    }
    ev3_motor_stop(left_motor, false);
    ev3_motor_stop(right_motor, false);

    ter_tsk(BT_TASK);
    fclose(bt);

    ext_tsk();
}