您的位置:首页 > 其它

wince 触摸和audio驱动中添加postmessage

2012-08-08 15:22 295 查看
最近做的一个项目,需要不同模块之间通信,MCU-(OS驱动)-DLL-EXE,

由于需要arm将触摸驱动和音频设备开关信息发送给MCU处理

我在touch驱动和wavmain中加入了postmessage

message发给应用层,应用再通过串口发给MCU处理

下面看看具体的代码

BOOL getTouchCoordinate(USHORT *x, USHORT *y)
{
ULONG  trytimes = 0;

*x = *y = MAX_ADC_VAL;

RETAILMSG(0, (TEXT("++++sampleADC!\r\n")));

while (trytimes++ < TIMEOUT_VAL)
{
if (!TouchSocIsPenDown())
{
return FALSE;
}

#if COORDINATE_MODE

if (TouchSocSampleCooCoordinate(x, y))
{
break;
}

#else    // COORDINATE_MODE

if (!TouchSocSampleCoordinate(x, TRUE))
{
continue;
}

// sampling Y coordinate

if (TouchSocSampleCoordinate(y, FALSE))
{
break;
}

#endif    // COORDINATE_MODE
}    // while

RETAILMSG(1, (TEXT("x=%x, y=%x \r\n"), *x, *y));
//下面是我添加的
if(((xx-(*x))>50)||(((*x)-xx)>50)||((yy-(*y))>50)||(((*y)-yy)>50))
{
::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_MCU_TOUCH-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),*x,*y);
}
xx=(*x);
yy=(*y);
//添加结束
if (trytimes > TIMEOUT_VAL)
{
RETAILMSG(1, (TEXT("timeout sampling coordinates\r\n")));
}

TouchSocPreInit();
return TRUE;
}


可以看到我添加的地方就是post一个消息,消息是注册表注册的一个信息,也可以用其他数字什么的,但是注册的信息能保证唯一性
其次推荐用post不用send,因为post是异步的。

其次再看看audio的message,这个就有点纠结了,弄了我很久

先发个错误的

case WODM_OPEN:
{
RETAILMSG(1, (_T("WODM_OPEN")));
::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_OPEN-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0);
DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);

if (!(dwParam2 & WAVE_FORMAT_QUERY))
{
g_pHWContext->AudioPowerOn(FALSE);
}

dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser);

break;
}

case WIDM_OPEN:
{

RETAILMSG(1, (_T("WIDM_OPEN")));
if (!(dwParam2 & WAVE_FORMAT_QUERY))
g_pHWContext->AudioPowerOn(FALSE);

DeviceContext *pDeviceContext = g_pHWContext->GetInputDeviceContext(uDeviceId);

dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser);
break;
}

case WODM_CLOSE:
{
RETAILMSG(1, (_T("WODM_CLOSE")));
::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_CLOSE-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0);

DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);

}


第四行和35行就是我添加的代码,编译后烧进板子后触摸无效,其实不是触摸无效,而是系统挂在一个地方了
原因就是这个地方跑进临界区,不能使用postMessage这种涉及到多线程的函数

下面发正确的修改:

DWORD dwRet = MMSYSERR_NOERROR;

//lishiqi insert 20120808
if(uMsg == WODM_OPEN)
{
::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_OPEN-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0);
}
else if(uMsg == WODM_CLOSE)
{
::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_CLOSE-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0);
}

g_pHWContext->Lock();

switch (uMsg)
{
case WIDM_OPEN_AUDIO_PHYSICAL_INPUT:
{
g_pHWContext->Codec_PowerInput(TRUE, dwParam1);
g_pHWContext->Codec_InMute(FALSE, dwParam1);
break;
}


3-11行就是我添加的,之所以前面那段加入switch里错误了,就是因为14行的lock函数
这个函数的定义就是进入临界区进行多线程的禁止和内存保护。

所以以后要长个教训,不是什么地方都可以乱插入函数

本文仅仅是作者个人观点,本人菜鸟,希望大家一起共同进步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: