package jp.ac.fit.asura.nao.strategy.permanent; import jp.ac.fit.asura.nao.Effector; import jp.ac.fit.asura.nao.RobotContext; import jp.ac.fit.asura.nao.SensorContext; import jp.ac.fit.asura.nao.Switch; import jp.ac.fit.asura.nao.communication.RoboCupGameControlData; import jp.ac.fit.asura.nao.communication.RobotInfo; import jp.ac.fit.asura.nao.communication.TeamInfo; import jp.ac.fit.asura.nao.event.RoboCupMessageListener; import jp.ac.fit.asura.nao.misc.AverageFilter; import jp.ac.fit.asura.nao.misc.Filter.BooleanFilter; import jp.ac.fit.asura.nao.motion.Motions; import jp.ac.fit.asura.nao.strategy.GameState; import jp.ac.fit.asura.nao.strategy.StrategyContext; import jp.ac.fit.asura.nao.strategy.StrategySystem; import jp.ac.fit.asura.nao.strategy.Task; import jp.ac.fit.asura.nao.strategy.Team; import org.apache.log4j.Logger; public class ManualSetupTask extends Task implements RoboCupMessageListener { private static final Logger log = Logger.getLogger(ManualSetupTask.class); private StrategySystem ss; private RobotContext robotContext; private BooleanFilter chestFilter; private BooleanFilter lFootFilter; private BooleanFilter rFootFilter; private Team lastTeam; private Team lastKickoff; private boolean lastPenalized; private GameState lastState; /** * */ public ManualSetupTask() { chestFilter = new AverageFilter.Boolean(6); lFootFilter = new AverageFilter.Boolean(10); rFootFilter = new AverageFilter.Boolean(10); } @Override public void init(RobotContext context) { context.getCommunication().addMessageListener(this); ss = context.getStrategy(); robotContext = context; } @Override public String getName() { return "ManualSetupTask"; } @Override public void update(RoboCupGameControlData gameData) { // gameData.debug(); if (gameData.getTeam((byte) Team.Red.toInt()).getTeamNumber() == robotContext .getTeamId()) ss.setTeam(Team.Red); if (gameData.getTeam((byte) Team.Blue.toInt()).getTeamNumber() == robotContext .getTeamId()) ss.setTeam(Team.Blue); if (robotContext.getTeamId() == gameData.getTeam( (byte) ss.getTeam().toInt()).getTeamNumber()) { // log.debug("teamId:" // + robotContext.getTeamId() // + " " // + gameData.getTeam((byte) ss.getTeam().toInt()) // .getTeamNumber()); TeamInfo team = gameData.getTeam((byte) ss.getTeam().toInt()); RobotInfo player = team.getPlayers()[ss.getContext().hasMotion( Motions.NAOJI_WALKER) ? (robotContext.getRobotId() - 1) : (robotContext.getRobotId())]; // log.debug("robotId:" + robotContext.getRobotId() + " penalty: " // + player.getPenalty()); boolean isPenalized = player.getPenalty() != 0; byte new_gs = gameData.getState(); GameState gs = ss.getGameState(); if (new_gs == RoboCupGameControlData.STATE_READY && (gs == GameState.INITIAL || gs == GameState.PLAYING)) { ss.setGameState(GameState.READY); } else if (new_gs == RoboCupGameControlData.STATE_SET && gs == GameState.READY) { ss.setGameState(GameState.SET); } else if (new_gs == RoboCupGameControlData.STATE_PLAYING && gs == GameState.SET) { ss.setGameState(GameState.PLAYING); } else if (new_gs == RoboCupGameControlData.STATE_FINISHED && gs == GameState.PLAYING) { ss.setGameState(GameState.FINISHED); } Effector e = robotContext.getEffector(); if (ss.getGameState() == GameState.PLAYING && lastPenalized != isPenalized) { if (isPenalized) { ss.setPenalized(true); log.info("I'm penalized by GameControler."); e.say("I'm penalized."); } else if (robotContext.getStrategy().isPenalized() && player.getSecsTillUnpenalised() == 0) { ss.setPenalized(false); log.info("I'm unpenalized by GameControler."); e.say("I'm unpenalized."); } } // score byte score = team.getScore(); ss.setOwnScore(score); // secsRemaining int remaining = gameData.getSecsRemaining(); ss.setSecsRemaining(remaining); byte kickOff = gameData.getKickOffTeam(); if (kickOff == RoboCupGameControlData.TEAM_BLUE) { ss.setKickOffTeam(Team.Blue); } else { ss.setKickOffTeam(Team.Red); } } } @Override public void before(StrategyContext context) { SensorContext sensor = context.getSensorContext(); boolean chestPushed = chestFilter.eval(sensor.getSwitch(Switch.Chest)); boolean lFootPushed = lFootFilter.eval(sensor .getSwitch(Switch.LFootLeft) && sensor.getSwitch(Switch.LFootRight)); boolean rFootPushed = rFootFilter.eval(sensor .getSwitch(Switch.RFootLeft) && sensor.getSwitch(Switch.RFootRight)); // TeamNumberによるチームの切り替え if (!chestFilter.isFilled()) chestPushed = false; if (!lFootFilter.isFilled()) lFootPushed = false; if (!rFootFilter.isFilled()) rFootPushed = false; if (chestPushed) chestFilter.clear(); if (lFootPushed) lFootFilter.clear(); if (rFootPushed) rFootFilter.clear(); Effector e = context.getSuperContext().getEffector(); // 胸ボタンによるステート変更 if (chestPushed) { if (context.getGameState() == GameState.INITIAL || context.getGameState() == GameState.PLAYING) { if (!context.isPenalized()) { context.setPenalized(true); log.info("I'm penalized by ChestButton."); e.say("I'm penalized."); } else { context.setPenalized(false); log.info("I'm unpenalized by ChestButton."); e.say("I'm unpenalized."); if (context.getGameState() != GameState.PLAYING) { context.setGameState(GameState.PLAYING); log.info("State changed by ChestButton PLAYING"); } } } context.getScheduler().abort(); } // if (chestPushed) { // if (context.getGameState() != GameState.PLAYING) { // switch (context.getGameState()) { // case INITIAL: // context.setGameState(GameState.READY); // log.info("State changed by ChestButton READY"); // break; // case READY: // context.setGameState(GameState.SET); // log.info("State changed by ChestButton SET"); // break; // case SET: // context.setGameState(GameState.PLAYING); // log.info("State changed by ChestButton PLAYING"); // break; // } // } else if (!context.isPenalized()) { // // ペナライズ(設定値は決めておいた方がいいかも) // context.setPenalized(true); // log.info("I'm penalized by ChestButton"); // e.say("I'm penalized."); // } else { // // アンペナライズ // context.setPenalized(false); // log.info("I'm unpenalized by ChestButton"); // e.say("I'm unpenalized."); // } // context.getScheduler().abort(); // } // チーム、キックオフの変更 if (context.getGameState() == GameState.INITIAL) { if (lFootPushed) { // チームと色替え if (context.getTeam() == Team.Red) ss.setTeam(Team.Blue); else ss.setTeam(Team.Red); log.info("Team color is changed by LeftBumper:" + context.getTeam()); e.say("We are " + context.getTeam().name() + " team."); } // if (rFootPushed) { // if (context.getKickOffTeam() == Team.Red) // context.setKickOffTeam(Team.Blue); // else // context.setKickOffTeam(Team.Red); // log.info("Kickoff is changed by RightBumper:" // + context.getKickOffTeam()); // e.say("We are " + context.getTeam().name() + " team."); // } } // LEDの表示など if (context.getTeam() != lastTeam) { lastTeam = context.getTeam(); if (lastTeam == Team.Red) { e.setLed("LFoot/Led/Red", 1.0f); e.setLed("LFoot/Led/Blue", 0.0f); e.setLed("LFoot/Led/Green", 0.0f); } if (lastTeam == Team.Blue) { e.setLed("LFoot/Led/Red", 0.0f); e.setLed("LFoot/Led/Blue", 1.0f); e.setLed("LFoot/Led/Green", 0.0f); } } if (context.getKickOffTeam() != lastKickoff) { lastKickoff = context.getKickOffTeam(); if (lastKickoff == context.getTeam()) { e.setLed("RFoot/Led/Red", 1.0f); e.setLed("RFoot/Led/Blue", 1.0f); e.setLed("RFoot/Led/Green", 1.0f); } else { e.setLed("RFoot/Led/Red", 0.0f); e.setLed("RFoot/Led/Blue", 0.0f); e.setLed("RFoot/Led/Green", 0.0f); } } if (context.getGameState() != lastState) { lastState = context.getGameState(); // LEDなど. 別のところでやるべき. float red; float blue; float green; String text = ""; switch (lastState) { case READY: red = green = 0.0f; blue = 1.0f; text = "Get ready."; break; case SET: // ちょっと赤がきつすぎる. red = 0.75f; green = 1.0f; blue = 0.0f; text = "Set."; break; case PLAYING: if (lastPenalized) { red = 1.0f; green = blue = 0.0f; } else { green = 1.0f; red = blue = 0.0f; } text = "Play!"; break; case FINISHED: text = "Finished."; case INITIAL: default: red = blue = green = 0.0f; break; } e.setLed("ChestBoard/Led/Red", red); e.setLed("ChestBoard/Led/Blue", blue); e.setLed("ChestBoard/Led/Green", green); e.say(text); } if (context.isPenalized() != lastPenalized) { lastPenalized = context.isPenalized(); float red; float blue; float green; if (lastPenalized) { red = 1.0f; green = blue = 0.0f; } else { green = 1.0f; red = blue = 0.0f; } e.setLed("ChestBoard/Led/Red", red); e.setLed("ChestBoard/Led/Blue", blue); e.setLed("ChestBoard/Led/Green", green); } } }