/* * 作成日: 2008/06/29 */ package jp.ac.fit.asura.nao.communication; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import jp.ac.fit.asura.nao.RobotContext; import jp.ac.fit.asura.nao.communication.messages.AsuraMessage; import jp.ac.fit.asura.nao.communication.messages.AsuraMessage.Type; import org.apache.log4j.Logger; /** * @author $Author: sey $ * * @version $Id: AsuraLink.java 709 2008-11-23 07:40:31Z sey $ * */ public class AsuraLink { private static final int PACKET_MAGIC = 'a'; private Logger log = Logger.getLogger(AsuraLink.class); private RobotContext robotContext; private AsuraLinkStrategyReceiveData rcvData; public AsuraLink(RobotContext context) { this.robotContext = context; } public boolean hasValidHeader(byte[] b) { if (b.length > 8) { // LE, Little endian return b[0] == PACKET_MAGIC && b[1] == 0 && b[2] == 0 && b[3] == 0; } return false; } public void parse(byte[] bytes) { assert hasValidHeader(bytes); ByteBuffer buf = ByteBuffer.wrap(bytes); buf.order(ByteOrder.LITTLE_ENDIAN); // read magic packet int magic = buf.getInt(); assert magic == PACKET_MAGIC; // read data length int dataLength = buf.getInt(); assert buf.remaining() == dataLength; // if (dataLength != buf.remaining()) { // log.error("Corrupted message received. length:" + dataLength + " (" + buf.remaining() + ")"); // } try { LOOP1: while (true) { log.trace("parse message."); int sender = buf.getInt(); long frame = buf.getLong(); int numMessage = buf.getInt(); log.trace("parse data. length:" + dataLength + " sender:" + sender + " frame:" + frame + " numMessage:" + numMessage); for (int i = 0; i < numMessage; i++) { AsuraMessage.Type type = AsuraMessage.Type.toType(buf .getInt()); switch (type) { case NONE: break; case PENALTY: break; case STATUS: break; case STRATEGY: rcvData = robotContext.getCommunication().getStrategyReceiveData(); log.trace("Strategy packet received!!"); rcvData.parseBuf(buf, sender, frame); break; case WMOBJECT: break; default: { log.error("Unknown message type:" + type); break LOOP1; } } } break; } } catch (BufferUnderflowException e) { log.error("Message parse error.", e); } } }