BTConnetor.WaitForConnection(int timeout, int mode)
Does not time out and
BTConnection.read(byte[] buffer, int length, boolean wait)
Will wait until it is loaded. To solve these problems, I created a wrapper class.
BtNbConnector.java
import java.io.IOException;
import lejos.remote.nxt.BTConnector;
import lejos.remote.nxt.NXTCommConnector;
import lejos.remote.nxt.NXTConnection;
import lejos.utility.Stopwatch;
public class BtNbConnector extends NXTCommConnector implements Runnable {
BTConnector connector;
private NXTConnection con = null;
private boolean connected = false;
private int mode;
public BtNbConnector() {
connector = new BTConnector();
}
@Override
public NXTConnection waitForConnection(int timeout, int mode) {
this.mode = mode;
new Thread(this).start();
Stopwatch sw = new Stopwatch();
while (!connected && sw.elapsed() < timeout) {
}
if (!connected) {
return null;
}
return new BtNbConnection(con);
}
public void run() {
con = connector.waitForConnection(0, mode);
connected = true;
}
@Override
public NXTConnection connect(String target, int mode) {
return new BtNbConnection(connector.connect(target, mode);
}
@Override
public boolean cancel() {
return connector.cancel();
}
}
class BtNbConnection extends NXTConnection implements Runnable {
private NXTConnection con = null;
BtNbConnection(NXTConnection con) {
this.con = con;
}
@Override
public void close() throws IOException {
con.close();
}
@Override
public int read(byte[] buf, int length) {
return con.read(buf, length);
}
@Override
public int write(byte[] buf, int numBytes) {
return con.write(buf, numBytes);
}
private boolean received = false;
private int rtn = 0;
private byte[] buffer;
private int length;
private Thread reading = null;
@Override
public int read(byte[] buf, int length, boolean wait) {
if (wait) {
return con.read(buf, length);
}
received = false;
this.buffer = buf;
this.length = length;
//Receive
if (reading == null) {
System.out.println("Thread start");
reading = new Thread(this);
reading.start();
}
//Receive data or wait 20ms
Stopwatch sw = new Stopwatch();
while (!received && sw.elapsed() < 20) {
}
return rtn;
}
public void run() {
rtn = con.read(buffer, length);
received = true;
}
}
The usage example is created based on the server side class of Bluetooth communication between EV3s by leJOS.
BluetoothServer.java
import lejos.hardware.Button;
import lejos.hardware.Sound;
import lejos.remote.nxt.NXTCommConnector;
import lejos.remote.nxt.NXTConnection;
import lejos.utility.Delay;
public class BluetoothServer {
public static void main(String[] args) {
int recvMessageNo = 2; //Number to receive
int sendMessageNo = 3; //Number to send
System.out.println("Connect waiting...");
//Create an instance of the BtConnector wrapper class
NXTCommConnector connector = new BtNbConnector();
//Wait for a connection from the destination, ★ Time out in 10 seconds
NXTConnection connection = connector.waitForConnection(10 * 1000, NXTConnection.RAW);
if (connection == null) {
//Shut down the system if the connection fails
System.out.println("Connect fail");
Delay.msDelay(3 * 1000);
System.exit(1);
}
System.out.println("Connected");
//Sounds if the reception number is correct
if(isReceived(connection, recvMessageNo)){
Sound.systemSound(false, 2);
} else {
Sound.buzz();
}
//Send a message
send(connection, sendMessageNo);
//Disconnect communication
System.out.println("Closing...");
try {
if (null != connection) {
connection.close();
}
} catch (Exception ioe) {
}
System.out.println("Finished");
Button.waitForAnyPress();
}
static boolean isReceived(NXTConnection connection, int messageNo) {
byte[] recvBuff = new byte[16];
//Wait until you receive a message or press the ESCAPE button
while(recvBuff[0] == 0 && Button.ESCAPE.isUp()){
//★ Receive without waiting
connection.read(recvBuff, recvBuff.length, false);
}
//Check if the message is correct
for (int i = 0; i < recvBuff.length; i++) {
System.out.print(recvBuff[i]);
if (recvBuff[i] != messageNo) {
System.out.println();
return false;
}
}
System.out.println();
return true;
}
static void send(NXTConnection connection, int messageNo) {
byte[] sendBuff = new byte[16];
for (int i = 0; i < sendBuff.length; i++) {
sendBuff[i] = (byte)messageNo;
}
connection.write(sendBuff, sendBuff.length);
}
}