mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Created AC35 Streaming server
- Sends heartbeat messages every 5 seconds - Sends XML at beginning Tags: #story[29]
This commit is contained in:
@@ -5,6 +5,7 @@ import javafx.fxml.FXMLLoader;
|
|||||||
import javafx.scene.Parent;
|
import javafx.scene.Parent;
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
import seng302.server.ServerThread;
|
||||||
|
|
||||||
public class App extends Application
|
public class App extends Application
|
||||||
{
|
{
|
||||||
@@ -18,6 +19,7 @@ public class App extends Application
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
new ServerThread("Racevision Test Server");
|
||||||
launch(args);
|
launch(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
package seng302.server;
|
||||||
|
|
||||||
|
import seng302.server.messages.Heartbeat;
|
||||||
|
import seng302.server.messages.Message;
|
||||||
|
import seng302.server.messages.XMLMessage;
|
||||||
|
import seng302.server.messages.XMLMessageSubType;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
public class ServerThread implements Runnable{
|
||||||
|
private Thread runner;
|
||||||
|
private StreamingServerSocket server;
|
||||||
|
private final int HEARTBEAT_PERIOD = 5000;
|
||||||
|
private final int PORT_NUMBER = 8085;
|
||||||
|
|
||||||
|
public ServerThread(String threadName){
|
||||||
|
runner = new Thread(this, threadName);
|
||||||
|
System.out.println("Spawning Server Thread");
|
||||||
|
runner.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns an XML Message from the file specified
|
||||||
|
* @param fileName The source XML file
|
||||||
|
* @param type The XML Message type
|
||||||
|
* @return The XML Message
|
||||||
|
*/
|
||||||
|
public Message getXmlMessage(String fileName, XMLMessageSubType type){
|
||||||
|
String fileContents = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fileContents = new String(Files.readAllBytes(Paths.get(this.getClass().getResource(fileName).getPath().substring(1))));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileContents != null){
|
||||||
|
return new XMLMessage(fileContents, type, server.getSequenceNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try{
|
||||||
|
server = new StreamingServerSocket(PORT_NUMBER);
|
||||||
|
}
|
||||||
|
catch (IOException e){
|
||||||
|
System.err.println("Failed to bind socket: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Load and send race XML data
|
||||||
|
Message raceData = getXmlMessage("/server_config/race.xml", XMLMessageSubType.RACE);
|
||||||
|
Message boatData = getXmlMessage("/server_config/boats.xml", XMLMessageSubType.BOAT);
|
||||||
|
Message regatta = getXmlMessage("/server_config/regatta.xml", XMLMessageSubType.REGATTA);
|
||||||
|
|
||||||
|
if (raceData != null){
|
||||||
|
server.send(raceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (boatData != null){
|
||||||
|
server.send(boatData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regatta != null){
|
||||||
|
server.send(regatta);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timer to send the heartbeat
|
||||||
|
Timer t = new Timer();
|
||||||
|
t.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Message hb = new Heartbeat(server.getSequenceNumber());
|
||||||
|
try {
|
||||||
|
server.send(hb);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0, HEARTBEAT_PERIOD);
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.err.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package seng302.server;
|
||||||
|
|
||||||
|
import seng302.server.messages.Message;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class StreamingServerSocket {
|
||||||
|
private java.net.ServerSocket socket;
|
||||||
|
private Socket client;
|
||||||
|
private List<Socket> clients;
|
||||||
|
private short seqNum;
|
||||||
|
|
||||||
|
StreamingServerSocket(int port) throws IOException{
|
||||||
|
socket = new java.net.ServerSocket(port);
|
||||||
|
clients = new ArrayList<>();
|
||||||
|
socket.setSoTimeout(10000);
|
||||||
|
seqNum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void start(){
|
||||||
|
System.out.println("Listening For Connections");
|
||||||
|
try {
|
||||||
|
client = socket.accept();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.getMessage();
|
||||||
|
}
|
||||||
|
if (client == null){
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
System.out.println("client connected from " + client.getInetAddress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void send(Message message) throws IOException{
|
||||||
|
if (client == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DataOutputStream outputStream = new DataOutputStream(client.getOutputStream());
|
||||||
|
message.send(outputStream);
|
||||||
|
|
||||||
|
seqNum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getSequenceNumber(){
|
||||||
|
return seqNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package seng302.server.messages;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class Header {
|
||||||
|
// From API spec
|
||||||
|
private final int syncByte1 = 0x47;
|
||||||
|
private final int syncByte2 = 0x83;
|
||||||
|
|
||||||
|
private MessageType messageType;
|
||||||
|
private int timeStamp;
|
||||||
|
private int sourceId;
|
||||||
|
private short messageLength;
|
||||||
|
private static final int MESSAGE_LEN = 15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message Header from section 3.2 of the AC35 Streaming
|
||||||
|
* Data spec
|
||||||
|
* @param messageType The type of the message following this header
|
||||||
|
* @param sourceId The message source (as defined in the spec)
|
||||||
|
* @param messageLength The length of the message following this header
|
||||||
|
*/
|
||||||
|
public Header(MessageType messageType, int sourceId, Short messageLength){
|
||||||
|
this.messageType = messageType;
|
||||||
|
this.sourceId = sourceId;
|
||||||
|
this.messageLength = messageLength;
|
||||||
|
timeStamp = (int) (System.currentTimeMillis() / 1000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a ByteBuffer containing the message header
|
||||||
|
*/
|
||||||
|
public ByteBuffer getByteBuffer(){
|
||||||
|
ByteBuffer buff = ByteBuffer.allocate(15);
|
||||||
|
|
||||||
|
// Sync Byte 1, 1 byte
|
||||||
|
buff.put(ByteBuffer.allocate(1).put((byte)syncByte1).array());
|
||||||
|
buff.position(1);
|
||||||
|
|
||||||
|
// Sync Byte 2, 1 byte
|
||||||
|
buff.put(ByteBuffer.allocate(1).put((byte)syncByte2).array());
|
||||||
|
buff.position(2);
|
||||||
|
|
||||||
|
// Message Type, 1 byte
|
||||||
|
buff.put(ByteBuffer.allocate(1).put((byte)messageType.getCode()).array());
|
||||||
|
buff.position(3);
|
||||||
|
|
||||||
|
// Timestamp, 6 bytes
|
||||||
|
int x = ((int) Integer.toUnsignedLong(6));
|
||||||
|
buff.put(ByteBuffer.allocate(6).putInt(timeStamp).array());
|
||||||
|
buff.position(9);
|
||||||
|
|
||||||
|
// Source ID, 4 bytes
|
||||||
|
buff.put(ByteBuffer.allocate(4).putInt(sourceId).array());
|
||||||
|
buff.position(13);
|
||||||
|
|
||||||
|
// Message Length, 2 bytes
|
||||||
|
buff.put(ByteBuffer.allocate(2).putShort(messageLength).array());
|
||||||
|
buff.position(15);
|
||||||
|
|
||||||
|
return buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the size of this message
|
||||||
|
* @return the size of the message
|
||||||
|
*/
|
||||||
|
public static Integer getSize(){
|
||||||
|
return MESSAGE_LEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package seng302.server.messages;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.zip.CRC32;
|
||||||
|
|
||||||
|
public class Heartbeat extends Message {
|
||||||
|
private final int MESSAGE_SIZE = 4;
|
||||||
|
private int seqNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Heartbeat from the AC35 Streaming data spec
|
||||||
|
* @param seqNo Increment every time a message is sent
|
||||||
|
*/
|
||||||
|
public Heartbeat(int seqNo){
|
||||||
|
this.seqNo = seqNo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize() {
|
||||||
|
return MESSAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void send(DataOutputStream outputStream) {
|
||||||
|
setHeader(new Header(MessageType.HEARTBEAT, 0x01, (short) getSize()));
|
||||||
|
|
||||||
|
ByteBuffer buff = ByteBuffer.allocate(Header.getSize() + getSize() + getSize());
|
||||||
|
|
||||||
|
// Write header
|
||||||
|
buff.put(getHeader().getByteBuffer());
|
||||||
|
buff.position(Header.getSize());
|
||||||
|
|
||||||
|
// Write seq num
|
||||||
|
buff.put(ByteBuffer.allocate(4).putInt(seqNo).array());
|
||||||
|
buff.position(Header.getSize()+4);
|
||||||
|
|
||||||
|
// Write CRC
|
||||||
|
CRC32 crc = new CRC32();
|
||||||
|
crc.update(buff.array());
|
||||||
|
|
||||||
|
buff.put(ByteBuffer.allocate(4).putInt((short)crc.getValue()).array());
|
||||||
|
|
||||||
|
try {
|
||||||
|
outputStream.write(buff.array());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package seng302.server.messages;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
|
||||||
|
public abstract class Message {
|
||||||
|
Header header;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param header Set the header for this message
|
||||||
|
*/
|
||||||
|
public void setHeader(Header header){
|
||||||
|
this.header = header;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the header specified for this message
|
||||||
|
*/
|
||||||
|
public Header getHeader(){
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the size of the message
|
||||||
|
*/
|
||||||
|
public abstract int getSize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the message as through the outputStream
|
||||||
|
*/
|
||||||
|
public abstract void send(DataOutputStream outputStream);
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package seng302.server.messages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum containing the types of messages
|
||||||
|
* sent by the server
|
||||||
|
*/
|
||||||
|
public enum MessageType {
|
||||||
|
HEARTBEAT(1),
|
||||||
|
RACE_STATUS(12),
|
||||||
|
DISPLAY_TEXT_MESSAGE(20),
|
||||||
|
XML_MESSAGE(26),
|
||||||
|
RACE_START_STATUS(27),
|
||||||
|
YACHT_EVENT_CODE(29),
|
||||||
|
YACHT_ACTION_CODE(31),
|
||||||
|
CHATTER_TEXT(36),
|
||||||
|
BOAT_LOCATION(37),
|
||||||
|
MARK_ROUNDING(38),
|
||||||
|
COURSE_WIND(44),
|
||||||
|
AVERAGE_WIND(47);
|
||||||
|
|
||||||
|
private int code;
|
||||||
|
|
||||||
|
MessageType(int code){
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message code (From the API Spec)
|
||||||
|
* @return the message code
|
||||||
|
*/
|
||||||
|
int getCode(){
|
||||||
|
return this.code;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
package seng302.server.messages;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.zip.CRC32;
|
||||||
|
|
||||||
|
public class XMLMessage extends Message{
|
||||||
|
private final MessageType MESSAGE_TYPE = MessageType.XML_MESSAGE;
|
||||||
|
private final int MESSAGE_VERSION = 1; //Always set to 1
|
||||||
|
private final int MESSAGE_SIZE = 14;
|
||||||
|
|
||||||
|
// Message fields
|
||||||
|
private int timeStamp;
|
||||||
|
private short ack = 0x00; //Unused
|
||||||
|
private XMLMessageSubType xmlMessageSubType;
|
||||||
|
private Short length;
|
||||||
|
private Short sequence;
|
||||||
|
private String content;
|
||||||
|
private CRC32 crc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XML Message from the AC35 Streaming data spec
|
||||||
|
* @param content The XML content
|
||||||
|
* @param type The XML Message Sub Type
|
||||||
|
*/
|
||||||
|
public XMLMessage(String content, XMLMessageSubType type, short sequenceNum){
|
||||||
|
this.content = content;
|
||||||
|
this.xmlMessageSubType = type;
|
||||||
|
crc = new CRC32();
|
||||||
|
timeStamp = (int) (System.currentTimeMillis() / 1000L);
|
||||||
|
ack = 0;
|
||||||
|
length = (short) this.content.length();
|
||||||
|
sequence = sequenceNum;
|
||||||
|
|
||||||
|
setHeader(new Header(MESSAGE_TYPE, 0x01, (short) getSize()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The length of this message
|
||||||
|
*/
|
||||||
|
public int getSize(){
|
||||||
|
return MESSAGE_SIZE + content.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send this message as a stream of bytes
|
||||||
|
* @param outputStream The output stream to send the message
|
||||||
|
*/
|
||||||
|
public void send(DataOutputStream outputStream) {
|
||||||
|
ByteBuffer buff = ByteBuffer.allocate(Header.getSize() + getSize() + 4);
|
||||||
|
buff.put(getHeader().getByteBuffer());
|
||||||
|
buff.position(Header.getSize());
|
||||||
|
|
||||||
|
// Version Number, 1 byte
|
||||||
|
buff.put(ByteBuffer.allocate(1).put((byte)MESSAGE_VERSION).array());
|
||||||
|
buff.position(Header.getSize() + 1);
|
||||||
|
|
||||||
|
// Ack, 2 bytes
|
||||||
|
buff.put(ByteBuffer.allocate(2).putShort(ack).array());
|
||||||
|
buff.position(Header.getSize() + 3);
|
||||||
|
|
||||||
|
// Timestamp, 6 bytes
|
||||||
|
buff.put(ByteBuffer.allocate(6).putInt(timeStamp).array());
|
||||||
|
buff.position(Header.getSize() + 9);
|
||||||
|
|
||||||
|
// XML message sub type, 1 byte
|
||||||
|
buff.put(ByteBuffer.allocate(1).put((byte)xmlMessageSubType.getType()).array());
|
||||||
|
buff.position(Header.getSize() + 10);
|
||||||
|
|
||||||
|
// Seq num, 2 bytes
|
||||||
|
buff.put(ByteBuffer.allocate(2).putShort(sequence).array());
|
||||||
|
buff.position(Header.getSize() + 12);
|
||||||
|
|
||||||
|
// Message length, 2 bytes
|
||||||
|
buff.put(ByteBuffer.allocate(2).putShort(length).array());
|
||||||
|
buff.position(Header.getSize() + 14);
|
||||||
|
|
||||||
|
// XML Content
|
||||||
|
buff.put(this.content.getBytes());
|
||||||
|
buff.position(Header.getSize() + 14 + this.content.getBytes().length);
|
||||||
|
|
||||||
|
// calculate CRC
|
||||||
|
crc.update(buff.array());
|
||||||
|
|
||||||
|
// Add CRC to message
|
||||||
|
buff.put(ByteBuffer.allocate(4).putInt((short)crc.getValue()).array());
|
||||||
|
|
||||||
|
// Send
|
||||||
|
try {
|
||||||
|
outputStream.write(buff.array());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package seng302.server.messages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum containing the types of XML messages
|
||||||
|
*/
|
||||||
|
public enum XMLMessageSubType {
|
||||||
|
REGATTA(5),
|
||||||
|
RACE(6),
|
||||||
|
BOAT(7);
|
||||||
|
|
||||||
|
private int type;
|
||||||
|
|
||||||
|
XMLMessageSubType(int type){
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType(){
|
||||||
|
return this.type;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<BoatConfig>
|
||||||
|
<Modified>2015-08-28T17:32:59+0100</Modified>
|
||||||
|
<Version>12</Version>
|
||||||
|
<Snapshot>219</Snapshot>
|
||||||
|
<Settings>
|
||||||
|
<RaceBoatType Type="AC45"/>
|
||||||
|
<BoatDimension BoatLength="14.019" HullLength="13.449"/>
|
||||||
|
<ZoneSize MarkZoneSize="40.347" CourseZoneSize="53.796"/>
|
||||||
|
<ZoneLimits Limit1="200" Limit2="100" Limit3="53.796" Limit4="0" Limit5="-100"/>
|
||||||
|
</Settings>
|
||||||
|
<BoatShapes>
|
||||||
|
<BoatShape ShapeID="0">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="3" Y="25" X="0"/>
|
||||||
|
</Vertices>
|
||||||
|
</BoatShape>
|
||||||
|
<BoatShape ShapeID="14">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="1" Y="0" X="-1"/>
|
||||||
|
<Vtx Seq="2" Y="0.75" X="-1"/>
|
||||||
|
<Vtx Seq="3" Y="0.75" X="-0.25"/>
|
||||||
|
<Vtx Seq="4" Y="3.5" X="-0.25"/>
|
||||||
|
<Vtx Seq="5" Y="4.5" X="-1"/>
|
||||||
|
<Vtx Seq="6" Y="6.5" X="-1"/>
|
||||||
|
<Vtx Seq="7" Y="7" X="-0.5"/>
|
||||||
|
<Vtx Seq="8" Y="7" X="0.5"/>
|
||||||
|
<Vtx Seq="9" Y="6.5" X="1"/>
|
||||||
|
<Vtx Seq="10" Y="4.5" X="1"/>
|
||||||
|
<Vtx Seq="11" Y="3.5" X="0.25"/>
|
||||||
|
<Vtx Seq="12" Y="0.75" X="0.25"/>
|
||||||
|
<Vtx Seq="13" Y="0.75" X="1"/>
|
||||||
|
<Vtx Seq="14" Y="0" X="1"/>
|
||||||
|
</Vertices>
|
||||||
|
</BoatShape>
|
||||||
|
<BoatShape ShapeID="15">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="1" Y="0" X="-3.46"/>
|
||||||
|
<Vtx Seq="2" Y="13.449" X="-3.46"/>
|
||||||
|
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||||
|
<Vtx Seq="4" Y="13.449" X="3.46"/>
|
||||||
|
<Vtx Seq="5" Y="0" X="3.46"/>
|
||||||
|
</Vertices>
|
||||||
|
<Catamaran>
|
||||||
|
<Vtx Seq="1" Y="1.769" X="-2.752"/>
|
||||||
|
<Vtx Seq="2" Y="0" X="-2.813"/>
|
||||||
|
<Vtx Seq="3" Y="0" X="-3.34"/>
|
||||||
|
<Vtx Seq="4" Y="5.351" X="-3.46"/>
|
||||||
|
<Vtx Seq="5" Y="10.544" X="-3.387"/>
|
||||||
|
<Vtx Seq="6" Y="13.449" X="-3.075"/>
|
||||||
|
<Vtx Seq="7" Y="10.851" X="-2.793"/>
|
||||||
|
<Vtx Seq="8" Y="6.669" X="-2.699"/>
|
||||||
|
<Vtx Seq="9" Y="6.669" X="2.699"/>
|
||||||
|
<Vtx Seq="10" Y="10.851" X="2.793"/>
|
||||||
|
<Vtx Seq="11" Y="13.449" X="3.075"/>
|
||||||
|
<Vtx Seq="12" Y="10.544" X="3.387"/>
|
||||||
|
<Vtx Seq="13" Y="5.351" X="3.46"/>
|
||||||
|
<Vtx Seq="14" Y="0" X="3.34"/>
|
||||||
|
<Vtx Seq="15" Y="0" X="2.813"/>
|
||||||
|
<Vtx Seq="16" Y="1.769" X="2.752"/>
|
||||||
|
</Catamaran>
|
||||||
|
<Bowsprit>
|
||||||
|
<Vtx Seq="1" Y="6.669" X="-0.2"/>
|
||||||
|
<Vtx Seq="2" Y="11.377" X="-0.2"/>
|
||||||
|
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||||
|
<Vtx Seq="4" Y="11.377" X="0.2"/>
|
||||||
|
<Vtx Seq="5" Y="6.669" X="0.2"/>
|
||||||
|
</Bowsprit>
|
||||||
|
<Trampoline>
|
||||||
|
<Vtx Seq="1" Y="2" X="-2.699"/>
|
||||||
|
<Vtx Seq="2" Y="6.438" X="-2.699"/>
|
||||||
|
<Vtx Seq="3" Y="6.438" X="2.699"/>
|
||||||
|
<Vtx Seq="4" Y="2" X="2.699"/>
|
||||||
|
</Trampoline>
|
||||||
|
</BoatShape>
|
||||||
|
<BoatShape ShapeID="18">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="1" Y="0" X="-1.04"/>
|
||||||
|
<Vtx Seq="2" Y="0.11" X="-1.18"/>
|
||||||
|
<Vtx Seq="3" Y="0.42" X="-1.28"/>
|
||||||
|
<Vtx Seq="4" Y="3.74" X="-1.29"/>
|
||||||
|
<Vtx Seq="5" Y="5.36" X="-1.21"/>
|
||||||
|
<Vtx Seq="6" Y="6.29" X="-1.08"/>
|
||||||
|
<Vtx Seq="7" Y="7.15" X="-0.84"/>
|
||||||
|
<Vtx Seq="8" Y="7.63" X="-0.62"/>
|
||||||
|
<Vtx Seq="9" Y="7.94" X="-0.34"/>
|
||||||
|
<Vtx Seq="10" Y="8.06" X="0"/>
|
||||||
|
<Vtx Seq="11" Y="7.94" X="0.34"/>
|
||||||
|
<Vtx Seq="12" Y="7.63" X="0.62"/>
|
||||||
|
<Vtx Seq="13" Y="7.15" X="0.84"/>
|
||||||
|
<Vtx Seq="14" Y="6.29" X="1.08"/>
|
||||||
|
<Vtx Seq="15" Y="5.36" X="1.21"/>
|
||||||
|
<Vtx Seq="16" Y="3.74" X="1.29"/>
|
||||||
|
<Vtx Seq="17" Y="0.42" X="1.28"/>
|
||||||
|
<Vtx Seq="18" Y="0.11" X="1.18"/>
|
||||||
|
<Vtx Seq="19" Y="0" X="1.04"/>
|
||||||
|
</Vertices>
|
||||||
|
</BoatShape>
|
||||||
|
<BoatShape ShapeID="24">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="1" Y="0" X="-2.5"/>
|
||||||
|
<Vtx Seq="2" Y="7" X="-2.5"/>
|
||||||
|
<Vtx Seq="3" Y="12.6" X="-2.2"/>
|
||||||
|
<Vtx Seq="4" Y="12.6" X="2.2"/>
|
||||||
|
<Vtx Seq="5" Y="7" X="2.5"/>
|
||||||
|
<Vtx Seq="6" Y="0" X="2.5"/>
|
||||||
|
</Vertices>
|
||||||
|
</BoatShape>
|
||||||
|
<BoatShape ShapeID="34">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="1" Y="0" X="-1.16"/>
|
||||||
|
<Vtx Seq="2" Y="5.51" X="-1.16"/>
|
||||||
|
<Vtx Seq="3" Y="5.846" X="-0.84"/>
|
||||||
|
<Vtx Seq="4" Y="5.846" X="0.84"/>
|
||||||
|
<Vtx Seq="5" Y="5.51" X="1.16"/>
|
||||||
|
<Vtx Seq="6" Y="0" X="1.16"/>
|
||||||
|
</Vertices>
|
||||||
|
</BoatShape>
|
||||||
|
<BoatShape ShapeID="35">
|
||||||
|
<Vertices>
|
||||||
|
<Vtx Seq="1" Y="0" X="-1.461"/>
|
||||||
|
<Vtx Seq="2" Y="6" X="-1.461"/>
|
||||||
|
<Vtx Seq="3" Y="7" X="-1.44"/>
|
||||||
|
<Vtx Seq="4" Y="8" X="-1.38"/>
|
||||||
|
<Vtx Seq="5" Y="9" X="-1.17"/>
|
||||||
|
<Vtx Seq="6" Y="10" X="-0.76"/>
|
||||||
|
<Vtx Seq="7" Y="10.6" X="-0.34"/>
|
||||||
|
<Vtx Seq="8" Y="10.61" X="0"/>
|
||||||
|
<Vtx Seq="9" Y="10.6" X="0.34"/>
|
||||||
|
<Vtx Seq="10" Y="10" X="0.76"/>
|
||||||
|
<Vtx Seq="11" Y="9" X="1.17"/>
|
||||||
|
<Vtx Seq="12" Y="8" X="1.38"/>
|
||||||
|
<Vtx Seq="13" Y="7" X="1.44"/>
|
||||||
|
<Vtx Seq="14" Y="6" X="1.461"/>
|
||||||
|
<Vtx Seq="15" Y="0" X="1.461"/>
|
||||||
|
</Vertices>
|
||||||
|
</BoatShape>
|
||||||
|
</BoatShapes>
|
||||||
|
<Boats>
|
||||||
|
<Boat Type="RC" SourceID="121" ShapeID="35" StoweName="PRO" ShortName="PRO" ShorterName="PRO" BoatName="REGARDLESS" HullNum="RG02" Skipper="Iain Murray" Helmsman="Iain Murray" PeliID="121" RadioIP="172.20.2.121">
|
||||||
|
<GPSposition Z="3.8" Y="4.15" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="3.77" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="122" ShapeID="34" StoweName="SL1" ShortName="SL1" ShorterName="SL1" BoatName="Start Line 1" HullNum="Mark-02" Skipper="" PeliID="122" RadioIP="172.20.2.122">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="123" ShapeID="34" StoweName="SL2" ShortName="SL2" ShorterName="SL2" BoatName="Start Line 2" HullNum="Mark-03" Skipper="" PeliID="123" RadioIP="172.20.2.123">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="124" ShapeID="34" StoweName="LG1" ShortName="LG1" ShorterName="LG1" BoatName="Lee Gate 1" HullNum="Mark-04" Skipper="" PeliID="124" RadioIP="172.20.2.124">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="125" ShapeID="34" StoweName="LG2" ShortName="LG2" ShorterName="LG2" BoatName="Lee Gate 2" HullNum="Mark-05" Skipper="" PeliID="125" RadioIP="172.20.2.125">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="126" ShapeID="34" StoweName="WG1" ShortName="WG1" ShorterName="WG1" BoatName="Wind Gate 1" HullNum="Mark-06" Skipper="" PeliID="126" RadioIP="172.20.2.126">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="127" ShapeID="34" StoweName="WG2" ShortName="WG2" ShorterName="WG2" BoatName="Wind Gate 2" HullNum="Mark-07" Skipper="" PeliID="127" RadioIP="172.20.2.127">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="128" ShapeID="34" StoweName="FL1" ShortName="FL1" ShorterName="FL1" BoatName="Finish Line 1" HullNum="Mark-08" Skipper="" PeliID="128" RadioIP="172.20.2.128">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="129" ShapeID="34" StoweName="FL2" ShortName="FL2" ShorterName="FL2" BoatName="Finish Line 2" HullNum="Mark-09" Skipper="" PeliID="129" RadioIP="172.20.2.129">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="130" ShapeID="34" StoweName="SP1" ShortName="SP1" ShorterName="Sp1" BoatName="Spare" HullNum="Mark-10" Skipper="" PeliID="130" RadioIP="172.20.2.130">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Mark" SourceID="131" ShapeID="34" StoweName="M1" ShortName="M1" ShorterName="M1" BoatName="Mark1" HullNum="Mark-01" Skipper="" PeliID="131" RadioIP="172.20.2.131">
|
||||||
|
<GPSposition Z="5.445" Y="1.12" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0.74" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Yacht" SourceID="101" ShapeID="15" StoweName="USA" ShortName="ORACLE" ShorterName="USA" BoatName="ORACLE TEAM USA" HullNum="AC4515" Skipper="SPITHILL" Helmsman="SPITHILL" Country="USA" PeliID="101" RadioIP="172.20.2.101">
|
||||||
|
<GPSposition Z="1.78" Y="-0.331" X="-0.006"/>
|
||||||
|
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Yacht" SourceID="102" ShapeID="15" StoweName="SWE" ShortName="ARTEMIS" ShorterName="SWE" BoatName="ARTEMIS RACING" HullNum="AC4517" Skipper="OUTTERIDGE" Helmsman="OUTTERIDGE" Country="SWE" PeliID="102" RadioIP="172.20.2.102">
|
||||||
|
<GPSposition Z="1.727" Y="-0.359" X="-0.0121"/>
|
||||||
|
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Yacht" SourceID="103" ShapeID="15" StoweName="NZL" ShortName="ETNZ" ShorterName="NZL" BoatName="EMIRATES TEAM NZ" HullNum="AC4503" Skipper="ASHBY" Helmsman="BURLING" Country="NZL" PeliID="103" RadioIP="172.20.2.103">
|
||||||
|
<GPSposition Z="1.881" Y="-0.291" X="-0.003"/>
|
||||||
|
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Yacht" SourceID="104" ShapeID="15" StoweName="JPN" ShortName="JAPAN" ShorterName="JPN" BoatName="SOFTBANK TEAM JAPAN" HullNum="AC4504" Skipper="BARKER" Helmsman="BARKER" Country="JPN" PeliID="104" RadioIP="172.20.2.104">
|
||||||
|
<GPSposition Z="1.805" Y="-0.322" X="-0.003"/>
|
||||||
|
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Yacht" SourceID="105" ShapeID="15" StoweName="FRA" ShortName="FRANCE" ShorterName="FRA" BoatName="GROUPAMA TEAM FRANCE" HullNum="AC4505" Skipper="CAMMAS" Helmsman="CAMMAS" Country="FRA" PeliID="105" RadioIP="172.20.2.105">
|
||||||
|
<GPSposition Z="1.863" Y="-0.3" X="-0.003"/>
|
||||||
|
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Yacht" SourceID="106" ShapeID="15" StoweName="GBR" ShortName="GBR" ShorterName="GBR" BoatName="LAND ROVER BAR" HullNum="AC4516" Skipper="ANSLIE" Helmsman="ANSLIE" Country="GBR" PeliID="106" RadioIP="172.20.2.106">
|
||||||
|
<GPSposition Z="1.734" Y="-0.352" X="0"/>
|
||||||
|
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Marshall" SourceID="109" ShapeID="24" StoweName="CAM" ShortName="CAM" ShorterName="CAM" BoatName="Cambria" HullNum="TV01" Skipper=" " Helmsman=" " PeliID="109" RadioIP="172.20.2.109">
|
||||||
|
<GPSposition Z="0" Y="0" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="0" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Marshall" SourceID="110" ShapeID="18" StoweName="BYS" ShortName="BYSTANDER" ShorterName="BYS" BoatName="BYSTANDER" HullNum="XR09" Skipper="Stan Gibbs" PeliID="110" RadioIP="172.20.2.110">
|
||||||
|
<GPSposition Z="5.334" Y="3.804" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="3.426" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Marshall" SourceID="111" ShapeID="18" StoweName="SHA" ShortName="SHA" ShorterName="SHA" BoatName="SHAMROCK" HullNum="XR01" Skipper="" PeliID="111" RadioIP="172.20.2.111">
|
||||||
|
<GPSposition Z="5.334" Y="3.804" X="0"/>
|
||||||
|
<FlagPosition Z="0" Y="3.426" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Umpire" SourceID="113" ShapeID="18" StoweName="U1" ShortName="U1" ShorterName="U1" BoatName="VIGILENT" HullNum="XR02" Skipper="" PeliID="113" RadioIP="172.20.2.113">
|
||||||
|
<GPSposition Z="5.334" Y="3.804" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Umpire" SourceID="114" ShapeID="18" StoweName="U2" ShortName="U2" ShorterName="U2" BoatName="RESOLUTE" HullNum="XR03" Skipper="" PeliID="114" RadioIP="172.20.2.114">
|
||||||
|
<GPSposition Z="5.334" Y="3.804" X="0"/>
|
||||||
|
</Boat>
|
||||||
|
<Boat Type="Helicopter" SourceID="140" ShapeID="14" StoweName="HL1" ShortName="HEL1" ShorterName="HL1" BoatName="HELICOPTER" PeliID="140" RadioIP="172.20.2.140"/>
|
||||||
|
</Boats>
|
||||||
|
</BoatConfig>
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Race>
|
||||||
|
<CreationTimeDate>2015-08-29T13:12:40+02:00</CreationTimeDate>
|
||||||
|
<RaceStartTime Start="2015-08-29T13:10:00+02:00" Postpone="False" />
|
||||||
|
<RaceID>15082901</RaceID>
|
||||||
|
<RaceType>Fleet</RaceType>
|
||||||
|
<Participants>
|
||||||
|
<Yacht SourceID="101" />
|
||||||
|
<Yacht SourceID="102" />
|
||||||
|
<Yacht SourceID="103" />
|
||||||
|
<Yacht SourceID="104" />
|
||||||
|
<Yacht SourceID="105" />
|
||||||
|
<Yacht SourceID="106" />
|
||||||
|
</Participants>
|
||||||
|
<Course>
|
||||||
|
<CompoundMark CompoundMarkID="1" Name="Mark0">
|
||||||
|
<Mark SeqID="1" Name="Start Line 1" TargetLat="57.6703330" TargetLng="11.8278330" SourceID="122" />
|
||||||
|
<Mark SeqID="2" Name="Start Line 2" TargetLat="57.6703330" TargetLng="11.8278330" SourceID="123" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="2" Name="Mark1">
|
||||||
|
<Mark SeqID="1" Name="Mark1" TargetLat="57.6675700" TargetLng="11.8359880" SourceID="131" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="3" Name="Mark2">
|
||||||
|
<Mark SeqID="1" Name="Lee Gate 1" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="124" />
|
||||||
|
<Mark SeqID="2" Name="Lee Gate 2" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="125" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="4" Name="Mark3">
|
||||||
|
<Mark SeqID="1" Name="Wind Gate 1" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="126" />
|
||||||
|
<Mark SeqID="2" Name="Wind Gate 2" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="127" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="5" Name="Mark2">
|
||||||
|
<Mark SeqID="1" Name="Lee Gate 1" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="124" />
|
||||||
|
<Mark SeqID="2" Name="Lee Gate 2" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="125" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="6" Name="Mark3">
|
||||||
|
<Mark SeqID="1" Name="Wind Gate 1" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="126" />
|
||||||
|
<Mark SeqID="2" Name="Wind Gate 2" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="127" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="7" Name="Mark2">
|
||||||
|
<Mark SeqID="1" Name="Lee Gate 1" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="124" />
|
||||||
|
<Mark SeqID="2" Name="Lee Gate 2" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="125" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="8" Name="Mark3">
|
||||||
|
<Mark SeqID="1" Name="Wind Gate 1" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="126" />
|
||||||
|
<Mark SeqID="2" Name="Wind Gate 2" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="127" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="9" Name="Mark2">
|
||||||
|
<Mark SeqID="1" Name="Lee Gate 1" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="124" />
|
||||||
|
<Mark SeqID="2" Name="Lee Gate 2" TargetLat="57.6708220" TargetLng="11.8433900" SourceID="125" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="10" Name="Mark3">
|
||||||
|
<Mark SeqID="1" Name="Wind Gate 1" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="126" />
|
||||||
|
<Mark SeqID="2" Name="Wind Gate 2" TargetLat="57.6650170" TargetLng="11.8279170" SourceID="127" />
|
||||||
|
</CompoundMark>
|
||||||
|
<CompoundMark CompoundMarkID="11" Name="Mark4">
|
||||||
|
<Mark SeqID="1" Name="Finish Line 1" TargetLat="57.6715240" TargetLng="11.8444950" SourceID="128" />
|
||||||
|
<Mark SeqID="2" Name="Finish Line 2" TargetLat="57.6715240" TargetLng="11.8444950" SourceID="129" />
|
||||||
|
</CompoundMark>
|
||||||
|
</Course>
|
||||||
|
<CompoundMarkSequence>
|
||||||
|
<Corner SeqID="1" CompoundMarkID="1" Rounding="PS" ZoneSize="3" />
|
||||||
|
<Corner SeqID="2" CompoundMarkID="2" Rounding="Port" ZoneSize="3" />
|
||||||
|
<Corner SeqID="3" CompoundMarkID="3" Rounding="SP" ZoneSize="3" />
|
||||||
|
<Corner SeqID="4" CompoundMarkID="4" Rounding="PS" ZoneSize="3" />
|
||||||
|
<Corner SeqID="5" CompoundMarkID="5" Rounding="SP" ZoneSize="3" />
|
||||||
|
<Corner SeqID="6" CompoundMarkID="6" Rounding="PS" ZoneSize="3" />
|
||||||
|
<Corner SeqID="7" CompoundMarkID="7" Rounding="SP" ZoneSize="3" />
|
||||||
|
<Corner SeqID="8" CompoundMarkID="8" Rounding="PS" ZoneSize="3" />
|
||||||
|
<Corner SeqID="9" CompoundMarkID="9" Rounding="SP" ZoneSize="3" />
|
||||||
|
<Corner SeqID="10" CompoundMarkID="10" Rounding="PS" ZoneSize="3" />
|
||||||
|
<Corner SeqID="11" CompoundMarkID="11" Rounding="PS" ZoneSize="3" />
|
||||||
|
</CompoundMarkSequence>
|
||||||
|
<CourseLimit>
|
||||||
|
<Limit SeqID="1" Lat="57.6739450" Lon="11.8417100" />
|
||||||
|
<Limit SeqID="2" Lat="57.6709520" Lon="11.8485010" />
|
||||||
|
<Limit SeqID="3" Lat="57.6690260" Lon="11.8472790" />
|
||||||
|
<Limit SeqID="4" Lat="57.6693140" Lon="11.8457610" />
|
||||||
|
<Limit SeqID="5" Lat="57.6665370" Lon="11.8432910" />
|
||||||
|
<Limit SeqID="6" Lat="57.6641400" Lon="11.8385840" />
|
||||||
|
<Limit SeqID="7" Lat="57.6629430" Lon="11.8332030" />
|
||||||
|
<Limit SeqID="8" Lat="57.6629480" Lon="11.8249660" />
|
||||||
|
<Limit SeqID="9" Lat="57.6686890" Lon="11.8250920" />
|
||||||
|
<Limit SeqID="10" Lat="57.6708220" Lon="11.8321340" />
|
||||||
|
</CourseLimit>
|
||||||
|
</Race>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RegattaConfig>
|
||||||
|
<RegattaID>24</RegattaID>
|
||||||
|
<RegattaName>Gothenburg World Series 2015</RegattaName>
|
||||||
|
<CourseName>Gothenburg</CourseName>
|
||||||
|
<CentralLatitude>57.6679590</CentralLatitude>
|
||||||
|
<CentralLongitude>11.8503233</CentralLongitude>
|
||||||
|
<CentralAltitude>6.95</CentralAltitude>
|
||||||
|
<UtcOffset>2</UtcOffset>
|
||||||
|
<MagneticVariation>3.2</MagneticVariation>
|
||||||
|
<ShorelineName>gothenburg_shoreline</ShorelineName>
|
||||||
|
</RegattaConfig>
|
||||||
Reference in New Issue
Block a user