mirror of
https://github.com/processing/processing4.git
synced 2026-02-04 22:29:18 +01:00
183 lines
4.0 KiB
Java
183 lines
4.0 KiB
Java
package galsasson.mode.tweak;
|
|
|
|
import java.net.*;
|
|
import java.nio.ByteBuffer;
|
|
|
|
public class UDPTweakClient {
|
|
private DatagramSocket socket;
|
|
private InetAddress address;
|
|
private boolean initialized;
|
|
private int sketchPort;
|
|
|
|
static final int VAR_INT = 0;
|
|
static final int VAR_FLOAT = 1;
|
|
static final int SHUTDOWN = 0xffffffff;
|
|
|
|
public UDPTweakClient(int sketchPort)
|
|
{
|
|
this.sketchPort = sketchPort;
|
|
|
|
try {
|
|
socket = new DatagramSocket();
|
|
// only local sketch is allowed
|
|
address = InetAddress.getByName("127.0.0.1");
|
|
initialized = true;
|
|
}
|
|
catch (SocketException e) {
|
|
initialized = false;
|
|
}
|
|
catch (UnknownHostException e) {
|
|
socket.close();
|
|
initialized = false;
|
|
}
|
|
catch (SecurityException e) {
|
|
socket.close();
|
|
initialized = false;
|
|
}
|
|
}
|
|
|
|
public void shutdown()
|
|
{
|
|
if (!initialized) {
|
|
return;
|
|
}
|
|
|
|
// send shutdown to the sketch
|
|
sendShutdown();
|
|
initialized = false;
|
|
}
|
|
|
|
public boolean sendInt(int index, int val)
|
|
{
|
|
if (!initialized) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
byte[] buf = new byte[12];
|
|
ByteBuffer bb = ByteBuffer.wrap(buf);
|
|
bb.putInt(0, VAR_INT);
|
|
bb.putInt(4, index);
|
|
bb.putInt(8, val);
|
|
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, sketchPort);
|
|
socket.send(packet);
|
|
}
|
|
catch (Exception e) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public boolean sendFloat(int index, float val)
|
|
{
|
|
if (!initialized) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
byte[] buf = new byte[12];
|
|
ByteBuffer bb = ByteBuffer.wrap(buf);
|
|
bb.putInt(0, VAR_FLOAT);
|
|
bb.putInt(4, index);
|
|
bb.putFloat(8, val);
|
|
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, sketchPort);
|
|
socket.send(packet);
|
|
}
|
|
catch (Exception e) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public boolean sendShutdown()
|
|
{
|
|
if (!initialized) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
byte[] buf = new byte[12];
|
|
ByteBuffer bb = ByteBuffer.wrap(buf);
|
|
bb.putInt(0, SHUTDOWN);
|
|
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, sketchPort);
|
|
socket.send(packet);
|
|
}
|
|
catch (Exception e) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static String getServerCode(int listenPort, boolean hasInts, boolean hasFloats)
|
|
{
|
|
String serverCode = ""+
|
|
"class TweakModeServer extends Thread\n"+
|
|
"{\n"+
|
|
" protected DatagramSocket socket = null;\n"+
|
|
" protected boolean running = true;\n"+
|
|
" final int INT_VAR = 0;\n"+
|
|
" final int FLOAT_VAR = 1;\n"+
|
|
" final int SHUTDOWN = 0xffffffff;\n"+
|
|
" public TweakModeServer() {\n"+
|
|
" this(\"TweakModeServer\");\n"+
|
|
" }\n"+
|
|
" public TweakModeServer(String name) {\n"+
|
|
" super(name);\n"+
|
|
" }\n"+
|
|
" public void setup()\n"+
|
|
" {\n"+
|
|
" try {\n"+
|
|
" socket = new DatagramSocket("+listenPort+");\n"+
|
|
" socket.setSoTimeout(250);\n"+
|
|
" } catch (IOException e) {\n"+
|
|
" println(\"error: could not create TweakMode server socket\");\n"+
|
|
" }\n"+
|
|
" }\n"+
|
|
" public void run()\n"+
|
|
" {\n"+
|
|
" byte[] buf = new byte[256];\n"+
|
|
" while(running)\n"+
|
|
" {\n"+
|
|
" try {\n"+
|
|
" DatagramPacket packet = new DatagramPacket(buf, buf.length);\n"+
|
|
" socket.receive(packet);\n"+
|
|
" ByteBuffer bb = ByteBuffer.wrap(buf);\n"+
|
|
" int type = bb.getInt(0);\n"+
|
|
" int index = bb.getInt(4);\n";
|
|
|
|
if (hasInts) {
|
|
serverCode +=
|
|
" if (type == INT_VAR) {\n"+
|
|
" int val = bb.getInt(8);\n"+
|
|
" tweakmode_int[index] = val;\n"+
|
|
" }\n"+
|
|
" else ";
|
|
}
|
|
if (hasFloats) {
|
|
serverCode +=
|
|
" if (type == FLOAT_VAR) {\n"+
|
|
" float val = bb.getFloat(8);\n"+
|
|
" tweakmode_float[index] = val;\n"+
|
|
" }\n"+
|
|
" else";
|
|
}
|
|
serverCode +=
|
|
" if (type == SHUTDOWN) {\n"+
|
|
" running = false;\n"+
|
|
" }\n"+
|
|
" } catch (SocketTimeoutException e) {\n"+
|
|
" // nothing to do here just try receiving again\n"+
|
|
" } catch (Exception e) {\n"+
|
|
" }\n"+
|
|
" }\n"+
|
|
" socket.close();\n"+
|
|
" }\n"+
|
|
"}\n\n\n";
|
|
|
|
return serverCode;
|
|
}
|
|
}
|