📄 btdriverledctrl.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include "BTDriverStream.h"
static DWORD gdwIoBase = 0;
static DWORD gdwLastBlink = 0;
static DWORD gdwTimeout = INFINITE;
static LONG glStarted = 0;
static HANDLE ghBlink = NULL;
static HANDLE ghExit = NULL;
static HANDLE ghThread = NULL;
static int BlinkOn (void) {
if (! gdwIoBase)
return FALSE;
__try {
WRITE_PORT_UCHAR(((unsigned char *)gdwIoBase + LED_CTRL_OFFSET), LED_ONE_ON | LED_ONE_IS_OUTPUT);
} __except (1) {
return FALSE;
}
return TRUE;
}
static int BlinkOff (void) {
if (! gdwIoBase)
return FALSE;
__try {
WRITE_PORT_UCHAR(((unsigned char *)gdwIoBase + LED_CTRL_OFFSET), LED_ONE_IS_OUTPUT);
} __except (1) {
return FALSE;
}
return TRUE;
}
static DWORD WINAPI BlinkThread (LPVOID lpUnused) {
HANDLE ah[2];
ah[0] = ghBlink;
ah[1] = ghExit;
if (! BlinkOn())
return 0;
int fLedOn = TRUE;
for ( ; ; ) {
DWORD dwRes = WaitForMultipleObjects (2, ah, FALSE, gdwTimeout);
if (((dwRes != WAIT_OBJECT_0) && (dwRes != WAIT_TIMEOUT)) || (! gdwIoBase))
break;
DWORD dwNow = GetTickCount ();
if ((DWORD)(dwNow - gdwLastBlink) > 600) {
gdwTimeout = INFINITE;
fLedOn = FALSE;
}
if (fLedOn) {
if (! BlinkOff ())
return 0;
fLedOn = FALSE;
} else {
if (! BlinkOn ())
return 0;
fLedOn = TRUE;
}
}
BlinkOff ();
return 0;
}
void BTWSSLedStart (DWORD ioBase) {
if (glStarted)
return;
glStarted = TRUE;
gdwIoBase = ioBase;
gdwLastBlink = GetTickCount ();
gdwTimeout = INFINITE;
ghBlink = CreateEvent (NULL, FALSE, FALSE, NULL);
ghExit = CreateEvent (NULL, FALSE, FALSE, NULL);
if (ghBlink && ghExit)
ghThread = CreateThread (NULL, 0, BlinkThread, NULL, 0, NULL);
else
ghThread = NULL;
if (! ghThread) {
CloseHandle (ghBlink);
CloseHandle (ghExit);
ghBlink = ghExit = NULL;
gdwIoBase = 0;
}
}
void BTWSSLedStop (void) {
if (! glStarted)
return;
glStarted = FALSE;
if (! gdwIoBase)
return;
SetEvent (ghExit);
SetEvent (ghBlink);
CloseHandle (ghExit);
CloseHandle (ghBlink);
WaitForSingleObject (ghThread, INFINITE);
CloseHandle (ghThread);
gdwIoBase = 0;
ghThread = ghExit = ghBlink = NULL;
gdwLastBlink = 0;
gdwTimeout = INFINITE;
}
void BTWSSLedBlink (void) {
gdwLastBlink = GetTickCount ();
if (gdwTimeout == INFINITE) {
gdwTimeout = 300;
if (ghBlink)
SetEvent (ghBlink);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -