RAM-based Registy方式下觸摸資訊儲存和重設一種思路

來源:互聯網
上載者:User

在此種方式下,因為註冊表資訊重啟後就沒有了,所以相應的觸摸校準資訊也會丟失並恢複到出廠值。對於儲存可以由應用在校準後讀出來儲存到外部檔案,這個容易實現。不過對於重設,因為觸摸資訊是由gwes載入並生效的,因此就算應用從檔案中讀取並設定註冊表也沒有效果。對於觸摸校準gwes會調用一個TouchCalibrateUI_Done來使校準有效,但是它不對應用開放,在網上找到了一個思路覺得可行,只是沒有驗證。
CalibrUi.lib作為gwes的一部分,在sysgen時被組裝進gwes.exe;修改calibrui.cpp,在其中加入判斷代碼,如果應用程式調用TouchCalibrate()進行校正之前設定了一個指定名字的事件,則calibrui.lib不再重新校正,而是直接從註冊表中恢複校正資料,否則進行再次校正;具體修改為:在函數TouchCalibrateUI_DrawMainScreen中加入判斷,如果不需要重新校正就直接返回;在函數TouchCalibrateUI_HandleUserInputMessage中加入判斷,如果不需要重新校正則調用TouchCalibrateRestoreFromRegistry()和TouchCalibrationAbort(),然後返回;這樣,註冊表中的校正資料就會被gwes重新讀取,應用程式在這之前可以從檔案中讀取校正資料到註冊表中,從而實現觸控螢幕校正資料的檔案形式儲存
引用自:http://xiaoxiongwinnie.blogbus.com/logs/30161249.html

==========================================================
又找到了另外一種實現思路

第一步,定義自訂觸控螢幕校準值儲存的註冊表位置

#define PSCAL_REGPATH L"SOFTWARE\\ANYCOMPAY\\TOUCH"
#define CALDATA_REGVAL L"CalibrationData"

第二步,在D:\WINCE600\PLATFORM\FreeScale51\COMMON\SRC\SOC\COMMON_FSL_V2\TOUCH\.\tchmain.c中添加如下函數,從指定位置讀取五個樣點的位置

static ULONG
GetPsTouchCalData(int* iUncalX,int* iUncalY)
{
HKEY hKey;
BOOL bReadOk=FALSE;
WCHAR tcCalData[64]=L"524,523 796,244 796,808 252,809 258,233";

if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE, PSCAL_REGPATH, 0,KEY_READ, &hKey))
{
DWORD dwLen = sizeof(tcCalData);
if(ERROR_SUCCESS==RegQueryValueEx(hKey, CALDATA_REGVAL, NULL, NULL, (LPBYTE)tcCalData, &dwLen))
{
   bReadOk = TRUE;
}
RegCloseKey(hKey);
}
if(bReadOk)
{
//524,523 796,244 796,808 252,809 258,233
swscanf(tcCalData,L"%d,%d %d,%d %d,%d %d,%d %d,%d",(iUncalX+0),(iUncalY+0),(iUncalX+1),(iUncalY+1),
   (iUncalX+2),(iUncalY+2) ,(iUncalX+3),(iUncalY+3),(iUncalX+4),(iUncalY+4));
}
return bReadOk;
}

第三步,在D:\WINCE600\PLATFORM\FreeScale51\COMMON\SRC\SOC\COMMON_FSL_V2\TOUCH\.\tchmain.c中添加如下線程函數,等待事件,執行應用自訂觸控螢幕校準值

#define POT_NUM 5
static ULONG
TouchApplyRegistryData(
    PVOID   Reserved //@parm Reserved, not used.
    )
{
BOOL bStop=FALSE;
//五個點分別為中,左上,左下,右下,右上
//執行個體螢幕尺寸為800*640
int iScreenX[POT_NUM] = {400,160,160,640,640};//(1/2 1/5 1/5 4/5 4/5)*width
int iScreenY[POT_NUM] = {240,96,384,384,96}; //(1/2 1/5 4/5 4/5 1/5)*higth
int iUncalX[POT_NUM] = {0};
int iUncalY[POT_NUM] = {0};
HANDLE hSetApplyEvent = CreateEvent( NULL, FALSE,FALSE, L"APPLY_CAL_REGISTRY");
UNREFERENCED_PARAMETER(Reserved);
RETAILMSG(TRUE,(L"Go into TouchApplyRegistryData ...............................\r\n"));
while(!bStop)
{
WaitForSingleObject( hSetApplyEvent, INFINITE);
if(GetPsTouchCalData(iUncalX,iUncalY))
{
   TouchPanelSetCalibration(POT_NUM,iScreenX,iScreenY,iUncalX,iUncalY);
   RETAILMSG(TRUE,(L"TouchApplyRegistryData call Finished ...............................\r\n"));
}
}
CloseHandle(hSetApplyEvent);
ExitThread(1);
    return ( TRUE );
}

如何確定取樣點螢幕的座標位置,在TouchPanelReadCalibrationPoint中最後列印RETAILMSG(TRUE,(L"TouchPanelReadCalibrationPoint : %d %d\r\n",*pRawX,*pRawY));
即可知道校準時系統取了那幾個樣點及其具體螢幕座標,也就是TouchPanelSetCalibration函數的第二個和第三個參數,我得出的結論是,五個點的時候規律為:

X:(1/2 1/5 1/5 4/5 4/5)*width
Y:(1/2 1/5 4/5 4/5 1/5)*higth

第四步,在D:\WINCE600\PLATFORM\FreeScale51\COMMON\SRC\SOC\COMMON_FSL_V2\TOUCH\.\tchmain.c中TouchPanelEnable函數中添加如下代碼,啟動第三部中的線程
hSetApplyThread = CreateThread( NULL, 0, TouchApplyRegistryData, 0, 0, NULL);

第五步,在應用程式調用TouchCalibrate 後,將系統預設儲存的cal值(HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH)複製到自訂儲存的位置(PSCAL_REGPATH)
   並將"SOFTWARE\\ANYCOMPAY"下的註冊表全部儲存到SD或Flash,儲存為abc.reg.

第六步,系統每次起來後將abc.reg匯入到系統註冊表中,並發送”"APPLY_CAL_REGISTRY"“event到touch驅動,觸發驅動更新自訂cal值

引用自:http://hi.baidu.com/cqit2001/blog/item/d0a547fc1a64a78db801a062.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.