19244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames/*******************************************************************************
29244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * Copyright 2011 See AUTHORS file.
39244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames *
49244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * Licensed under the Apache License, Version 2.0 (the "License");
59244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * you may not use this file except in compliance with the License.
69244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * You may obtain a copy of the License at
79244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames *
89244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames *   http://www.apache.org/licenses/LICENSE-2.0
99244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames *
109244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * Unless required by applicable law or agreed to in writing, software
119244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * distributed under the License is distributed on an "AS IS" BASIS,
129244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * See the License for the specific language governing permissions and
149244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames * limitations under the License.
159244abf367bce0e823d8cacc8f2ad15d3c83d154badlogicgames ******************************************************************************/
162f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
170124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgamespackage com.badlogic.gdx.input;
180124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
190124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgamesimport java.io.DataOutputStream;
200124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgamesimport java.net.Socket;
210124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
220124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgamesimport com.badlogic.gdx.Gdx;
23468499d795b89a5f9011192b4d650a539ecc6910badlogicgamesimport com.badlogic.gdx.Input.Peripheral;
240124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgamesimport com.badlogic.gdx.InputProcessor;
250124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
262f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet/** Sends all inputs from touch, key, accelerometer and compass to a {@link RemoteInput} at the given ip/port. Instantiate this and
272f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet * call sendUpdate() periodically.
280124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames *
292f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet * @author mzechner */
300124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgamespublic class RemoteSender implements InputProcessor {
310124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	private DataOutputStream out;
320124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	private boolean connected = false;
332f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
340124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int KEY_DOWN = 0;
350124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int KEY_UP = 1;
360124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int KEY_TYPED = 2;
372f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
380124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int TOUCH_DOWN = 3;
390124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int TOUCH_UP = 4;
400124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int TOUCH_DRAGGED = 5;
412f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
420124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int ACCEL = 6;
430124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int COMPASS = 7;
440124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	public static final int SIZE = 8;
4575f0b833ed0d3a177b4f19c4b2d04afc118e5e96snovak	public static final int GYRO = 9;
462f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
472f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public RemoteSender (String ip, int port) {
480124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
490124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			Socket socket = new Socket(ip, port);
500124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			socket.setTcpNoDelay(true);
510124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			socket.setSoTimeout(3000);
520124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out = new DataOutputStream(socket.getOutputStream());
53468499d795b89a5f9011192b4d650a539ecc6910badlogicgames			out.writeBoolean(Gdx.input.isPeripheralAvailable(Peripheral.MultitouchScreen));
540124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			connected = true;
550124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			Gdx.input.setInputProcessor(this);
562f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Exception e) {
57eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			Gdx.app.log("RemoteSender", "couldn't connect to " + ip + ":" + port);
580124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
592f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	}
602f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
612f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public void sendUpdate () {
622f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
632f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return;
64eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
650124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
660124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(ACCEL);
670124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.input.getAccelerometerX());
680124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.input.getAccelerometerY());
690124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.input.getAccelerometerZ());
700124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(COMPASS);
710124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.input.getAzimuth());
720124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.input.getPitch());
730124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.input.getRoll());
740124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(SIZE);
750124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.graphics.getWidth());
760124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeFloat(Gdx.graphics.getHeight());
7775f0b833ed0d3a177b4f19c4b2d04afc118e5e96snovak			out.writeInt(GYRO);
7875f0b833ed0d3a177b4f19c4b2d04afc118e5e96snovak			out.writeFloat(Gdx.input.getGyroscopeX());
7975f0b833ed0d3a177b4f19c4b2d04afc118e5e96snovak			out.writeFloat(Gdx.input.getGyroscopeY());
8075f0b833ed0d3a177b4f19c4b2d04afc118e5e96snovak			out.writeFloat(Gdx.input.getGyroscopeZ());
812f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
820124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out = null;
830124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			connected = false;
840124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
850124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
860124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
872f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
882f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean keyDown (int keycode) {
892f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
902f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return false;
91eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
922f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
930124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
940124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(KEY_DOWN);
950124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(keycode);
962f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
972f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			synchronized (this) {
98eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames				connected = false;
99eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			}
1000124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
1010124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1020124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1030124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
1042f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
1052f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean keyUp (int keycode) {
1062f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
1072f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return false;
108eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
1092f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
1100124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
1110124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(KEY_UP);
1120124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(keycode);
1132f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
1142f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			synchronized (this) {
115eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames				connected = false;
116eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			}
1170124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
1180124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1190124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1200124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
1212f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
1222f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean keyTyped (char character) {
1232f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
1242f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return false;
125eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
1262f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
1270124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
1280124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(KEY_TYPED);
1290124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeChar(character);
1302f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
1312f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			synchronized (this) {
132eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames				connected = false;
133eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			}
1340124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
1350124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1360124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1370124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
1382f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
1392f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean touchDown (int x, int y, int pointer, int button) {
1402f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
1412f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return false;
142eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
1432f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
1440124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
1450124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(TOUCH_DOWN);
1460124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(x);
1470124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(y);
1482f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			out.writeInt(pointer);
1492f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
1502f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			synchronized (this) {
151eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames				connected = false;
152eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			}
1530124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
1540124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1550124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1560124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
1572f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
1582f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean touchUp (int x, int y, int pointer, int button) {
1592f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
1602f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return false;
161eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
1622f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
1630124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
1640124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(TOUCH_UP);
1650124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(x);
1660124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(y);
1672f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			out.writeInt(pointer);
1682f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
1692f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			synchronized (this) {
170eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames				connected = false;
171eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			}
1720124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
1730124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1740124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1750124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
1762f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
1772f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean touchDragged (int x, int y, int pointer) {
1782f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
1792f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			if (!connected) return false;
180eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
1812f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
1820124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		try {
1830124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(TOUCH_DRAGGED);
1840124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(x);
1850124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames			out.writeInt(y);
1862f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			out.writeInt(pointer);
1872f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		} catch (Throwable t) {
1882f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet			synchronized (this) {
189eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames				connected = false;
190eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			}
1910124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		}
1920124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1930124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1940124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
1952f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
196d9c98ddd1c352be2d8d92f3601b5cd000ba37219nathan.sweet	public boolean mouseMoved (int x, int y) {
1970124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
1980124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
1990124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames
2002f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	@Override
2012f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean scrolled (int amount) {
2020124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames		return false;
2030124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
2042f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet
2052f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet	public boolean isConnected () {
2062f412de0a867ffffe70909d9bb69434e3ac6b16bnathan.sweet		synchronized (this) {
207eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames			return connected;
208eb58939adf4f5779f325ab1e928a9c57a0f98a16badlogicgames		}
2090124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames	}
2100124e6dde9484f4cbc804ba0bd52ff308cf746b6badlogicgames}
211