in src/main/c/Windows/SerialPort_Windows.c [1133:1210]
JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_waitForEvent(JNIEnv *env, jobject obj, jlong serialPortPointer)
{
// Create an asynchronous event structure
OVERLAPPED overlappedStruct;
memset(&overlappedStruct, 0, sizeof(OVERLAPPED));
serialPort *port = (serialPort*)(intptr_t)serialPortPointer;
overlappedStruct.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
jint event = com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_TIMED_OUT;
if (!overlappedStruct.hEvent)
{
port->errorNumber = GetLastError();
port->errorLineNumber = __LINE__ - 5;
return event;
}
// Wait for a serial port event
DWORD eventMask = 0, errorMask = 0, waitValue, numBytesTransferred;
if (!WaitCommEvent(port->handle, &eventMask, &overlappedStruct))
{
if ((GetLastError() == ERROR_IO_PENDING) || (GetLastError() == ERROR_INVALID_PARAMETER))
{
do { waitValue = WaitForSingleObject(overlappedStruct.hEvent, 500); }
while ((waitValue == WAIT_TIMEOUT) && port->eventListenerRunning);
if ((waitValue != WAIT_OBJECT_0) || !GetOverlappedResult(port->handle, &overlappedStruct, &numBytesTransferred, FALSE))
{
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_PORT_DISCONNECTED;
port->errorNumber = GetLastError();
port->errorLineNumber = __LINE__ - 4;
CloseHandle(overlappedStruct.hEvent);
return event;
}
}
else // Problem occurred
{
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_PORT_DISCONNECTED;
port->errorNumber = GetLastError();
port->errorLineNumber = __LINE__ - 18;
CloseHandle(overlappedStruct.hEvent);
return event;
}
}
// Retrieve and clear any serial port errors
COMSTAT commInfo;
if (ClearCommError(port->handle, &errorMask, &commInfo))
{
if (errorMask & CE_BREAK)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_BREAK_INTERRUPT;
if (errorMask & CE_FRAME)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_FRAMING_ERROR;
if (errorMask & CE_OVERRUN)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR;
if (errorMask & CE_RXOVER)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_SOFTWARE_OVERRUN_ERROR;
if (errorMask & CE_RXPARITY)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_PARITY_ERROR;
}
// Parse any received serial port events
if (eventMask & EV_BREAK)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_BREAK_INTERRUPT;
if (eventMask & EV_TXEMPTY)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_DATA_WRITTEN;
if ((eventMask & EV_RXCHAR) && (commInfo.cbInQue > 0))
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_DATA_AVAILABLE;
if (eventMask & EV_CTS)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_CTS;
if (eventMask & EV_DSR)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_DSR;
if (eventMask & EV_RING)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_RING_INDICATOR;
if (eventMask & EV_RLSD)
event |= com_fazecast_jSerialComm_SerialPort_LISTENING_EVENT_CARRIER_DETECT;
// Return the serial event type
CloseHandle(overlappedStruct.hEvent);
return event;
}