From b065b8d9c71229d319e32425bbf584857e54f5f2 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 15 May 2017 15:49:38 +1200 Subject: [PATCH] Merged Mock49 and fixed bugs - Error where mock would not read in the files when running from the jar. - Error where the AC35 stream now no longer sends us packets with information that is set for 0 for boat location. #story[881] #pair[fwy13, esa46 --- mock/src/main/java/seng302/App.java | 39 +++++- .../java/seng302/DataInput/XMLReader.java | 19 +++ mock/src/main/java/seng302/Model/Race.java | 1 - .../MessageDecoders/BoatLocationDecoder.java | 126 +++++++++++++----- .../Networking/Messages/RaceStatus.java | 2 +- .../java/seng302/Mock/StreamedCourse.java | 1 - .../src/main/java/seng302/Model/Marker.java | 4 +- .../main/java/seng302/VisualiserInput.java | 7 +- 8 files changed, 152 insertions(+), 47 deletions(-) diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index 17afabbc..d4cb6882 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -4,12 +4,25 @@ package seng302; import javafx.application.Application; import javafx.stage.Stage; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import seng302.DataInput.XMLReader; import seng302.Model.Event; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; public class App extends Application { @@ -27,21 +40,35 @@ public class App extends Application { public void start(Stage primaryStage) { try { - String regattaXML = readFile("mock/src/main/resources/mockXML/regattaTest.xml", StandardCharsets.UTF_8); - String raceXML = readFile("mock/src/main/resources/mockXML/raceTest.xml", StandardCharsets.UTF_8); - String boatXML = readFile("mock/src/main/resources/mockXML/boatTest.xml", StandardCharsets.UTF_8); + String regattaXML = readFile("mockXML/regattaTest.xml", StandardCharsets.UTF_8); + String raceXML = readFile("mockXML/raceTest.xml", StandardCharsets.UTF_8); + String boatXML = readFile("mockXML/boatTest.xml", StandardCharsets.UTF_8); Event raceEvent = new Event(raceXML, regattaXML, boatXML); raceEvent.start(); } catch (IOException e) { e.printStackTrace(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (TransformerException e) { + e.printStackTrace(); } } - static String readFile(String path, Charset encoding) throws IOException { - byte[] encoded = Files.readAllBytes(Paths.get(path)); - return new String(encoded, encoding); + private String readFile(String path, Charset encoding) throws IOException, ParserConfigurationException, SAXException, TransformerException { + + InputSource fXmlFile = new InputSource(getClass().getClassLoader().getResourceAsStream(path)); + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(fXmlFile); + doc.getDocumentElement().normalize(); + + return XMLReader.getContents(doc); + } } diff --git a/mock/src/main/java/seng302/DataInput/XMLReader.java b/mock/src/main/java/seng302/DataInput/XMLReader.java index 13c4808b..1dce01ec 100644 --- a/mock/src/main/java/seng302/DataInput/XMLReader.java +++ b/mock/src/main/java/seng302/DataInput/XMLReader.java @@ -9,9 +9,13 @@ import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; +import java.io.StringWriter; /** * Created by fwy13 on 26/03/2017. @@ -80,4 +84,19 @@ public abstract class XMLReader { return node.getAttributes().getNamedItem(attribute) != null; } + public static String getContents(Document document) throws TransformerException { + DOMSource source = new DOMSource(document); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + + StringWriter stringWriter = new StringWriter(); + StreamResult result = new StreamResult(stringWriter); + transformer.transform(source, result); + + return stringWriter.toString(); + } + } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 18a4c2cc..57d62964 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -226,7 +226,6 @@ public class Race implements Runnable { //distanceTravelled = velocity (nm p hr) * time taken to update loop double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000; double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); - System.out.println(totalDistanceTravelled); boolean finish = boat.getCurrentLeg().getName().equals("Finish"); if (!finish) { diff --git a/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java b/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java index 2fd8918d..b3e17945 100644 --- a/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java +++ b/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java @@ -36,44 +36,100 @@ public class BoatLocationDecoder { private BoatLocation message; public BoatLocationDecoder(byte[] encodedBoatLocation) { - messageVersionNumber = encodedBoatLocation[0]; - time = Arrays.copyOfRange(encodedBoatLocation, 1, 7); - sourceID = Arrays.copyOfRange(encodedBoatLocation, 7, 11); - seqNum = Arrays.copyOfRange(encodedBoatLocation, 11, 15); - deviceType = encodedBoatLocation[15]; - latitude = Arrays.copyOfRange(encodedBoatLocation, 16, 20); - longitude = Arrays.copyOfRange(encodedBoatLocation,20, 24); - altitude = Arrays.copyOfRange(encodedBoatLocation, 24, 28); - heading = Arrays.copyOfRange(encodedBoatLocation,28, 30); - pitch =Arrays.copyOfRange(encodedBoatLocation,30,32); - roll = Arrays.copyOfRange(encodedBoatLocation,32,34); - boatSpeed = Arrays.copyOfRange(encodedBoatLocation,34,36); - cog = Arrays.copyOfRange(encodedBoatLocation,36,38); - sog = Arrays.copyOfRange(encodedBoatLocation,38, 40); - apparentWindSpeed = Arrays.copyOfRange(encodedBoatLocation, 40, 42); - apparentWindAngle = Arrays.copyOfRange(encodedBoatLocation, 42, 44); - trueWindSpeed = Arrays.copyOfRange(encodedBoatLocation,44, 46); - trueWindDirection = Arrays.copyOfRange(encodedBoatLocation, 46, 48); - trueWindAngle = Arrays.copyOfRange(encodedBoatLocation, 48, 50); - currentDrift = Arrays.copyOfRange(encodedBoatLocation,50,52); - currentSet = Arrays.copyOfRange(encodedBoatLocation,52, 54); - rudderAngle = Arrays.copyOfRange(encodedBoatLocation,54, 56); + byte numMessageVersionNumber = 0; + long numTime = 0; + int numSourceID = 0; + int numSeqNum = 0; + byte numDeviceType = 0; + int numLatitude = 0; + int numLongitude = 0; + int numAltitude = 0; + int numHeading = 0; + short numPitch = 0; + short numRoll = 0; + int numBoatSpeed = 0; + int numCog = 0; + int numSog = 0; + int numApparentWindSpeed = 0; + short numApparentWindAngle = 0; + int numTrueWindSpeed = 0; + short numTrueWindDirection = 0; + short numTrueWindAngle = 0; + int numCurrentDrift = 0; + int numCurrentSet = 0; + short numRudderAngle = 0; -// System.out.println(bytesToInt(sourceID)); -// System.out.println(bytesToInt(boatSpeed)); + try { + messageVersionNumber = encodedBoatLocation[0]; + numMessageVersionNumber = messageVersionNumber; + time = Arrays.copyOfRange(encodedBoatLocation, 1, 7); + numTime = bytesToLong(time); + sourceID = Arrays.copyOfRange(encodedBoatLocation, 7, 11); + numSourceID = bytesToInt(sourceID); + seqNum = Arrays.copyOfRange(encodedBoatLocation, 11, 15); + numSeqNum = bytesToInt(seqNum); + deviceType = encodedBoatLocation[15]; + numDeviceType = deviceType; + latitude = Arrays.copyOfRange(encodedBoatLocation, 16, 20); + numLatitude = bytesToInt(latitude); + longitude = Arrays.copyOfRange(encodedBoatLocation, 20, 24); + numLongitude = bytesToInt(longitude); + altitude = Arrays.copyOfRange(encodedBoatLocation, 24, 28); + numAltitude = bytesToInt(altitude); + heading = Arrays.copyOfRange(encodedBoatLocation, 28, 30); + numHeading = bytesToInt(heading); + pitch = Arrays.copyOfRange(encodedBoatLocation, 30, 32); + numPitch = bytesToShort(pitch); + roll = Arrays.copyOfRange(encodedBoatLocation, 32, 34); + numRoll = bytesToShort(roll); + boatSpeed = Arrays.copyOfRange(encodedBoatLocation, 34, 36); + numBoatSpeed = bytesToInt(boatSpeed); + cog = Arrays.copyOfRange(encodedBoatLocation, 36, 38); + numCog = bytesToInt(cog); + sog = Arrays.copyOfRange(encodedBoatLocation, 38, 40); + numSog = bytesToInt(sog); + apparentWindSpeed = Arrays.copyOfRange(encodedBoatLocation, 40, 42); + numApparentWindSpeed = bytesToInt(apparentWindSpeed); + apparentWindAngle = Arrays.copyOfRange(encodedBoatLocation, 42, 44); + numApparentWindAngle = bytesToShort(apparentWindAngle); + trueWindSpeed = Arrays.copyOfRange(encodedBoatLocation, 44, 46); + numTrueWindSpeed = bytesToInt(trueWindSpeed); + trueWindDirection = Arrays.copyOfRange(encodedBoatLocation, 46, 48); + numTrueWindDirection = bytesToShort(trueWindSpeed); + trueWindAngle = Arrays.copyOfRange(encodedBoatLocation, 48, 50); + numTrueWindAngle = bytesToShort(trueWindSpeed); + currentDrift = Arrays.copyOfRange(encodedBoatLocation, 50, 52); + numCurrentDrift = bytesToInt(currentDrift); + currentSet = Arrays.copyOfRange(encodedBoatLocation, 52, 54); + numCurrentSet = bytesToShort(currentSet); + rudderAngle = Arrays.copyOfRange(encodedBoatLocation, 54, 56); + numRudderAngle = bytesToShort(rudderAngle); + } catch(ArrayIndexOutOfBoundsException e){ + + } + message = new BoatLocation(numMessageVersionNumber, numTime, + numSourceID, numSeqNum, numDeviceType, numLatitude, + numLongitude, numAltitude, numHeading, numPitch, + numRoll, numBoatSpeed, numCog, numSog, numApparentWindSpeed, + numApparentWindAngle, numTrueWindSpeed, numTrueWindDirection, + numTrueWindAngle, numCurrentDrift, numCurrentSet, numRudderAngle + );/* message = new BoatLocation(messageVersionNumber, bytesToLong(time), - bytesToInt(sourceID), bytesToInt(seqNum), - deviceType, bytesToInt(latitude), - bytesToInt(longitude), bytesToInt(altitude), - bytesToInt(heading), bytesToShort(pitch), - bytesToShort(roll), bytesToInt(boatSpeed), - bytesToInt(cog), bytesToInt(sog), - bytesToInt(apparentWindSpeed), bytesToShort(apparentWindAngle), - bytesToInt(trueWindSpeed), bytesToShort(trueWindDirection), - bytesToShort(trueWindAngle), bytesToInt(currentDrift), - bytesToInt(currentSet), bytesToShort(rudderAngle) - ); + bytesToInt(sourceID), bytesToInt(seqNum), + deviceType, bytesToInt(latitude), + bytesToInt(longitude), bytesToInt(altitude), + bytesToInt(heading), bytesToShort(pitch), + bytesToShort(roll), bytesToInt(boatSpeed), + bytesToInt(cog), bytesToInt(sog), + bytesToInt(apparentWindSpeed), bytesToShort(apparentWindAngle), + bytesToInt(trueWindSpeed), bytesToShort(trueWindDirection), + bytesToShort(trueWindAngle), bytesToInt(currentDrift), + bytesToInt(currentSet), bytesToShort(rudderAngle) + );*/ + +// System.out.println(bytesToInt(sourceID)); +// System.out.println(bytesToInt(boatSpeed)); } diff --git a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java index 097045ba..87ea6342 100644 --- a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java +++ b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java @@ -46,7 +46,7 @@ public class RaceStatus extends AC35Data { } /** - * @deprecated use status booleans + * * @return race status number */ public int getRaceStatus() diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 2457baf9..bcb4a90c 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -25,7 +25,6 @@ public class StreamedCourse extends Observable implements RaceDataSource { this.boatXMLReader = boatXMLReader; if (streamedCourseXMLReader != null && boatXMLReader != null) { this.boatXMLReader.setParticipants(streamedCourseXMLReader.getParticipants()); - System.out.println(streamedCourseXMLReader.getParticipants().size()); boatXMLReader.read(); } diff --git a/visualiser/src/main/java/seng302/Model/Marker.java b/visualiser/src/main/java/seng302/Model/Marker.java index 8816807b..567af254 100644 --- a/visualiser/src/main/java/seng302/Model/Marker.java +++ b/visualiser/src/main/java/seng302/Model/Marker.java @@ -30,7 +30,7 @@ public class Marker { } /** - * @deprecated + * * @param mark1 Mark coordinates. */ public Marker(GPSCoordinate mark1) { @@ -38,7 +38,7 @@ public class Marker { } /** - * @deprecated + * * @param mark1 Mark one coordinate * @param mark2 Mark two coordinate */ diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index 05f2752d..66547b8a 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -159,7 +159,7 @@ public class VisualiserInput implements Runnable { * @throws IOException Thrown when an error occurs while reading from the socket. */ private byte[] getNextMessageBytes() throws IOException { - + inStream.mark(0); short CRCLength = 4; short headerLength = 15; @@ -253,6 +253,11 @@ public class VisualiserInput implements Runnable { catch (InvalidMessageException | IOException e) { //Prints exception to stderr, and iterate loop (that is, read the next message). System.err.println("Unable to read message: " + e.getMessage()); + try { + inStream.reset(); + } catch (IOException e1) { + e1.printStackTrace(); + } //Continue to the next loop iteration/message. continue; }/*