import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class SpaceNavigator { private static final int TOTAL_VALUES_FROM_SPACE_NAVIGATOR = 7; private final int LINE_ID = 0; private final int PAN_X_VALUE = 1; private final int PAN_X_BITMASK = 2; private final int PAN_Y_VALUE = 3; private final int PAN_Y_BITMASK = 4; private final int ZOOM_VALUE = 5; private final int ZOOM_BITMASK = 6; private final int TILT_Y_VALUE = 1; private final int TILT_Y_BITMASK = 2; private final int TILT_X_VALUE = 3; private final int TILT_X_BITMASK = 4; private final int TWIST_VALUE = 5; private final int TWIST_BITMASK = 6; private final int BUTTONS_VALUE = 1; private final int PAN_ZOOM_LINE = 1; private final int TILT_TWIST_LINE = 2; private final int BUTTON_LINE = 3; public final int PAN_X = 0; public final int PAN_Y = 1; public final int TILT_X = 2; public final int TILT_Y = 3; public final int TWIST = 4; public final int ZOOM = 5; public final int BUTTONS_MASK = 6; private int port = 6000; private Visualizer visualizer; private int[] values; public static void main(String[] args) { new SpaceNavigator(); } public SpaceNavigator() { visualizer = new Visualizer(); values = new int[TOTAL_VALUES_FROM_SPACE_NAVIGATOR]; startServer(); } private void startServer() { System.err.println("starting server on port " + port); try { ServerSocket server = new ServerSocket(port); System.err.println("Server started. Waiting for connection"); Socket socket = server.accept(); if (socket.isConnected()) { System.err.println("connected to " + socket.getRemoteSocketAddress()); } final BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); System.err.println("monitoring stream"); // read the incoming stream String line; while ((line = in.readLine()) != null) { if ("EXIT".equals(line)) { System.err.println("EXIT detected, exiting..."); break; } // this is where all the magic happens decodeValues(line); visualize(); } } catch (IOException e) { e.printStackTrace(); } System.err.println("Server Stopped"); } private void visualize() { visualizer.setPanXValue(values[PAN_X]); visualizer.setPanYValue(values[PAN_Y]); visualizer.setTiltXValue(values[TILT_X]); visualizer.setTiltYValue(values[TILT_Y]); visualizer.setTwistValue(values[TWIST]); visualizer.setZoomValue(values[ZOOM]); visualizer.setButtonsValue(values[BUTTONS_MASK]); } private void decodeValues(String line) { char bytes[] = parseLine(line); if (bytes[LINE_ID] == PAN_ZOOM_LINE) { values[PAN_X] = shift(bytes[PAN_X_VALUE], bytes[PAN_X_BITMASK]); values[PAN_Y] = -1 * shift(bytes[PAN_Y_VALUE], bytes[PAN_Y_BITMASK]); values[ZOOM] = -1 * shift(bytes[ZOOM_VALUE], bytes[ZOOM_BITMASK]); } else if (bytes[LINE_ID] == TILT_TWIST_LINE) { values[TILT_Y] = -1 * shift(bytes[TILT_Y_VALUE], bytes[TILT_Y_BITMASK]); values[TILT_X] = -1 * shift(bytes[TILT_X_VALUE], bytes[TILT_X_BITMASK]); values[TWIST] = shift(bytes[TWIST_VALUE], bytes[TWIST_BITMASK]); } else if (bytes[LINE_ID] == BUTTON_LINE) { values[BUTTONS_MASK] = bytes[BUTTONS_VALUE]; } else { throw new RuntimeException( "Line identifies value should only be 1, 2 or 3. Value was " + bytes[LINE_ID]); } } private int shift(char a, char b) { return (short) (b << 8) | a; } private char[] parseLine(String line) { String[] stringValues = line.split(" "); char[] byteValues = new char[stringValues.length]; for (int n = 0; n < stringValues.length; n++) { byteValues[n] = (char) Integer.parseInt(stringValues[n]); } return byteValues; } }