diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 4c2b38ce..97a974a9 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -4,6 +4,7 @@ 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; @@ -75,7 +76,9 @@ 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); new Thread(mockOutput).start(); + new Thread(controllerServer).start(); mockOutputList.add(mockOutput); System.out.println(String.format("%d number of Visualisers Connected.", mockOutputList.size())); } catch (IOException e) { diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 3ba6841c..b2c5b243 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -94,7 +94,6 @@ public class Event { MockRace newRace = new MockRace(boatDataSource, raceDataSource, regattaDataSource, this.latestMessages, this.boatPolars, Constants.RaceTimeScale); new Thread(newRace).start(); - } /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index 87477bea..7652f98e 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -53,7 +53,7 @@ public class ConnectionController extends Controller { statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty()); connectionTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> { - if (curr != null && ((RaceConnection)curr).check()) connectButton.setDisable(false); + if (curr != null && curr.check()) connectButton.setDisable(false); else connectButton.setDisable(true); }); connectButton.setDisable(true); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index 262c3c8a..d258e695 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -4,6 +4,7 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.layout.AnchorPane; import visualiser.app.VisualiserInput; +import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRace; @@ -36,8 +37,8 @@ public class MainController extends Controller { * @param visualiserInput The object used to read packets from the race server. * @param visualiserRace The object modelling the race. */ - public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) { - raceController.startRace(visualiserInput, visualiserRace); + public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) { + raceController.startRace(visualiserInput, visualiserRace, controllerClient); } /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 427e152c..476d4309 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -19,11 +19,13 @@ import javafx.util.Callback; import network.Messages.Enums.RaceStatusEnum; import shared.model.Leg; import visualiser.app.VisualiserInput; +import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; import visualiser.model.*; import java.awt.*; +import java.io.IOException; import java.net.URL; import java.text.DecimalFormat; import java.util.ResourceBundle; @@ -58,6 +60,11 @@ public class RaceController extends Controller { */ private Sparkline sparkline; + /** + * Service for sending keystrokes to server + */ + private ControllerClient controllerClient; + @FXML private GridPane canvasBase; @FXML private Pane arrow; @@ -90,7 +97,11 @@ public class RaceController extends Controller { String codeString = event.getCode().toString(); ControlKey controlKey = KeyFactory.getKey(codeString); if(controlKey != null) { - System.out.println(controlKey.toString() + " is Pressed."); + try { + controllerClient.sendKey(controlKey); + } catch (IOException e) { + e.printStackTrace(); + } } }); } @@ -324,10 +335,11 @@ public class RaceController extends Controller { * @param visualiserInput Object used to read packets from server. * @param visualiserRace Object modelling the race. */ - public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) { + public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) { this.visualiserInput = visualiserInput; this.visualiserRace = visualiserRace; + this.controllerClient = controllerClient; initialiseRace(); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java index 2735023e..8db4ec60 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java @@ -19,6 +19,7 @@ import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import visualiser.app.VisualiserInput; +import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRace; @@ -76,6 +77,8 @@ public class StartController extends Controller implements Observer { */ private VisualiserRace visualiserRace; + private ControllerClient controllerClient; + /** * An array of colors used to assign colors to each boat - passed in to the VisualiserRace constructor. */ @@ -258,7 +261,7 @@ public class StartController extends Controller implements Observer { startWrapper.setVisible(false); start.setVisible(false); - parent.beginRace(visualiserInput, visualiserRace); + parent.beginRace(visualiserInput, visualiserRace, controllerClient); } } }.start(); @@ -308,6 +311,8 @@ public class StartController extends Controller implements Observer { try { //Begin reading packets from the socket/server. this.visualiserInput = new VisualiserInput(socket); + //Send controller input to server + this.controllerClient = new ControllerClient(socket); //Store a reference to latestMessages so that we can observe it. LatestMessages latestMessages = this.visualiserInput.getLatestMessages(); latestMessages.addObserver(this); diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java new file mode 100644 index 00000000..8a74e394 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -0,0 +1,46 @@ +package visualiser.gameController; + +import visualiser.gameController.Keys.ControlKey; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.nio.ByteBuffer; + +/** + * Basic service for sending key presses to game server + */ +public class ControllerClient { + /** + * Socket to server + */ + Socket socket; + + /** + * Output stream wrapper for socket to server + */ + DataOutputStream outputStream; + + /** + * Initialise controller client with live socket. + * @param socket to server + */ + public ControllerClient(Socket socket) { + this.socket = socket; + try { + this.outputStream = new DataOutputStream(socket.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Send a keypress to server + * @param key to send + * @throws IOException if socket write fails + */ + public void sendKey(ControlKey key) throws IOException { + // TODO - get and send action number currently corresponding to key (context dependent) + System.out.println(key.toString()); + } +} diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java new file mode 100644 index 00000000..012d3087 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -0,0 +1,51 @@ +package visualiser.gameController; + +import visualiser.gameController.Keys.ControlKey; +import visualiser.gameController.Keys.KeyFactory; + +import java.io.DataInputStream; +import java.io.IOException; +import java.net.Socket; + +/** + * Service for dispatching key press data to race from client + */ +public class ControllerServer implements Runnable { + /** + * Socket to client + */ + private Socket socket; + /** + * Wrapper for input from client + */ + private DataInputStream inputStream; + + /** + * Initialise server-side controller with live client socket + * @param socket to client + */ + public ControllerServer(Socket socket) { + this.socket = socket; + try { + this.inputStream = new DataInputStream(this.socket.getInputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Wait for controller key input from client and loop. + */ + @Override + public void run() { + while(true) { + byte[] key = new byte[1]; + try { + inputStream.read(key); + // TODO - handle messages received + } 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 6e4d403b..70e9c670 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java @@ -8,7 +8,7 @@ import javafx.scene.input.KeyCode; public class KeyFactory { /** - * Get the Control Key incharge of a key press + * Get the Control Key in charge of a key press * @param key key pressed (String value of KeyCode) * @return the Control Key behaviour of the key pressed. */