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