package jp.ac.fit.asura.nao.communication; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import jp.ac.fit.asura.nao.DatagramService; import jp.ac.fit.asura.nao.communication.messages.AsuraMessage; import jp.ac.fit.asura.nao.communication.messages.AsuraMessage.Type; import jp.ac.fit.asura.nao.localization.WorldObject; import jp.ac.fit.asura.nao.localization.WorldObjects; import jp.ac.fit.asura.nao.motion.Motions; import jp.ac.fit.asura.nao.strategy.Role; import jp.ac.fit.asura.nao.strategy.StrategyContext; /** * ストラテジ協調の送信クラス. * * @author takata * */ public class AsuraLinkStrategySendData extends AsuraLinkSendData { private Logger log = Logger.getLogger(AsuraLinkStrategySendData.class); private StrategyContext context; /** ペナルティ状態 */ private boolean isPenalty = false; /** ポジション */ private Role role = Role.Striker; /** メッセージタイプ */ private static AsuraMessage.Type type; /** 1メッセージあたりのByte長 */ private static int messageLength; public AsuraLinkStrategySendData(StrategyContext context) { super(context); this.context = context; type = Type.STRATEGY; // メッセージタイプはSTRATEGY messageLength = 10; } @Override void createData() { log.trace("creating StrategySendData... by number " + sender + " of Team" + context.getSuperContext().getTeamId()); // 送信用ByteBufferをクリアする clearBuf(); if (context.hasMotion(Motions.NAOJI_WALKER)) sender = context.getSuperContext().getRobotId(); else sender = context.getSuperContext().getRobotId() + 1; sendData.putInt(sender); updateData(); // ペナルティ状態, ポジションを最新状態にする //試しにデータ長をput //sendData.putInt(100); // データをセット putSendTime(); // 送信時刻 putMessageNum(1); // メッセージ数.今は便宜的に1.今後複数のメッセージを送るなら、何かしらの処理が要る. putMessageType(type); // メッセージタイプ // Roleをput sendData.putInt(role.getRoleNum()); // ペナルティ状態をput if (isPenalty) { sendData.putInt(1); } else { sendData.putInt(0); } // WorldObjectのデータをputする for (WorldObjects type : WorldObjects.values()) { WorldObject wo = context.getSuperContext().getLocalization().get(type); sendData.putInt(type.getWorldObjectsNum()); // WorldObjectの種類 sendData.putInt(wo.getConfidence()); // 信頼度 sendData.putInt(wo.getX()); // チーム座標系でのX座標 sendData.putInt(wo.getY()); // チーム座標系でのY座標 sendData.putInt(wo.getDistance()); // 距離 sendData.putFloat(wo.getHeading()); // Heading sendData.putLong(wo.getDifftime()); // 最後に認識してからの時間[ms] if (wo.getType() == WorldObjects.Self) sendData.putFloat(wo.getYaw()); // Yaw姿勢(Selfのみ) } // データ長を計算してputする putDataLength(); } /** * クラスのデータで現在値で更新する. */ private void updateData() { isPenalty = context.isPenalized(); role = context.getRole(); } /** * ストラテジデータを送信する. */ public void send() { createData(); // 送信用ByteBufferにデータを格納する super.send(); } }