public final void waitForSerialEvent()

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));
			}
		}