主题 : 关于修改ce5.0中的s3c2440a_touch.cpp实现adc后出现的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 27989
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2010-09-03
最后登录: 2010-10-24
楼主  发表于: 2010-10-03 12:06

 关于修改ce5.0中的s3c2440a_touch.cpp实现adc后出现的问题

因为初学,不懂怎么实现驱动,只好修改已有的源码。友善的这个能实现对通道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不很了解,不知道是什么问题,希望大家指点。
描述:打包的s3c2440a_touch.cpp文件
附件: s3c2440a_touch.rar (6 K) 下载次数:19