in src/main/java/com/fazecast/jSerialComm/SerialPort.java [2155:2228]
public final void waitForSerialEvent() throws Exception
{
int event = ((androidPort != null) ? androidPort.waitForEvent() : waitForEvent(portHandle)) & eventFlags;
if (((event & SerialPort.LISTENING_EVENT_DATA_AVAILABLE) > 0) && ((eventFlags & SerialPort.LISTENING_EVENT_DATA_RECEIVED) > 0))
{
// Read data from serial port
int numBytesAvailable, bytesRemaining, newBytesIndex;
event &= ~(SerialPort.LISTENING_EVENT_DATA_AVAILABLE | SerialPort.LISTENING_EVENT_DATA_RECEIVED);
while (eventListenerRunning && ((numBytesAvailable = bytesAvailable()) > 0))
{
newBytesIndex = 0;
byte[] newBytes = new byte[numBytesAvailable];
bytesRemaining = readBytes(newBytes, newBytes.length);
if (bytesRemaining > 0)
{
if (delimiters.length > 0)
{
int startIndex = 0;
for (int offset = 0; offset < bytesRemaining; ++offset)
if (newBytes[offset] == delimiters[delimiterIndex])
{
if ((++delimiterIndex) == delimiters.length)
{
messageBytes.write(newBytes, startIndex, 1 + offset - startIndex);
byte[] byteArray = (messageEndIsDelimited ? messageBytes.toByteArray() : Arrays.copyOf(messageBytes.toByteArray(), messageBytes.size() - delimiters.length));
if ((byteArray.length > 0) && (messageEndIsDelimited || (delimiters[0] == byteArray[0])))
userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, SerialPort.LISTENING_EVENT_DATA_RECEIVED, byteArray));
startIndex = offset + 1;
messageBytes.reset();
delimiterIndex = 0;
if (!messageEndIsDelimited)
messageBytes.write(delimiters, 0, delimiters.length);
}
}
else if (delimiterIndex != 0)
delimiterIndex = (newBytes[offset] == delimiters[0]) ? 1 : 0;
messageBytes.write(newBytes, startIndex, bytesRemaining - startIndex);
}
else if (dataPacket.length == 0)
userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, SerialPort.LISTENING_EVENT_DATA_RECEIVED, newBytes.clone()));
else
{
while (bytesRemaining >= (dataPacket.length - dataPacketIndex))
{
System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, dataPacket.length - dataPacketIndex);
bytesRemaining -= (dataPacket.length - dataPacketIndex);
newBytesIndex += (dataPacket.length - dataPacketIndex);
dataPacketIndex = 0;
userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, SerialPort.LISTENING_EVENT_DATA_RECEIVED, dataPacket.clone()));
}
if (bytesRemaining > 0)
{
System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, bytesRemaining);
dataPacketIndex += bytesRemaining;
}
}
}
}
}
if (eventListenerRunning && !isShuttingDown && (event != SerialPort.LISTENING_EVENT_TIMED_OUT))
{
// If disconnected, invoke the user data listener from a new thread to allow them to close the port without blocking
if ((event & SerialPort.LISTENING_EVENT_PORT_DISCONNECTED) > 0)
{
eventListenerRunning = false;
SerialPortThreadFactory.get().newThread(new Runnable() {
@Override
public void run() { userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, SerialPort.LISTENING_EVENT_PORT_DISCONNECTED)); }
}).start();
}
else
userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, event));
}
}