From fcea323cfd9ecb805f15833f6a2385e1a745be47 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Fri, 28 Jul 2017 09:30:26 +1200 Subject: [PATCH 1/8] The racevisionGame pom still had "profiles", which aren't needed with a single jar build, and the built jar didn't have a mainifest/main class. --- racevisionGame/pom.xml | 117 ++++++++++++----------------------------- 1 file changed, 34 insertions(+), 83 deletions(-) diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml index f77e5ea3..b0f6d203 100644 --- a/racevisionGame/pom.xml +++ b/racevisionGame/pom.xml @@ -83,89 +83,40 @@ - - - - mock - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - - - - visualiser.app.App - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - package - - shade - - - - - - - - - - - visualiser - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - - - - visualiser.app.App - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - package - - shade - - - - - - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + + + visualiser.app.App + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + package + + shade + + + + + + From 554f8a2a0ffd5525448ede94f4331d546f5ebfb1 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Fri, 4 Aug 2017 23:08:07 +1200 Subject: [PATCH 2/8] Added WindCommand and multiple command execution to RaceLogic - Dispatch commands with CompositeCommand - Single WindCommand handles upwind and downwind logic - Changed key bindings as Mac lacks PgUp PgDn - ControllerServer is observable, RaceLogic updates CompositeCommand as observer --- .../src/main/java/mock/model/RaceLogic.java | 26 ++++++++++++++-- .../model/commandFactory/CommandFactory.java | 2 ++ .../commandFactory/CompositeCommand.java | 23 ++++++++++++++ .../model/commandFactory/WindCommand.java | 30 ++++++++++++++++++ .../gameController/ControllerServer.java | 19 ++++++++++-- .../gameController/Keys/KeyFactory.java | 4 +-- .../model/commandFactory/WindCommandTest.java | 31 +++++++++++++++++++ 7 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java create mode 100644 racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 9e810761..adc0fe37 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -1,12 +1,20 @@ package mock.model; import javafx.animation.AnimationTimer; +import mock.model.commandFactory.Command; +import mock.model.commandFactory.CommandFactory; +import mock.model.commandFactory.CompositeCommand; +import network.Messages.Enums.BoatActionEnum; import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.RaceStatusEnum; import network.Messages.LatestMessages; -import shared.model.Race; +import visualiser.gameController.ControllerServer; -public class RaceLogic implements Runnable { +import java.util.Observable; +import java.util.Observer; +import java.util.Stack; + +public class RaceLogic implements Observer, Runnable { /** * State of current race modified by this object */ @@ -16,6 +24,8 @@ public class RaceLogic implements Runnable { */ private RaceServer server; + private CompositeCommand commands; + /** * Initialises race loop with state and server message queue * @param race state of race to modify @@ -24,6 +34,7 @@ public class RaceLogic implements Runnable { public RaceLogic(MockRace race, LatestMessages messages) { this.race = race; this.server = new RaceServer(race, messages); + this.commands = new CompositeCommand(); } /** @@ -123,7 +134,7 @@ public class RaceLogic implements Runnable { //If it is still racing, update its position. if (boat.getStatus() == BoatStatusEnum.RACING) { - + commands.execute(); race.updatePosition(boat, framePeriod, race.getRaceClock().getDurationMilli()); } @@ -173,4 +184,13 @@ public class RaceLogic implements Runnable { iters++; } }; + + @Override + public void update(Observable o, Object arg) { + ControllerServer server = (ControllerServer)o; + BoatActionEnum action = server.getAction(); + MockBoat boat = race.getBoats().get(0); + + commands.addCommand(CommandFactory.createCommand(race, boat, action)); + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java index 6e87f11b..fba06cb5 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java @@ -19,6 +19,8 @@ public class CommandFactory { switch(action) { case AUTO_PILOT: return new VMGCommand(race, boat); case TACK_GYBE: return new TackGybeCommand(race, boat); + case UPWIND: return new WindCommand(race, boat, true); + case DOWNWIND: return new WindCommand(race, boat, false); default: return null; // TODO - please please have discussion over what to default to } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java new file mode 100644 index 00000000..12690d29 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java @@ -0,0 +1,23 @@ +package mock.model.commandFactory; + +import java.util.Stack; + +/** + * Wraps multiple commands into a composite to execute queued commands during a frame. + */ +public class CompositeCommand implements Command { + private Stack commands; + + public CompositeCommand() { + this.commands = new Stack<>(); + } + + public void addCommand(Command command) { + commands.push(command); + } + + @Override + public void execute() { + while(!commands.isEmpty()) commands.pop().execute(); + } +} diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java new file mode 100644 index 00000000..b254f087 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -0,0 +1,30 @@ +package mock.model.commandFactory; + +import mock.model.MockBoat; +import mock.model.MockRace; +import shared.model.Bearing; + +/** + * Created by connortaylorbrown on 4/08/17. + */ +public class WindCommand implements Command { + private MockRace race; + private MockBoat boat; + private int direction; + + public WindCommand(MockRace race, MockBoat boat, boolean upwind) { + this.race = race; + this.boat = boat; + this.direction = upwind? 1 : -1; + } + + @Override + public void execute() { + double wind = race.getWindDirection().degrees(); + double heading = boat.getBearing().degrees(); + + double offset = 3; + if(wind - heading < 0) offset *= -1 * direction; + boat.setBearing(Bearing.fromDegrees(heading + offset)); + } +} diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index fb6a257b..a2f8c80e 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -1,5 +1,7 @@ package visualiser.gameController; +import mock.model.commandFactory.Command; +import mock.model.commandFactory.CommandFactory; import network.BinaryMessageDecoder; import network.MessageDecoders.BoatActionDecoder; import network.Messages.Enums.BoatActionEnum; @@ -9,11 +11,12 @@ import visualiser.gameController.Keys.KeyFactory; import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; +import java.util.Observable; /** * Service for dispatching key press data to race from client */ -public class ControllerServer implements Runnable { +public class ControllerServer extends Observable implements Runnable { /** * Socket to client */ @@ -22,6 +25,10 @@ public class ControllerServer implements Runnable { * Wrapper for input from client */ private DataInputStream inputStream; + /** + * Last received boat action + */ + private BoatActionEnum action; /** * Initialise server-side controller with live client socket @@ -36,6 +43,10 @@ public class ControllerServer implements Runnable { } } + public BoatActionEnum getAction() { + return action; + } + /** * Wait for controller key input from client and loop. */ @@ -48,8 +59,10 @@ public class ControllerServer implements Runnable { inputStream.read(message); BinaryMessageDecoder encodedMessage = new BinaryMessageDecoder(message); BoatActionDecoder boatActionDecoder = new BoatActionDecoder(encodedMessage.getMessageBody()); - BoatActionEnum decodedMessage = boatActionDecoder.getBoatAction(); - System.out.println("Received key: " + decodedMessage); + action = boatActionDecoder.getBoatAction(); + + this.notifyObservers(); + this.setChanged(); } } catch (IOException e) { e.printStackTrace(); diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java index ef1368f0..be95abd3 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java @@ -27,8 +27,8 @@ public class KeyFactory { keyState.put("SPACE", new VMGKey("VMG")); keyState.put("SHIFT", new SailsToggleKey("Toggle Sails")); keyState.put("ENTER", new TackGybeKey("Tack/Gybe")); - keyState.put("PAGE_UP", new UpWindKey("Upwind")); - keyState.put("PAGE_DOWN", new DownWindKey("Downwind")); + keyState.put("UP", new UpWindKey("Upwind")); + keyState.put("DOWN", new DownWindKey("Downwind")); } /** diff --git a/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java b/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java new file mode 100644 index 00000000..c3d0df04 --- /dev/null +++ b/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java @@ -0,0 +1,31 @@ +package mock.model.commandFactory; + +import mock.model.MockRace; +import network.Messages.Enums.BoatActionEnum; +import org.junit.Before; +import org.junit.Test; +import shared.model.Boat; +import shared.model.Race; +import visualiser.model.VisualiserRace; + +import static org.testng.Assert.*; + +/** + * Created by connortaylorbrown on 4/08/17. + */ +public class WindCommandTest { + private Race race; + private Boat boat; + private Command upwind; + private Command downwind; + + @Before + public void setUp() { + boat = new Boat(0, "Bob", "NZ"); + } + + @Test + public void upwindCommandDecreasesAngle() { + + } +} \ No newline at end of file From e76de1cbf994dd18241864de90c76f5b52e73145 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Mon, 7 Aug 2017 14:13:14 +1200 Subject: [PATCH 3/8] Added test for WindCommand #story[1096] --- .../model/commandFactory/WindCommand.java | 3 +- .../model/commandFactory/WindCommandTest.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java index b254f087..d20c0744 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -12,6 +12,8 @@ public class WindCommand implements Command { private MockBoat boat; private int direction; + private double offset = 3.0; + public WindCommand(MockRace race, MockBoat boat, boolean upwind) { this.race = race; this.boat = boat; @@ -23,7 +25,6 @@ public class WindCommand implements Command { double wind = race.getWindDirection().degrees(); double heading = boat.getBearing().degrees(); - double offset = 3; if(wind - heading < 0) offset *= -1 * direction; boat.setBearing(Bearing.fromDegrees(heading + offset)); } diff --git a/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java b/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java index c3d0df04..4316d78d 100644 --- a/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java +++ b/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java @@ -1,31 +1,58 @@ package mock.model.commandFactory; +import mock.model.MockBoat; import mock.model.MockRace; import network.Messages.Enums.BoatActionEnum; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import shared.model.Bearing; import shared.model.Boat; import shared.model.Race; import visualiser.model.VisualiserRace; +import static org.mockito.Mockito.when; import static org.testng.Assert.*; +import static org.mockito.Mockito.mock; /** * Created by connortaylorbrown on 4/08/17. */ public class WindCommandTest { - private Race race; - private Boat boat; + private MockRace race; + private MockBoat boat; private Command upwind; private Command downwind; + private double initial; + + private double offset = 3.0; @Before public void setUp() { - boat = new Boat(0, "Bob", "NZ"); + race = mock(MockRace.class); + boat = new MockBoat(0, "Bob", "NZ", null); + + when(race.getWindDirection()).thenReturn(Bearing.fromDegrees(0.0)); + boat.setBearing(Bearing.fromDegrees(45.0)); + + upwind = CommandFactory.createCommand(race, boat, BoatActionEnum.UPWIND); + downwind = CommandFactory.createCommand(race, boat, BoatActionEnum.DOWNWIND); + + initial = boat.getBearing().degrees(); } + /** + * Ensure the difference between initial and final angle is 3 degrees + */ @Test public void upwindCommandDecreasesAngle() { + upwind.execute(); + assertEquals(initial - boat.getBearing().degrees(), offset, 1e-5); + } + @Test + public void downwindCommandIncreasesAngle() { + downwind.execute(); + assertEquals(boat.getBearing().degrees() - initial, offset, 1e-5); } } \ No newline at end of file From 55798447ab4bce81dd418711af7c9bf33f550a8f Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Mon, 7 Aug 2017 14:25:30 +1200 Subject: [PATCH 4/8] Cherry-picked CommandFactory connection between ControllerServer and RaceLogic. #story[1096] --- .../main/java/mock/app/ConnectionAcceptor.java | 16 +++++++++++----- racevisionGame/src/main/java/mock/app/Event.java | 2 ++ .../gameController/ControllerServer.java | 13 ++++++++----- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 97a974a9..3584fbab 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -1,20 +1,17 @@ package mock.app; +import mock.model.RaceLogic; import network.Messages.Enums.XMLMessageType; import network.Messages.LatestMessages; import network.Messages.XMLMessage; -import org.mockito.Mock; import visualiser.gameController.ControllerServer; import java.io.DataOutputStream; import java.io.IOException; -import java.lang.reflect.Array; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.ArrayBlockingQueue; /** @@ -43,6 +40,10 @@ public class ConnectionAcceptor implements Runnable { private short boatXMLSequenceNumber; //regatta xml sequence number private short regattaXMLSequenceNumber; + //controller server + private ControllerServer controllerServer; + // + private RaceLogic rl = null; /** * Connection Acceptor Constructor @@ -65,6 +66,11 @@ public class ConnectionAcceptor implements Runnable { return serverPort; } + + public void setRace(RaceLogic rl){ + this.rl = rl; + } + /** * Run the Acceptor */ @@ -76,7 +82,7 @@ public class ConnectionAcceptor implements Runnable { Socket mockSocket = serverSocket.accept(); DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser); - ControllerServer controllerServer = new ControllerServer(mockSocket); + this.controllerServer = new ControllerServer(mockSocket, rl); new Thread(mockOutput).start(); new Thread(controllerServer).start(); mockOutputList.add(mockOutput); diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index b4b0586c..617ad584 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -94,6 +94,8 @@ public class Event { //Create and start race. RaceLogic newRace = new RaceLogic(new MockRace(boatDataSource, raceDataSource, regattaDataSource, this.latestMessages, this.boatPolars, Constants.RaceTimeScale), this.latestMessages); + mockOutput.setRace(newRace); + new Thread(newRace).start(); } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index a2f8c80e..c95a0789 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -1,12 +1,9 @@ package visualiser.gameController; -import mock.model.commandFactory.Command; -import mock.model.commandFactory.CommandFactory; +import mock.model.RaceLogic; import network.BinaryMessageDecoder; import network.MessageDecoders.BoatActionDecoder; import network.Messages.Enums.BoatActionEnum; -import visualiser.gameController.Keys.ControlKey; -import visualiser.gameController.Keys.KeyFactory; import java.io.DataInputStream; import java.io.IOException; @@ -29,13 +26,19 @@ public class ControllerServer extends Observable implements Runnable { * Last received boat action */ private BoatActionEnum action; + /** + * + */ + private RaceLogic rc; /** * Initialise server-side controller with live client socket * @param socket to client */ - public ControllerServer(Socket socket) { + public ControllerServer(Socket socket, RaceLogic rc) { this.socket = socket; + this.rc = rc; + this.addObserver(rc); try { this.inputStream = new DataInputStream(this.socket.getInputStream()); } catch (IOException e) { From dad4fa57c69a9b7860cf9381b73ad235dbcb85a0 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Mon, 7 Aug 2017 14:51:32 +1200 Subject: [PATCH 5/8] Fixed WindCommand not updating downwind command when moving upwind. #story[1096] --- .../java/mock/model/commandFactory/WindCommand.java | 10 ++++++---- .../mock/model/commandFactory/WindCommandTest.java | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java index d20c0744..5ba5d5bf 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -12,12 +12,10 @@ public class WindCommand implements Command { private MockBoat boat; private int direction; - private double offset = 3.0; - public WindCommand(MockRace race, MockBoat boat, boolean upwind) { this.race = race; this.boat = boat; - this.direction = upwind? 1 : -1; + this.direction = upwind? -1 : 1; } @Override @@ -25,7 +23,11 @@ public class WindCommand implements Command { double wind = race.getWindDirection().degrees(); double heading = boat.getBearing().degrees(); - if(wind - heading < 0) offset *= -1 * direction; + double offset = 3.0; + + offset *= direction; + if(wind - heading < 0) offset *= -1; + boat.setBearing(Bearing.fromDegrees(heading + offset)); } } diff --git a/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java b/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java index 4316d78d..e5d147d9 100644 --- a/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java +++ b/racevisionGame/src/test/java/mock/model/commandFactory/WindCommandTest.java @@ -47,12 +47,12 @@ public class WindCommandTest { @Test public void upwindCommandDecreasesAngle() { upwind.execute(); - assertEquals(initial - boat.getBearing().degrees(), offset, 1e-5); + assertEquals(initial - boat.getBearing().degrees(), -offset, 1e-5); } @Test public void downwindCommandIncreasesAngle() { downwind.execute(); - assertEquals(boat.getBearing().degrees() - initial, offset, 1e-5); + assertEquals(initial - boat.getBearing().degrees(), offset, 1e-5); } } \ No newline at end of file From e021dd328dcaf940393092398230f51a96fcd231 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Tue, 8 Aug 2017 23:56:59 +1200 Subject: [PATCH 6/8] Changed CompositeCommand stack to queue #story[1096] --- .../mock/model/commandFactory/CompositeCommand.java | 11 ++++++----- .../visualiser/gameController/ControllerServer.java | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java index 12690d29..74c5e95b 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CompositeCommand.java @@ -1,23 +1,24 @@ package mock.model.commandFactory; -import java.util.Stack; +import java.util.ArrayDeque; +import java.util.Queue; /** * Wraps multiple commands into a composite to execute queued commands during a frame. */ public class CompositeCommand implements Command { - private Stack commands; + private Queue commands; public CompositeCommand() { - this.commands = new Stack<>(); + this.commands = new ArrayDeque<>(); } public void addCommand(Command command) { - commands.push(command); + commands.add(command); } @Override public void execute() { - while(!commands.isEmpty()) commands.pop().execute(); + while(!commands.isEmpty()) commands.remove().execute(); } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index c95a0789..66e98d89 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -64,6 +64,7 @@ public class ControllerServer extends Observable implements Runnable { BoatActionDecoder boatActionDecoder = new BoatActionDecoder(encodedMessage.getMessageBody()); action = boatActionDecoder.getBoatAction(); + // Notify observers of most recent action this.notifyObservers(); this.setChanged(); } From 39b5cc2edcd323af967b7b5781e037096143adf9 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Thu, 10 Aug 2017 12:44:42 +1200 Subject: [PATCH 7/8] MockBoat has autoVMG disabled by default. Wind/Tack commands disable autoVMG. VMG command enables it. Upwind command was turning until boat was at 0 degrees, instead of being aligned with wind direction, but that's fixed. #story[1096] --- racevisionGame/src/main/java/mock/model/MockBoat.java | 2 +- .../java/mock/model/commandFactory/TackGybeCommand.java | 3 +++ .../src/main/java/mock/model/commandFactory/VMGCommand.java | 1 + .../main/java/mock/model/commandFactory/WindCommand.java | 6 +++++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockBoat.java b/racevisionGame/src/main/java/mock/model/MockBoat.java index 104fa264..a2f74dd7 100644 --- a/racevisionGame/src/main/java/mock/model/MockBoat.java +++ b/racevisionGame/src/main/java/mock/model/MockBoat.java @@ -25,7 +25,7 @@ public class MockBoat extends Boat { /** * Stores whether the boat is on autoVMG or not */ - private boolean autoVMG = true; + private boolean autoVMG = false; diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java index 150a1da8..8dcf1c48 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java @@ -18,6 +18,9 @@ public class TackGybeCommand implements Command { //The refactoring of MockRace will require changes to be made @Override public void execute() { + + boat.setAutoVMG(false); + /*VMG newVMG = boat.getPolars().calculateVMG( race.getWindDirection(), race.getWindSpeed(), diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java index 64cc6a9f..1a1eeda5 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java @@ -18,6 +18,7 @@ public class VMGCommand implements Command { //The refactoring of MockRace will require changes to be made @Override public void execute() { + boat.setAutoVMG(true); /*VMG newVMG = boat.getPolars().calculateVMG( race.getWindDirection(), race.getWindSpeed(), diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java index 5ba5d5bf..530bf5bc 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -20,13 +20,17 @@ public class WindCommand implements Command { @Override public void execute() { + + boat.setAutoVMG(false); + double wind = race.getWindDirection().degrees(); double heading = boat.getBearing().degrees(); double offset = 3.0; offset *= direction; - if(wind - heading < 0) offset *= -1; + double headWindDelta = wind - heading; + if ((headWindDelta < 0) || (headWindDelta > 180)) offset *= -1; boat.setBearing(Bearing.fromDegrees(heading + offset)); } From 130ffcbf077d64a68135d14105d19fadc30ac8a9 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Thu, 10 Aug 2017 13:16:53 +1200 Subject: [PATCH 8/8] Fixed some merge issues. --- racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java | 2 +- .../main/java/visualiser/gameController/ControllerServer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 5fb01ee9..75b0e721 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -88,7 +88,7 @@ public class ConnectionAcceptor implements Runnable { DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser); - ControllerServer controllerServer = new ControllerServer(mockSocket); //TODO probably pass assigned boat source ID into ControllerServer. + ControllerServer controllerServer = new ControllerServer(mockSocket, this.rl); //TODO probably pass assigned boat source ID into ControllerServer. new Thread(mockOutput, "ConnectionAcceptor.run()->MockOutput thread" + mockOutput).start(); new Thread(controllerServer, "ConnectionAcceptor.run()->ControllerServer thread" + controllerServer).start(); diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index 7469fc26..63c5b263 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -72,7 +72,7 @@ public class ControllerServer extends Observable implements Runnable { try { boatActionDecoder.decode(encodedMessage.getMessageBody()); BoatAction boatAction = boatActionDecoder.getMessage(); - action = boatActionDecoder.getBoatAction(); + action = boatAction.getBoatAction(); // Notify observers of most recent action this.notifyObservers();