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.
127 lines
3.8 KiB
127 lines
3.8 KiB
package network.MessageEncoders;
|
|
|
|
|
|
import network.Exceptions.InvalidMessageException;
|
|
import network.Exceptions.InvalidMessageTypeException;
|
|
import network.Messages.*;
|
|
|
|
import static network.Utils.ByteConverter.*;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
|
|
|
|
/**
|
|
* Created by fwy13 on 19/04/17.
|
|
*/
|
|
public class RaceVisionByteEncoder {
|
|
|
|
|
|
|
|
|
|
public static byte[] displayTextMessage(RaceMessage[] message){
|
|
//ByteBuffer result = ByteBuffer.allocate(4 + numLines * 32);
|
|
int messageVersionNumber = 0b1;//version number
|
|
short ackNum = 0;//no clue what this does just a placeholder for 2 bytes.
|
|
byte[] messLines = intToBytes(message.length, 1);
|
|
|
|
// result.putInt(messageVersionNumber);
|
|
// result.putShort(ackNum);
|
|
// result.put(messLines);
|
|
|
|
ArrayList<byte[]> messages = new ArrayList<byte[]>();
|
|
int size = 4;
|
|
|
|
for (int i = 0; i < message.length; i ++){
|
|
int messageLen = message[i].getMessageText().getBytes().length;
|
|
byte[] messageAsBytes = message[i].getMessageText().getBytes();
|
|
if (messageLen < 30){
|
|
messageLen = 30;
|
|
}
|
|
ByteBuffer mess = ByteBuffer.allocate(2 + messageLen);
|
|
mess.put(intToBytes(message[i].getLineNumber(), 1));
|
|
mess.put(intToBytes(messageLen, 1));
|
|
for (int j = 0; j < messageLen; j ++){
|
|
mess.put(messageAsBytes[j]);
|
|
}
|
|
messages.add(mess.array());
|
|
size += 2 + messageLen;
|
|
}
|
|
|
|
ByteBuffer result = ByteBuffer.allocate(size);
|
|
result.put(intToBytes(messageVersionNumber, 1));
|
|
result.putShort(ackNum);
|
|
result.put(messLines);
|
|
|
|
for(byte[] mess: messages){
|
|
result.put(mess);
|
|
}
|
|
|
|
return result.array();
|
|
}
|
|
|
|
public static byte[] yachtEventCode(long time, short acknowledgeNumber, int raceID, int destSourceID, int incidentID,
|
|
int eventID){
|
|
int messageVersion = 0b10;
|
|
byte[] encodeTime = longToBytes(time, 6);
|
|
short ackNum = acknowledgeNumber;
|
|
int raceUID = raceID;//TODO chekc if this is an into for a 4 char string.
|
|
int destSource = destSourceID;
|
|
int incident = incidentID;
|
|
byte[] event = intToBytes(eventID, 1);
|
|
|
|
ByteBuffer result = ByteBuffer.allocate(22);
|
|
result.put(intToBytes(messageVersion, 1));
|
|
result.put(encodeTime);
|
|
result.putShort(ackNum);
|
|
result.put(intToBytes(raceUID));
|
|
result.put(intToBytes(destSource));
|
|
result.put(intToBytes(incident));
|
|
result.put(event);
|
|
return result.array();
|
|
}
|
|
|
|
public static byte[] chatterText(int messageType, String message){
|
|
int messageVersion = 0b1;
|
|
byte[] type = intToBytes(messageType, 1);
|
|
byte[] text = message.getBytes();
|
|
byte[] length = intToBytes(text.length, 1);
|
|
|
|
ByteBuffer result = ByteBuffer.allocate(3 + text.length);
|
|
result.put(intToBytes(messageVersion, 1));
|
|
result.put(type);
|
|
result.put(length);
|
|
result.put(text);
|
|
|
|
return result.array();
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Encodes a given message.
|
|
* @param message Message to encode.
|
|
* @return Encoded message.
|
|
* @throws InvalidMessageException If the message cannot be encoded.
|
|
*/
|
|
public static byte[] encode(AC35Data message) throws InvalidMessageException {
|
|
|
|
MessageEncoder encoder = null;
|
|
try {
|
|
encoder = EncoderFactory.create(message.getType());
|
|
} catch (InvalidMessageTypeException e) {
|
|
throw new InvalidMessageException("Could not create encoder for MessageType: " + message.getType(), e);
|
|
}
|
|
|
|
byte[] encodedMessage = encoder.encode(message);
|
|
|
|
return encodedMessage;
|
|
}
|
|
|
|
|
|
}
|