Action packets now sent at regular 20ms intervals

#issue[38] #implement
This commit is contained in:
Calum
2017-08-09 14:03:21 +12:00
parent a3ce5998ff
commit 30a6cb98ec
6 changed files with 41 additions and 73 deletions
-2
View File
@@ -67,8 +67,6 @@ public class App extends Application {
@Override @Override
public void start(Stage primaryStage) throws Exception { public void start(Stage primaryStage) throws Exception {
PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv"));
Parent root = FXMLLoader.load(getClass().getResource("/views/StartScreenView.fxml")); Parent root = FXMLLoader.load(getClass().getResource("/views/StartScreenView.fxml"));
primaryStage.setTitle("RaceVision"); primaryStage.setTitle("RaceVision");
Scene scene = new Scene(root, 1530, 960); Scene scene = new Scene(root, 1530, 960);
@@ -49,10 +49,8 @@ public class GameState implements Runnable {
players = new ArrayList<>(); players = new ArrayList<>();
currentStage = GameStages.LOBBYING; currentStage = GameStages.LOBBYING;
isRaceStarted = false; isRaceStarted = false;
yachts = new HashMap<>();
//set this when game stage changes to prerace //set this when game stage changes to prerace
previousUpdateTime = System.currentTimeMillis(); previousUpdateTime = System.currentTimeMillis();
yachts = new HashMap<>();
new Thread(this).start(); new Thread(this).start();
} }
@@ -67,7 +65,8 @@ public class GameState implements Runnable {
public static void addPlayer(Player player) { public static void addPlayer(Player player) {
players.add(player); players.add(player);
String playerText = player.getYacht().getSourceId() + " " + player.getYacht().getBoatName() + " " + player.getYacht().getCountry(); String playerText = player.getYacht().getSourceId() + " " + player.getYacht().getBoatName()
+ " " + player.getYacht().getCountry();
playerStringMap.put(player, playerText); playerStringMap.put(player, playerText);
} }
@@ -42,7 +42,7 @@ public class HeartbeatThread extends Thread{
*/ */
private void sendHeartbeatToAllPlayers(){ private void sendHeartbeatToAllPlayers(){
Message heartbeat = new Heartbeat(seqNum); Message heartbeat = new Heartbeat(seqNum);
System.out.println(GameState.getPlayers());
for (Player player : GameState.getPlayers()){ for (Player player : GameState.getPlayers()){
if (!player.getSocket().isConnected()) { if (!player.getSocket().isConnected()) {
playerLostConnection(player); playerLostConnection(player);
@@ -8,6 +8,7 @@ import java.util.Observable;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import seng302.model.Player; import seng302.model.Player;
import seng302.model.PolarTable;
/** /**
* A class describing the overall server, which creates and collects server threads for each client * A class describing the overall server, which creates and collects server threads for each client
@@ -31,7 +32,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
} catch (IOException e) { } catch (IOException e) {
serverLog("IO error in server thread handler upon trying to make new server socket", 0); serverLog("IO error in server thread handler upon trying to make new server socket", 0);
} }
PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv"));
terminated = false; terminated = false;
thread = new Thread(this); thread = new Thread(this);
thread.start(); thread.start();
@@ -71,8 +71,6 @@ public final class PolarTable {
} catch (IOException e) { } catch (IOException e) {
System.out.println("[PolarTable] IO exception"); System.out.println("[PolarTable] IO exception");
} }
} }
@@ -155,7 +153,6 @@ public final class PolarTable {
public static Double getClosestWindSpeedInPolar(Double thisWindSpeed) { public static Double getClosestWindSpeedInPolar(Double thisWindSpeed) {
Double smallestDif = Double.POSITIVE_INFINITY; Double smallestDif = Double.POSITIVE_INFINITY;
Double closestWind = 0d; Double closestWind = 0d;
for (Double polarWindSpeed : polarTable.keySet()) { for (Double polarWindSpeed : polarTable.keySet()) {
Double difference = Math.abs(polarWindSpeed - thisWindSpeed); Double difference = Math.abs(polarWindSpeed - thisWindSpeed);
if (difference < smallestDif) { if (difference < smallestDif) {
@@ -1,24 +1,18 @@
package seng302.visualiser.ClientToServerTests; package seng302.visualiser.ClientToServerTests;
import java.lang.reflect.Field; import java.util.ArrayList;
import javafx.application.Platform; import org.junit.After;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
import org.junit.Test; import org.junit.Test;
import org.junit.runners.MethodSorters; import org.junit.runners.MethodSorters;
import org.testfx.api.FxToolkit;
import seng302.gameServer.GameStages; import seng302.gameServer.GameStages;
import seng302.gameServer.GameState; import seng302.gameServer.GameState;
import seng302.gameServer.MainServerThread; import seng302.gameServer.MainServerThread;
import seng302.gameServer.server.messages.BoatActionType;
import seng302.model.Yacht; import seng302.model.Yacht;
import seng302.visualiser.ClientToServerThread; import seng302.visualiser.ClientToServerThread;
import seng302.visualiser.GameClient;
/** /**
* Test for checking how regularly packets are sent from ClientToServer Thread. * Test for checking how regularly packets are sent from ClientToServer Thread.
@@ -27,87 +21,59 @@ import seng302.visualiser.GameClient;
public class RegularPacketsTest { public class RegularPacketsTest {
private MainServerThread serverThread; private MainServerThread serverThread;
private GameClient gameClient; private ClientToServerThread clientThread;
private Pane pane;
private Scene scene;
private Stage stage;
// @BeforeClass
// public static void preSetup() throws Exception {
// FxToolkit toolkit = FxToolkit.registerPrimaryStage();
// }
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
stage = FxToolkit.registerPrimaryStage(); new GameState("localhost");
Platform.runLater(() -> { serverThread = new MainServerThread();
pane = new Pane(); clientThread = new ClientToServerThread("localhost", 4942);
scene = new Scene(pane);
stage.setScene(scene);
});
while (stage != null && pane != null && scene != null && stage.getScene() != null);
gameClient = new GameClient(pane);
gameClient.runAsHost("localhost", 4942);
Field server = gameClient.getClass().getDeclaredField("server");
server.setAccessible(true);
serverThread = (MainServerThread) server.get(gameClient);
GameState.setCurrentStage(GameStages.RACING); GameState.setCurrentStage(GameStages.RACING);
serverThread.startGame();
} }
@Test @Test
public void Test1PacketsSentAtRegularIntervals () throws Exception { public void Test1PacketsSentAtRegularIntervals () throws Exception {
Yacht yacht = GameState.getYachts().get(0); final double TEST_DISTANCE = 10.0;
serverThread.startGame();
SleepThreadMaxDelay();
Yacht yacht = new ArrayList<>(GameState.getYachts().values()).get(0);
double startAngle = yacht.getHeading(); double startAngle = yacht.getHeading();
KeyEvent keyPress = new KeyEvent(null, scene,
KeyEvent.KEY_PRESSED, "page_up", "page_up", KeyCode.PAGE_UP,
false, false, false, false
);
KeyEvent keyRelease = new KeyEvent(null, scene,
KeyEvent.KEY_RELEASED, "page_up", "page_up", KeyCode.PAGE_UP,
false, false, false, false
);
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
pane.fireEvent(keyPress); clientThread.sendBoatEvent(BoatActionType.UPWIND);
while (yacht.getHeading() - startAngle > 100); Thread.sleep(200);
pane.fireEvent(keyRelease); while (Math.abs(yacht.getHeading() - startAngle) < TEST_DISTANCE) {
//Wait for yacht to move
}
clientThread.sendBoatEvent(BoatActionType.MAINTAIN_HEADING);
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
SleepThreadMaxDelay(); //Allowed to be two loops of delay due to loop delay and processing delay at client + server ends. SleepThreadMaxDelay();
Assert.assertEquals(100 / Yacht.TURN_STEP * ClientToServerThread.PACKET_SENDING_INTERVAL_MS, //Allowed to be two loops of delay due to loop delay and processing delay at client + server ends.
endTime - startTime / (100 / Yacht.TURN_STEP), 2 * ClientToServerThread.PACKET_SENDING_INTERVAL_MS); Assert.assertEquals(TEST_DISTANCE / Yacht.TURN_STEP * ClientToServerThread.PACKET_SENDING_INTERVAL_MS,
(endTime - startTime), 2 * ClientToServerThread.PACKET_SENDING_INTERVAL_MS);
} }
@Test @Test
public void Test2ArbitraryPacketSentOnRelease() throws Exception { public void Test2ArbitraryPacketSentOnRelease() throws Exception {
KeyEvent keyPress = new KeyEvent(null, scene, serverThread.startGame();
KeyEvent.KEY_PRESSED, "shift", "shift", KeyCode.SHIFT, SleepThreadMaxDelay();
false, false, false, false Yacht yacht = new ArrayList<>(GameState.getYachts().values()).get(0);
);
KeyEvent keyRelease = new KeyEvent(null, scene,
KeyEvent.KEY_RELEASED, "shift", "shift", KeyCode.SHIFT,
false, false, false, false
);
Yacht yacht = GameState.getYachts().get(0);
boolean startState = yacht.getSailIn(); boolean startState = yacht.getSailIn();
pane.fireEvent(keyPress); clientThread.sendBoatEvent(BoatActionType.SAILS_IN);
pane.fireEvent(keyRelease);
SleepThreadMaxDelay(); SleepThreadMaxDelay();
Assert.assertEquals(startState, !yacht.getSailIn()); Assert.assertEquals(startState, !yacht.getSailIn());
} }
@Test @Test
public void Test3ArbitraryPacketSentOnPress() throws Exception { public void Test3ArbitraryPacketSentOnPress() throws Exception {
KeyEvent keyPress = new KeyEvent(null, scene, serverThread.startGame();
KeyEvent.KEY_PRESSED, "space", "space", KeyCode.SPACE, SleepThreadMaxDelay();
false, false, false, false Yacht yacht = new ArrayList<>(GameState.getYachts().values()).get(0);
);
Yacht yacht = GameState.getYachts().get(0);
double heading = yacht.getHeading(); double heading = yacht.getHeading();
double windDirection = GameState.getWindDirection(); double windDirection = GameState.getWindDirection();
Yacht testYacht = new Yacht("", 0, "", "", "", ""); Yacht testYacht = new Yacht("", 0, "", "", "", "");
testYacht.setHeading(heading); testYacht.setHeading(heading);
testYacht.tackGybe(windDirection); testYacht.tackGybe(windDirection);
pane.fireEvent(keyPress); clientThread.sendBoatEvent(BoatActionType.TACK_GYBE);
SleepThreadMaxDelay(); SleepThreadMaxDelay();
Assert.assertEquals(testYacht.getHeading(), yacht.getHeading(), 1); Assert.assertEquals(testYacht.getHeading(), yacht.getHeading(), 1);
} }
@@ -120,4 +86,11 @@ public class RegularPacketsTest {
private void SleepThreadMaxDelay() throws Exception { private void SleepThreadMaxDelay() throws Exception {
Thread.sleep(200); Thread.sleep(200);
} }
@After
public void teardown () {
serverThread.terminate();
clientThread.setSocketToClose();
GameState.setCurrentStage(GameStages.LOBBYING);
}
} }