Esempio n. 1
0
void strat_prepare(void)
{
  //initalise kx factor
  robot_kx = TEAM_SIDE_VALUE(-1, 1);

  //send color to meca
  ROME_SENDWAIT_MECA_SET_ROBOT_COLOR(&rome_meca, robot_state.team == TEAM_GREEN);

  ROME_LOG(&rome_paddock,DEBUG,"Strat prepare");
  // initialize asserv
  ROME_SENDWAIT_ASSERV_ACTIVATE(&rome_asserv, 1);
  set_xya_wait(0,0,0);
  ROME_SENDWAIT_ASSERV_GOTO_XY(&rome_asserv, 0, 0, 0);
  ROME_SENDWAIT_ASSERV_SET_HTRAJ_XY_STEERING(&rome_asserv, 1.5, 0.03);
  ROME_SENDWAIT_ASSERV_SET_HTRAJ_XY_CRUISE(&rome_asserv, 15, 0.03);

  // autoset robot
  // x in starting area
  set_xya_wait(KX(0), 0, arfast(ROBOT_SIDE_BACK,TABLE_SIDE_MAIN));
  autoset(ROBOT_SIDE_BACK,AUTOSET_MAIN, KX(1500-AUTOSET_OFFSET), 0);
  goto_xya(KX(1000), 0, arfast(ROBOT_SIDE_BACK,TABLE_SIDE_MAIN));
  // y on building area
  goto_xya(KX(800), 400, arfast(ROBOT_SIDE_BACK,TABLE_SIDE_UP));
  autoset(ROBOT_SIDE_BACK,AUTOSET_UP, 0, 2000-AUTOSET_OFFSET);

  // check the state of the cylinder
  _wait_meca_ready();
  ROME_SENDWAIT_MECA_CMD(&rome_meca,ROME_ENUM_MECA_COMMAND_CHECK_EMPTY);

  //evade the border, leaving space for galipette
  goto_xya(KX(900), 1600, arfast(ROBOT_SIDE_BACK,TABLE_SIDE_UP));

  //go in front of starting area
  goto_xya(KX(1300), 1500, arfast(ROBOT_SIDE_BALLEATER,TABLE_SIDE_DOWN));

  //wait for meca to end checking cylinder
  _wait_meca_ready();
  if (!cylinder_is_empty()){
    _wait_meca_ready();
    ROME_SENDWAIT_MECA_CMD(&rome_meca,ROME_ENUM_MECA_COMMAND_TRASH_BEGINMATCH);
  }

  //wait for meca to end all orders before shutting down asserv
  _wait_meca_ready();

  ROME_SENDWAIT_ASSERV_ACTIVATE(&rome_asserv, 0);
  ROME_SENDWAIT_ASSERV_GYRO_INTEGRATION(&rome_asserv, 0);

}
Esempio n. 2
0
void strat_run(void)
{
  ROME_LOG(&rome_paddock,INFO,"Go !!!");
  ROME_SENDWAIT_ASSERV_GYRO_INTEGRATION(&rome_asserv, 1);
  ROME_SENDWAIT_ASSERV_ACTIVATE(&rome_asserv, 1);

  order_result_t or_take_water_near  = ORDER_FAILURE;
  order_result_t or_empty_water_near = ORDER_FAILURE;
  order_result_t or_take_water_far   = ORDER_FAILURE;
  order_result_t or_empty_water_far  = ORDER_FAILURE;

  while (!( or_take_water_near  == ORDER_SUCCESS &&
            or_take_water_far   == ORDER_SUCCESS &&
            or_empty_water_near == ORDER_SUCCESS &&
            or_empty_water_far  == ORDER_SUCCESS )  ){
    idle();

    if (or_take_water_near != ORDER_SUCCESS){
      or_take_water_near = take_water(DISPENSER_NEAR);
      or_empty_water_near = empty_cylinder();
    }

    //go to the middle to reset the Y axis
    if (goto_pathfinding_node(PATHFINDING_GRAPH_NODE_MIDDLE_BOT, arfast(ROBOT_SIDE_BACK,TABLE_SIDE_DOWN)) 
          == ORDER_SUCCESS){
      goto_xya(KX(0), 500, arfast(ROBOT_SIDE_BACK, TABLE_SIDE_DOWN));
      autoset(ROBOT_SIDE_BACK, AUTOSET_DOWN, 0, 250+AUTOSET_OFFSET);
      goto_xya(KX(0), 550, arfast(ROBOT_SIDE_BACK, TABLE_SIDE_DOWN));

    }
    //if oponent blocked us on the path to the middle, go back near starting area
    else {
      goto_pathfinding_node(PATHFINDING_GRAPH_NODE_WATER_TOWER, arfast(ROBOT_SIDE_BACK, TABLE_SIDE_DOWN));
    }

    if (or_take_water_far != ORDER_SUCCESS){
      or_take_water_far = take_water(DISPENSER_FAR);
      or_empty_water_far = empty_cylinder();
    }
  }

  ROME_LOG(&rome_paddock,INFO,"That's all folks !");
  idle_delay_ms(3000);
  ROME_SENDWAIT_ASSERV_ACTIVATE(&rome_asserv, 0);
  ROME_SENDWAIT_MECA_SET_POWER(&rome_meca, 0);
}
Esempio n. 3
0
void key_action(void)
{
  unsigned char i;
  i=init_key();
  delay_ad9833(50000);
  switch(i)
  {
  case 0:
    break;
  case 1://选择方波
    itswave=0;
    change_vol(itsvol);
    autoset(itswave,itsfreq);
    break;
  case 2://选择正弦波
    itswave=1;
    change_vol(itsvol);
    autoset(itswave,itsfreq);
    break;
  case 3://选择三角波
    itswave=2;
    change_vol(itsvol);
    autoset(itswave,itsfreq);
    break;
  case 4://恢复初始值
    itswave=1,itsfreq=100,itsvol=10;
    change_vol(itsvol);
    autoset(itswave,itsfreq);
    break;
  case 5://频率加(50hz)
    itsfreq+=50;
    if(itsfreq>=20000)
    {
      itsfreq=20000;
    }
    autoset(itswave,itsfreq);
    break;
  case 6://频率减(50hz)
    itsfreq-=50;
    if(itsfreq<=50)
    {
      itsfreq=50;
    }
    autoset(itswave,itsfreq);
    break;
  case 7://频率加(100hz)
    itsfreq+=100;
    if(itsfreq>=20000)
    {
      itsfreq=20000;
    }
    autoset(itswave,itsfreq);
    break;
  case 8://频率减(100hz)
    itsfreq-=100;
    if(itsfreq<=100)
    {
      itsfreq=100;
    }
    autoset(itswave,itsfreq);
    break;
    
  case 9://幅度加(0.1V)
    itsvol+=1;
    if(itsvol>=50)
    {
      itsvol=50;      
    }
    change_vol(itsvol);
    break;
  case 10://幅度减(0.1V)
    itsvol-=1;
    if(itsvol<=1)
    {
      itsvol=1;
    }
    change_vol(itsvol);
    break;
  case 11://幅度加(1V)
    itsvol+=10;
    if(itsvol>=50)
    {
      itsvol=50;      
    }
    change_vol(itsvol);
    break;   
  case 12://幅度减(1V)
    itsvol-=10;
    if(itsvol<=10)
    {
      itsvol=10;
    }
    change_vol(itsvol);
    break;  
  case 13:
    save();
    break;
  case 14:
    load();
    break;
  case 15:
    exit();
    break;
  case 16://频率加(1000hz)
    autoset_test(itswave,itsfreq/10);
//    break;
//    thanks();
    break;
  default:
    break;
  }
}
Esempio n. 4
0
order_result_t take_water(dispenser_t dispenser){
  order_result_t or;

  //save the amount of water we already have to check if we managed to "open" a dispenser
  uint8_t nb_empty = robot_state.cylinder_nb_empty;

  //dispenser positions
  int16_t near_pos = 2000-840;
  int16_t far_pos = -(1500-620);

  //balleater configuration
  int16_t balleater_depth = AUTOSET_OFFSET + 35;
  int16_t approach_depth = balleater_depth + 60;
  int16_t approach_side = 150;

  int16_t traj1[4];
  int16_t traj2[2];
  float angle;

  //prepare meca to take water
  _wait_meca_ready();
  ROME_SENDWAIT_MECA_CMD(&rome_meca,ROME_ENUM_MECA_COMMAND_PREPARE_LOAD_WATER);
  _wait_meca_ground_clear();

  set_speed(RS_FAST);

  switch(dispenser){
    case DISPENSER_NEAR:{
      ROME_LOG(&rome_paddock,DEBUG,"Going to start area dispenser");
      angle = arfast(ROBOT_SIDE_BALLEATER, TABLE_SIDE_MAIN);
      //send first position order
      or = goto_xya(KX(1200), near_pos + approach_side, angle);
      if (or!= ORDER_SUCCESS)
        return or;
      //prepare next move orders
      //dispenser near is alongside Y axis
      traj1[0] = KX(1500-approach_depth);
      traj1[1] = near_pos + approach_side;
      traj1[2] = KX(1500-(balleater_depth+10));
      traj1[3] = near_pos;

      traj2[0] = KX(1500-300);
      traj2[1] = near_pos;
      break;
    }
    case DISPENSER_FAR:{
      ROME_LOG(&rome_paddock,INFO,"Going to opposite dispenser");
      //send first position order
      //go to the bee corner to be near borders for autoset
      or = goto_pathfinding_node(PATHFINDING_GRAPH_NODE_OPPOSITE_BEE, arfast(ROBOT_SIDE_BALLEATER, TABLE_SIDE_AUX));
      if (or != ORDER_SUCCESS){
        ROME_LOG(&rome_paddock,INFO,"Aborting opposite dispenser");
        //go back in the middle
        goto_pathfinding_node(PATHFINDING_GRAPH_NODE_MIDDLE_BOT, arfast(ROBOT_SIDE_BACK, TABLE_SIDE_DOWN));
        return or;
      }
      //we did a very long move, so try to launch an autoset
      //or = goto_xya(KX(-1200), 150, arfast(ROBOT_SIDE_BACK, TABLE_SIDE_DOWN));
      //autoset(ROBOT_SIDE_BACK,AUTOSET_DOWN, 0, AUTOSET_OFFSET);
      or = goto_xya(KX(-1350), 300, arfast(ROBOT_SIDE_BALLEATER, TABLE_SIDE_AUX));
      autoset(ROBOT_SIDE_BALLEATER,AUTOSET_AUX, KX(-1500+AUTOSET_OFFSET), 0);
      or = goto_xya(KX(-1200), 300, arfast(ROBOT_SIDE_BALLEATER, TABLE_SIDE_AUX));
      //prepare next move orders
      //dispenser far is alongside X axis
      angle = arfast(ROBOT_SIDE_BALLEATER, TABLE_SIDE_DOWN);
      traj1[0] = KX(far_pos-approach_side);
      traj1[1] = approach_depth;
      traj1[2] = KX(far_pos);
      traj1[3] = balleater_depth-25;

      traj2[0] = KX(far_pos);
      traj2[1] = 500;
      break;
    }
    default:
      return ORDER_FAILURE;
  }

  set_speed(RS_SLOW);
  //go to dispenser
  or = goto_traj(traj1, angle);
  if (or!= ORDER_SUCCESS)
    return or;

  //take the water
  _wait_meca_ready();
  ROME_SENDWAIT_MECA_CMD(&rome_meca,ROME_ENUM_MECA_COMMAND_LOAD_WATER);
  _wait_meca_ground_clear();

  set_speed(RS_NORMAL);
  //just go back a little bit
  or = goto_traj(traj2, angle);

  //if the water in cylinder changed, we scored !
  if (nb_empty != robot_state.cylinder_nb_empty)
    update_score(10);

  set_speed(RS_NORMAL);
  return or;
}