diff --git a/racevisionGame/src/main/java/network/BinaryMessageDecoder.java b/racevisionGame/src/main/java/network/BinaryMessageDecoder.java index 1c34ca85..ecc6b2f3 100644 --- a/racevisionGame/src/main/java/network/BinaryMessageDecoder.java +++ b/racevisionGame/src/main/java/network/BinaryMessageDecoder.java @@ -193,6 +193,10 @@ public class BinaryMessageDecoder { AverageWindDecoder awDecoder = new AverageWindDecoder(messageBody); return awDecoder.getAverageWind(); + case BOATACTION: + BoatActionDecoder baDecoder = new BoatActionDecoder(messageBody); + return new BoatAction(baDecoder.getBoatAction()); + default: //System.out.println("Broken Message!"); //throw new InvalidMessageException("Broken message! Did not recognise message type: " + headerMessageType + "."); diff --git a/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java new file mode 100644 index 00000000..bf2076b5 --- /dev/null +++ b/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java @@ -0,0 +1,20 @@ +package network.MessageDecoders; + +import network.Messages.Enums.BoatActionEnum; + +import java.util.Arrays; + +public class BoatActionDecoder { + byte byteBoatAction; + BoatActionEnum boatAction; + + public BoatActionDecoder(byte[] encodedBoatAction) { + byteBoatAction = encodedBoatAction[0]; + + boatAction = BoatActionEnum.fromByte(byteBoatAction); + } + + public BoatActionEnum getBoatAction() { + return boatAction; + } +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java b/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java index 0808d16d..4c57cf0c 100644 --- a/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java +++ b/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java @@ -339,4 +339,11 @@ public class RaceVisionByteEncoder { return result.array(); } + public static byte[] boatActionMessage(BoatAction boatAction){ + ByteBuffer boatActionMessage = ByteBuffer.allocate(1); + boatActionMessage.put(intToBytes(boatAction.getBoatAction(), 1)); + byte [] result = boatActionMessage.array(); + return result; + } + } diff --git a/racevisionGame/src/main/java/network/Messages/BoatAction.java b/racevisionGame/src/main/java/network/Messages/BoatAction.java new file mode 100644 index 00000000..d20943a5 --- /dev/null +++ b/racevisionGame/src/main/java/network/Messages/BoatAction.java @@ -0,0 +1,22 @@ +package network.Messages; + +import network.Messages.Enums.BoatActionEnum; +import network.Messages.Enums.MessageType; + +/** + * Created by David on 10/07/2017. + */ +public class BoatAction extends AC35Data { + + private byte boatAction; + + public BoatAction(BoatActionEnum boatAction){ + super(MessageType.BOATACTION); + this.boatAction = boatAction.getValue(); + } + + public byte getBoatAction() { + return boatAction; + } + +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java b/racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java new file mode 100644 index 00000000..84f6e0fd --- /dev/null +++ b/racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java @@ -0,0 +1,71 @@ +package network.Messages.Enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * Boat actions + */ +public enum BoatActionEnum { + NOT_A_STATUS(-1), + AUTO_PILOT(1), + SAILS_IN(2), + SAILS_OUT(3), + TACK_GYBE(4), + UPWIND(5), + DOWNWIND(6); + + private byte value; + + /** + * Ctor. Creates a BoatActionEnum from a given primitive integer value, cast to a byte. + * @param value Integer, which is cast to byte, to construct from. + */ + private BoatActionEnum(int value) { + this.value = (byte) value; + } + + /** + * Returns the primitive value of the enum. + * @return Primitive value of the enum. + */ + public byte getValue() { + return value; + } + + + /** + * Stores a mapping between Byte values and BoatActionEnum values. + */ + private static final Map byteToStatusMap = new HashMap<>(); + + + /* + Static initialization block. Initializes the byteToStatusMap. + */ + static { + for (BoatActionEnum type : BoatActionEnum.values()) { + BoatActionEnum.byteToStatusMap.put(type.value, type); + } + } + + + /** + * Returns the enumeration value which corresponds to a given byte value. + * @param boatActionEnum Byte value to convert to a BoatActionEnum value. + * @return The BoatActionEnum value which corresponds to the given byte value. + */ + public static BoatActionEnum fromByte(byte boatActionEnum) { + //Gets the corresponding MessageType from the map. + BoatActionEnum type = BoatActionEnum.byteToStatusMap.get(boatActionEnum); + + if (type == null) { + //If the byte value wasn't found, return the NOT_A_STATUS boatActionEnum. + return BoatActionEnum.NOT_A_STATUS; + } else { + //Otherwise, return the boatActionEnum. + return type; + } + + } +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index 0981f570..69940a15 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -1,6 +1,9 @@ package visualiser.gameController; import network.BinaryMessageEncoder; +import network.MessageEncoders.RaceVisionByteEncoder; +import network.Messages.BoatAction; +import network.Messages.Enums.BoatActionEnum; import network.Messages.Enums.MessageType; import visualiser.gameController.Keys.ControlKey; @@ -46,12 +49,18 @@ public class ControllerClient { public void sendKey(ControlKey key) throws IOException { int protocolCode = key.getProtocolCode(); if(protocolCode > -1) { - ByteBuffer buffer = ByteBuffer.allocate(4); - buffer.putInt(protocolCode); - byte[] message = new byte[]{buffer.get(3)}; - BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, message); - //outputStream.write(binaryMessage.getFullMessage()); - System.out.println("Binary message constructed"); + + byte[] bytes = new byte[4]; + ByteBuffer.wrap(bytes).putInt(key.getProtocolCode()); + + BoatAction boatAction = new BoatAction(BoatActionEnum.fromByte(bytes[3])); + + byte[] encodedBoatAction = RaceVisionByteEncoder.boatActionMessage(boatAction); + + BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, System.currentTimeMillis(), 0, + (short) encodedBoatAction.length, encodedBoatAction); + + outputStream.write(binaryMessage.getFullMessage()); } } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index 2e391d2a..67e9c4c0 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -1,5 +1,8 @@ package visualiser.gameController; +import network.BinaryMessageDecoder; +import network.MessageDecoders.BoatActionDecoder; +import network.Messages.Enums.BoatActionEnum; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; @@ -39,10 +42,15 @@ public class ControllerServer implements Runnable { @Override public void run() { while(true) { - byte[] key = new byte[16]; + byte[] message = new byte[20]; try { - inputStream.read(key); - // TODO - handle messages received + if (inputStream.available() > 0) { + inputStream.read(message); + BinaryMessageDecoder encodedMessage = new BinaryMessageDecoder(message); + BoatActionDecoder boatActionDecoder = new BoatActionDecoder(encodedMessage.getMessageBody()); + BoatActionEnum decodedMessage = boatActionDecoder.getBoatAction(); + int key = decodedMessage.getValue(); + } } catch (IOException e) { e.printStackTrace(); }