camera ftm 测试按键失效

一 问题描述

工厂测试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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值