一 问题描述
工厂测试camera,会出现两种现象:
1 camera preview有显示,但是按键无响应,无法拍照测试
2 camera preview黑屏,按键无响应
以上情况,系统都没有死,adb log正常
二 复现路径确认
按照正常测试手法,进入camera测试,preview取景出来,再按confirm键拍照,测试camera都不会出现问题,反复试验发现,一进入camera测试,preview取景还没有出来,就按confirm键拍照,则必现按键无响应现象。
三 问题分析
代码流程分析:
int camera_entry(structftm_param *param, void *priv)
{
//Camera item view/textinit
camera_state = CAMERA_STATE_IDLE;
acdkIFInit();//acdkinit camera_update_capture_tv_thread(priv);//previewcapture
camera_preview_stop();
do
{
switch (chosen)
{
caseITEM_CAMERA_TEST://重新测试
break;
case ITEM_PASS: //测试通过
break;
caseITEM_FAIL: //测试失败
break;
}
While(1);
}
static void*camera_update_capture_tv_thread(void *priv)
{
//register key handle
ui_init_textview(tv,camera_cap_key_handler,(void*)cam);
camera_preview_test();//preview entry
cam->exit_thd = MFALSE;
//waite key event
while (1)
{
key = ui_wait_key();
usleep(200000);
chkcnt--;
tv->m_khandler(key, tv->m_priv);
if (cam ->exit_thd)
break;
if (chkcnt > 0)
continue;
chkcnt = 5;
}
}
static MINT32camera_preview_test()
{
bool bRet =bSendDataToACDK(ACDK_CMD_PREVIEW_START,
(MUINT8*)&rACDKPrvConfig,
sizeof(ACDK_PREVIEW_STRUCT),
NULL,
0,
&u4RetLen);
camera_state = CAMERA_STATE_PREVIEW;
}
static volatile intcapture_done = MFALSE;
static intcamera_cap_key_handler(int key, void *priv)
{
switch (key)
{
case UI_KEY_CONFIRM:
err =camera_capture_test();
if(err == 0)
{
capture_done =MTRUE;
}
else
{
FTM_CAMERA_DBG("Capture Fail\n");
}
exit = 1;
break;
case UI_KEY_BACK:
exit = 1;
break;
if (exit)
{
cam->exit_thd =MTRUE;
tv->exit(tv);
}
}
static intcamera_capture_test()
{
gCapCBDone = MFALSE;
bRet = bSendDataToACDK(ACDK_CMD_CAPTURE,
(unsigned char*)&rACDKCapConfig,
sizeof(ACDK_CAPTURE_STRUCT),
NULL,
0,
&u4RetLen);
//wait capture done
if(bRet == MTRUE)
{
// gCapCBDone在capture success cb置true
while(!gCapCBDone) {
usleep(1000);
}
}
else
{
return 1;
}
}
问题的本质原因是camera ftm thread 调用acdk preview/capture是异步的,通过发消息给acdk module。而进入 camera_update_capture_tv_thread就注册key handle,这时confirm key就能正常相应,然而camera preview 还要通过发消息ACDK_CMD_PREVIEW_START给acdk,返回后preview还没有ok,因为是异步的,但是这时confirm keyevent来,就得跑到handle的capture流程,发送ACDK_CMD_CAPTURE消息给acdk做拍照,一直等待capture成功,但是由于preivew流程都没有正常执行,这时capture一直不能成功执行,导致thread 死锁,按键无响应。
四 修改方法
将key handle 注册后移到camera preview ready后,camera ftm发ACDK_CMD_PREVIEW_START消息给acdk启动preview,返回后等待1.5s 使得camerapreview取景正常。这时confirm key按下就能正常相应了。
+ pthread_mutex_lock(&camera_mutex);
camera_preview_test();
+ usleep(1500000);//2s
+ pthread_mutex_unlock(&camera_mutex);
+ ui_init_textview(tv,camera_cap_key_handler, (void*)cam );
+ tv->set_title(tv, &cam->title);
+ tv->set_text(tv, &cam->text);
+ tv->set_btn(tv,&cam->left_btn, &cam->center_btn, &cam->right_btn);
+ tv->redraw(tv);