def ReceiveThreadProc(self): hFile = self.hFile osReader = self.osReader lpBuf = create_string_buffer(1) dwRead = DWORD() pHandles = (HANDLE * 2)(osReader.hEvent, self.stopEvent) waitingOnRead = False while self.keepAlive: #print "ReceiveThreadProc" # if no read is outstanding, then issue another one if not waitingOnRead: #print "ResetEvent" ResetEvent(osReader.hEvent) returnValue = self._ReadFile( hFile, lpBuf, 1, # we want to get notified as soon as a byte is available byref(dwRead), byref(osReader) ) if not returnValue: err = GetLastError() if err != 0 and err != ERROR_IO_PENDING: raise SerialError() waitingOnRead = True else: # read completed immediately if dwRead.value: self.HandleReceive(lpBuf.raw) continue ret = MsgWaitForMultipleObjects( 2, pHandles, 0, 100000, QS_ALLINPUT ) if ret == WAIT_OBJECT_0: returnValue = GetOverlappedResult( hFile, byref(osReader), byref(dwRead), 0 ) #print "GetOverlappedResult", returnValue, dwRead.value waitingOnRead = False if returnValue and dwRead.value: self.HandleReceive(lpBuf.raw) elif ret == WAIT_OBJECT_0 + 1: #print "WAIT_OBJECT_1" # stop event signaled self.readCondition.acquire() self.readCondition.notifyAll() self.readCondition.release() break elif ret == WAIT_TIMEOUT: #print "WAIT_TIMEOUT" pass else: raise SerialError("Unknown message in ReceiveThreadProc")
def OnRawInput(self, hwnd, mesg, wParam, lParam): pcbSize = UINT() GetRawInputData( lParam, RID_INPUT, None, byref(pcbSize), sizeof(RAWINPUTHEADER) ) buf = create_string_buffer(pcbSize.value) GetRawInputData( lParam, RID_INPUT, buf, byref(pcbSize), sizeof(RAWINPUTHEADER) ) pRawInput = cast(buf, POINTER(RAWINPUT)) keyboard = pRawInput.contents.data.keyboard if keyboard.VKey == 0xFF: eg.eventThread.Call(eg.Print, "0xFF") return 0 #print "Scan code:", keyboard.MakeCode info = "" mTime = time.clock() if keyboard.Message == WM_KEYDOWN: transition = "KEYDOWN" elif keyboard.Message == WM_KEYUP: transition = "KEYUP" else: transition = " %d" % keyboard.Message info = "%f " % mTime info += "RawI %s: %s(%d), " % ( transition, VK_KEYS[keyboard.VKey], keyboard.VKey ) if GetAsyncKeyState(162): #LCtrl info += "LCtrl " if GetAsyncKeyState(163): #RCtrl info += "RCtrl " info += "Scan: %d, " % keyboard.MakeCode info += "Extra: %d, " % keyboard.ExtraInformation info += "Device: %r, " % pRawInput.contents.header.hDevice #print "Flags:", keyboard.Flags rawKeyboardData = RawKeyboardData( keyboard.VKey, pRawInput.contents.header.hDevice, keyboard.Message in (WM_KEYDOWN, WM_SYSKEYDOWN), time.clock() ) self.buf.append(rawKeyboardData) eg.eventThread.Call(eg.Print, info) if GET_RAWINPUT_CODE_WPARAM(wParam) == RIM_INPUT: return DefWindowProc(hwnd, mesg, wParam, lParam) return 0
def _ReadAllAvailable(self): """ Get all bytes currently in the drivers receive buffer. Only used internally. """ sleep(0.001) errors = DWORD() self._ClearCommError(self.hFile, byref(errors), byref(self.comstat)) numBytes = self.comstat.cbInQue if numBytes == 0: return "" # ResetEvent(self.osReader.hEvent) lpBuffer = create_string_buffer(numBytes) numberOfBytesRead = DWORD() if not self._ReadFile(self.hFile, lpBuffer, numBytes, byref(numberOfBytesRead), byref(self.osReader)): WaitForSingleObject(self.osReader.hEvent, INFINITE) return lpBuffer.raw[: numberOfBytesRead.value]
def _ReadAllAvailable(self): """ Get all bytes currently in the drivers receive buffer. Only used internally. """ sleep(0.001) errors = DWORD() self._ClearCommError(self.hFile, byref(errors), byref(self.comstat)) numBytes = self.comstat.cbInQue if numBytes == 0: return '' #ResetEvent(self.osReader.hEvent) lpBuffer = create_string_buffer(numBytes) numberOfBytesRead = DWORD() if not self._ReadFile(self.hFile, lpBuffer, numBytes, byref(numberOfBytesRead), byref(self.osReader)): WaitForSingleObject(self.osReader.hEvent, INFINITE) return lpBuffer.raw[:numberOfBytesRead.value]