⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btdriverledctrl.cpp

📁 Windows CE操作系统中适用的蓝牙驱动程序
💻 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 + -