/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
******************************************************************************/
package com.badlogic.gdx.input;
import java.io.DataOutputStream;
import java.net.Socket;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Peripheral;
import com.badlogic.gdx.InputProcessor;
/**
* Sends all inputs from touch, key, accelerometer and compass to a {@link RemoteInput} at the given ip/port.
* Instantiate this and call sendUpdate() periodically.
*
* @author mzechner
*/
public class RemoteSender implements InputProcessor {
private DataOutputStream out;
private boolean connected = false;
public static final int KEY_DOWN = 0;
public static final int KEY_UP = 1;
public static final int KEY_TYPED = 2;
public static final int TOUCH_DOWN = 3;
public static final int TOUCH_UP = 4;
public static final int TOUCH_DRAGGED = 5;
public static final int ACCEL = 6;
public static final int COMPASS = 7;
public static final int SIZE = 8;
public RemoteSender(String ip, int port) {
try {
Socket socket = new Socket(ip, port);
socket.setTcpNoDelay(true);
socket.setSoTimeout(3000);
out = new DataOutputStream(socket.getOutputStream());
out.writeBoolean(Gdx.input.isPeripheralAvailable(Peripheral.MultitouchScreen));
connected = true;
Gdx.input.setInputProcessor(this);
} catch (Exception e) {
Gdx.app.log("RemoteSender", "couldn't connect to " + ip + ":" + port);
}
}
public void sendUpdate() {
synchronized (this) {
if (!connected)
return;
}
try {
out.writeInt(ACCEL);
out.writeFloat(Gdx.input.getAccelerometerX());
out.writeFloat(Gdx.input.getAccelerometerY());
out.writeFloat(Gdx.input.getAccelerometerZ());
out.writeInt(COMPASS);
out.writeFloat(Gdx.input.getAzimuth());
out.writeFloat(Gdx.input.getPitch());
out.writeFloat(Gdx.input.getRoll());
out.writeInt(SIZE);
out.writeFloat(Gdx.graphics.getWidth());
out.writeFloat(Gdx.graphics.getHeight());
} catch (Throwable t) {
out = null;
connected = false;
}
}
@Override
public boolean keyDown(int keycode) {
synchronized (this) {
if (!connected)
return false;
}
try {
out.writeInt(KEY_DOWN);
out.writeInt(keycode);
} catch (Throwable t) {
synchronized (this) {
connected = false;
}
}
return false;
}
@Override
public boolean keyUp(int keycode) {
synchronized (this) {
if (!connected)
return false;
}
try {
out.writeInt(KEY_UP);
out.writeInt(keycode);
} catch (Throwable t) {
synchronized (this) {
connected = false;
}
}
return false;
}
@Override
public boolean keyTyped(char character) {
synchronized (this) {
if (!connected)
return false;
}
try {
out.writeInt(KEY_TYPED);
out.writeChar(character);
} catch (Throwable t) {
synchronized (this) {
connected = false;
}
}
return false;
}
@Override
public boolean touchDown(int x, int y, int pointer, int button) {
synchronized (this) {
if (!connected)
return false;
}
try {
out.writeInt(TOUCH_DOWN);
out.writeInt(x);
out.writeInt(y);
out.writeInt(pointer);
} catch (Throwable t) {
synchronized (this) {
connected = false;
}
}
return false;
}
@Override
public boolean touchUp(int x, int y, int pointer, int button) {
synchronized (this) {
if (!connected)
return false;
}
try {
out.writeInt(TOUCH_UP);
out.writeInt(x);
out.writeInt(y);
out.writeInt(pointer);
} catch (Throwable t) {
synchronized (this) {
connected = false;
}
}
return false;
}
@Override
public boolean touchDragged(int x, int y, int pointer) {
synchronized (this) {
if (!connected)
return false;
}
try {
out.writeInt(TOUCH_DRAGGED);
out.writeInt(x);
out.writeInt(y);
out.writeInt(pointer);
} catch (Throwable t) {
synchronized (this) {
connected = false;
}
}
return false;
}
@Override
public boolean mouseMoved(int x, int y) {
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
public boolean isConnected() {
synchronized (this) {
return connected;
}
}
}