Refactored AverageWindDecoder - it now implements MessageDecoder. Refactored AverageWind - it now uses milliseconds and knots, instead of packed MMperSec and tenths of a second. It also exposes its attributes now. Added (un)packAverageWindPeriod to AC35UnitConverter. Added AverageWindDecoderTest. issue #35 #36 #story[1095]main
parent
ce63f58429
commit
da800e659a
@ -1,56 +1,103 @@
|
||||
package network.MessageDecoders;
|
||||
|
||||
|
||||
import network.Messages.AC35Data;
|
||||
import network.Messages.AverageWind;
|
||||
import network.Utils.ByteConverter;
|
||||
|
||||
import static network.Utils.AC35UnitConverter.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
* Decodes {@link AverageWind} messages.
|
||||
*/
|
||||
public class AverageWindDecoder {
|
||||
byte messageVersionNumber;
|
||||
byte[] byteTime;
|
||||
byte[] byteRawPeriod;
|
||||
byte[] byteRawSpeed;
|
||||
byte[] bytePeriod2;
|
||||
byte[] byteSpeed2;
|
||||
byte[] bytePeriod3;
|
||||
byte[] byteSpeed3;
|
||||
byte[] bytePeriod4;
|
||||
byte[] byteSpeed4;
|
||||
|
||||
AverageWind averageWind;
|
||||
|
||||
public AverageWindDecoder(byte[] encodedAverageWind) {
|
||||
messageVersionNumber = encodedAverageWind[0];
|
||||
byteTime = Arrays.copyOfRange(encodedAverageWind, 1, 7);
|
||||
byteRawPeriod = Arrays.copyOfRange(encodedAverageWind, 7, 9);
|
||||
byteRawSpeed = Arrays.copyOfRange(encodedAverageWind, 9, 11);
|
||||
bytePeriod2 = Arrays.copyOfRange(encodedAverageWind, 11, 13);
|
||||
byteSpeed2 = Arrays.copyOfRange(encodedAverageWind, 13, 15);
|
||||
bytePeriod3 = Arrays.copyOfRange(encodedAverageWind, 15, 17);
|
||||
byteSpeed3 = Arrays.copyOfRange(encodedAverageWind, 17, 19);
|
||||
bytePeriod4 = Arrays.copyOfRange(encodedAverageWind, 19, 21);
|
||||
byteSpeed4 = Arrays.copyOfRange(encodedAverageWind, 21, 23);
|
||||
|
||||
int msgNum = ByteConverter.bytesToInt(messageVersionNumber);
|
||||
long lngTime = ByteConverter.bytesToLong(byteTime);
|
||||
public class AverageWindDecoder implements MessageDecoder {
|
||||
|
||||
/**
|
||||
* The encoded message.
|
||||
*/
|
||||
private byte[] encodedMessage;
|
||||
|
||||
/**
|
||||
* The decoded message.
|
||||
*/
|
||||
private AverageWind message;
|
||||
|
||||
|
||||
|
||||
public AverageWindDecoder() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public AC35Data decode(byte[] encodedMessage) {
|
||||
this.encodedMessage = encodedMessage;
|
||||
|
||||
|
||||
byte messageVersionNumber = encodedMessage[0];
|
||||
|
||||
|
||||
byte[] byteTime = Arrays.copyOfRange(encodedMessage, 1, 7);
|
||||
long time = ByteConverter.bytesToLong(byteTime);
|
||||
|
||||
byte[] byteRawPeriod = Arrays.copyOfRange(encodedMessage, 7, 9);
|
||||
int intRawPeriod = ByteConverter.bytesToInt(byteRawPeriod);
|
||||
long rawPeriod = unpackAverageWindPeriod(intRawPeriod);
|
||||
|
||||
byte[] byteRawSpeed = Arrays.copyOfRange(encodedMessage, 9, 11);
|
||||
int intRawSpeed = ByteConverter.bytesToInt(byteRawSpeed);
|
||||
double rawSpeedKnots = unpackMMperSecToKnots(intRawSpeed);
|
||||
|
||||
byte[] bytePeriod2 = Arrays.copyOfRange(encodedMessage, 11, 13);
|
||||
int intPeriod2 = ByteConverter.bytesToInt(bytePeriod2);
|
||||
long period2 = unpackAverageWindPeriod(intPeriod2);
|
||||
|
||||
byte[] byteSpeed2 = Arrays.copyOfRange(encodedMessage, 13, 15);
|
||||
int intSpeed2 = ByteConverter.bytesToInt(byteSpeed2);
|
||||
double speed2Knots = unpackMMperSecToKnots(intSpeed2);
|
||||
|
||||
byte[] bytePeriod3 = Arrays.copyOfRange(encodedMessage, 15, 17);
|
||||
int intPeriod3 = ByteConverter.bytesToInt(bytePeriod3);
|
||||
long period3 = unpackAverageWindPeriod(intPeriod3);
|
||||
|
||||
byte[] byteSpeed3 = Arrays.copyOfRange(encodedMessage, 17, 19);
|
||||
int intSpeed3 = ByteConverter.bytesToInt(byteSpeed3);
|
||||
double speed3Knots = unpackMMperSecToKnots(intSpeed3);
|
||||
|
||||
byte[] bytePeriod4 = Arrays.copyOfRange(encodedMessage, 19, 21);
|
||||
int intPeriod4 = ByteConverter.bytesToInt(bytePeriod4);
|
||||
long period4 = unpackAverageWindPeriod(intPeriod4);
|
||||
|
||||
byte[] byteSpeed4 = Arrays.copyOfRange(encodedMessage, 21, 23);
|
||||
int intSpeed4 = ByteConverter.bytesToInt(byteSpeed4);
|
||||
double speed4Knots = unpackMMperSecToKnots(intSpeed4);
|
||||
|
||||
|
||||
|
||||
|
||||
message = new AverageWind(
|
||||
messageVersionNumber,
|
||||
time,
|
||||
rawPeriod,
|
||||
rawSpeedKnots,
|
||||
period2,
|
||||
speed2Knots,
|
||||
period3,
|
||||
speed3Knots,
|
||||
period4,
|
||||
speed4Knots );
|
||||
|
||||
this.averageWind = new AverageWind(msgNum, lngTime, intRawPeriod, intRawSpeed, intPeriod2, intSpeed2, intPeriod3, intSpeed3, intPeriod4, intSpeed4);
|
||||
return message;
|
||||
|
||||
}
|
||||
|
||||
public AverageWind getAverageWind() {
|
||||
return averageWind;
|
||||
/**
|
||||
* Returns the decoded message.
|
||||
* @return The decoded message.
|
||||
*/
|
||||
public AverageWind getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,86 @@
|
||||
package network.MessageEncoders;
|
||||
|
||||
|
||||
import network.Messages.AC35Data;
|
||||
import network.Messages.AverageWind;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import static network.Utils.AC35UnitConverter.*;
|
||||
import static network.Utils.ByteConverter.intToBytes;
|
||||
import static network.Utils.ByteConverter.longToBytes;
|
||||
|
||||
/**
|
||||
* This encoder can encode a {@link AverageWind} message.
|
||||
*/
|
||||
public class AverageWindEncoder implements MessageEncoder {
|
||||
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public AverageWindEncoder() {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public byte[] encode(AC35Data message) {
|
||||
|
||||
//Downcast.
|
||||
AverageWind averageWind = (AverageWind) message;
|
||||
|
||||
|
||||
byte messageVersionNumber = averageWind.getMessageVersionNumber();
|
||||
|
||||
long time = averageWind.getTime();
|
||||
byte[] byteTime = longToBytes(time,6);
|
||||
|
||||
long rawPeriod = averageWind.getRawPeriod();
|
||||
int rawPeriodInt = packAverageWindPeriod(rawPeriod);
|
||||
byte[] byteRawPeriod = intToBytes(rawPeriodInt, 2);
|
||||
|
||||
double rawSampleSpeed = averageWind.getRawSpeedKnots();
|
||||
int rawSampleSpeedInt = packKnotsToMMperSec(rawSampleSpeed);
|
||||
byte[] byteRawSpeed = intToBytes(rawSampleSpeedInt, 2);
|
||||
|
||||
long period2 = averageWind.getSampleTwoPeriod();
|
||||
int period2Int = packAverageWindPeriod(period2);
|
||||
byte[] bytePeriod2 = intToBytes(period2Int, 2);
|
||||
|
||||
double speed2 = averageWind.getSampleTwoSpeedKnots();
|
||||
int speed2Int = packKnotsToMMperSec(speed2);
|
||||
byte[] byteSpeed2 = intToBytes(speed2Int, 2);
|
||||
|
||||
long period3 = averageWind.getSampleThreePeriod();
|
||||
int period3Int = packAverageWindPeriod(period3);
|
||||
byte[] bytePeriod3 = intToBytes(period3Int, 2);
|
||||
|
||||
double speed3 = averageWind.getSampleThreeSpeedKnots();
|
||||
int speed3Int = packKnotsToMMperSec(speed3);
|
||||
byte[] byteSpeed3 = intToBytes(speed3Int, 2);
|
||||
|
||||
long period4 = averageWind.getSampleFourPeriod();
|
||||
int period4Int = packAverageWindPeriod(period4);
|
||||
byte[] bytePeriod4 = intToBytes(period4Int, 2);
|
||||
|
||||
double speed4 = averageWind.getSampleFourSpeedKnots();
|
||||
int speed4Int = packKnotsToMMperSec(speed4);
|
||||
byte[] byteSpeed4 = intToBytes(speed4Int, 2);
|
||||
|
||||
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(23);
|
||||
result.put(messageVersionNumber);
|
||||
result.put(byteTime);
|
||||
result.put(byteRawPeriod);
|
||||
result.put(byteRawSpeed);
|
||||
result.put(bytePeriod2);
|
||||
result.put(byteSpeed2);
|
||||
result.put(bytePeriod3);
|
||||
result.put(byteSpeed3);
|
||||
result.put(bytePeriod4);
|
||||
result.put(byteSpeed4);
|
||||
return result.array();
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,75 @@
|
||||
package network.MessageDecoders;
|
||||
|
||||
import network.MessageEncoders.RaceVisionByteEncoder;
|
||||
import network.Messages.AverageWind;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
import shared.model.Bearing;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Test for the AverageWind encoder and decoder
|
||||
*/
|
||||
public class AverageWindDecoderTest {
|
||||
|
||||
|
||||
/**
|
||||
* Creates a AverageWind message, encodes it, decodes it, and checks that the result matches the starting message.
|
||||
* @throws Exception if test fails.
|
||||
*/
|
||||
@Test
|
||||
public void averageWindEncodeDecodeTest() throws Exception {
|
||||
|
||||
AverageWind averageWind = new AverageWind(
|
||||
AverageWind.currentMessageVersionNumber,
|
||||
System.currentTimeMillis(),
|
||||
3000,
|
||||
12.5,
|
||||
4050,
|
||||
12.6,
|
||||
3055,
|
||||
12.7,
|
||||
6051,
|
||||
13.37
|
||||
);
|
||||
|
||||
byte[] encodedMessage = RaceVisionByteEncoder.encode(averageWind);
|
||||
|
||||
AverageWindDecoder averageWindDecoder = new AverageWindDecoder();
|
||||
averageWindDecoder.decode(encodedMessage);
|
||||
AverageWind averageWindDecoded = averageWindDecoder.getMessage();
|
||||
|
||||
compareAverageWindMessages(averageWind, averageWindDecoded);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compares two AverageWind messages to check that they are equal.
|
||||
* @param original The original AverageWind message.
|
||||
* @param decoded The decoded AverageWind message.
|
||||
*/
|
||||
public static void compareAverageWindMessages(AverageWind original, AverageWind decoded) {
|
||||
|
||||
|
||||
assertEquals(original.getMessageVersionNumber(), decoded.getMessageVersionNumber());
|
||||
assertEquals(original.getTime(), decoded.getTime());
|
||||
|
||||
assertEquals(original.getRawPeriod(), decoded.getRawPeriod(), 100);
|
||||
assertEquals(original.getRawSpeedKnots(), decoded.getRawSpeedKnots(), 0.01);
|
||||
|
||||
assertEquals(original.getSampleTwoPeriod(), decoded.getSampleTwoPeriod(), 100);
|
||||
assertEquals(original.getSampleTwoSpeedKnots(), decoded.getSampleTwoSpeedKnots(), 0.01);
|
||||
|
||||
assertEquals(original.getSampleThreePeriod(), decoded.getSampleThreePeriod(), 100);
|
||||
assertEquals(original.getSampleThreeSpeedKnots(), decoded.getSampleThreeSpeedKnots(), 0.01);
|
||||
|
||||
assertEquals(original.getSampleFourPeriod(), decoded.getSampleFourPeriod(), 100);
|
||||
assertEquals(original.getSampleFourSpeedKnots(), decoded.getSampleFourSpeedKnots(), 0.01);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in new issue