package org.thingml.generated.network;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.spi.SelectorProvider;
import java.util.Iterator;
import java.util.Set;
import org.thingml.generated.messages.*;
import org.thingml.java.*;
import org.thingml.java.ext.*;
public class UDPJava extends Component {
private final /*$SERIALIZER$*/ formatter = new /*$SERIALIZER$*/();
private final int clientID;
private final int port;
private SocketAddress remote;
private DatagramChannel channel;
private Selector selector;
private Thread receiver;
private java.util.concurrent.atomic.AtomicBoolean receiving = new java.util.concurrent.atomic.AtomicBoolean(true);
/*$PORTS$*/
public UDPJava(int clientID, int port, String dest) {
this.clientID = clientID;
this.port = port;
try {
remote = new InetSocketAddress(dest, port);
channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.connect(remote);
selector = SelectorProvider.provider().openSelector();
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
receiver = new Thread( new Runnable() {
@Override
public void run() {
while(UDPJava.this.receiving.get()) {
receive();
try {
Thread.sleep(25);
} catch (InterruptedException e) {}
}
}
});
receiver.start();
} catch (IOException ex) {
System.err.println(ex);
}
}
public void send(final byte[] payload) {
try {
selector.select(clientID);
final Set readyKeys = selector.selectedKeys();
final Iterator iterator = readyKeys.iterator();
if (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
if (key.isWritable()) {
channel.write(ByteBuffer.wrap(payload));
}
}
} catch (IOException ex) {
System.err.println(ex);
}
}
public void receive() {
try {
selector.select(clientID);
final Set readyKeys = selector.selectedKeys();
final Iterator iterator = readyKeys.iterator();
if (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
if (key.isReadable()) {
final ByteBuffer buffer = ByteBuffer.allocate(128);
channel.read(buffer);
buffer.flip();
/*$PARSING CODE$*/
}
}
} catch (IOException ex) {
System.err.println(ex);
}
}
@Override
public void stop() {
super.stop();
receiving.set(false);
try {
receiver.join(100);
} catch (InterruptedException e) {} }
@Override
public void run() {
while (active.get()) {
try {
final Event e = queue.take();//should block if queue is empty, waiting for a message
final byte[] payload = JavaBinaryHelper.toPrimitive(formatter.format(e));
if (payload != null) {
send(payload);
}
} catch (InterruptedException e) {
//e.printStackTrace();
}
}
}
@Override
public Component buildBehavior(String id, Component root) {
/*$INIT PORTS$*/
final java.util.List < AtomicState > states = new java.util.ArrayList < AtomicState > ();
final AtomicState init = new AtomicState("Init");
states.add(init);
behavior = new CompositeState("default", states, init, java.util.Collections.EMPTY_LIST);
return this;
}
}