因为初学,不懂怎么实现驱动,只好修改已有的源码。友善的这个能实现对通道0的采集,我要用到同时两个通道,就不行了。
但是出现了多次点击后哦触摸屏会失效的问题,或者谁能告诉我,应该怎么写一个adc的驱动来使用。
主要修改的部分代码,如下,原理还是一样的
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define ADC_SAMPLE_NUM 5
static DWORD ADCValue[4];// for 4 chanel
static DWORD WINAPI ADCThreadProc(LPVOID lpParameter)
{
int i,j,k;
DWORD ADCV[4][ADC_SAMPLE_NUM], temp;
HANDLE DriverEvent = CreateEvent(NULL, FALSE, FALSE, L"ADC_EVENT");
if (DriverEvent == NULL) {
RETAILMSG(1, (L"Cannot alloc object for ADC driver"));
return 0;
}
for (;;) {
DWORD ret = WaitForSingleObject(DriverEvent, INFINITE);
if (ret != WAIT_OBJECT_0) {
RETAILMSG(1, (L"Unknown error\n"));
return 0;
}
HWND Wnd = FindWindow(L"Dialog", L"ADC Receiver");
if (Wnd == NULL) {
RETAILMSG(TS_DBGON, (L"Cannot Find the Window\n"));
} else {
for (i = 0; i < ADC_SAMPLE_NUM; i++)
for (j = 0; j<4;j++)
ADCV[j] = (DWORD)GetADCValue((BYTE)j);
for (j = 0; j < ADC_SAMPLE_NUM -1; ++j)
for (k = j+1; k < ADC_SAMPLE_NUM; ++k)
for (i = 0; i < 4; i++)
if(ADCV[j]>ADCV[k])
{
temp = ADCV[j];
ADCV[j]=ADCV[k];
ADCV[k]=temp;
}
for (j = 0; j<4;j++)
ADCValue[j] = ADCV[j][ADC_SAMPLE_NUM>>1];
COPYDATASTRUCT cp;
cp.dwData = GetADCValue(0);
cp.cbData = sizeof(ADCValue); // 4 chanel,4 byte
cp.lpData = ADCValue;
SendMessage(Wnd, WM_COPYDATA, NULL, (LPARAM)(&cp));
}
}
return 0;
}
static DWORD WINAPI DEBUGThreadProc(LPVOID lpParameter)
{
HANDLE DriverEvent = CreateEvent(NULL, FALSE, FALSE, L"ADC_EVENT_DEBUG");
if (DriverEvent == NULL) {
RETAILMSG(1, (L"Cannot alloc object for ADC driver"));
return 0;
}
for (;;) {
DWORD ret = WaitForSingleObject(DriverEvent, INFINITE);
if (ret != WAIT_OBJECT_0) {
RETAILMSG(1, (L"Unknown error\n"));
return 0;
}
HWND Wnd = FindWindow(L"Dialog", L"ADC Reciever");
if (Wnd == NULL) {
RETAILMSG(TS_DBGON, (L"Cannot Find the Window\n"));
} else {
COPYDATASTRUCT cp;
cp.dwData = GetADCValue(0);
cp.cbData = 4; // 4 chanel,4 byte
cp.lpData = ADCValue;
SendMessage(Wnd, WM_COPYDATA, NULL, (LPARAM)(&cp));
}
}
return 0;
}
#define ADC_OWN_BY_NONE 0
#define ADC_OWN_BY_TS 1
#define ADC_OWN_BY_AIN 2
static long AdcOwner = ADC_OWN_BY_NONE;
static void FreeADC()
{
AdcOwner = ADC_OWN_BY_NONE;
}
static bool TsAllocADC()
{
long ret = InterlockedCompareExchange(&AdcOwner, ADC_OWN_BY_TS, ADC_OWN_BY_NONE);
switch (ret) {
case ADC_OWN_BY_TS:
RETAILMSG(1, (TEXT("Warning: Alloc ADC Again\r\n")));
return true;
case ADC_OWN_BY_NONE:
return true;
default:
return false;
}
}
static bool AinAllocADC()
{
long ret = InterlockedCompareExchange(&AdcOwner, ADC_OWN_BY_AIN, ADC_OWN_BY_NONE);
return ret == ADC_OWN_BY_NONE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
改完倒是能收到剩下四个通道的,但是发现多次点击屏幕后,触摸屏停止响应,点击时不再出现本来会出现的-1,只是数值会变小。我对windows不很了解,不知道是什么问题,希望大家指点。