diff --git a/src/main/java/seng302/Networking/MessageDecoders/RaceStartStatus.java b/src/main/java/seng302/Networking/MessageDecoders/RaceStartStatus.java deleted file mode 100644 index b1f893c2..00000000 --- a/src/main/java/seng302/Networking/MessageDecoders/RaceStartStatus.java +++ /dev/null @@ -1,25 +0,0 @@ -package seng302.Networking.MessageDecoders; - -import java.util.Arrays; - -/** - * Created by hba56 on 21/04/17. - */ -public class RaceStartStatus { - byte messageVersion; - byte[] timestamp; - byte[] ackNumber; - byte[] raceStartTime; - byte[] raceIdentifier; - byte notificationType; - - public RaceStartStatus(byte[] encodedRaceStartStatus) { - messageVersion = encodedRaceStartStatus[0]; - timestamp = Arrays.copyOfRange(encodedRaceStartStatus, 1, 7); - ackNumber = Arrays.copyOfRange(encodedRaceStartStatus, 7, 9); - raceStartTime = Arrays.copyOfRange(encodedRaceStartStatus, 9, 15); - raceIdentifier = Arrays.copyOfRange(encodedRaceStartStatus, 15, 19); - notificationType = encodedRaceStartStatus[19]; - - } -} diff --git a/src/main/java/seng302/Networking/MessageDecoders/RaceStartStatusDecoder.java b/src/main/java/seng302/Networking/MessageDecoders/RaceStartStatusDecoder.java new file mode 100644 index 00000000..76179872 --- /dev/null +++ b/src/main/java/seng302/Networking/MessageDecoders/RaceStartStatusDecoder.java @@ -0,0 +1,102 @@ +package seng302.Networking.MessageDecoders; + +import seng302.Model.BoatInRace; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by hba56 on 21/04/17. + */ +public class RaceStartStatusDecoder { + private byte messageVersion; + private byte[] timestamp; + private byte[] ackNumber; + private byte[] raceStartTime; + private byte[] raceIdentifier; + private byte notificationType; + + private long time; + private short ack; + private long startTime; + private int raceID; + private char notification; + + + public RaceStartStatusDecoder(byte[] encodedRaceStartStatus) { + messageVersion = encodedRaceStartStatus[0]; + timestamp = Arrays.copyOfRange(encodedRaceStartStatus, 1, 7); + ackNumber = Arrays.copyOfRange(encodedRaceStartStatus, 7, 9); + raceStartTime = Arrays.copyOfRange(encodedRaceStartStatus, 9, 15); + raceIdentifier = Arrays.copyOfRange(encodedRaceStartStatus, 15, 19); + notificationType = encodedRaceStartStatus[19]; + + time = bytesToLong(timestamp); + ack = bytesToShort(ackNumber); + startTime = bytesToLong(raceStartTime); + raceID = bytesToInt(raceIdentifier); + notification = byteToChar(notificationType); + } + + private char byteToChar(byte bytesInt){ + ByteBuffer byteBuffer = ByteBuffer.allocate(4); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.put((byte)0); + byteBuffer.put(bytesInt); + char num = byteBuffer.getChar(0); + return num; + } + + private short bytesToShort(byte[] bytesShort){ + ByteBuffer wrapped = ByteBuffer.wrap(bytesShort); + short num = wrapped.getShort(); + return num; + } + + private int bytesToInt(byte[] bytesInt){ + ByteBuffer wrapped = ByteBuffer.wrap(bytesInt); + int num = wrapped.getInt(); + return num; + } + + private long bytesToLong(byte[] bytesLong){ + ByteBuffer byteBuffer = ByteBuffer.allocate(8); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.put((byte)0); + byteBuffer.put((byte)0); + byteBuffer.put(bytesLong[0]); + byteBuffer.put(bytesLong[1]); + byteBuffer.put(bytesLong[2]); + byteBuffer.put(bytesLong[3]); + byteBuffer.put(bytesLong[4]); + byteBuffer.put(bytesLong[5]); + long longVal = byteBuffer.getLong(0); + return longVal; + } + + public byte getMessageVersion() { + return messageVersion; + } + + public long getTime() { + return time; + } + + public short getAck() { + return ack; + } + + public long getStartTime() { + return startTime; + } + + public int getRaceID() { + return raceID; + } + + public char getNotification() { + return notification; + } +} diff --git a/src/main/java/seng302/Networking/RaceVisionByteEncoder.java b/src/main/java/seng302/Networking/RaceVisionByteEncoder.java index aec05dbe..5e5f0915 100644 --- a/src/main/java/seng302/Networking/RaceVisionByteEncoder.java +++ b/src/main/java/seng302/Networking/RaceVisionByteEncoder.java @@ -108,7 +108,7 @@ public class RaceVisionByteEncoder { byte[] ackNumber = convert(ack, 2); byte[] raceStartTime = convert(startTime, 6); int raceIdentifier = raceID; - char notificationType = notification; + byte[] notificationType = convert(notification, 1); ByteBuffer result = ByteBuffer.allocate(20); result.put(convert(messageVersion, 1)); @@ -116,7 +116,7 @@ public class RaceVisionByteEncoder { result.put(ackNumber); result.put(raceStartTime); result.putInt(raceIdentifier); - result.putChar(notificationType); + result.put(notificationType); return result.array(); } diff --git a/src/test/java/seng302/Networking/MessageDecoders/RaceStartStatusDecoderTest.java b/src/test/java/seng302/Networking/MessageDecoders/RaceStartStatusDecoderTest.java new file mode 100644 index 00000000..d27fb5f0 --- /dev/null +++ b/src/test/java/seng302/Networking/MessageDecoders/RaceStartStatusDecoderTest.java @@ -0,0 +1,30 @@ +package seng302.Networking.MessageDecoders; + +import org.junit.Assert; +import org.junit.Test; +import seng302.Networking.RaceVisionByteEncoder; + +/** + * Created by hba56 on 23/04/17. + */ +public class RaceStartStatusDecoderTest { + @Test + public void getByteArrayTest(){ + long time = System.currentTimeMillis(); + + RaceVisionByteEncoder raceVisionByteEncoder = new RaceVisionByteEncoder(); + long time2 = System.currentTimeMillis(); + byte[] encodedRaceStartStatus = raceVisionByteEncoder.raceStartStatus(time, (short)1, + time2, 2, (char)3); + + RaceStartStatusDecoder testDecoder = new RaceStartStatusDecoder(encodedRaceStartStatus); + + Assert.assertEquals(0b1, testDecoder.getMessageVersion()); + Assert.assertEquals(time, testDecoder.getTime()); + Assert.assertEquals(1, testDecoder.getAck()); + Assert.assertEquals(time2, testDecoder.getStartTime()); + Assert.assertEquals(2, testDecoder.getRaceID()); + Assert.assertEquals((char)3, testDecoder.getNotification()); + + } +}