You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.4 KiB
120 lines
3.4 KiB
package seng302.Networking.MessageDecoders;
|
|
|
|
import seng302.Networking.Utils.BoatStatus;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
|
|
import static seng302.Networking.Utils.ByteConverter.*;
|
|
|
|
/**
|
|
* Created by hba56 on 21/04/17.
|
|
*/
|
|
public class RaceStatusDecoder {
|
|
private byte versionNum;
|
|
private byte[] timeBytes;
|
|
private byte[] raceID;
|
|
private byte raceStatus;
|
|
private byte[] expectedStart;
|
|
private byte[] raceWind;
|
|
private byte[] windSpeed;
|
|
private byte numBoats;
|
|
private byte bytesRaceType;
|
|
private byte[] boatsBytes;
|
|
|
|
private long time;
|
|
private int race;
|
|
private int raceState;
|
|
private long startTime;
|
|
private short raceWindDir;
|
|
private short raceWindSpeed;
|
|
private int numberOfBoats;
|
|
private int raceType;
|
|
private ArrayList<BoatStatus> boats = new ArrayList<>();
|
|
|
|
|
|
public RaceStatusDecoder(byte[] encodedRaceStatus){
|
|
versionNum = encodedRaceStatus[0];
|
|
timeBytes = Arrays.copyOfRange(encodedRaceStatus, 1, 7);
|
|
raceID = Arrays.copyOfRange(encodedRaceStatus, 7, 11);
|
|
raceStatus = encodedRaceStatus[11];
|
|
expectedStart = Arrays.copyOfRange(encodedRaceStatus, 12, 18);
|
|
raceWind = Arrays.copyOfRange(encodedRaceStatus, 18, 20);
|
|
windSpeed = Arrays.copyOfRange(encodedRaceStatus, 20, 22);
|
|
numBoats = encodedRaceStatus[22];
|
|
bytesRaceType = encodedRaceStatus[23];
|
|
boatsBytes = Arrays.copyOfRange(encodedRaceStatus, 24, 25+20*this.numBoats);
|
|
|
|
time = bytesToLong(timeBytes);
|
|
race = bytesToInt(raceID);
|
|
raceState = bytesToInt(raceStatus);
|
|
startTime = bytesToLong(expectedStart);
|
|
raceWindDir = bytesToShort(raceWind);
|
|
raceWindSpeed = bytesToShort(windSpeed);
|
|
numberOfBoats = bytesToInt(numBoats);
|
|
|
|
int boatLoopIndex = 0;
|
|
|
|
for (int i=0; i < numberOfBoats; i++) {
|
|
byte[] boatBytes = Arrays.copyOfRange(boatsBytes, boatLoopIndex, boatLoopIndex+20);
|
|
|
|
byte[] sourceID = Arrays.copyOfRange(boatBytes, 1, 5);
|
|
byte boatStatus = boatBytes[5];
|
|
byte legNumber = boatBytes[6];
|
|
byte numPenaltiesAwarded = boatBytes[7];
|
|
byte numPenaltiesServed = boatBytes[8];
|
|
byte[] estTimeAtNextMark = Arrays.copyOfRange(boatBytes, 9, 15);
|
|
byte[] estTimeAtFinish = Arrays.copyOfRange(boatBytes, 15, 20);
|
|
|
|
BoatStatus boat = new BoatStatus(bytesToInt(sourceID),boatStatus,
|
|
legNumber, numPenaltiesAwarded, numPenaltiesServed,
|
|
bytesToLong(estTimeAtNextMark), bytesToLong(estTimeAtFinish));
|
|
|
|
boats.add(boat);
|
|
boatLoopIndex += 20;
|
|
}
|
|
}
|
|
|
|
public byte getVersionNum() {
|
|
return versionNum;
|
|
}
|
|
|
|
public long getTime() {
|
|
return time;
|
|
}
|
|
|
|
public int getRace() {
|
|
return race;
|
|
}
|
|
|
|
public int getRaceState() {
|
|
return raceState;
|
|
}
|
|
|
|
public long getStartTime() {
|
|
return startTime;
|
|
}
|
|
|
|
public short getRaceWindDir() {
|
|
return raceWindDir;
|
|
}
|
|
|
|
public short getRaceWindSpeed() {
|
|
return raceWindSpeed;
|
|
}
|
|
|
|
public int getNumberOfBoats() {
|
|
return numberOfBoats;
|
|
}
|
|
|
|
public int getRaceType() {
|
|
return raceType;
|
|
}
|
|
|
|
public ArrayList<BoatStatus> getBoats() {
|
|
return boats;
|
|
}
|
|
}
|