int atack(int timeCounter){
		ev3_motor_set_power(STEER,0);
		if(ev3_color_sensor_get_color(IR) != 6){
				ev3_motor_set_power(DRIVE_L,-10);
				ev3_motor_set_power(DRIVE_R,-10);
		}else{
				ev3_motor_set_power(DRIVE_L,0);
				ev3_motor_set_power(DRIVE_R,0);
			return 1;
		}
		return 0;
}
void Arbitrator::update_sensor_data() {
	sensor_data->touch_left = ev3_touch_sensor_is_pressed(sensors->TLEFT_P);
	sensor_data->touch_right = ev3_touch_sensor_is_pressed(sensors->TRIGHT_P);
	sensor_data->color = ev3_color_sensor_get_color(sensors->COLOR_P);
	sensor_data->ultrasonic = ev3_ultrasonic_sensor_get_distance(sensors->ULTRA_P);
}
void main_task(intptr_t unused) {
	int grey = (BLACK+WHITE)/2;
	int white_side = (BLACK+WHITE*2)/3;
	int black_side = (BLACK*3+WHITE)/4;
	int light = 0;
	int count = 0;
	unsigned int timeCounter = 1;
	int flag = 0;
	float turn_angle = 0.0;
	int distace = 0;
	int dflag = 0;

	pid *my_pid = pid_make(4.0, 0.2, 0.1, grey); //default pid 1.0 0.02 0.0
	pid *white_pid = pid_make(4.0, 0.2, 0.1, white_side);
	pid *black_pid = pid_make(4.0, 0.2, 0.1, black_side);

	turn_angle_structure *tas = turn_angle_constructor();

	ev3_lcd_fill_rect(0, 0, EV3_LCD_WIDTH, EV3_LCD_HEIGHT, EV3_LCD_WHITE);
	ev3_lcd_draw_string("EV3way ETRobcon 2015 KatLab", 0, CALIB_FONT_HEIGHT*1);
	ev3_lcd_draw_string("Ver.20150508", 0, CALIB_FONT_HEIGHT*2);
	ev3_lcd_draw_string("right side", 0, CALIB_FONT_HEIGHT*3);
    // Configure motors
  ev3_motor_config(STEER, LARGE_MOTOR);
  ev3_motor_config(DRIVE_L, LARGE_MOTOR);
  ev3_motor_config(DRIVE_R, LARGE_MOTOR);

    // Configure sensors
  ev3_sensor_config(IR, COLOR_SENSOR);
  ev3_sensor_config(TOUCH, TOUCH_SENSOR);
	ev3_sensor_config(GYRO, GYRO_SENSOR);

  ev3_led_set_color(LED_GREEN);

	ev3_motor_reset_counts(STEER);
	ev3_motor_reset_counts(DRIVE_L);
	ev3_motor_reset_counts(DRIVE_R);


	ev3_motor_set_power(STEER,0);


	ev3_gyro_sensor_reset(GYRO);

	while(!ev3_touch_sensor_is_pressed(TOUCH)){
	  //tslp_tsk(500); /* 500msec wait */
	}
	while(!ev3_button_is_pressed(BACK_BUTTON)){
	  light = ev3_color_sensor_get_reflect(IR);
	  count = ev3_motor_get_counts(STEER);

	  switch(changeStyle){
	  case 0://始めのカーブ差し掛かりまで
	    count = ev3_motor_get_counts(STEER);
	    forward = 55;
	    pid_input(my_pid, ev3_color_sensor_get_reflect(IR));
	    turn = (signed char) pid_get_output(*my_pid);

	    if(turn > 100){
	      turn = 100;
	    }else if(turn < -100){
	      turn = -100;
	    }

	    turn = -turn;

	    if(count<MAX_STEERING_ANGLE && count>-MAX_STEERING_ANGLE)
	      {
		ev3_motor_set_power(STEER, turn/2);
	      }else if(count<=-MAX_STEERING_ANGLE && turn>=0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else if(count>=MAX_STEERING_ANGLE && turn<0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else{
	      ev3_motor_stop(STEER, true);
	    }


	    if((ev3_motor_get_counts(DRIVE_L)+ev3_motor_get_counts(DRIVE_R))/2 < (-7300 + 2400)){
	      ev3_lcd_draw_string("changeStyle 1", 0, 70);
	      changeStyle = 1;
	    }

	    break;
	  case 1: //カーブ白より走行
	    count = ev3_motor_get_counts(STEER);
	    forward = 26;
	    pid_input(white_pid, ev3_color_sensor_get_reflect(IR));
	    turn = (signed char) pid_get_output(*white_pid);

	    if(turn > 0){
	      turn = turn*2;
	    }
	    if(turn > 100){
	      turn = 100;
	    }else if(turn < -100){
	      turn = -100;
	    }

	    turn = -turn;

	    if(count<MAX_STEERING_ANGLE && count>-MAX_STEERING_ANGLE)
	      {
		ev3_motor_set_power(STEER, turn/2);
	      }else if(count<=-MAX_STEERING_ANGLE && turn>=0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else if(count>=MAX_STEERING_ANGLE && turn<0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else{
	      ev3_motor_stop(STEER, true);
	    }


	    if((ev3_motor_get_counts(DRIVE_L)+ev3_motor_get_counts(DRIVE_R))/2 < (-9200 + 2400)){
	      changeStyle = 2;
	    }


	    break;
	  case 2://段差検知まで 黒より走行
	    count = ev3_motor_get_counts(STEER);
	    forward = 30;
	    pid_input(black_pid, ev3_color_sensor_get_reflect(IR));
	    turn = (signed char) pid_get_output(*black_pid);

	    if(turn < 0){
	      turn = turn*2;
	    }
	    if(turn > 100){
	      turn = 100;
	    }else if(turn < -100){
	      turn = -100;
	    }

	    turn = -turn;

	    if(count<MAX_STEERING_ANGLE && count>-MAX_STEERING_ANGLE)
	      {
		ev3_motor_set_power(STEER, turn/2);
	      }else if(count<=-MAX_STEERING_ANGLE && turn>=0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else if(count>=MAX_STEERING_ANGLE && turn<0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else{
	      ev3_motor_stop(STEER, true);
	    }


	    if(stepDetective(12)==1){
	      changeStyle = 3;
	      ev3_lcd_draw_string("changeStyle Now", 0, 70);
	      flag = 1;
	    }

	    break;
	  case 3://二本橋クリアする
	    if(bridge(timeCounter) == 1){
	      changeStyle = 13;
	    }
	    timeCounter++;
	    break;
	  case 4://止まる
	    if(ev3_color_sensor_get_color(IR) == 6 || ev3_color_sensor_get_color(IR) == 3){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	    }else{
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,-20);
	      ev3_motor_set_power(DRIVE_R,-20);
	    }
	    break;

	  case 5://バーコード終了後ライントレース
	    count = ev3_motor_get_counts(STEER);
	    forward = 25;
	    pid_input(my_pid, ev3_color_sensor_get_reflect(IR));
	    turn = (signed char) pid_get_output(*my_pid);

	    if(turn > 100){
	      turn = 100;
	    }else if(turn < -100){
	      turn = -100;
	    }

	    turn = -turn;

	    if(count<MAX_STEERING_ANGLE && count>-MAX_STEERING_ANGLE)
	      {
		ev3_motor_set_power(STEER, turn/2);
	      }else if(count<=-MAX_STEERING_ANGLE && turn>=0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else if(count>=MAX_STEERING_ANGLE && turn<0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else{
	      ev3_motor_stop(STEER, true);
	    }

	    if((ev3_motor_get_counts(DRIVE_L)+ev3_motor_get_counts(DRIVE_R))/2 < -300){
	      changeStyle = 6;
	      flag = 1;
	      ev3_motor_reset_counts(DRIVE_L);
	      ev3_motor_reset_counts(DRIVE_R);
	    }
	    break;
	  case 6://まっすぐ走る
	    ev3_motor_set_power(STEER,0);
	    ev3_motor_set_power(DRIVE_L,-40);
	    ev3_motor_set_power(DRIVE_R,-40);
	    if((ev3_motor_get_counts(DRIVE_L)+ev3_motor_get_counts(DRIVE_R))/2 < -750){
	      changeStyle = 7;
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	      timeCounter = 0;
	    }
	    break;

	  case 7://前輪を真横にする
	    if(timeCounter <= 9){
	      ev3_motor_rotate(STEER,90,50,true);
	    }else if(timeCounter > 9){
	      changeStyle = 8;
	      ev3_lcd_draw_string("changeStyle Now", 0, 70);
	      timeCounter = 0;
	    }
	    timeCounter++;
	    break;
	  case 8://車体を左向きに
	    turn_angle = turn_angle_detection(tas);
	    if(turn_angle >= -76.0){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,30);
	      ev3_motor_set_power(DRIVE_R,-20);
	    }else if(turn_angle < -76.0){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	      changeStyle = 9;
	    }
	    break;
	  case 9://前輪を戻す
	    ev3_motor_rotate(STEER,-900,50,true);
	    changeStyle = 10;
	    ev3_lcd_draw_string("changeStyle Now", 0, 70);
	    ev3_motor_reset_counts(DRIVE_L);
	    ev3_motor_reset_counts(DRIVE_R);
	    break;

	  case 10://使用未確定エリアに乗る
	    ev3_motor_set_power(DRIVE_L,-50);
	    ev3_motor_set_power(DRIVE_R,-50);
	    if((ev3_motor_get_counts(DRIVE_L)+ev3_motor_get_counts(DRIVE_R))/2 < -500){
	      timeCounter++;
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	    }
	    if(timeCounter >= 100){
	      timeCounter=0;
	      changeStyle=11;
	    }
	    break;
	  case 11://ウィリー走行に切り替え
	    if(tail_run(timeCounter) == 1){
	      changeStyle = 12;
	      timeCounter = 0;
	    }else{
	      timeCounter++;
	    }

	    break;

	  case 12://止まる
	    ev3_motor_set_power(STEER,0);
	    ev3_motor_set_power(DRIVE_L,0);
	    ev3_motor_set_power(DRIVE_R,0);
	    break;

	  case 13://ライン復帰
	    ev3_motor_rotate(STEER,940,50,true);
	    changeStyle = 14;
	    ev3_lcd_draw_string("changeStyle Now", 0, 70);
	    timeCounter = 1;
	    break;
	  case 14:
	    if(timeCounter < 37){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,30);
	      ev3_motor_set_power(DRIVE_R,-30);
	    }else if(timeCounter >= 37){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	      changeStyle = 15;
	      timeCounter = 0;
	    }timeCounter++;
	    break;
	  case 15:
	    ev3_motor_rotate(STEER,-1000,50,true);
	    changeStyle = 16;
	    ev3_lcd_draw_string("changeStyle Now", 0, 70);
	    break;
	  case 16:

	    ev3_motor_set_power(STEER,0);
	    if(timeCounter <= 20){
	      ev3_motor_set_power(DRIVE_L,15);
	      ev3_motor_set_power(DRIVE_R,15);
	    }else if(timeCounter > 20 && (timeCounter -20) /60 % 2 == 1){
	      ev3_motor_set_power(DRIVE_L,15);
	      ev3_motor_set_power(DRIVE_R,15);
	    }else if(timeCounter > 20 && (timeCounter - 20) /60 % 2 == 0){
	      ev3_motor_set_power(DRIVE_L,-15);
	      ev3_motor_set_power(DRIVE_R,-15);
	    }
	    timeCounter++;
	    if(ev3_color_sensor_get_color(IR) == 1){
	      changeStyle = 30;
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	      timeCounter = 0;
	    }
	    break;
	  case 17:
	    ev3_motor_rotate(STEER,830,50,true);
	    changeStyle = 18;
	    ev3_lcd_draw_string("changeStyle Now", 0, 70);
	    break;
	  case 18:
	    if(ev3_color_sensor_get_reflect(IR) > white_side){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,-6);
	      ev3_motor_set_power(DRIVE_R,6);
	    }else if(ev3_color_sensor_get_reflect(IR) < white_side){
	      ev3_motor_set_power(STEER,0);
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	      changeStyle = 19;
	    }
	    break;
	  case 19:
	    ev3_motor_rotate(STEER,-950,40,true);
	    changeStyle = 20;
	    ev3_lcd_draw_string("changeStyle Now", 0, 70);
	    break;
	  case 20:
	    ev3_motor_set_power(STEER,0);
	    ev3_motor_set_power(DRIVE_L,-17);
	    ev3_motor_set_power(DRIVE_R,-15);
	    if(ev3_color_sensor_get_color(IR) == 1){
	      changeStyle = 21;
	      flag = 0;
	      ev3_motor_reset_counts(DRIVE_L);
	      ev3_motor_reset_counts(DRIVE_R);
	    }
	    break;
	  case 21:
	    count = ev3_motor_get_counts(STEER);
	    forward = 14;
	    pid_input(my_pid, ev3_color_sensor_get_reflect(IR));
	    turn = (signed char) pid_get_output(*my_pid);

	    if(turn > 100){
	      turn = 100;
	    }else if(turn < -100){
	      turn = -100;
	    }


	    if(count<MAX_STEERING_ANGLE && count>-MAX_STEERING_ANGLE)
	      {
		ev3_motor_set_power(STEER, turn/2);
	      }else if(count<=-MAX_STEERING_ANGLE && turn>=0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else if(count>=MAX_STEERING_ANGLE && turn<0){
	      ev3_motor_set_power(STEER, turn/2);
	    }else{
	      ev3_motor_stop(STEER, true);
	    }

	    if((ev3_motor_get_counts(DRIVE_L)+ev3_motor_get_counts(DRIVE_R))/2 < -3000){
	      changeStyle = 5;
	      ev3_motor_reset_counts(DRIVE_L);
	      ev3_motor_reset_counts(DRIVE_R);
	    }

	    break;
	  case 30:
	    ev3_motor_set_power(STEER,0);
	    if(timeCounter <= 65){
	      ev3_motor_set_power(DRIVE_L,-17);
	      ev3_motor_set_power(DRIVE_R,-17);
	    }else if(timeCounter > 65 && timeCounter <= 120){
	      ev3_motor_set_power(DRIVE_L,0);
	      ev3_motor_set_power(DRIVE_R,0);
	    }else if(timeCounter > 120){
	      changeStyle = 17;
	      timeCounter = 0;
	    }			timeCounter++;
	  default:

	    break;
	  }
	  if(flag==0){
	    ev3_motor_steer(DRIVE_L, DRIVE_R, -forward, -turn);
	  }

	  tslp_tsk(10); /* 10msec wait */

	}

	ev3_motor_stop(STEER, false);
	ev3_motor_stop(DRIVE_L, false);
	ev3_motor_stop(DRIVE_R, false);

	ext_tsk();
}