13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*/
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCameraStateMachine"
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Errors.h>
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdio.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2HWI.h"
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraStateMachine.h"
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h"
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera {
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : smEvtProcRoutine
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Statemachine process thread routine to handle events
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              in different state.
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data    : ptr to QCameraStateMachine object
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid *QCameraStateMachine::smEvtProcRoutine(void *data)
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int running = 1, ret;
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraStateMachine *pme = (QCameraStateMachine *)data;
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    do {
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        do {
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ret = cam_sem_wait(&pme->cmd_sem);
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (ret != 0 && errno != EINVAL) {
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("cam_sem_wait error (%s)",
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            strerror(errno));
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return NULL;
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } while (ret != 0);
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // we got notified about new cmd avail in cmd queue
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // first check API cmd queue
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_sm_cmd_t *node = (qcamera_sm_cmd_t *)pme->api_queue.dequeue();
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (node == NULL) {
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no API cmd, then check evt cmd queue
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            node = (qcamera_sm_cmd_t *)pme->evt_queue.dequeue();
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (node != NULL) {
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (node->cmd) {
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_SM_CMD_TYPE_API:
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pme->stateMachine(node->evt, node->evt_payload);
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // API is in a way sync call, so evt_payload is managed by HWI
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // no need to free payload for API
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_SM_CMD_TYPE_EVT:
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pme->stateMachine(node->evt, node->evt_payload);
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // EVT is async call, so payload need to be free after use
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                free(node->evt_payload);
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                node->evt_payload = NULL;
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_SM_CMD_TYPE_EXIT:
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                running = 0;
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(node);
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            node = NULL;
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } while (running);
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraStateMachine
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraStateMachine. Will start process thread
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @ctrl    : ptr to HWI object
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStateMachine::QCameraStateMachine(QCamera2HardwareInterface *ctrl) :
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    api_queue(),
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    evt_queue()
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_parent = ctrl;
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cmd_pid = 0;
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_sem_init(&cmd_sem, 0);
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_create(&cmd_pid,
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   NULL,
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   smEvtProcRoutine,
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   this);
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_setname_np(cmd_pid, "CAM_stMachine");
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bDelayPreviewMsgs = false;
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_DelayedMsgs = 0;
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_RestoreZSL = TRUE;
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bPreviewCallbackNeeded = TRUE;
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCameraStateMachine
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStateMachine::~QCameraStateMachine()
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_sem_destroy(&cmd_sem);
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : releaseThread
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Sends an exit command and terminates the state machine thread
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraStateMachine::releaseThread()
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (cmd_pid != 0) {
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_sm_cmd_t *node =
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NULL != node) {
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(node, 0, sizeof(qcamera_sm_cmd_t));
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (api_queue.enqueue((void *)node)) {
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_sem_post(&cmd_sem);
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                free(node);
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                node = NULL;
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            /* wait until cmd thread exits */
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pthread_join(cmd_pid, NULL) != 0) {
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("pthread dead already\n");
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cmd_pid = 0;
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : applyDelayedMsgs
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enable if needed any delayed message types
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::applyDelayedMsgs()
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_bDelayPreviewMsgs && m_DelayedMsgs) {
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = m_parent->enableMsgType(m_DelayedMsgs);
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_bDelayPreviewMsgs = false;
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_DelayedMsgs = 0;
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (m_bDelayPreviewMsgs) {
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_bDelayPreviewMsgs = false;
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procAPI
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: process incoming API request from framework layer.
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt          : event to be processed
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @api_payload  : API payload. Can be NULL if not needed.
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     void *api_payload)
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_sm_cmd_t *node =
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == node) {
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No memory for qcamera_sm_cmd_t");
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(node, 0, sizeof(qcamera_sm_cmd_t));
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    node->cmd = QCAMERA_SM_CMD_TYPE_API;
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    node->evt = evt;
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    node->evt_payload = api_payload;
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (api_queue.enqueue((void *)node)) {
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_sem_post(&cmd_sem);
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("API enqueue failed API = %d", evt);
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        free(node);
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return UNKNOWN_ERROR;
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvt
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: process incoming envent from mm-camera-interface and
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              mm-jpeg-interface.
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt          : event to be processed
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt_payload  : event payload. Can be NULL if not needed.
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     void *evt_payload)
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_sm_cmd_t *node =
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == node) {
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No memory for qcamera_sm_cmd_t");
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(node, 0, sizeof(qcamera_sm_cmd_t));
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    node->evt = evt;
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    node->evt_payload = evt_payload;
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (evt_queue.enqueue((void *)node)) {
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_sem_post(&cmd_sem);
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("EVENT enqueue failed Event = %d", evt);
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        free(node);
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return UNKNOWN_ERROR;
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stateMachine
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine entry function. Depends on state,
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              incoming event will be handled differently.
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("m_state %d, event (%d)", m_state, evt);
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (m_state) {
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_STOPPED:
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtPreviewStoppedState(evt, payload);
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_READY:
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtPreviewReadyState(evt, payload);
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEWING:
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtPreviewingState(evt, payload);
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtPrepareSnapshotState(evt, payload);
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PIC_TAKING:
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtPicTakingState(evt, payload);
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_RECORDING:
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtRecordingState(evt, payload);
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtVideoPicTakingState(evt, payload);
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = procEvtPreviewPicTakingState(evt, payload);
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtPreviewStoppedState
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_PREVIEW_STOPPED.
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                        void *payload)
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->enableMsgType(*((int32_t *)payload));
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->disableMsgType(*((int32_t *)payload));
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->updateParameters((char*)payload, needRestart);
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->m_memoryPool.clear();
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->setNeedRestart(false);
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status            = rc;
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api       = evt;
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type       = QCAMERA_API_RESULT_TYPE_DEF;
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                char* nullParams = (char *)malloc(1);
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (nullParams) {
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    memset(nullParams, 0, 1);
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.params = nullParams;
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.params = m_parent->getParameters();
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //prepare preview success, move to ready state
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEW_READY;
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else if (m_parent->mPreviewWindow == NULL) {
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if(rc == NO_ERROR) {
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // preview window is not set yet, move to previewReady state
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEW_READY;
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("preparePreview failed");
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc == NO_ERROR) {
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    applyDelayedMsgs();
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = m_parent->startPreview();
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (rc != NO_ERROR) {
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_parent->unpreparePreview();
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    } else {
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        // start preview success, move to previewing state
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_state = QCAMERA_SM_STATE_PREVIEWING;
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                applyDelayedMsgs();
5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->unpreparePreview();
5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEWING;
5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    break;
5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no op needed here
5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("already in preview stopped state, do nothing");
5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = NO_ERROR;
5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = NO_ERROR;
5793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->release();
5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->dump(*((int *)payload));
6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                qcamera_sm_evt_command_payload_t *cmd_payload =
6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (qcamera_sm_evt_command_payload_t *)payload;
6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->sendCommand(cmd_payload->cmd,
6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        cmd_payload->arg1,
6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        cmd_payload->arg2);
6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
635e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
636e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        {
637e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            LOGW("Free video handle %d %d", evt, m_state);
638e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            QCameraVideoMemory::closeNativeHandle((const void *)payload);
639e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        }
6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
6503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no op needed here
6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("No ops for evt(%d) in state(%d)", evt, m_state);
6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = NO_ERROR;
6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelAutoFocus();
6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
6923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
6933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
6943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
6953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
6983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
6993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
7003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
7013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Param init deferred work failed");
7023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
7033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->updateThermalLevel(payload);
7043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
7053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
7083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
7153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
7163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
7193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             cam_evt->server_event_type, m_state);
7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
7263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
7273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // No ops, but need to notify
7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
7293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
7303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
7313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
7333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
7363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       {
7373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           qcamera_sm_internal_evt_payload_t *internal_evt =
7383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               (qcamera_sm_internal_evt_payload_t *)payload;
7393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           switch (internal_evt->evt_type) {
7403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
7413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = m_parent->waitDeferredWork(m_parent->mParamInitJob);
7423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if (NO_ERROR != rc) {
7433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   LOGE("Param init deferred work failed");
7443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               } else {
7453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data);
7463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
7473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               break;
7483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           default:
7493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
7503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               break;
7513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
7523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       }
7533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
7543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
7553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
7563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
7573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
7593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
7643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtPreviewReadyState
7653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
7673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_PREVIEW_READY.
7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
7723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
7763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                      void *payload)
7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->mPreviewWindow != NULL) {
7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                applyDelayedMsgs();
7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->unpreparePreview();
7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEWING;
7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->enableMsgType(*((int32_t *)payload));
8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->disableMsgType(*((int32_t *)payload));
8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateParameters((char*)payload, needRestart);
8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Stopping preview...");
8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // need restart preview for parameters to take effect
8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->unpreparePreview();
8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Clear memory pools
8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->m_memoryPool.clear();
8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // prepare preview again
8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preparePreview();
8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->setNeedRestart(false);
8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
8973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.params = m_parent->getParameters();
8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no ops here
9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->startPreview();
9273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
9283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->unpreparePreview();
9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
9313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEWING;
9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no ops here
9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->mPreviewWindow != NULL) {
9443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
9453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
9463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->unpreparePreview();
9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEWING;
9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no ops here
9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->unpreparePreview();
9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = 0;
9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
9773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 1;
9783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = 0;
9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->dump(*((int *)payload));
10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->autoFocus();
10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelAutoFocus();
10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_command_payload_t *)payload;
10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->sendCommand(cmd_payload->cmd,
10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg1,
10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg2);
10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
10433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
1055e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1056e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        {
1057e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            LOGW("Free video handle %d %d", evt, m_state);
1058e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            QCameraVideoMemory::closeNativeHandle((const void *)payload);
1059e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        }
10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
10613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             cam_evt->server_event_type, m_state);
10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // No ops, but need to notify
11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       {
11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           qcamera_sm_internal_evt_payload_t *internal_evt =
11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   (qcamera_sm_internal_evt_payload_t *)payload;
11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           switch (internal_evt->evt_type) {
11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data);
11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               break;
11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           default:
11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               break;
11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       }
11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtPreviewingState
11333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
11343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_PREVIEWING.
11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                    void *payload)
11473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
11483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
11503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Error setting preview window during previewing
11573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot set preview window when preview is running");
11583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
11603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
11653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
11663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
11803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
11813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
11823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t enable_msgs = *((int32_t *)payload);
11833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_bDelayPreviewMsgs &&
11843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (enable_msgs & CAMERA_MSG_PREVIEW_FRAME)) {
11853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                enable_msgs &= ~CAMERA_MSG_PREVIEW_FRAME;
11863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_DelayedMsgs = CAMERA_MSG_PREVIEW_FRAME;
11873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->enableMsgType(enable_msgs);
11893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
11903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
11913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
11933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
11953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
11963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
11973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t disable_msgs = *((int32_t *)payload);
11983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_bDelayPreviewMsgs && m_DelayedMsgs) {
11993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_DelayedMsgs &= ~disable_msgs;
12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (0 == m_DelayedMsgs) {
12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_bDelayPreviewMsgs = false;
12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->disableMsgType(disable_msgs);
12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t msgs = *((int32_t *)payload);
12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(msgs);
12153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_bDelayPreviewMsgs && m_DelayedMsgs) {
12163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                enabled |= (msgs & m_DelayedMsgs);
12173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
12213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateParameters((char*)payload, needRestart);
12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Stopping preview...");
12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // stop preview
12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopPreview();
12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Clear memory pools
12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->m_memoryPool.clear();
12423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
12493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
12513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
12583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // start preview again
12603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preparePreview();
12613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
12623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                applyDelayedMsgs();
12633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
12643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
12653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->unpreparePreview();
12663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
12673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
12683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
12693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
12703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->setNeedRestart(false);
12723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status            = rc;
12733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api       = evt;
12743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type       = QCAMERA_API_RESULT_TYPE_DEF;
12753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
12793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.params = m_parent->getParameters();
12813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
12823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
12853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
12893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
12913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
12923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
12933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
12953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
12973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
12983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
12993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no ops here
13003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Already in preview ready state, no ops here");
13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no ops here
13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Already in previewing, no ops here to start preview");
13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            applyDelayedMsgs();
13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopPreview();
13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            applyDelayedMsgs();
13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            applyDelayedMsgs();
13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 1;
13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
13503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
13543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
13563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->dump(*((int *)payload));
13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
13723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->autoFocus();
13743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelAutoFocus();
13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
13903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
13913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preStartRecording();
13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->startRecording();
14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // move state to recording state
14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_RECORDING;
14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                applyDelayedMsgs();
14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->prepareHardwareForSnapshot(FALSE);
14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
14163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Do not signal API result in this case.
14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Need to wait for snapshot done in metadta.
14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                applyDelayedMsgs();
14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
14213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Do not change state in this case.
14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("prepareHardwareForSnapshot failed %d",
14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc);
14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.status = rc;
14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.request_api = evt;
14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->signalAPIResult(&result);
14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preTakePicture();
14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       {
14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           LOGL("QCAMERA_SM_EVT_TAKE_PICTURE ");
14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if ( m_parent->mParameters.getRecordingHintValue() == true) {
14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->stopPreview();
14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->mParameters.updateRecordingHintValue(FALSE);
14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // start preview again
14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc == NO_ERROR) {
14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = m_parent->startPreview();
14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (rc != NO_ERROR) {
14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_parent->unpreparePreview();
14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               bool restartPreview = m_parent->isPreviewRestartEnabled();
14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if ((restartPreview) && (m_parent->mParameters.getManualCaptureMode()
14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       >= CAM_MANUAL_CAPTURE_TYPE_3)) {
14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   /* stop preview and disable ZSL now */
14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_parent->stopPreview();
14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_parent->mParameters.updateZSLModeValue(FALSE);
14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_RestoreZSL = TRUE;
14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_bDelayPreviewMsgs = true;
14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_state = QCAMERA_SM_STATE_PIC_TAKING;
14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               } else {
14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_bDelayPreviewMsgs = true;
14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = m_parent->takePicture();
14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if (rc != NO_ERROR) {
14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   // move state to previewing state
14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_parent->unconfigureAdvancedCapture();
14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_state = QCAMERA_SM_STATE_PREVIEWING;
14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if (!(m_parent->isRetroPicture()) || (rc != NO_ERROR)) {
14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   LOGD("signal API result, m_state = %d",
14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                          m_state);
14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   result.status = rc;
14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   result.request_api = evt;
14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_parent->signalAPIResult(&result);
14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           } else {
14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               m_state = QCAMERA_SM_STATE_PIC_TAKING;
14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = m_parent->takePicture();
14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if (rc != NO_ERROR) {
14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   int32_t temp_rc = NO_ERROR;
14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   // move state to preview stopped state
14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_parent->unconfigureAdvancedCapture();
14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   m_parent->stopPreview();
14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   // start preview again
14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   temp_rc = m_parent->preparePreview();
14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   if (temp_rc == NO_ERROR) {
14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       temp_rc = m_parent->startPreview();
14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       if (temp_rc != NO_ERROR) {
14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                           m_parent->unpreparePreview();
14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                           m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       } else {
15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                           m_state = QCAMERA_SM_STATE_PREVIEWING;
15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       }
15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   } else {
15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   }
15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               result.status = rc;
15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               result.request_api = evt;
15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               m_parent->signalAPIResult(&result);
15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (qcamera_sm_evt_command_payload_t *)payload;
15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->sendCommand(cmd_payload->cmd,
15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cmd_payload->arg1,
15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cmd_payload->arg2);
15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_bPreviewNeedsRestart =
15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1);
15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_bPreviewDelayedRestart =
15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (QCAMERA_SM_EVT_DELAYED_RESTART == cmd_payload->arg2);
15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL
15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) &&
15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (m_bPreviewNeedsRestart)) {
15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->stopPreview();
15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Clear memory pools
15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->m_memoryPool.clear();
15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (!m_bPreviewDelayedRestart) {
15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // start preview again
15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = m_parent->preparePreview();
15363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (rc == NO_ERROR) {
15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        applyDelayedMsgs();
15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        rc = m_parent->startPreview();
15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (rc != NO_ERROR) {
15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            m_parent->unpreparePreview();
15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
15523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND_RESTART:
15533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
15543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL
15553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
15563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (qcamera_sm_evt_command_payload_t *)payload;
15573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) &&
15583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (m_bPreviewNeedsRestart) &&
15593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (m_bPreviewDelayedRestart)) {
15603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // start preview again
15613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
15623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc == NO_ERROR) {
15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = m_parent->startPreview();
15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (rc != NO_ERROR) {
15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_parent->unpreparePreview();
15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
1591e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1592e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        {
1593e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            LOGW("Free video handle %d %d", evt, m_state);
1594e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            QCameraVideoMemory::closeNativeHandle((const void *)payload);
1595e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        }
15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
16013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
16023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_internal_evt_payload_t *internal_evt =
16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_internal_evt_payload_t *)payload;
16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (internal_evt->evt_type) {
16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
16143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
16173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHistogramStats(internal_evt->stats_data);
16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_CROP_INFO:
16253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZoomEvent(internal_evt->crop_data);
16263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processASDUpdate(internal_evt->asd_data);
16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data);
16323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
16353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AE_UPDATE:
16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAEInfo(internal_evt->ae_data);
16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
16433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHDRData(internal_evt->hdr_data);
16443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processRetroAECUnlock();
16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZSLCaptureDone();
16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
1651cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            case QCAMERA_INTERNAL_EVT_DUAL_CAMERA_FOV_CONTROL:
1652c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                m_parent->processDualCamFovControl();
1653cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
16549ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel            case QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE:
16559ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                rc = m_parent->processLEDCalibration(internal_evt->led_calib_result);
16569ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                break;
16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             internal_evt->evt_type, m_state);
16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
16713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
16723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
16763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("no handling for server evt (%d) at this state",
16773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       cam_evt->server_event_type);
16783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
16793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
16823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateThermalLevel(payload);
16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // No ops, but need to notify
16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
16933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->stopPreview();
17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preparePreview();
17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
17253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtPrepareSnapshotState
17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
17343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
17383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
17423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                    void *payload)
17433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
17443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
17453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
17463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
17523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_internal_evt_payload_t *internal_evt =
17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_internal_evt_payload_t *)payload;
17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (internal_evt->evt_type) {
17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
18023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEWING;
18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.status = NO_ERROR;
18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->signalAPIResult(&result);
18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHistogramStats(internal_evt->stats_data);
18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_CROP_INFO:
18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZoomEvent(internal_evt->crop_data);
18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processASDUpdate(internal_evt->asd_data);
18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
18263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AE_UPDATE:
18283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAEInfo(internal_evt->ae_data);
18293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
18313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
18323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
18343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHDRData(internal_evt->hdr_data);
18353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
18373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processRetroAECUnlock();
18383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
18403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZSLCaptureDone();
18413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
1842cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            case QCAMERA_INTERNAL_EVT_DUAL_CAMERA_FOV_CONTROL:
1843c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                m_parent->processDualCamFovControl();
1844cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
18459ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel            case QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE:
18469ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                rc = m_parent->processLEDCalibration(internal_evt->led_calib_result);
18479ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                break;
18483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
18493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
18503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             internal_evt->evt_type, m_state);
18513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
18533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
18553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
18563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
18573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
18583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
18593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
18603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
18613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // Send internal events to stop indefinite wait on prepare
18623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // snapshot done event.
1863e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                    m_state = QCAMERA_SM_STATE_PREVIEWING;
1864e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
18653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = rc;
18663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
18673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
18693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = rc;
18713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE;
18723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
18743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
18763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
18773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
18783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
18793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
18813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
18823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             cam_evt->server_event_type, m_state);
18833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
18853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
18873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
18883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
18893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // No ops, but need to notify
18903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
18913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
18923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
18933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
18953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
18973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
18983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
18993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateThermalLevel(payload);
19003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
19033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
19043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
19053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
19093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
19103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtPicTakingState
19133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
19153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_PIC_TAKING.
19163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
19193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
19203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
19223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
19233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
19243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
19263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                   void *payload)
19273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
19293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
19303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
19313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
19333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
19343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
19353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
19363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Error setting preview window during previewing
19373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot set preview window when preview is running");
19383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
19393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
19403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
19413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
19433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
19463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
19473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
19483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
19493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
19503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
19513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
19523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
19533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
19543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
19553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
19563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
19583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
19613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
19623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->enableMsgType(*((int32_t *)payload));
19633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
19643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
19653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
19673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
19703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
19713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->disableMsgType(*((int32_t *)payload));
19723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
19733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
19743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
19763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
19793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
19803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
19813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
19823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
19833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
19843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
19853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
19863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
19893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
19903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
19913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateParameters((char*)payload, needRestart);
19923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
19933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
19943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
19963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
19983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
19993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
20073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
20093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
20163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->setNeedRestart(false);
20183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status           =  rc;
20193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api      =  evt;
20203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type      =  QCAMERA_API_RESULT_TYPE_DEF;
20213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
20253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.params = m_parent->getParameters();
20273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
20283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
20313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
20353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
20373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
20443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // cancel picture first
20463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelPicture();
20473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
20483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
20563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
20583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
20613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
20623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
20663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
20683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
20713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
20723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
20763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
20783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
20853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->dump(*((int *)payload));
20873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
20913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
20923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
20933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
20943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
20953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->autoFocus();
20963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
20973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
20983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
21033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelAutoFocus();
21053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
21063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
21073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
21123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
21143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_command_payload_t *)payload;
21153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->sendCommand(cmd_payload->cmd,
21163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg1,
21173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg2);
21183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL
21193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
21203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // move state to previewing state
21213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEWING;
21223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
21233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
21243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
21253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
21263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
21313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelPicture();
21333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
21343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
21353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
21363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
21413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
21433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
21443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
21453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
21463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
21473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
21483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
21493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
21503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
21513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
21523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
21563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if ( m_parent->isLongshotEnabled() ) {
21583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               // no ops here, need to singal NO_ERROR
21593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = NO_ERROR;
21603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
21613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
21623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
21633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
21643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
21663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
21673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
21723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if ( m_parent->isLongshotEnabled() ) {
21743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = m_parent->longShot();
21753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
21763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
21773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
21783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
21793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
21813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
21823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
21843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
21863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
21873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
21883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
21893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
21903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
21913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
21923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
21933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
21943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
21953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
21963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
21973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
21983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
21993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
22003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
22013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
22023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
22033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
22043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
22053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
22063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
22073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
22083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_internal_evt_payload_t *internal_evt =
22093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_internal_evt_payload_t *)payload;
22103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (internal_evt->evt_type) {
22113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
22123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
22133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
22153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
22173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
22193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_CROP_INFO:
22213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZoomEvent(internal_evt->crop_data);
22223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
22243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processASDUpdate(internal_evt->asd_data);
22253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
22273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
22283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
22303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
22313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AE_UPDATE:
22333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAEInfo(internal_evt->ae_data);
22343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
22363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
22373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
22393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHDRData(internal_evt->hdr_data);
22403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
22423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processRetroAECUnlock();
22433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
22453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZSLCaptureDone();
22463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
2247cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            case QCAMERA_INTERNAL_EVT_DUAL_CAMERA_FOV_CONTROL:
2248c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                m_parent->processDualCamFovControl();
2249cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
22509ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel            case QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE:
22519ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                rc = m_parent->processLEDCalibration(internal_evt->led_calib_result);
22529ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                break;
22533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
22543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
22563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
22573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
22583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
22593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
22603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
22613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
22623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
22633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
22643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // Send internal events to stop indefinite wait on prepare
22653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // snapshot done event.
22663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = rc;
22673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
22683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
22693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
22703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = rc;
22723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE;
22733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
22743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
22753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
22773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
22783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
22793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
22803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_CAC_DONE:
22823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (m_parent->isCACEnabled() || m_parent->mParameters.isOEMFeatEnabled()) {
22833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGD("[LONG_SHOT_DBG] : Received CAC Done");
22843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (m_parent->isLongshotEnabled()
22853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            && !m_parent->isCaptureShutterEnabled()) {
22863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        // play shutter sound for longshot
22873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        // after CAC stage is done
22883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_parent->playShutter();
22893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
22903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->mCACDoneReceived = TRUE;
22913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
22923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
22943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("no handling for server evt (%d) at this state",
22953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       cam_evt->server_event_type);
22963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
22973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
22983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
22993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
23003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
23013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
23023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_jpeg_evt_payload_t *jpeg_job =
23033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_jpeg_evt_payload_t *)payload;
23043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->processJpegNotify(jpeg_job);
23053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
23063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
23073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
23083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
23093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool restartPreview = m_parent->isPreviewRestartEnabled();
23103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopCaptureChannel(restartPreview);
23113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (restartPreview && (NO_ERROR == rc)) {
231304e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel                m_parent->unconfigureAdvancedCapture();
23143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preparePreview();
23153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (NO_ERROR == rc) {
23163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->m_bPreviewStarted = true;
23173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    applyDelayedMsgs();
23183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = m_parent->startPreview();
23193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
23203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
23213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
23233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
23243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
23263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
23273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
23283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
23293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
23303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelPicture();
23313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool restartPreview = m_parent->isPreviewRestartEnabled();
23333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (restartPreview) {
23343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (m_parent->mParameters.getManualCaptureMode()
23353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        >= CAM_MANUAL_CAPTURE_TYPE_3) {
23363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->mParameters.updateZSLModeValue(m_RestoreZSL);
23373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_RestoreZSL = FALSE;
23383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = m_parent->preparePreview();
23393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (NO_ERROR == rc) {
23403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_parent->m_bPreviewStarted = true;
23413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        applyDelayedMsgs();
23423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        rc = m_parent->startPreview();
23433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
23443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
23453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEWING;
23463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
23473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
23483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
23493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
23513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
23523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
23543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
23553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
23563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
23573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
23583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateThermalLevel(payload);
23593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
23603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
23613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
23623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
23633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
23643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
23653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
23673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
23703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtRecordingState
23713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
23723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
23733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_RECORDING.
23743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
23753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
23763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
23773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
23783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
23793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
23803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
23813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
23823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
23833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
23843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                   void *payload)
23853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
23863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
23873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
23883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
23893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
23913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
23923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
23933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
23943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
23953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
23963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // WA: CTS test VideoSnapshot will try to
23973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            //     start preview during video recording.
23983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("CTS video restart op");
23993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
24003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
24073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
24093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
24103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
24113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
24123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
24133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
24143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
24153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
24223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->enableMsgType(*((int32_t *)payload));
24243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
24313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->disableMsgType(*((int32_t *)payload));
24333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
24403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
24423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
24453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
24463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
24503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
24523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateParameters((char*)payload, needRestart);
24533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
24543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (needRestart) {
24553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // cannot set parameters that requires restart during recording
24563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Error!! cannot set parameters that requires restart during recording");
24573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = BAD_VALUE;
24583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
24593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
24603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
24613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->setNeedRestart(false);
24623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
24633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
24703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
24723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
24793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
24803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
24823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
24833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
24903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
24913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.params = m_parent->getParameters();
24923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
24933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
24943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
24953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
24963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
24973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
24993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
25003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
25023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
25093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
25113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
25143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
25153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
25193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
25213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
25243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 1;
25253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
25293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
25313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
25383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->dump(*((int *)payload));
25403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
25473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->autoFocus();
25493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
25563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelAutoFocus();
25583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
25653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
25673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_command_payload_t *)payload;
25683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->sendCommand(cmd_payload->cmd,
25693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg1,
25703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg2);
25713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
25783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // No ops here, send NO_ERROR.
25803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
25813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
25873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
25883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
25893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
25903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->takeLiveSnapshot();
25913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
25923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->unconfigureAdvancedCapture();
25933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_RECORDING;
25943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
25953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
25963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
25973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
25983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
25993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
26023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
26033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
26043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
26053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // no ops here
26073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("already in recording state, no ops for start_recording");
26083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = 0;
26093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
26103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
26123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
26163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopRecording();
26183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEWING;
26193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
26203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
26223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
26263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopRecording();
26283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEWING;
26293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopPreview();
26313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
26323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
26343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
26363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
26403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->releaseRecordingFrame((const void *)payload);
26423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
26433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
26453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
26493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
26513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
26523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
26533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
26543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
26553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
26563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
26573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
26593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
26603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
26643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            //In Video snapshot, prepare hardware is a no-op.
26663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = NO_ERROR;
26673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
26693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
26733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
26743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
26753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
26773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
26783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
26793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
26803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
26813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
26823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
26843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
26853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
26863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_internal_evt_payload_t *internal_evt =
26873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_internal_evt_payload_t *)payload;
26883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (internal_evt->evt_type) {
26893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
26903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
26913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
26923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
26933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
26943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
26953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
26963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
26973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
26983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHistogramStats(internal_evt->stats_data);
26993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_CROP_INFO:
27013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZoomEvent(internal_evt->crop_data);
27023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
27043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processASDUpdate(internal_evt->asd_data);
27053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
27073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
27083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
27103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
27113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AE_UPDATE:
27133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAEInfo(internal_evt->ae_data);
27143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
27163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
27173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
27193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHDRData(internal_evt->hdr_data);
27203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
27223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processRetroAECUnlock();
27233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
27253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZSLCaptureDone();
27263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
2727cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            case QCAMERA_INTERNAL_EVT_DUAL_CAMERA_FOV_CONTROL:
2728c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                m_parent->processDualCamFovControl();
2729cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
27309ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel            case QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE:
27319ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                rc = m_parent->processLEDCalibration(internal_evt->led_calib_result);
27329ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                break;
27333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
27343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
27363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
27383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
27393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
27403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
27413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
27423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
27433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
27443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
27453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
27463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
27473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
27483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
27503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
27513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             cam_evt->server_event_type, m_state);
27523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
27533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
27543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
27563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
27573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
27583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateThermalLevel(payload);
27593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
27613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
27623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
27633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // No ops, but need to notify
27643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
27653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
27663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
27673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
27683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
27693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
27713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
27723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
27733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
27743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
27753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
27783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
27793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
27813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtVideoPicTakingState
27823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
27843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
27853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
27873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
27883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
27893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
27913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
27923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
27933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
27943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
27953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                        void *payload)
27963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
27973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
27983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
27993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
28003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
28023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
28033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
28043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Error setting preview window during previewing
28063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot set preview window when preview is running");
28073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
28083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
28153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
28173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
28183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
28193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
28203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
28213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
28223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
28233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
28303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->enableMsgType(*((int32_t *)payload));
28323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
28393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->disableMsgType(*((int32_t *)payload));
28413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
28483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
28503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
28533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
28543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
28583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
28603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateParameters((char*)payload, needRestart);
28613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
28623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (needRestart) {
28633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // cannot set parameters that requires restart during recording
28643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Error!! cannot set parameters that requires restart during recording");
28653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = BAD_VALUE;
28663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
28673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
28683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
28693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->setNeedRestart(false);
28703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
28713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
28783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
28803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
28873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
28883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
28903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
28913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
28923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
28933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
28943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
28953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
28963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
28973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
28983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
28993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.params = m_parent->getParameters();
29003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
29013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
29043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
29083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
29103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
29173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
29193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
29223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 1;
29233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
29273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
29293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
29323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 1;
29333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
29373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
29393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
29463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->dump(*((int *)payload));
29483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
29553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->autoFocus();
29573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
29643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelAutoFocus();
29663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
29733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
29753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_command_payload_t *)payload;
29763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->sendCommand(cmd_payload->cmd,
29773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg1,
29783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg2);
29793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
29863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
29873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelLiveSnapshot();
29883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_RECORDING;
29893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopRecording();
29913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEWING;
29923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
29943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
29953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
29963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
29973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
29983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
29993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
30003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
30013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->releaseRecordingFrame((const void *)payload);
30023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
30033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
30043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
30053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
30063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
30073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
30083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
30093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
30103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelLiveSnapshot();
30113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_RECORDING;
30123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
30133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
30143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
30153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
30163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
30173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
30183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
30193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
30203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
30213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
30223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
30233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
30243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
30253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
30263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
30273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
30283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
30293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
30303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
30313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
30323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
30333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
30343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
30353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelLiveSnapshot();
30363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_RECORDING;
30373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopRecording();
30393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEWING;
30403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopPreview();
30423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
30433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
30453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
30463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
30473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
30483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
30493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
30503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
30513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
30523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
30533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
30543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
30553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
30563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
30573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
30583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
30593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
30603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
30613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
30623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
30633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
30643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
30653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
30663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
30673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
30683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
30693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
30703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
30713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
30723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_internal_evt_payload_t *internal_evt =
30733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_internal_evt_payload_t *)payload;
30743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (internal_evt->evt_type) {
30753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
30763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
30773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
30793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
30813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
30823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
30843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHistogramStats(internal_evt->stats_data);
30853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_CROP_INFO:
30873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZoomEvent(internal_evt->crop_data);
30883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
30903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processASDUpdate(internal_evt->asd_data);
30913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
30933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
30943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
30963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
30973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
30983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AE_UPDATE:
30993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAEInfo(internal_evt->ae_data);
31003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
31023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
31033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
31053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHDRData(internal_evt->hdr_data);
31063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
31083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processRetroAECUnlock();
31093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
31113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZSLCaptureDone();
31123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
3113cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            case QCAMERA_INTERNAL_EVT_DUAL_CAMERA_FOV_CONTROL:
3114c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                m_parent->processDualCamFovControl();
3115cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
31169ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel            case QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE:
31179ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                rc = m_parent->processLEDCalibration(internal_evt->led_calib_result);
31189ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                break;
31193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
31203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
31223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
31233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
31243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
31253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
31263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
31273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
31283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
31293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
31303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
31313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
31323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
31333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
31343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
31363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
31373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             cam_evt->server_event_type, m_state);
31383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
31393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
31403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
31413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
31423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
31433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
31443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_jpeg_evt_payload_t *jpeg_job =
31453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_jpeg_evt_payload_t *)payload;
31463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->processJpegNotify(jpeg_job);
31473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
31483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
31493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
31503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
31513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelLiveSnapshot();
31523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_RECORDING;
31533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
31543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
31553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
31563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
31573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
31583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
31593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
31603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
31613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateThermalLevel(payload);
31623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
31633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
31643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
31653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
31663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
31673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
31683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
31693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
31703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
31713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
31723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
31733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : procEvtPreviewPicTakingState
31743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
31753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: finite state machine function to handle event in state of
31763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
31773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
31783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
31793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @evt      : event to be processed
31803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @payload  : event payload. Can be NULL if not needed.
31813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
31823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
31833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
31843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
31853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
31863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
31873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                          void *payload)
31883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
31893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
31903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_api_result_t result;
31913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&result, 0, sizeof(qcamera_api_result_t));
31923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
31933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGL("event (%d)", evt);
31943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (evt) {
31953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_CALLBACKS:
31963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
31973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_setcb_payload_t *setcbs =
31983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_setcb_payload_t *)payload;
31993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->setCallBacks(setcbs->notify_cb,
32003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb,
32013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->data_cb_timestamp,
32023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->get_memory,
32033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        setcbs->user);
32043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
32073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
32113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->enableMsgType(*((int32_t *)payload));
32133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
32163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
32203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->disableMsgType(*((int32_t *)payload));
32223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
32253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
32293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
32313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
32343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = enabled;
32353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS:
32393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bool needRestart = false;
32413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateParameters((char*)payload, needRestart);
32423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
32453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_STOP:
32493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // need restart preview for parameters to take effect
32513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Stopping preview...");
32523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // stop preview
32533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->stopPreview();
32543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Clear memory pools
32553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->m_memoryPool.clear();
32563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
32593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_COMMIT:
32633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // commit parameter changes to server
32653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->commitParameterChanges();
32663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
32693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PARAMS_RESTART:
32733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // start preview again
32753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preparePreview();
32763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
32773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                applyDelayedMsgs();
32783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
32793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
32803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->unpreparePreview();
32813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
32823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
32833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
32843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PIC_TAKING;
32853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
32863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->setNeedRestart(false);
32873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status           =  rc;
32883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api      =  evt;
32893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type      =  QCAMERA_API_RESULT_TYPE_DEF;
32903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
32913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
32923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
32933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_GET_PARAMS:
32943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
32953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.params = m_parent->getParameters();
32963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = result.params ? NO_ERROR : UNKNOWN_ERROR;
32973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
32983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
32993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
33003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PUT_PARAMS:
33043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->putParameters((char*)payload);
33063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
33133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
33153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
33183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 1;
33193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RECORDING_ENABLED:
33233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
33253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
33283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.enabled = 0;
33293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
33333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
33353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_DUMP:
33423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->dump(*((int *)payload));
33443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
33513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->autoFocus();
33533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
33603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->cancelAutoFocus();
33623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SEND_COMMAND:
33693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_command_payload_t *cmd_payload =
33713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_command_payload_t *)payload;
33723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->sendCommand(cmd_payload->cmd,
33733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg1,
33743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                       cmd_payload->arg2);
33753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL
33763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
33773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // move state to previewing state
33783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_state = QCAMERA_SM_STATE_PREVIEWING;
33793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
33803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
33813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
33883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->releaseRecordingFrame((const void *)payload);
33903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
33913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
33923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
33933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
33943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
33963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_CANCEL_PICTURE:
33973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
33983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
33993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelPicture();
34003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
34013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelLiveSnapshot();
34023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
34033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEWING;
34043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
34053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
34063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
34073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
34083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
34103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_PREVIEW:
34113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
34123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->isZSLMode()) {
34133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // cancel picture first
34143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelPicture();
34153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
34163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else if (m_parent->isLongshotEnabled()) {
34173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // just cancel picture
34183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelPicture();
34193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
34203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelLiveSnapshot();
34213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
34223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
34233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // unprepare preview
34243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->unpreparePreview();
34253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
34263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
34273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
34283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
34293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
34303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
34323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_START_RECORDING:
34333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
34343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->isZSLMode()) {
34353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d) in ZSL mode", evt, m_state);
34363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
34373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else if (m_parent->isLongshotEnabled()) {
34383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d) in Longshot mode", evt, m_state);
34393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
34403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
34413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->preStartRecording();
34423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
34433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
34443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
34453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
34463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
34473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
34493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_RECORDING:
34503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
34513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->isZSLMode()) {
34523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d) in ZSL mode",
34533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       evt, m_state);
34543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
34553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else if (m_parent->isLongshotEnabled()) {
34563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d) in Longshot mode",
34573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       evt, m_state);
34583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
34593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
34603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startRecording();
34613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc == NO_ERROR) {
34623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
34633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
34643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
34653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
34663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
34673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
34683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
34693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
34713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
34723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
34733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t faceID = 0;
34743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_evt_reg_face_payload_t *reg_payload =
34753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_evt_reg_face_payload_t *)payload;
34763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
34773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             reg_payload->config,
34783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                             faceID);
34793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
34803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
34813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
34823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.handle = faceID;
34833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
34843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
34863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PRE_TAKE_PICTURE:
34873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
34883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if ( m_parent->isLongshotEnabled() ) {
34893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               // no ops here, need to singal NO_ERROR
34903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = NO_ERROR;
34913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
34923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
34933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
34943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
34953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
34973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
34983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
34993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
35003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
35013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
35023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_TAKE_PICTURE:
35033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
35043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ( m_parent->isLongshotEnabled() ) {
35053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = m_parent->longShot();
35063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
35073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
35083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = INVALID_OPERATION;
35093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
35103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
35123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
35133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
35143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
35153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
35163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
35173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
35193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
35203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          LOGD("Prepare Snapshot");
35213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          if (m_parent->isRetroPicture()) {
35223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              LOGD("Prepare Snapshot in Retro Mode");
35233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              rc = m_parent->prepareHardwareForSnapshot(FALSE);
35243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              if (rc != NO_ERROR) {
35253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  LOGE("prepareHardwareForSnapshot failed %d",
35263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       rc);
35273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  result.status = rc;
35283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  result.request_api = evt;
35293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
35303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  m_parent->signalAPIResult(&result);
35313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              }
35323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          }
35333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          else {
35343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              LOGE("Error!! cannot handle evt(%d) in state(%d)",
35353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 evt, m_state);
35363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              rc = INVALID_OPERATION;
35373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              result.status = rc;
35383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              result.request_api = evt;
35393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
35403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              m_parent->signalAPIResult(&result);
35413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          }
35423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
35433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
35443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_STOP_RECORDING:
35453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_PREPARE_PREVIEW:
35463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_PREVIEW:
35473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
35483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
35493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RELEASE:
35503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
35513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state);
35523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = INVALID_OPERATION;
35533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
35543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
35553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
35563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
35573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
35583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
35593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_INTERNAL:
35603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
35613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_sm_internal_evt_payload_t *internal_evt =
35623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_sm_internal_evt_payload_t *)payload;
35633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (internal_evt->evt_type) {
35643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
35653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
35663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
35673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
35683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGD("Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event");
35693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (m_parent->isRetroPicture()) {
35703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
35713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGD("Retro picture");
35723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = NO_ERROR;
35733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
35743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
35753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
35763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
35773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                else {
35783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Invalid Case for  "
35793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            "QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event");
35803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
35813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
35823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
35833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
35843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
35853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT:
35863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // This is valid only in Retro picture Mode
35873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (m_parent->isRetroPicture()) {
35883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGD("Received QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event");
35893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = NO_ERROR;
35903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE;
35913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
35923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
35933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
35943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                else {
35953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGD("Wrong Case for QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event");
35963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
35973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
35983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
35993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHistogramStats(internal_evt->stats_data);
36003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_CROP_INFO:
36023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZoomEvent(internal_evt->crop_data);
36033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
36053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processASDUpdate(internal_evt->asd_data);
36063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
36083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
36093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
36113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
36123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_AE_UPDATE:
36143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processAEInfo(internal_evt->ae_data);
36153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
36173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
36183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
36203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processHDRData(internal_evt->hdr_data);
36213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
36233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processRetroAECUnlock();
36243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
36263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->processZSLCaptureDone();
36273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
3628cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            case QCAMERA_INTERNAL_EVT_DUAL_CAMERA_FOV_CONTROL:
3629c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                m_parent->processDualCamFovControl();
3630cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
36319ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel            case QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE:
36329ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                rc = m_parent->processLEDCalibration(internal_evt->led_calib_result);
36339ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel                break;
36343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
36353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
36373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
36383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
36393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_EVT_NOTIFY:
36403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
36413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
36423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            switch (cam_evt->server_event_type) {
36433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_DAEMON_DIED:
36443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                {
36453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // Send internal events to stop indefinite wait on prepare
36463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // snapshot done event.
36473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = rc;
36483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
36493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
36503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
36513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.status = rc;
36533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE;
36543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
36553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->signalAPIResult(&result);
36563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
36583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            CAMERA_ERROR_SERVER_DIED,
36593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            0);
36603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
36613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_EVENT_TYPE_CAC_DONE:
36633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (m_parent->isCACEnabled() || m_parent->mParameters.isOEMFeatEnabled()) {
36643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGD("[LONG_SHOT_DBG] : Received CAC Done");
36653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if ((m_parent->isLongshotEnabled())
36663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            && (!m_parent->isCaptureShutterEnabled())) {
36673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        // play shutter sound for longshot
36683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        // after CAC stage is done
36693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_parent->playShutter();
36703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
36713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_parent->mCACDoneReceived = TRUE;
36723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
36733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
36753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Invalid internal event %d in state(%d)",
36763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             cam_evt->server_event_type, m_state);
36773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
36783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
36793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
36803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
36813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
36823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
36833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGL("Calling Process Jpeg Notify");
36843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            qcamera_jpeg_evt_payload_t *jpeg_job =
36853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (qcamera_jpeg_evt_payload_t *)payload;
36863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->processJpegNotify(jpeg_job);
36873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
36883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
36893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
36903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
36913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGL("Snapshot Done");
36923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
36933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelPicture();
36943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
36953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->cancelLiveSnapshot();
36963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
36973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_state = QCAMERA_SM_STATE_PREVIEWING;
36983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_parent->isRetroPicture()){
36993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.status = rc;
37003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.request_api = evt;
37013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
37023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGL("\n Signalling for JPEG snapshot done!!");
37033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_parent->signalAPIResult(&result);
37043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
37063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
37073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
37083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
37093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalEvtResult(&result);
37103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
37113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
37123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
37133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
37143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->updateThermalLevel(payload);
37153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
37163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
37173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW:
37183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
37193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->stopPreview();
37203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
37213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
37223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
37233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
37243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
37253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
37263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_EVT_RESTART_START_PREVIEW:
37273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
37283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = m_parent->preparePreview();
37293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
37303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = m_parent->startPreview();
37313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
37323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = rc;
37333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.request_api = evt;
37343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
37353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_parent->signalAPIResult(&result);
37363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
37373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       break;
37383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
37393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state);
37403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
37413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
37443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
37453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
37473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : isRecording
37483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: check if recording is in process.
37503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
37523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true -- recording
37543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              false -- not in recording mode
37553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
37563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraStateMachine::isRecording()
37573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
37583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (m_state) {
37593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_RECORDING:
37603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
37613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return true;
37623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
37633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
37643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
37663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
37683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : isPreviewRunning
37693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: check if preview is in process.
37713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
37733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true -- preview running
37753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              false -- preview stopped
37763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
37773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraStateMachine::isPreviewRunning()
37783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
37793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (m_state) {
37803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEWING:
37813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_RECORDING:
37823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
37833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
37843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
37853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_READY:
37863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return true;
37873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
37883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
37893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
37913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
37933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : isPreviewReady
37943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: check if preview is in ready state.
37963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
37983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
37993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true -- preview is in ready state
38003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              false -- preview is stopped
38013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
38023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraStateMachine::isPreviewReady()
38033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
38043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (m_state) {
38053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_READY:
38063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return true;
38073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
38083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
38093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
38103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
38113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
38133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : isCaptureRunning
38143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: check if image capture is in process.
38163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
38183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true -- capture running
38203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              false -- capture stopped
38213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
38223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraStateMachine::isCaptureRunning()
38233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
38243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (m_state) {
38253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PIC_TAKING:
38263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
38273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
38283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return true;
38293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
38303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
38313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
38323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
38333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
38343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : isNonZSLCaptureRunning
38353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: check if image capture is in process in non ZSL mode.
38373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
38393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true -- capture running in non ZSL mode
38413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              false -- Either in not capture mode or captur is not in non ZSL mode
38423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
38433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraStateMachine::isNonZSLCaptureRunning()
38443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
38453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (m_state) {
38463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case QCAMERA_SM_STATE_PIC_TAKING:
38473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return true;
38483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
38493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
38503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
38513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
38523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
38543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : dump
38553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Composes a string based on current configuration
38573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
38593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : Formatted string
38613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
38623d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelString8 QCameraStateMachine::dump()
38633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
38643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8 str("\n");
38653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char s[128];
38663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(s, 128, "Is Preview Running: %d\n", isPreviewRunning());
38683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    str += s;
38693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(s, 128, "Is Capture Running: %d\n", isCaptureRunning());
38713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    str += s;
38723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(s, 128, "Is Non ZSL Capture Running: %d\n",
38743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        isNonZSLCaptureRunning());
38753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    str += s;
38763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(s, 128, "Current State: %d \n", m_state);
38783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    str += s;
38793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch(m_state){
38813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_PREVIEW_STOPPED:
38823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_STOPPED \n");
38833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
38843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_PREVIEW_READY:
38863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_READY \n");
38873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
38883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_PREVIEWING:
38903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEWING \n");
38913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
38923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
38943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_PREPARE_SNAPSHOT \n");
38953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
38963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_PIC_TAKING:
38983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_PIC_TAKING \n");
38993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
39003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_RECORDING:
39023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_RECORDING \n");
39033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
39043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
39063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_VIDEO_PIC_TAKING \n");
39073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
39083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
39103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_PIC_TAKING \n");
39113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
39123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
39133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    str += s;
39143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return str;
39163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
39173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera
3919