Refactored BoatLocation message, encoders, decoders. It now exposes datatypes that we actually use in the program (double knots, bearings, etc..), instead of the bits-on-the-wire packed units (like int mmPerSec). Also documented it, and updated test.
issue #35 #36 #story[1095]
This commit is contained in:
@@ -2,12 +2,14 @@ package network.MessageDecoders;
|
||||
|
||||
|
||||
import network.Messages.BoatLocation;
|
||||
import network.Messages.Enums.BoatLocationDeviceEnum;
|
||||
import shared.model.Azimuth;
|
||||
import shared.model.Bearing;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import static network.Utils.ByteConverter.bytesToInt;
|
||||
import static network.Utils.ByteConverter.bytesToLong;
|
||||
import static network.Utils.ByteConverter.bytesToShort;
|
||||
import static network.Utils.AC35UnitConverter.*;
|
||||
import static network.Utils.ByteConverter.*;
|
||||
|
||||
|
||||
/**
|
||||
@@ -45,96 +47,110 @@ public class BoatLocationDecoder {
|
||||
*/
|
||||
private void decode() {
|
||||
|
||||
byte[] messageVersionNumber = Arrays.copyOfRange(encodedMessage, 0, 1);
|
||||
byte numMessageVersionNumber = messageVersionNumber[0];
|
||||
byte[] messageVersionNumberBytes = Arrays.copyOfRange(encodedMessage, 0, 1);
|
||||
byte messageVersionNumber = messageVersionNumberBytes[0];
|
||||
|
||||
byte[] time = Arrays.copyOfRange(encodedMessage, 1, 7);
|
||||
long numTime = bytesToLong(time);
|
||||
byte[] timeBytes = Arrays.copyOfRange(encodedMessage, 1, 7);
|
||||
long time = bytesToLong(timeBytes);
|
||||
|
||||
byte[] sourceID = Arrays.copyOfRange(encodedMessage, 7, 11);
|
||||
int numSourceID = bytesToInt(sourceID);
|
||||
byte[] sourceIDBytes = Arrays.copyOfRange(encodedMessage, 7, 11);
|
||||
int sourceID = bytesToInt(sourceIDBytes);
|
||||
|
||||
byte[] seqNum = Arrays.copyOfRange(encodedMessage, 11, 15);
|
||||
int numSeqNum = bytesToInt(seqNum);
|
||||
byte[] seqNumBytes = Arrays.copyOfRange(encodedMessage, 11, 15);
|
||||
int seqNum = bytesToInt(seqNumBytes);
|
||||
|
||||
byte[] deviceType = Arrays.copyOfRange(encodedMessage, 15, 16);
|
||||
byte numDeviceType = deviceType[0];
|
||||
byte[] deviceTypeBytes = Arrays.copyOfRange(encodedMessage, 15, 16);
|
||||
BoatLocationDeviceEnum deviceType = BoatLocationDeviceEnum.fromByte(deviceTypeBytes[0]);
|
||||
|
||||
byte[] latitude = Arrays.copyOfRange(encodedMessage, 16, 20);
|
||||
int numLatitude = bytesToInt(latitude);
|
||||
byte[] latitudeBytes = Arrays.copyOfRange(encodedMessage, 16, 20);
|
||||
int numLatitude = bytesToInt(latitudeBytes);
|
||||
double latitude = unpackGPS(numLatitude);
|
||||
|
||||
byte[] longitude = Arrays.copyOfRange(encodedMessage, 20, 24);
|
||||
int numLongitude = bytesToInt(longitude);
|
||||
byte[] longitudeBytes = Arrays.copyOfRange(encodedMessage, 20, 24);
|
||||
int numLongitude = bytesToInt(longitudeBytes);
|
||||
double longitude = unpackGPS(numLongitude);
|
||||
|
||||
byte[] altitude = Arrays.copyOfRange(encodedMessage, 24, 28);
|
||||
int numAltitude = bytesToInt(altitude);
|
||||
byte[] altitudeBytes = Arrays.copyOfRange(encodedMessage, 24, 28);
|
||||
int numAltitude = bytesToInt(altitudeBytes);
|
||||
|
||||
byte[] heading = Arrays.copyOfRange(encodedMessage, 28, 30);
|
||||
int numHeading = bytesToInt(heading);
|
||||
byte[] headingBytes = Arrays.copyOfRange(encodedMessage, 28, 30);
|
||||
int numHeading = bytesToInt(headingBytes);
|
||||
Bearing heading = Bearing.fromDegrees(unpackHeading(numHeading));
|
||||
|
||||
byte[] pitch = Arrays.copyOfRange(encodedMessage, 30, 32);
|
||||
short numPitch = bytesToShort(pitch);
|
||||
byte[] pitchBytes = Arrays.copyOfRange(encodedMessage, 30, 32);
|
||||
short numPitch = bytesToShort(pitchBytes);
|
||||
|
||||
byte[] roll = Arrays.copyOfRange(encodedMessage, 32, 34);
|
||||
short numRoll = bytesToShort(roll);
|
||||
byte[] rollBytes = Arrays.copyOfRange(encodedMessage, 32, 34);
|
||||
short numRoll = bytesToShort(rollBytes);
|
||||
|
||||
byte[] boatSpeed = Arrays.copyOfRange(encodedMessage, 34, 36);
|
||||
int numBoatSpeed = bytesToInt(boatSpeed);
|
||||
byte[] boatSpeedBytes = Arrays.copyOfRange(encodedMessage, 34, 36);
|
||||
int numBoatSpeed = bytesToInt(boatSpeedBytes);
|
||||
double boatSpeedKnots = unpackMMperSecToKnots(numBoatSpeed);
|
||||
|
||||
byte[] cog = Arrays.copyOfRange(encodedMessage, 36, 38);
|
||||
int numCog = bytesToInt(cog);
|
||||
byte[] cogBytes = Arrays.copyOfRange(encodedMessage, 36, 38);
|
||||
int numCog = bytesToInt(cogBytes);
|
||||
Bearing cog = Bearing.fromDegrees(unpackHeading(numCog));
|
||||
|
||||
byte[] sog = Arrays.copyOfRange(encodedMessage, 38, 40);
|
||||
int numSog = bytesToInt(sog);
|
||||
byte[] sogBytes = Arrays.copyOfRange(encodedMessage, 38, 40);
|
||||
int numSog = bytesToInt(sogBytes);
|
||||
double sogKnots = unpackMMperSecToKnots(numSog);
|
||||
|
||||
byte[] apparentWindSpeed = Arrays.copyOfRange(encodedMessage, 40, 42);
|
||||
int numApparentWindSpeed = bytesToInt(apparentWindSpeed);
|
||||
byte[] apparentWindSpeedBytes = Arrays.copyOfRange(encodedMessage, 40, 42);
|
||||
int numApparentWindSpeed = bytesToInt(apparentWindSpeedBytes);
|
||||
double apparentWindSpeedKnots = unpackMMperSecToKnots(numApparentWindSpeed);
|
||||
|
||||
byte[] apparentWindAngle = Arrays.copyOfRange(encodedMessage, 42, 44);
|
||||
short numApparentWindAngle = bytesToShort(apparentWindAngle);
|
||||
byte[] apparentWindAngleBytes = Arrays.copyOfRange(encodedMessage, 42, 44);
|
||||
short numApparentWindAngle = bytesToShort(apparentWindAngleBytes);
|
||||
Azimuth apparentWindAngle = Azimuth.fromDegrees(unpackTrueWindAngle(numApparentWindAngle));
|
||||
|
||||
byte[] trueWindSpeed = Arrays.copyOfRange(encodedMessage, 44, 46);
|
||||
int numTrueWindSpeed = bytesToInt(trueWindSpeed);
|
||||
byte[] trueWindSpeedBytes = Arrays.copyOfRange(encodedMessage, 44, 46);
|
||||
int numTrueWindSpeed = bytesToInt(trueWindSpeedBytes);
|
||||
double trueWindSpeedKnots = unpackMMperSecToKnots(numTrueWindSpeed);
|
||||
|
||||
byte[] trueWindDirection = Arrays.copyOfRange(encodedMessage, 46, 48);
|
||||
short numTrueWindDirection = bytesToShort(trueWindDirection);
|
||||
byte[] trueWindDirectionBytes = Arrays.copyOfRange(encodedMessage, 46, 48);
|
||||
short numTrueWindDirection = bytesToShort(trueWindDirectionBytes);
|
||||
Bearing trueWindDirection = Bearing.fromDegrees(unpackHeading(numTrueWindDirection));
|
||||
|
||||
byte[] trueWindAngle = Arrays.copyOfRange(encodedMessage, 48, 50);
|
||||
short numTrueWindAngle = bytesToShort(trueWindAngle);
|
||||
byte[] trueWindAngleBytes = Arrays.copyOfRange(encodedMessage, 48, 50);
|
||||
short numTrueWindAngle = bytesToShort(trueWindAngleBytes);
|
||||
Azimuth trueWindAngle = Azimuth.fromDegrees(unpackTrueWindAngle(numTrueWindAngle));
|
||||
|
||||
byte[] currentDrift = Arrays.copyOfRange(encodedMessage, 50, 52);
|
||||
int numCurrentDrift = bytesToInt(currentDrift);
|
||||
byte[] currentDriftBytes = Arrays.copyOfRange(encodedMessage, 50, 52);
|
||||
int numCurrentDrift = bytesToInt(currentDriftBytes);
|
||||
double currentDriftKnots = unpackMMperSecToKnots(numCurrentDrift);
|
||||
|
||||
byte[] currentSet = Arrays.copyOfRange(encodedMessage, 52, 54);
|
||||
int numCurrentSet = bytesToShort(currentSet);
|
||||
byte[] currentSetBytes = Arrays.copyOfRange(encodedMessage, 52, 54);
|
||||
int numCurrentSet = bytesToShort(currentSetBytes);
|
||||
Bearing currentSet = Bearing.fromDegrees(unpackHeading(numCurrentSet));
|
||||
|
||||
byte[] rudderAngle = Arrays.copyOfRange(encodedMessage, 54, 56);
|
||||
short numRudderAngle = bytesToShort(rudderAngle);
|
||||
byte[] rudderAngleBytes = Arrays.copyOfRange(encodedMessage, 54, 56);
|
||||
short numRudderAngle = bytesToShort(rudderAngleBytes);
|
||||
Azimuth rudderAngle = Azimuth.fromDegrees(unpackTrueWindAngle(numRudderAngle));
|
||||
|
||||
|
||||
message = new BoatLocation(
|
||||
numMessageVersionNumber,
|
||||
numTime,
|
||||
numSourceID,
|
||||
numSeqNum,
|
||||
numDeviceType,
|
||||
numLatitude,
|
||||
numLongitude,
|
||||
messageVersionNumber,
|
||||
time,
|
||||
sourceID,
|
||||
seqNum,
|
||||
deviceType,
|
||||
latitude,
|
||||
longitude,
|
||||
numAltitude,
|
||||
numHeading,
|
||||
heading,
|
||||
numPitch,
|
||||
numRoll,
|
||||
numBoatSpeed,
|
||||
numCog,
|
||||
numSog,
|
||||
numApparentWindSpeed,
|
||||
numApparentWindAngle,
|
||||
numTrueWindSpeed,
|
||||
numTrueWindDirection,
|
||||
numTrueWindAngle,
|
||||
numCurrentDrift,
|
||||
numCurrentSet,
|
||||
numRudderAngle );
|
||||
boatSpeedKnots,
|
||||
cog,
|
||||
sogKnots,
|
||||
apparentWindSpeedKnots,
|
||||
apparentWindAngle,
|
||||
trueWindSpeedKnots,
|
||||
trueWindDirection,
|
||||
trueWindAngle,
|
||||
currentDriftKnots,
|
||||
currentSet,
|
||||
rudderAngle );
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user