Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2012-2015, The Linux Foundataion. All rights reserved.
      2 *
      3 * Redistribution and use in source and binary forms, with or without
      4 * modification, are permitted provided that the following conditions are
      5 * met:
      6 *     * Redistributions of source code must retain the above copyright
      7 *       notice, this list of conditions and the following disclaimer.
      8 *     * Redistributions in binary form must reproduce the above
      9 *       copyright notice, this list of conditions and the following
     10 *       disclaimer in the documentation and/or other materials provided
     11 *       with the distribution.
     12 *     * Neither the name of The Linux Foundation nor the names of its
     13 *       contributors may be used to endorse or promote products derived
     14 *       from this software without specific prior written permission.
     15 *
     16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 *
     28 */
     29 
     30 #define LOG_TAG "QCameraStateMachine"
     31 
     32 #include <utils/Errors.h>
     33 #include "QCamera2HWI.h"
     34 #include "QCameraStateMachine.h"
     35 
     36 namespace qcamera {
     37 
     38 /*===========================================================================
     39  * FUNCTION   : smEvtProcRoutine
     40  *
     41  * DESCRIPTION: Statemachine process thread routine to handle events
     42  *              in different state.
     43  *
     44  * PARAMETERS :
     45  *   @data    : ptr to QCameraStateMachine object
     46  *
     47  * RETURN     : none
     48  *==========================================================================*/
     49 void *QCameraStateMachine::smEvtProcRoutine(void *data)
     50 {
     51     int running = 1, ret;
     52     QCameraStateMachine *pme = (QCameraStateMachine *)data;
     53 
     54     CDBG_HIGH("%s: E", __func__);
     55     do {
     56         do {
     57             ret = cam_sem_wait(&pme->cmd_sem);
     58             if (ret != 0 && errno != EINVAL) {
     59                 ALOGE("%s: cam_sem_wait error (%s)",
     60                            __func__, strerror(errno));
     61                 return NULL;
     62             }
     63         } while (ret != 0);
     64 
     65         // we got notified about new cmd avail in cmd queue
     66         // first check API cmd queue
     67         qcamera_sm_cmd_t *node = (qcamera_sm_cmd_t *)pme->api_queue.dequeue();
     68         if (node == NULL) {
     69             // no API cmd, then check evt cmd queue
     70             node = (qcamera_sm_cmd_t *)pme->evt_queue.dequeue();
     71         }
     72         if (node != NULL) {
     73             switch (node->cmd) {
     74             case QCAMERA_SM_CMD_TYPE_API:
     75                 pme->stateMachine(node->evt, node->evt_payload);
     76                 // API is in a way sync call, so evt_payload is managed by HWI
     77                 // no need to free payload for API
     78                 break;
     79             case QCAMERA_SM_CMD_TYPE_EVT:
     80                 pme->stateMachine(node->evt, node->evt_payload);
     81 
     82                 // EVT is async call, so payload need to be free after use
     83                 free(node->evt_payload);
     84                 node->evt_payload = NULL;
     85                 break;
     86             case QCAMERA_SM_CMD_TYPE_EXIT:
     87                 running = 0;
     88                 break;
     89             default:
     90                 break;
     91             }
     92             free(node);
     93             node = NULL;
     94         }
     95     } while (running);
     96     CDBG_HIGH("%s: X", __func__);
     97     return NULL;
     98 }
     99 
    100 /*===========================================================================
    101  * FUNCTION   : QCameraStateMachine
    102  *
    103  * DESCRIPTION: constructor of QCameraStateMachine. Will start process thread
    104  *
    105  * PARAMETERS :
    106  *   @ctrl    : ptr to HWI object
    107  *
    108  * RETURN     : none
    109  *==========================================================================*/
    110 QCameraStateMachine::QCameraStateMachine(QCamera2HardwareInterface *ctrl) :
    111     api_queue(),
    112     evt_queue()
    113 {
    114     m_parent = ctrl;
    115     m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
    116     cmd_pid = 0;
    117     cam_sem_init(&cmd_sem, 0);
    118     pthread_create(&cmd_pid,
    119                    NULL,
    120                    smEvtProcRoutine,
    121                    this);
    122     pthread_setname_np(cmd_pid, "CAM_stMachine");
    123     m_bDelayPreviewMsgs = false;
    124     m_DelayedMsgs = 0;
    125 }
    126 
    127 /*===========================================================================
    128  * FUNCTION   : ~QCameraStateMachine
    129  *
    130  * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
    131  *
    132  * PARAMETERS : none
    133  *
    134  * RETURN     : none
    135  *==========================================================================*/
    136 QCameraStateMachine::~QCameraStateMachine()
    137 {
    138     cam_sem_destroy(&cmd_sem);
    139 }
    140 
    141 /*===========================================================================
    142  * FUNCTION   : releaseThread
    143  *
    144  * DESCRIPTION: Sends an exit command and terminates the state machine thread
    145  *
    146  * PARAMETERS : none
    147  *
    148  * RETURN     : none
    149  *==========================================================================*/
    150 void QCameraStateMachine::releaseThread()
    151 {
    152     if (cmd_pid != 0) {
    153         qcamera_sm_cmd_t *node =
    154             (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
    155         if (NULL != node) {
    156             memset(node, 0, sizeof(qcamera_sm_cmd_t));
    157             node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
    158 
    159             if (api_queue.enqueue((void *)node)) {
    160                 cam_sem_post(&cmd_sem);
    161             } else {
    162                 free(node);
    163                 node = NULL;
    164             }
    165 
    166             /* wait until cmd thread exits */
    167             if (pthread_join(cmd_pid, NULL) != 0) {
    168                 CDBG_HIGH("%s: pthread dead already\n", __func__);
    169             }
    170         }
    171         cmd_pid = 0;
    172     }
    173 }
    174 
    175 /*===========================================================================
    176  * FUNCTION   : applyDelayedMsgs
    177  *
    178  * DESCRIPTION: Enable if needed any delayed message types
    179  *
    180  * PARAMETERS : None
    181  * RETURN     : int32_t type of status
    182  *              NO_ERROR  -- success
    183  *              none-zero failure code
    184  *==========================================================================*/
    185 int32_t QCameraStateMachine::applyDelayedMsgs()
    186 {
    187     int32_t rc = NO_ERROR;
    188 
    189     if (m_bDelayPreviewMsgs && m_DelayedMsgs) {
    190         rc = m_parent->enableMsgType(m_DelayedMsgs);
    191         m_bDelayPreviewMsgs = false;
    192         m_DelayedMsgs = 0;
    193     } else if (m_bDelayPreviewMsgs) {
    194         m_bDelayPreviewMsgs = false;
    195     }
    196 
    197     return rc;
    198 }
    199 
    200 /*===========================================================================
    201  * FUNCTION   : procAPI
    202  *
    203  * DESCRIPTION: process incoming API request from framework layer.
    204  *
    205  * PARAMETERS :
    206  *   @evt          : event to be processed
    207  *   @api_payload  : API payload. Can be NULL if not needed.
    208  *
    209  * RETURN     : int32_t type of status
    210  *              NO_ERROR  -- success
    211  *              none-zero failure code
    212  *==========================================================================*/
    213 int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
    214                                      void *api_payload)
    215 {
    216     qcamera_sm_cmd_t *node =
    217         (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
    218     if (NULL == node) {
    219         ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
    220         return NO_MEMORY;
    221     }
    222 
    223     memset(node, 0, sizeof(qcamera_sm_cmd_t));
    224     node->cmd = QCAMERA_SM_CMD_TYPE_API;
    225     node->evt = evt;
    226     node->evt_payload = api_payload;
    227     if (api_queue.enqueue((void *)node)) {
    228         cam_sem_post(&cmd_sem);
    229         return NO_ERROR;
    230     } else {
    231         free(node);
    232         return UNKNOWN_ERROR;
    233     }
    234 }
    235 
    236 /*===========================================================================
    237  * FUNCTION   : procEvt
    238  *
    239  * DESCRIPTION: process incoming envent from mm-camera-interface and
    240  *              mm-jpeg-interface.
    241  *
    242  * PARAMETERS :
    243  *   @evt          : event to be processed
    244  *   @evt_payload  : event payload. Can be NULL if not needed.
    245  *
    246  * RETURN     : int32_t type of status
    247  *              NO_ERROR  -- success
    248  *              none-zero failure code
    249  *==========================================================================*/
    250 int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
    251                                      void *evt_payload)
    252 {
    253     qcamera_sm_cmd_t *node =
    254         (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
    255     if (NULL == node) {
    256         ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
    257         return NO_MEMORY;
    258     }
    259 
    260     memset(node, 0, sizeof(qcamera_sm_cmd_t));
    261     node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
    262     node->evt = evt;
    263     node->evt_payload = evt_payload;
    264     if (evt_queue.enqueue((void *)node)) {
    265         cam_sem_post(&cmd_sem);
    266         return NO_ERROR;
    267     } else {
    268         free(node);
    269         return UNKNOWN_ERROR;
    270     }
    271 }
    272 
    273 /*===========================================================================
    274  * FUNCTION   : stateMachine
    275  *
    276  * DESCRIPTION: finite state machine entry function. Depends on state,
    277  *              incoming event will be handled differently.
    278  *
    279  * PARAMETERS :
    280  *   @evt      : event to be processed
    281  *   @payload  : event payload. Can be NULL if not needed.
    282  *
    283  * RETURN     : int32_t type of status
    284  *              NO_ERROR  -- success
    285  *              none-zero failure code
    286  *==========================================================================*/
    287 int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
    288 {
    289     int32_t rc = NO_ERROR;
    290     ALOGV("%s: m_state %d, event (%d)", __func__, m_state, evt);
    291     switch (m_state) {
    292     case QCAMERA_SM_STATE_PREVIEW_STOPPED:
    293         rc = procEvtPreviewStoppedState(evt, payload);
    294         break;
    295     case QCAMERA_SM_STATE_PREVIEW_READY:
    296         rc = procEvtPreviewReadyState(evt, payload);
    297         break;
    298     case QCAMERA_SM_STATE_PREVIEWING:
    299         rc = procEvtPreviewingState(evt, payload);
    300         break;
    301     case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
    302         rc = procEvtPrepareSnapshotState(evt, payload);
    303         break;
    304     case QCAMERA_SM_STATE_PIC_TAKING:
    305         rc = procEvtPicTakingState(evt, payload);
    306         break;
    307     case QCAMERA_SM_STATE_RECORDING:
    308         rc = procEvtRecordingState(evt, payload);
    309         break;
    310     case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
    311         rc = procEvtVideoPicTakingState(evt, payload);
    312         break;
    313     case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
    314         rc = procEvtPreviewPicTakingState(evt, payload);
    315         break;
    316     default:
    317         break;
    318     }
    319 
    320     return rc;
    321 }
    322 
    323 /*===========================================================================
    324  * FUNCTION   : procEvtPreviewStoppedState
    325  *
    326  * DESCRIPTION: finite state machine function to handle event in state of
    327  *              QCAMERA_SM_STATE_PREVIEW_STOPPED.
    328  *
    329  * PARAMETERS :
    330  *   @evt      : event to be processed
    331  *   @payload  : event payload. Can be NULL if not needed.
    332  *
    333  * RETURN     : int32_t type of status
    334  *              NO_ERROR  -- success
    335  *              none-zero failure code
    336  *==========================================================================*/
    337 int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
    338                                                         void *payload)
    339 {
    340     int32_t rc = NO_ERROR;
    341     qcamera_api_result_t result;
    342     memset(&result, 0, sizeof(qcamera_api_result_t));
    343 
    344     ALOGV("%s: event (%d)", __func__, evt);
    345     switch (evt) {
    346     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
    347         {
    348             rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
    349             result.status = rc;
    350             result.request_api = evt;
    351             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    352             m_parent->signalAPIResult(&result);
    353         }
    354         break;
    355     case QCAMERA_SM_EVT_SET_CALLBACKS:
    356         {
    357             qcamera_sm_evt_setcb_payload_t *setcbs =
    358                 (qcamera_sm_evt_setcb_payload_t *)payload;
    359             rc = m_parent->setCallBacks(setcbs->notify_cb,
    360                                         setcbs->data_cb,
    361                                         setcbs->data_cb_timestamp,
    362                                         setcbs->get_memory,
    363                                         setcbs->user);
    364             result.status = rc;
    365             result.request_api = evt;
    366             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    367             m_parent->signalAPIResult(&result);
    368         }
    369         break;
    370     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
    371         {
    372             rc = m_parent->enableMsgType(*((int32_t *)payload));
    373             result.status = rc;
    374             result.request_api = evt;
    375             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    376             m_parent->signalAPIResult(&result);
    377         }
    378         break;
    379     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
    380         {
    381             rc = m_parent->disableMsgType(*((int32_t *)payload));
    382             result.status = rc;
    383             result.request_api = evt;
    384             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    385             m_parent->signalAPIResult(&result);
    386         }
    387         break;
    388     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
    389         {
    390             int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
    391             result.status = rc;
    392             result.request_api = evt;
    393             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
    394             result.enabled = enabled;
    395             m_parent->signalAPIResult(&result);
    396         }
    397         break;
    398     case QCAMERA_SM_EVT_SET_PARAMS:
    399         {
    400             bool needRestart = false;
    401             rc = m_parent->updateParameters((char*)payload, needRestart);
    402             if (needRestart) {
    403                 // Clear memory pools
    404                 m_parent->m_memoryPool.clear();
    405             }
    406             if (rc == NO_ERROR) {
    407                 rc = m_parent->commitParameterChanges();
    408             }
    409             result.status = rc;
    410             result.request_api = evt;
    411             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    412             m_parent->signalAPIResult(&result);
    413         }
    414         break;
    415     case QCAMERA_SM_EVT_GET_PARAMS:
    416         {
    417             result.params = m_parent->getParameters();
    418             rc = NO_ERROR;
    419             result.status = rc;
    420             result.request_api = evt;
    421             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
    422             m_parent->signalAPIResult(&result);
    423         }
    424         break;
    425     case QCAMERA_SM_EVT_PUT_PARAMS:
    426         {
    427             rc = m_parent->putParameters((char*)payload);
    428             result.status = rc;
    429             result.request_api = evt;
    430             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    431             m_parent->signalAPIResult(&result);
    432         }
    433         break;
    434     case QCAMERA_SM_EVT_START_PREVIEW:
    435         {
    436             if (m_parent->mPreviewWindow == NULL) {
    437                 rc = m_parent->preparePreview();
    438                 if(rc == NO_ERROR) {
    439                     // preview window is not set yet, move to previewReady state
    440                     m_state = QCAMERA_SM_STATE_PREVIEW_READY;
    441                 } else {
    442                     ALOGE("%s: preparePreview failed",__func__);
    443                 }
    444             } else {
    445                 rc = m_parent->preparePreview();
    446                 if (rc == NO_ERROR) {
    447                     applyDelayedMsgs();
    448                     rc = m_parent->startPreview();
    449                     if (rc != NO_ERROR) {
    450                         m_parent->unpreparePreview();
    451                     } else {
    452                         // start preview success, move to previewing state
    453                         m_state = QCAMERA_SM_STATE_PREVIEWING;
    454                     }
    455                 }
    456             }
    457             result.status = rc;
    458             result.request_api = evt;
    459             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    460             m_parent->signalAPIResult(&result);
    461         }
    462         break;
    463     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
    464         {
    465             rc = m_parent->preparePreview();
    466             if (rc == NO_ERROR) {
    467                 applyDelayedMsgs();
    468                 rc = m_parent->startPreview();
    469                 if (rc != NO_ERROR) {
    470                     m_parent->unpreparePreview();
    471                 } else {
    472                     m_state = QCAMERA_SM_STATE_PREVIEWING;
    473                 }
    474             }
    475             result.status = rc;
    476             result.request_api = evt;
    477             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    478             m_parent->signalAPIResult(&result);
    479         }
    480     break;
    481     case QCAMERA_SM_EVT_STOP_PREVIEW:
    482         {
    483             // no op needed here
    484             CDBG_HIGH("%s: already in preview stopped state, do nothing", __func__);
    485             result.status = NO_ERROR;
    486             result.request_api = evt;
    487             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    488             m_parent->signalAPIResult(&result);
    489         }
    490         break;
    491     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
    492     case QCAMERA_SM_EVT_RECORDING_ENABLED:
    493         {
    494             result.status = NO_ERROR;
    495             result.request_api = evt;
    496             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
    497             result.enabled = 0;
    498             m_parent->signalAPIResult(&result);
    499         }
    500         break;
    501     case QCAMERA_SM_EVT_RELEASE:
    502         {
    503             rc = m_parent->release();
    504             result.status = rc;
    505             result.request_api = evt;
    506             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    507             m_parent->signalAPIResult(&result);
    508         }
    509         break;
    510     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
    511         {
    512             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
    513             result.status = rc;
    514             result.request_api = evt;
    515             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    516             m_parent->signalAPIResult(&result);
    517         }
    518         break;
    519     case QCAMERA_SM_EVT_DUMP:
    520         {
    521             rc = m_parent->dump(*((int *)payload));
    522             result.status = rc;
    523             result.request_api = evt;
    524             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    525             m_parent->signalAPIResult(&result);
    526         }
    527         break;
    528     case QCAMERA_SM_EVT_SEND_COMMAND:
    529         {
    530             qcamera_sm_evt_command_payload_t *cmd_payload =
    531                 (qcamera_sm_evt_command_payload_t *)payload;
    532             rc = m_parent->sendCommand(cmd_payload->cmd,
    533                                        cmd_payload->arg1,
    534                                        cmd_payload->arg2);
    535             result.status = rc;
    536             result.request_api = evt;
    537             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    538             m_parent->signalAPIResult(&result);
    539         }
    540         break;
    541     case QCAMERA_SM_EVT_START_RECORDING:
    542     case QCAMERA_SM_EVT_STOP_RECORDING:
    543     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
    544     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
    545     case QCAMERA_SM_EVT_TAKE_PICTURE:
    546         {
    547             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    548             rc = INVALID_OPERATION;
    549             result.status = rc;
    550             result.request_api = evt;
    551             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    552             m_parent->signalAPIResult(&result);
    553         }
    554         break;
    555     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
    556     case QCAMERA_SM_EVT_CANCEL_PICTURE:
    557         {
    558             // no op needed here
    559             CDBG_HIGH("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
    560             result.status = NO_ERROR;
    561             result.request_api = evt;
    562             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    563             m_parent->signalAPIResult(&result);
    564         }
    565         break;
    566     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
    567         {
    568             rc = m_parent->cancelAutoFocus();
    569             result.status = rc;
    570             result.request_api = evt;
    571             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    572             m_parent->signalAPIResult(&result);
    573         }
    574         break;
    575     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
    576         {
    577             int32_t faceID = 0;
    578             qcamera_sm_evt_reg_face_payload_t *reg_payload =
    579                 (qcamera_sm_evt_reg_face_payload_t *)payload;
    580             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
    581                                              reg_payload->config,
    582                                              faceID);
    583             result.status = rc;
    584             result.request_api = evt;
    585             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
    586             result.handle = faceID;
    587             m_parent->signalAPIResult(&result);
    588         }
    589         break;
    590     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
    591         {
    592             rc = m_parent->updateThermalLevel(payload);
    593         }
    594         break;
    595     case QCAMERA_SM_EVT_EVT_NOTIFY:
    596         {
    597             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
    598             switch (cam_evt->server_event_type) {
    599             case CAM_EVENT_TYPE_DAEMON_DIED:
    600                 {
    601                     //close the camera backend
    602                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
    603                     if (handle && handle->ops) {
    604                         handle->ops->error_close_camera(handle->camera_handle);
    605                     } else {
    606                         ALOGE("%s: Could not close because the handle or ops is NULL",
    607                                 __func__);
    608                     }
    609                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
    610                                             CAMERA_ERROR_SERVER_DIED,
    611                                             0);
    612                 }
    613                 break;
    614             default:
    615                 ALOGE("%s: Invalid internal event %d in state(%d)",
    616                             __func__, cam_evt->server_event_type, m_state);
    617                 break;
    618             }
    619         }
    620         break;
    621     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
    622         {
    623             // No ops, but need to notify
    624             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    625             result.status = rc;
    626             result.request_api = evt;
    627             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    628             m_parent->signalEvtResult(&result);
    629         }
    630        break;
    631     case QCAMERA_SM_EVT_EVT_INTERNAL:
    632        {
    633            qcamera_sm_internal_evt_payload_t *internal_evt =
    634                (qcamera_sm_internal_evt_payload_t *)payload;
    635            switch (internal_evt->evt_type) {
    636            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
    637                rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data);
    638                break;
    639            default:
    640                ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    641                break;
    642            }
    643        }
    644        break;
    645     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
    646     default:
    647         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    648         break;
    649     }
    650 
    651     return rc;
    652 }
    653 
    654 /*===========================================================================
    655  * FUNCTION   : procEvtPreviewReadyState
    656  *
    657  * DESCRIPTION: finite state machine function to handle event in state of
    658  *              QCAMERA_SM_STATE_PREVIEW_READY.
    659  *
    660  * PARAMETERS :
    661  *   @evt      : event to be processed
    662  *   @payload  : event payload. Can be NULL if not needed.
    663  *
    664  * RETURN     : int32_t type of status
    665  *              NO_ERROR  -- success
    666  *              none-zero failure code
    667  *==========================================================================*/
    668 int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
    669                                                       void *payload)
    670 {
    671     int32_t rc = NO_ERROR;
    672     qcamera_api_result_t result;
    673     memset(&result, 0, sizeof(qcamera_api_result_t));
    674 
    675     ALOGV("%s: event (%d)", __func__, evt);
    676     switch (evt) {
    677     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
    678         {
    679             m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
    680             if (m_parent->mPreviewWindow != NULL) {
    681                 applyDelayedMsgs();
    682                 rc = m_parent->startPreview();
    683                 if (rc != NO_ERROR) {
    684                     m_parent->unpreparePreview();
    685                     m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
    686                 } else {
    687                     m_state = QCAMERA_SM_STATE_PREVIEWING;
    688                 }
    689             }
    690 
    691             result.status = rc;
    692             result.request_api = evt;
    693             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    694             m_parent->signalAPIResult(&result);
    695         }
    696         break;
    697     case QCAMERA_SM_EVT_SET_CALLBACKS:
    698         {
    699             qcamera_sm_evt_setcb_payload_t *setcbs =
    700                 (qcamera_sm_evt_setcb_payload_t *)payload;
    701             rc = m_parent->setCallBacks(setcbs->notify_cb,
    702                                         setcbs->data_cb,
    703                                         setcbs->data_cb_timestamp,
    704                                         setcbs->get_memory,
    705                                         setcbs->user);
    706             result.status = rc;
    707             result.request_api = evt;
    708             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    709             m_parent->signalAPIResult(&result);
    710         }
    711         break;
    712     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
    713         {
    714             rc = m_parent->enableMsgType(*((int32_t *)payload));
    715             result.status = rc;
    716             result.request_api = evt;
    717             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    718             m_parent->signalAPIResult(&result);
    719         }
    720         break;
    721     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
    722         {
    723             rc = m_parent->disableMsgType(*((int32_t *)payload));
    724             result.status = rc;
    725             result.request_api = evt;
    726             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    727             m_parent->signalAPIResult(&result);
    728         }
    729         break;
    730     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
    731         {
    732             int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
    733             result.status = rc;
    734             result.request_api = evt;
    735             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
    736             result.enabled = enabled;
    737             m_parent->signalAPIResult(&result);
    738         }
    739         break;
    740     case QCAMERA_SM_EVT_SET_PARAMS:
    741         {
    742             bool needRestart = false;
    743             rc = m_parent->updateParameters((char*)payload, needRestart);
    744             if (rc == NO_ERROR) {
    745                 if (needRestart) {
    746                     // need restart preview for parameters to take effect
    747                     m_parent->unpreparePreview();
    748                     // Clear memory pools
    749                     m_parent->m_memoryPool.clear();
    750                     // commit parameter changes to server
    751                     m_parent->commitParameterChanges();
    752                     // prepare preview again
    753                     rc = m_parent->preparePreview();
    754                     if (rc != NO_ERROR) {
    755                         m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
    756                     }
    757                 } else {
    758                     rc = m_parent->commitParameterChanges();
    759                 }
    760             }
    761 
    762             result.status = rc;
    763             result.request_api = evt;
    764             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    765             m_parent->signalAPIResult(&result);
    766         }
    767         break;
    768     case QCAMERA_SM_EVT_GET_PARAMS:
    769         {
    770             result.params = m_parent->getParameters();
    771             rc = NO_ERROR;
    772             result.status = rc;
    773             result.request_api = evt;
    774             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
    775             m_parent->signalAPIResult(&result);
    776         }
    777         break;
    778     case QCAMERA_SM_EVT_PUT_PARAMS:
    779         {
    780             rc = m_parent->putParameters((char*)payload);
    781             result.status = rc;
    782             result.request_api = evt;
    783             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    784             m_parent->signalAPIResult(&result);
    785         }
    786         break;
    787     case QCAMERA_SM_EVT_START_PREVIEW:
    788         {
    789             // no ops here
    790             rc = NO_ERROR;
    791             result.status = rc;
    792             result.request_api = evt;
    793             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    794             m_parent->signalAPIResult(&result);
    795         }
    796         break;
    797     case QCAMERA_SM_EVT_STOP_PREVIEW:
    798         {
    799             m_parent->unpreparePreview();
    800             rc = 0;
    801             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
    802             result.status = rc;
    803             result.request_api = evt;
    804             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    805             m_parent->signalAPIResult(&result);
    806         }
    807         break;
    808     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
    809         {
    810             rc = NO_ERROR;
    811             result.status = rc;
    812             result.request_api = evt;
    813             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
    814             result.enabled = 1;
    815             m_parent->signalAPIResult(&result);
    816         }
    817         break;
    818     case QCAMERA_SM_EVT_RECORDING_ENABLED:
    819         {
    820             rc = 0;
    821             result.status = rc;
    822             result.request_api = evt;
    823             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
    824             result.enabled = 0;
    825             m_parent->signalAPIResult(&result);
    826         }
    827         break;
    828     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
    829         {
    830             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
    831             result.status = rc;
    832             result.request_api = evt;
    833             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    834             m_parent->signalAPIResult(&result);
    835         }
    836         break;
    837     case QCAMERA_SM_EVT_DUMP:
    838         {
    839             rc = m_parent->dump(*((int *)payload));
    840             result.status = rc;
    841             result.request_api = evt;
    842             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    843             m_parent->signalAPIResult(&result);
    844         }
    845         break;
    846     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
    847         {
    848             rc = m_parent->autoFocus();
    849             result.status = rc;
    850             result.request_api = evt;
    851             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    852             m_parent->signalAPIResult(&result);
    853         }
    854         break;
    855     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
    856         {
    857             rc = m_parent->cancelAutoFocus();
    858             result.status = rc;
    859             result.request_api = evt;
    860             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    861             m_parent->signalAPIResult(&result);
    862         }
    863         break;
    864     case QCAMERA_SM_EVT_SEND_COMMAND:
    865         {
    866             qcamera_sm_evt_command_payload_t *cmd_payload =
    867                 (qcamera_sm_evt_command_payload_t *)payload;
    868             rc = m_parent->sendCommand(cmd_payload->cmd,
    869                                        cmd_payload->arg1,
    870                                        cmd_payload->arg2);
    871             result.status = rc;
    872             result.request_api = evt;
    873             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    874             m_parent->signalAPIResult(&result);
    875         }
    876         break;
    877     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
    878         {
    879             int32_t faceID = 0;
    880             qcamera_sm_evt_reg_face_payload_t *reg_payload =
    881                 (qcamera_sm_evt_reg_face_payload_t *)payload;
    882             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
    883                                              reg_payload->config,
    884                                              faceID);
    885             result.status = rc;
    886             result.request_api = evt;
    887             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
    888             result.handle = faceID;
    889             m_parent->signalAPIResult(&result);
    890         }
    891         break;
    892     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
    893     case QCAMERA_SM_EVT_START_RECORDING:
    894     case QCAMERA_SM_EVT_STOP_RECORDING:
    895     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
    896     case QCAMERA_SM_EVT_TAKE_PICTURE:
    897     case QCAMERA_SM_EVT_CANCEL_PICTURE:
    898     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
    899     case QCAMERA_SM_EVT_RELEASE:
    900         {
    901             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    902             rc = INVALID_OPERATION;
    903             result.status = rc;
    904             result.request_api = evt;
    905             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    906             m_parent->signalAPIResult(&result);
    907         }
    908         break;
    909     case QCAMERA_SM_EVT_EVT_NOTIFY:
    910         {
    911             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
    912             switch (cam_evt->server_event_type) {
    913             case CAM_EVENT_TYPE_DAEMON_DIED:
    914                 {
    915                     //close the camera backend
    916                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
    917                     if (handle && handle->ops) {
    918                         handle->ops->error_close_camera(handle->camera_handle);
    919                     } else {
    920                         ALOGE("%s: Could not close because the handle or ops is NULL",
    921                                 __func__);
    922                     }
    923                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
    924                                             CAMERA_ERROR_SERVER_DIED,
    925                                             0);
    926                 }
    927                 break;
    928             default:
    929                 ALOGE("%s: Invalid internal event %d in state(%d)",
    930                             __func__, cam_evt->server_event_type, m_state);
    931                 break;
    932             }
    933         }
    934         break;
    935     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
    936         {
    937             // No ops, but need to notify
    938             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    939             result.status = rc;
    940             result.request_api = evt;
    941             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
    942             m_parent->signalEvtResult(&result);
    943         }
    944        break;
    945     case QCAMERA_SM_EVT_EVT_INTERNAL:
    946        {
    947            qcamera_sm_internal_evt_payload_t *internal_evt =
    948                    (qcamera_sm_internal_evt_payload_t *)payload;
    949            switch (internal_evt->evt_type) {
    950            case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
    951                rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data);
    952                break;
    953            default:
    954                ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    955                break;
    956            }
    957        }
    958        break;
    959     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
    960     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
    961     default:
    962         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
    963         break;
    964     }
    965 
    966     return rc;
    967 }
    968 
    969 /*===========================================================================
    970  * FUNCTION   : procEvtPreviewingState
    971  *
    972  * DESCRIPTION: finite state machine function to handle event in state of
    973  *              QCAMERA_SM_STATE_PREVIEWING.
    974  *
    975  * PARAMETERS :
    976  *   @evt      : event to be processed
    977  *   @payload  : event payload. Can be NULL if not needed.
    978  *
    979  * RETURN     : int32_t type of status
    980  *              NO_ERROR  -- success
    981  *              none-zero failure code
    982  *==========================================================================*/
    983 int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
    984                                                     void *payload)
    985 {
    986     int32_t rc = NO_ERROR;
    987     qcamera_api_result_t result;
    988     memset(&result, 0, sizeof(qcamera_api_result_t));
    989 
    990     ALOGV("%s: event (%d)", __func__, evt);
    991     switch (evt) {
    992     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
    993         {
    994             // Error setting preview window during previewing
    995             ALOGE("Error!! cannot set preview window when preview is running");
    996             rc = INVALID_OPERATION;
    997             result.status = rc;
    998             result.request_api = evt;
    999             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1000             m_parent->signalAPIResult(&result);
   1001         }
   1002         break;
   1003     case QCAMERA_SM_EVT_SET_CALLBACKS:
   1004         {
   1005             qcamera_sm_evt_setcb_payload_t *setcbs =
   1006                 (qcamera_sm_evt_setcb_payload_t *)payload;
   1007             rc = m_parent->setCallBacks(setcbs->notify_cb,
   1008                                         setcbs->data_cb,
   1009                                         setcbs->data_cb_timestamp,
   1010                                         setcbs->get_memory,
   1011                                         setcbs->user);
   1012             result.status = rc;
   1013             result.request_api = evt;
   1014             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1015             m_parent->signalAPIResult(&result);
   1016         }
   1017         break;
   1018     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
   1019         {
   1020             int32_t enable_msgs = *((int32_t *)payload);
   1021             if (m_bDelayPreviewMsgs &&
   1022                     (enable_msgs & CAMERA_MSG_PREVIEW_FRAME)) {
   1023                 enable_msgs &= ~CAMERA_MSG_PREVIEW_FRAME;
   1024                 m_DelayedMsgs = CAMERA_MSG_PREVIEW_FRAME;
   1025             }
   1026             rc = m_parent->enableMsgType(enable_msgs);
   1027             result.status = rc;
   1028             result.request_api = evt;
   1029             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1030             m_parent->signalAPIResult(&result);
   1031         }
   1032         break;
   1033     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
   1034         {
   1035             int32_t disable_msgs = *((int32_t *)payload);
   1036             if (m_bDelayPreviewMsgs && m_DelayedMsgs) {
   1037                 m_DelayedMsgs &= ~disable_msgs;
   1038                 if (0 == m_DelayedMsgs) {
   1039                     m_bDelayPreviewMsgs = false;
   1040                 }
   1041             }
   1042             rc = m_parent->disableMsgType(disable_msgs);
   1043             result.status = rc;
   1044             result.request_api = evt;
   1045             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1046             m_parent->signalAPIResult(&result);
   1047         }
   1048         break;
   1049     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
   1050         {
   1051             int32_t msgs = *((int32_t *)payload);
   1052             int enabled = m_parent->msgTypeEnabled(msgs);
   1053             if (m_bDelayPreviewMsgs && m_DelayedMsgs) {
   1054                 enabled |= (msgs & m_DelayedMsgs);
   1055             }
   1056             result.status = rc;
   1057             result.request_api = evt;
   1058             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   1059             result.enabled = enabled;
   1060             m_parent->signalAPIResult(&result);
   1061         }
   1062         break;
   1063     case QCAMERA_SM_EVT_SET_PARAMS:
   1064         {
   1065             bool needRestart = false;
   1066             rc = m_parent->updateParameters((char*)payload, needRestart);
   1067             if (rc == NO_ERROR) {
   1068                 if (needRestart) {
   1069                     // need restart preview for parameters to take effect
   1070                     // stop preview
   1071                     m_parent->stopPreview();
   1072                     // Clear memory pools
   1073                     m_parent->m_memoryPool.clear();
   1074                     // commit parameter changes to server
   1075                     m_parent->commitParameterChanges();
   1076                     // start preview again
   1077                     rc = m_parent->preparePreview();
   1078                     if (rc == NO_ERROR) {
   1079                         applyDelayedMsgs();
   1080                         rc = m_parent->startPreview();
   1081                         if (rc != NO_ERROR) {
   1082                             m_parent->unpreparePreview();
   1083                         }
   1084                     }
   1085                     if (rc != NO_ERROR) {
   1086                         m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   1087                     }
   1088                 } else {
   1089                     rc = m_parent->commitParameterChanges();
   1090                 }
   1091             }
   1092             result.status = rc;
   1093             result.request_api = evt;
   1094             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1095             m_parent->signalAPIResult(&result);
   1096         }
   1097         break;
   1098     case QCAMERA_SM_EVT_GET_PARAMS:
   1099         {
   1100             result.params = m_parent->getParameters();
   1101             rc = NO_ERROR;
   1102             result.status = rc;
   1103             result.request_api = evt;
   1104             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
   1105             m_parent->signalAPIResult(&result);
   1106         }
   1107         break;
   1108     case QCAMERA_SM_EVT_PUT_PARAMS:
   1109         {
   1110             rc = m_parent->putParameters((char*)payload);
   1111             result.status = rc;
   1112             result.request_api = evt;
   1113             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1114             m_parent->signalAPIResult(&result);
   1115         }
   1116         break;
   1117     case QCAMERA_SM_EVT_START_PREVIEW:
   1118     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
   1119         {
   1120             // no ops here
   1121             CDBG_HIGH("%s: Already in previewing, no ops here to start preview", __func__);
   1122             applyDelayedMsgs();
   1123             rc = NO_ERROR;
   1124             result.status = rc;
   1125             result.request_api = evt;
   1126             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1127             m_parent->signalAPIResult(&result);
   1128         }
   1129         break;
   1130     case QCAMERA_SM_EVT_STOP_PREVIEW:
   1131         {
   1132             rc = m_parent->stopPreview();
   1133             applyDelayedMsgs();
   1134             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   1135             result.status = rc;
   1136             result.request_api = evt;
   1137             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1138             m_parent->signalAPIResult(&result);
   1139         }
   1140         break;
   1141     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
   1142         {
   1143             applyDelayedMsgs();
   1144             rc = NO_ERROR;
   1145             result.status = rc;
   1146             result.request_api = evt;
   1147             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   1148             result.enabled = 1;
   1149             m_parent->signalAPIResult(&result);
   1150         }
   1151         break;
   1152     case QCAMERA_SM_EVT_RECORDING_ENABLED:
   1153         {
   1154             rc = NO_ERROR;
   1155             result.status = rc;
   1156             result.request_api = evt;
   1157             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   1158             result.enabled = 0;
   1159             m_parent->signalAPIResult(&result);
   1160         }
   1161         break;
   1162     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
   1163         {
   1164             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
   1165             result.status = rc;
   1166             result.request_api = evt;
   1167             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1168             m_parent->signalAPIResult(&result);
   1169         }
   1170         break;
   1171     case QCAMERA_SM_EVT_DUMP:
   1172         {
   1173             rc = m_parent->dump(*((int *)payload));
   1174             result.status = rc;
   1175             result.request_api = evt;
   1176             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1177             m_parent->signalAPIResult(&result);
   1178         }
   1179         break;
   1180     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
   1181         {
   1182             rc = m_parent->autoFocus();
   1183             result.status = rc;
   1184             result.request_api = evt;
   1185             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1186             m_parent->signalAPIResult(&result);
   1187         }
   1188         break;
   1189     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
   1190         {
   1191             rc = m_parent->cancelAutoFocus();
   1192             result.status = rc;
   1193             result.request_api = evt;
   1194             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1195             m_parent->signalAPIResult(&result);
   1196         }
   1197         break;
   1198     case QCAMERA_SM_EVT_START_RECORDING:
   1199         {
   1200             rc = m_parent->startRecording();
   1201             if (rc == NO_ERROR) {
   1202                 // move state to recording state
   1203                 m_state = QCAMERA_SM_STATE_RECORDING;
   1204                 applyDelayedMsgs();
   1205             }
   1206             result.status = rc;
   1207             result.request_api = evt;
   1208             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1209             m_parent->signalAPIResult(&result);
   1210         }
   1211         break;
   1212     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
   1213         {
   1214             rc = m_parent->prepareHardwareForSnapshot(FALSE);
   1215             if (rc == NO_ERROR) {
   1216                 // Do not signal API result in this case.
   1217                 // Need to wait for snapshot done in metadta.
   1218                 m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
   1219                 applyDelayedMsgs();
   1220             } else {
   1221                 // Do not change state in this case.
   1222                 ALOGE("%s: prepareHardwareForSnapshot failed %d",
   1223                     __func__, rc);
   1224 
   1225                 result.status = rc;
   1226                 result.request_api = evt;
   1227                 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1228                 m_parent->signalAPIResult(&result);
   1229             }
   1230         }
   1231         break;
   1232     case QCAMERA_SM_EVT_TAKE_PICTURE:
   1233        {
   1234 
   1235            ALOGV("%s: QCAMERA_SM_EVT_TAKE_PICTURE ", __func__);
   1236            if ( m_parent->mParameters.getRecordingHintValue() == false) {
   1237                if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
   1238                    m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
   1239                    m_bDelayPreviewMsgs = true;
   1240                    rc = m_parent->takePicture();
   1241                    if (rc != NO_ERROR) {
   1242                        // move state to previewing state
   1243                        m_state = QCAMERA_SM_STATE_PREVIEWING;
   1244                    }
   1245                    if (!(m_parent->isRetroPicture()) || (rc != NO_ERROR)) {
   1246                        ALOGD("%s: signal API result, m_state = %d",
   1247                              __func__, m_state);
   1248                        result.status = rc;
   1249                        result.request_api = evt;
   1250                        result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1251                        m_parent->signalAPIResult(&result);
   1252                    }
   1253                } else {
   1254                    m_state = QCAMERA_SM_STATE_PIC_TAKING;
   1255                    rc = m_parent->takePicture();
   1256                    if (rc != NO_ERROR) {
   1257                        // move state to preview stopped state
   1258                        m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   1259                    }
   1260 
   1261                    result.status = rc;
   1262                    result.request_api = evt;
   1263                    result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1264                    m_parent->signalAPIResult(&result);
   1265                }
   1266            } else {
   1267                m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
   1268                rc = m_parent->takeLiveSnapshot();
   1269                if (rc != NO_ERROR ) {
   1270                    m_state = QCAMERA_SM_STATE_PREVIEWING;
   1271                }
   1272                result.status = rc;
   1273                result.request_api = evt;
   1274                result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1275                m_parent->signalAPIResult(&result);
   1276            }
   1277         }
   1278         break;
   1279     case QCAMERA_SM_EVT_SEND_COMMAND:
   1280         {
   1281             qcamera_sm_evt_command_payload_t *cmd_payload =
   1282                 (qcamera_sm_evt_command_payload_t *)payload;
   1283             rc = m_parent->sendCommand(cmd_payload->cmd,
   1284                                        cmd_payload->arg1,
   1285                                        cmd_payload->arg2);
   1286 #ifndef VANILLA_HAL
   1287             if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
   1288                 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
   1289                     m_parent->stopPreview();
   1290                     // Clear memory pools
   1291                     m_parent->m_memoryPool.clear();
   1292                     // start preview again
   1293                     rc = m_parent->preparePreview();
   1294                     if (rc == NO_ERROR) {
   1295                         applyDelayedMsgs();
   1296                         rc = m_parent->startPreview();
   1297                         if (rc != NO_ERROR) {
   1298                             m_parent->unpreparePreview();
   1299                         }
   1300                     }
   1301                 }
   1302             }
   1303 #endif
   1304             result.status = rc;
   1305             result.request_api = evt;
   1306             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1307             m_parent->signalAPIResult(&result);
   1308         }
   1309         break;
   1310     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
   1311         {
   1312             int32_t faceID = 0;
   1313             qcamera_sm_evt_reg_face_payload_t *reg_payload =
   1314                 (qcamera_sm_evt_reg_face_payload_t *)payload;
   1315             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
   1316                                              reg_payload->config,
   1317                                              faceID);
   1318             result.status = rc;
   1319             result.request_api = evt;
   1320             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
   1321             result.handle = faceID;
   1322             m_parent->signalAPIResult(&result);
   1323         }
   1324         break;
   1325     case QCAMERA_SM_EVT_CANCEL_PICTURE:
   1326     case QCAMERA_SM_EVT_STOP_RECORDING:
   1327     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
   1328     case QCAMERA_SM_EVT_RELEASE:
   1329         {
   1330             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1331             rc = INVALID_OPERATION;
   1332             result.status = rc;
   1333             result.request_api = evt;
   1334             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1335             m_parent->signalAPIResult(&result);
   1336         }
   1337         break;
   1338     case QCAMERA_SM_EVT_EVT_INTERNAL:
   1339         {
   1340             qcamera_sm_internal_evt_payload_t *internal_evt =
   1341                 (qcamera_sm_internal_evt_payload_t *)payload;
   1342             switch (internal_evt->evt_type) {
   1343             case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
   1344                 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
   1345                 break;
   1346             case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
   1347                 break;
   1348             case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
   1349                 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
   1350                 break;
   1351             case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
   1352                 rc = m_parent->processHistogramStats(internal_evt->stats_data);
   1353                 break;
   1354             case QCAMERA_INTERNAL_EVT_CROP_INFO:
   1355                 rc = m_parent->processZoomEvent(internal_evt->crop_data);
   1356                 break;
   1357             case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
   1358                 rc = m_parent->processASDUpdate(internal_evt->asd_data);
   1359                 break;
   1360             case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
   1361                 rc = m_parent->mParameters.updateFlashMode(internal_evt->led_data);
   1362                 break;
   1363             case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
   1364                 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
   1365                 break;
   1366             case QCAMERA_INTERNAL_EVT_AE_UPDATE:
   1367                 rc = m_parent->processAEInfo(internal_evt->ae_data);
   1368                 break;
   1369             case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
   1370                 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
   1371                 break;
   1372             case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
   1373                 rc = m_parent->processHDRData(internal_evt->hdr_data);
   1374                 break;
   1375             case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
   1376                 rc = m_parent->processRetroAECUnlock();
   1377                 break;
   1378             case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
   1379                 rc = m_parent->processZSLCaptureDone();
   1380                 break;
   1381             default:
   1382                 ALOGE("%s: Invalid internal event %d in state(%d)",
   1383                             __func__, internal_evt->evt_type, m_state);
   1384                 break;
   1385             }
   1386         }
   1387         break;
   1388     case QCAMERA_SM_EVT_EVT_NOTIFY:
   1389         {
   1390             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
   1391             switch (cam_evt->server_event_type) {
   1392             case CAM_EVENT_TYPE_DAEMON_DIED:
   1393                 {
   1394                     //close the camera backend
   1395                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
   1396                     if (handle && handle->ops) {
   1397                         handle->ops->error_close_camera(handle->camera_handle);
   1398                     } else {
   1399                         ALOGE("%s: Could not close because the handle or ops is NULL",
   1400                                 __func__);
   1401                     }
   1402                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
   1403                                             CAMERA_ERROR_SERVER_DIED,
   1404                                             0);
   1405                 }
   1406                 break;
   1407             default:
   1408                 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
   1409                       __func__, cam_evt->server_event_type);
   1410                 break;
   1411             }
   1412         }
   1413         break;
   1414     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
   1415         {
   1416             rc = m_parent->updateThermalLevel(payload);
   1417         }
   1418         break;
   1419     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
   1420         {
   1421             // No ops, but need to notify
   1422             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1423             result.status = rc;
   1424             result.request_api = evt;
   1425             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1426             m_parent->signalEvtResult(&result);
   1427         }
   1428        break;
   1429     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
   1430     default:
   1431         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1432         break;
   1433     }
   1434 
   1435     return rc;
   1436 }
   1437 
   1438 /*===========================================================================
   1439  * FUNCTION   : procEvtPrepareSnapshotState
   1440  *
   1441  * DESCRIPTION: finite state machine function to handle event in state of
   1442  *              QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
   1443  *
   1444  * PARAMETERS :
   1445  *   @evt      : event to be processed
   1446  *   @payload  : event payload. Can be NULL if not needed.
   1447  *
   1448  * RETURN     : int32_t type of status
   1449  *              NO_ERROR  -- success
   1450  *              none-zero failure code
   1451  *==========================================================================*/
   1452 int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
   1453                                                     void *payload)
   1454 {
   1455     int32_t rc = NO_ERROR;
   1456     qcamera_api_result_t result;
   1457     memset(&result, 0, sizeof(qcamera_api_result_t));
   1458 
   1459     ALOGV("%s: event (%d)", __func__, evt);
   1460     switch (evt) {
   1461     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
   1462     case QCAMERA_SM_EVT_SET_CALLBACKS:
   1463     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
   1464     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
   1465     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
   1466     case QCAMERA_SM_EVT_SET_PARAMS:
   1467     case QCAMERA_SM_EVT_GET_PARAMS:
   1468     case QCAMERA_SM_EVT_PUT_PARAMS:
   1469     case QCAMERA_SM_EVT_START_PREVIEW:
   1470     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
   1471     case QCAMERA_SM_EVT_STOP_PREVIEW:
   1472     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
   1473     case QCAMERA_SM_EVT_RECORDING_ENABLED:
   1474     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
   1475     case QCAMERA_SM_EVT_DUMP:
   1476     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
   1477     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
   1478     case QCAMERA_SM_EVT_START_RECORDING:
   1479     case QCAMERA_SM_EVT_TAKE_PICTURE:
   1480     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
   1481     case QCAMERA_SM_EVT_SEND_COMMAND:
   1482     case QCAMERA_SM_EVT_CANCEL_PICTURE:
   1483     case QCAMERA_SM_EVT_STOP_RECORDING:
   1484     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
   1485     case QCAMERA_SM_EVT_RELEASE:
   1486         {
   1487             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1488             rc = INVALID_OPERATION;
   1489             result.status = rc;
   1490             result.request_api = evt;
   1491             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1492             m_parent->signalAPIResult(&result);
   1493         }
   1494         break;
   1495     case QCAMERA_SM_EVT_EVT_INTERNAL:
   1496         {
   1497             qcamera_sm_internal_evt_payload_t *internal_evt =
   1498                 (qcamera_sm_internal_evt_payload_t *)payload;
   1499             switch (internal_evt->evt_type) {
   1500             case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
   1501                 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
   1502                 break;
   1503             case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
   1504                 CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
   1505                     __func__);
   1506                 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
   1507                 m_state = QCAMERA_SM_STATE_PREVIEWING;
   1508 
   1509                 result.status = NO_ERROR;
   1510                 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
   1511                 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1512                 m_parent->signalAPIResult(&result);
   1513                 break;
   1514             case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
   1515                 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
   1516                 break;
   1517             case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
   1518                 rc = m_parent->processHistogramStats(internal_evt->stats_data);
   1519                 break;
   1520             case QCAMERA_INTERNAL_EVT_CROP_INFO:
   1521                 rc = m_parent->processZoomEvent(internal_evt->crop_data);
   1522                 break;
   1523             case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
   1524                 rc = m_parent->processASDUpdate(internal_evt->asd_data);
   1525                 break;
   1526             case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
   1527                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1528                 break;
   1529             case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
   1530                 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
   1531                 break;
   1532             case QCAMERA_INTERNAL_EVT_AE_UPDATE:
   1533                 rc = m_parent->processAEInfo(internal_evt->ae_data);
   1534                 break;
   1535             case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
   1536                 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
   1537                 break;
   1538             case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
   1539                 rc = m_parent->processHDRData(internal_evt->hdr_data);
   1540                 break;
   1541             case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
   1542                 rc = m_parent->processRetroAECUnlock();
   1543                 break;
   1544             case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
   1545                 rc = m_parent->processZSLCaptureDone();
   1546                 break;
   1547             default:
   1548                 ALOGE("%s: Invalid internal event %d in state(%d)",
   1549                             __func__, internal_evt->evt_type, m_state);
   1550                 break;
   1551             }
   1552         }
   1553         break;
   1554     case QCAMERA_SM_EVT_EVT_NOTIFY:
   1555         {
   1556             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
   1557             switch (cam_evt->server_event_type) {
   1558             case CAM_EVENT_TYPE_DAEMON_DIED:
   1559                 {
   1560                     //close the camera backend
   1561                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
   1562                     if (handle && handle->ops) {
   1563                         handle->ops->error_close_camera(handle->camera_handle);
   1564                     } else {
   1565                         ALOGE("%s: Could not close because the handle or ops is NULL",
   1566                                 __func__);
   1567                     }
   1568                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
   1569                                             CAMERA_ERROR_SERVER_DIED,
   1570                                             0);
   1571                 }
   1572                 break;
   1573             default:
   1574                 ALOGE("%s: Invalid internal event %d in state(%d)",
   1575                             __func__, cam_evt->server_event_type, m_state);
   1576                 break;
   1577             }
   1578         }
   1579         break;
   1580     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
   1581         {
   1582             // No ops, but need to notify
   1583             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1584             result.status = rc;
   1585             result.request_api = evt;
   1586             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1587             m_parent->signalEvtResult(&result);
   1588         }
   1589        break;
   1590     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
   1591         {
   1592             rc = m_parent->updateThermalLevel(payload);
   1593         }
   1594         break;
   1595     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
   1596     default:
   1597         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1598         break;
   1599     }
   1600 
   1601     return rc;
   1602 }
   1603 
   1604 /*===========================================================================
   1605  * FUNCTION   : procEvtPicTakingState
   1606  *
   1607  * DESCRIPTION: finite state machine function to handle event in state of
   1608  *              QCAMERA_SM_STATE_PIC_TAKING.
   1609  *
   1610  * PARAMETERS :
   1611  *   @evt      : event to be processed
   1612  *   @payload  : event payload. Can be NULL if not needed.
   1613  *
   1614  * RETURN     : int32_t type of status
   1615  *              NO_ERROR  -- success
   1616  *              none-zero failure code
   1617  *==========================================================================*/
   1618 int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
   1619                                                    void *payload)
   1620 {
   1621     int32_t rc = NO_ERROR;
   1622     qcamera_api_result_t result;
   1623     memset(&result, 0, sizeof(qcamera_api_result_t));
   1624 
   1625     ALOGV("%s: event (%d)", __func__, evt);
   1626     switch (evt) {
   1627     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
   1628         {
   1629             // Error setting preview window during previewing
   1630             ALOGE("Error!! cannot set preview window when preview is running");
   1631             rc = INVALID_OPERATION;
   1632             result.status = rc;
   1633             result.request_api = evt;
   1634             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1635             m_parent->signalAPIResult(&result);
   1636         }
   1637         break;
   1638     case QCAMERA_SM_EVT_SET_CALLBACKS:
   1639         {
   1640             qcamera_sm_evt_setcb_payload_t *setcbs =
   1641                 (qcamera_sm_evt_setcb_payload_t *)payload;
   1642             rc = m_parent->setCallBacks(setcbs->notify_cb,
   1643                                         setcbs->data_cb,
   1644                                         setcbs->data_cb_timestamp,
   1645                                         setcbs->get_memory,
   1646                                         setcbs->user);
   1647             result.status = rc;
   1648             result.request_api = evt;
   1649             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1650             m_parent->signalAPIResult(&result);
   1651         }
   1652         break;
   1653     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
   1654         {
   1655             rc = m_parent->enableMsgType(*((int32_t *)payload));
   1656             result.status = rc;
   1657             result.request_api = evt;
   1658             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1659             m_parent->signalAPIResult(&result);
   1660         }
   1661         break;
   1662     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
   1663         {
   1664             rc = m_parent->disableMsgType(*((int32_t *)payload));
   1665             result.status = rc;
   1666             result.request_api = evt;
   1667             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1668             m_parent->signalAPIResult(&result);
   1669         }
   1670         break;
   1671     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
   1672         {
   1673             int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
   1674             result.status = rc;
   1675             result.request_api = evt;
   1676             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   1677             result.enabled = enabled;
   1678             m_parent->signalAPIResult(&result);
   1679         }
   1680         break;
   1681     case QCAMERA_SM_EVT_SET_PARAMS:
   1682         {
   1683             bool needRestart = false;
   1684             rc = m_parent->updateParameters((char*)payload, needRestart);
   1685             if (rc == NO_ERROR) {
   1686                 rc = m_parent->commitParameterChanges();
   1687             }
   1688             result.status = rc;
   1689             result.request_api = evt;
   1690             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1691             m_parent->signalAPIResult(&result);
   1692         }
   1693         break;
   1694     case QCAMERA_SM_EVT_GET_PARAMS:
   1695         {
   1696             result.params = m_parent->getParameters();
   1697             rc = NO_ERROR;
   1698             result.status = rc;
   1699             result.request_api = evt;
   1700             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
   1701             m_parent->signalAPIResult(&result);
   1702         }
   1703         break;
   1704     case QCAMERA_SM_EVT_PUT_PARAMS:
   1705         {
   1706             rc = m_parent->putParameters((char*)payload);
   1707             result.status = rc;
   1708             result.request_api = evt;
   1709             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1710             m_parent->signalAPIResult(&result);
   1711         }
   1712         break;
   1713     case QCAMERA_SM_EVT_STOP_PREVIEW:
   1714         {
   1715             // cancel picture first
   1716             rc = m_parent->cancelPicture();
   1717             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   1718 
   1719             result.status = rc;
   1720             result.request_api = evt;
   1721             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1722             m_parent->signalAPIResult(&result);
   1723         }
   1724         break;
   1725     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
   1726         {
   1727             rc = NO_ERROR;
   1728             result.status = rc;
   1729             result.request_api = evt;
   1730             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   1731             result.enabled = 0;
   1732             m_parent->signalAPIResult(&result);
   1733         }
   1734         break;
   1735     case QCAMERA_SM_EVT_RECORDING_ENABLED:
   1736         {
   1737             rc = NO_ERROR;
   1738             result.status = rc;
   1739             result.request_api = evt;
   1740             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   1741             result.enabled = 0;
   1742             m_parent->signalAPIResult(&result);
   1743         }
   1744         break;
   1745     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
   1746         {
   1747             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
   1748             result.status = rc;
   1749             result.request_api = evt;
   1750             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1751             m_parent->signalAPIResult(&result);
   1752         }
   1753         break;
   1754     case QCAMERA_SM_EVT_DUMP:
   1755         {
   1756             rc = m_parent->dump(*((int *)payload));
   1757             result.status = rc;
   1758             result.request_api = evt;
   1759             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1760             m_parent->signalAPIResult(&result);
   1761         }
   1762         break;
   1763     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
   1764         {
   1765             rc = m_parent->autoFocus();
   1766             result.status = rc;
   1767             result.request_api = evt;
   1768             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1769             m_parent->signalAPIResult(&result);
   1770         }
   1771         break;
   1772     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
   1773         {
   1774             rc = m_parent->cancelAutoFocus();
   1775             result.status = rc;
   1776             result.request_api = evt;
   1777             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1778             m_parent->signalAPIResult(&result);
   1779         }
   1780         break;
   1781     case QCAMERA_SM_EVT_SEND_COMMAND:
   1782         {
   1783             qcamera_sm_evt_command_payload_t *cmd_payload =
   1784                 (qcamera_sm_evt_command_payload_t *)payload;
   1785             rc = m_parent->sendCommand(cmd_payload->cmd,
   1786                                        cmd_payload->arg1,
   1787                                        cmd_payload->arg2);
   1788 #ifndef VANILLA_HAL
   1789             if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
   1790                 // move state to previewing state
   1791                 m_state = QCAMERA_SM_STATE_PREVIEWING;
   1792             }
   1793 #endif
   1794             result.status = rc;
   1795             result.request_api = evt;
   1796             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1797             m_parent->signalAPIResult(&result);
   1798         }
   1799         break;
   1800     case QCAMERA_SM_EVT_CANCEL_PICTURE:
   1801         {
   1802             rc = m_parent->cancelPicture();
   1803             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   1804             result.status = rc;
   1805             result.request_api = evt;
   1806             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1807             m_parent->signalAPIResult(&result);
   1808         }
   1809         break;
   1810     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
   1811         {
   1812             int32_t faceID = 0;
   1813             qcamera_sm_evt_reg_face_payload_t *reg_payload =
   1814                 (qcamera_sm_evt_reg_face_payload_t *)payload;
   1815             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
   1816                                              reg_payload->config,
   1817                                              faceID);
   1818             result.status = rc;
   1819             result.request_api = evt;
   1820             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
   1821             result.handle = faceID;
   1822             m_parent->signalAPIResult(&result);
   1823         }
   1824         break;
   1825     case QCAMERA_SM_EVT_TAKE_PICTURE:
   1826         {
   1827            if ( m_parent->isLongshotEnabled() ) {
   1828                rc = m_parent->longShot();
   1829             } else {
   1830                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1831                 rc = INVALID_OPERATION;
   1832             }
   1833 
   1834             result.status = rc;
   1835             result.request_api = evt;
   1836             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1837             m_parent->signalAPIResult(&result);
   1838         }
   1839         break;
   1840     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
   1841     case QCAMERA_SM_EVT_START_RECORDING:
   1842     case QCAMERA_SM_EVT_STOP_RECORDING:
   1843     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
   1844     case QCAMERA_SM_EVT_START_PREVIEW:
   1845     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
   1846     case QCAMERA_SM_EVT_RELEASE:
   1847         {
   1848             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1849             rc = INVALID_OPERATION;
   1850             result.status = rc;
   1851             result.request_api = evt;
   1852             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1853             m_parent->signalAPIResult(&result);
   1854         }
   1855         break;
   1856     case QCAMERA_SM_EVT_EVT_INTERNAL:
   1857         {
   1858             qcamera_sm_internal_evt_payload_t *internal_evt =
   1859                 (qcamera_sm_internal_evt_payload_t *)payload;
   1860             switch (internal_evt->evt_type) {
   1861             case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
   1862                 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
   1863                 break;
   1864             case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
   1865                 break;
   1866             case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
   1867                 break;
   1868             case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
   1869                 break;
   1870             case QCAMERA_INTERNAL_EVT_CROP_INFO:
   1871                 rc = m_parent->processZoomEvent(internal_evt->crop_data);
   1872                 break;
   1873             case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
   1874                 rc = m_parent->processASDUpdate(internal_evt->asd_data);
   1875                 break;
   1876             case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
   1877                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1878                 break;
   1879             case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
   1880                 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
   1881                 break;
   1882             case QCAMERA_INTERNAL_EVT_AE_UPDATE:
   1883                 rc = m_parent->processAEInfo(internal_evt->ae_data);
   1884                 break;
   1885             case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
   1886                 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
   1887                 break;
   1888             case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
   1889                 rc = m_parent->processHDRData(internal_evt->hdr_data);
   1890                 break;
   1891             case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
   1892                 rc = m_parent->processRetroAECUnlock();
   1893                 break;
   1894             case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
   1895                 rc = m_parent->processZSLCaptureDone();
   1896                 break;
   1897             default:
   1898                 break;
   1899             }
   1900         }
   1901         break;
   1902     case QCAMERA_SM_EVT_EVT_NOTIFY:
   1903         {
   1904             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
   1905             switch (cam_evt->server_event_type) {
   1906             case CAM_EVENT_TYPE_DAEMON_DIED:
   1907                 {
   1908                     // Send internal events to release statemachine
   1909                     // thread to process CAMERA_ERROR_SERVER_DIED error
   1910                     result.status = rc;
   1911                     result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
   1912                     result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1913                     m_parent->signalAPIResult(&result);
   1914 
   1915                     result.status = rc;
   1916                     result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE;
   1917                     result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1918                     m_parent->signalAPIResult(&result);
   1919 
   1920                     //close the camera backend
   1921                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
   1922                     if (handle && handle->ops) {
   1923                         handle->ops->error_close_camera(handle->camera_handle);
   1924                     } else {
   1925                         ALOGE("%s: Could not close because the handle or ops is NULL",
   1926                                 __func__);
   1927                     }
   1928                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
   1929                                             CAMERA_ERROR_SERVER_DIED,
   1930                                             0);
   1931                 }
   1932                 break;
   1933             default:
   1934                 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
   1935                       __func__, cam_evt->server_event_type);
   1936                 break;
   1937             }
   1938         }
   1939         break;
   1940     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
   1941         {
   1942             qcamera_jpeg_evt_payload_t *jpeg_job =
   1943                 (qcamera_jpeg_evt_payload_t *)payload;
   1944             rc = m_parent->processJpegNotify(jpeg_job);
   1945         }
   1946         break;
   1947     case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
   1948         {
   1949             bool restartPreview = m_parent->isPreviewRestartEnabled();
   1950             rc = m_parent->stopCaptureChannel(restartPreview);
   1951 
   1952             if (restartPreview && (NO_ERROR == rc)) {
   1953                 rc = m_parent->preparePreview();
   1954                 if (NO_ERROR == rc) {
   1955                     m_parent->m_bPreviewStarted = true;
   1956                     applyDelayedMsgs();
   1957                     rc = m_parent->startPreview();
   1958                 }
   1959             }
   1960 
   1961             result.status = rc;
   1962             result.request_api = evt;
   1963             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1964             m_parent->signalAPIResult(&result);
   1965         }
   1966         break;
   1967     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
   1968         {
   1969             rc = m_parent->cancelPicture();
   1970 
   1971             bool restartPreview = m_parent->isPreviewRestartEnabled();
   1972             if (restartPreview) {
   1973                 m_state = QCAMERA_SM_STATE_PREVIEWING;
   1974             } else {
   1975                 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   1976             }
   1977 
   1978             result.status = rc;
   1979             result.request_api = evt;
   1980             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   1981             m_parent->signalEvtResult(&result);
   1982         }
   1983         break;
   1984     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
   1985         {
   1986             rc = m_parent->updateThermalLevel(payload);
   1987         }
   1988         break;
   1989     default:
   1990         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   1991         break;
   1992     }
   1993 
   1994     return rc;
   1995 }
   1996 
   1997 /*===========================================================================
   1998  * FUNCTION   : procEvtRecordingState
   1999  *
   2000  * DESCRIPTION: finite state machine function to handle event in state of
   2001  *              QCAMERA_SM_STATE_RECORDING.
   2002  *
   2003  * PARAMETERS :
   2004  *   @evt      : event to be processed
   2005  *   @payload  : event payload. Can be NULL if not needed.
   2006  *
   2007  * RETURN     : int32_t type of status
   2008  *              NO_ERROR  -- success
   2009  *              none-zero failure code
   2010  *==========================================================================*/
   2011 int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
   2012                                                    void *payload)
   2013 {
   2014     int32_t rc = NO_ERROR;
   2015     qcamera_api_result_t result;
   2016     memset(&result, 0, sizeof(qcamera_api_result_t));
   2017 
   2018     ALOGV("%s: event (%d)", __func__, evt);
   2019     switch (evt) {
   2020     case QCAMERA_SM_EVT_START_PREVIEW:
   2021     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
   2022         {
   2023             // WA: CTS test VideoSnapshot will try to
   2024             //     start preview during video recording.
   2025             CDBG_HIGH("CTS video restart op");
   2026             rc = NO_ERROR;
   2027             result.status = rc;
   2028             result.request_api = evt;
   2029             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2030             m_parent->signalAPIResult(&result);
   2031         }
   2032         break;
   2033     case QCAMERA_SM_EVT_SET_CALLBACKS:
   2034         {
   2035             qcamera_sm_evt_setcb_payload_t *setcbs =
   2036                 (qcamera_sm_evt_setcb_payload_t *)payload;
   2037             rc = m_parent->setCallBacks(setcbs->notify_cb,
   2038                                         setcbs->data_cb,
   2039                                         setcbs->data_cb_timestamp,
   2040                                         setcbs->get_memory,
   2041                                         setcbs->user);
   2042             result.status = rc;
   2043             result.request_api = evt;
   2044             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2045             m_parent->signalAPIResult(&result);
   2046         }
   2047         break;
   2048     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
   2049         {
   2050             rc = m_parent->enableMsgType(*((int32_t *)payload));
   2051             result.status = rc;
   2052             result.request_api = evt;
   2053             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2054             m_parent->signalAPIResult(&result);
   2055         }
   2056         break;
   2057     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
   2058         {
   2059             rc = m_parent->disableMsgType(*((int32_t *)payload));
   2060             result.status = rc;
   2061             result.request_api = evt;
   2062             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2063             m_parent->signalAPIResult(&result);
   2064         }
   2065         break;
   2066     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
   2067         {
   2068             int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
   2069             result.status = rc;
   2070             result.request_api = evt;
   2071             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2072             result.enabled = enabled;
   2073             m_parent->signalAPIResult(&result);
   2074         }
   2075         break;
   2076     case QCAMERA_SM_EVT_SET_PARAMS:
   2077         {
   2078             bool needRestart = false;
   2079             rc = m_parent->updateParameters((char*)payload, needRestart);
   2080             if (rc == NO_ERROR) {
   2081                 if (needRestart) {
   2082                     // cannot set parameters that requires restart during recording
   2083                     ALOGE("%s: Error!! cannot set parameters that requires restart during recording",
   2084                           __func__);
   2085                     rc = BAD_VALUE;
   2086                 } else {
   2087                     rc = m_parent->commitParameterChanges();
   2088                 }
   2089             }
   2090             result.status = rc;
   2091             result.request_api = evt;
   2092             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2093             m_parent->signalAPIResult(&result);
   2094         }
   2095         break;
   2096     case QCAMERA_SM_EVT_GET_PARAMS:
   2097         {
   2098             result.params = m_parent->getParameters();
   2099             rc = NO_ERROR;
   2100             result.status = rc;
   2101             result.request_api = evt;
   2102             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
   2103             m_parent->signalAPIResult(&result);
   2104         }
   2105         break;
   2106     case QCAMERA_SM_EVT_PUT_PARAMS:
   2107         {
   2108             rc = m_parent->putParameters((char*)payload);
   2109             result.status = rc;
   2110             result.request_api = evt;
   2111             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2112             m_parent->signalAPIResult(&result);
   2113         }
   2114         break;
   2115     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
   2116         {
   2117             rc = NO_ERROR;
   2118             result.status = rc;
   2119             result.request_api = evt;
   2120             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2121             result.enabled = 0;
   2122             m_parent->signalAPIResult(&result);
   2123         }
   2124         break;
   2125     case QCAMERA_SM_EVT_RECORDING_ENABLED:
   2126         {
   2127             rc = NO_ERROR;
   2128             result.status = rc;
   2129             result.request_api = evt;
   2130             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2131             result.enabled = 1;
   2132             m_parent->signalAPIResult(&result);
   2133         }
   2134         break;
   2135     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
   2136         {
   2137             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
   2138             result.status = rc;
   2139             result.request_api = evt;
   2140             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2141             m_parent->signalAPIResult(&result);
   2142         }
   2143         break;
   2144     case QCAMERA_SM_EVT_DUMP:
   2145         {
   2146             rc = m_parent->dump(*((int *)payload));
   2147             result.status = rc;
   2148             result.request_api = evt;
   2149             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2150             m_parent->signalAPIResult(&result);
   2151         }
   2152         break;
   2153     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
   2154         {
   2155             rc = m_parent->autoFocus();
   2156             result.status = rc;
   2157             result.request_api = evt;
   2158             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2159             m_parent->signalAPIResult(&result);
   2160         }
   2161         break;
   2162     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
   2163         {
   2164             rc = m_parent->cancelAutoFocus();
   2165             result.status = rc;
   2166             result.request_api = evt;
   2167             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2168             m_parent->signalAPIResult(&result);
   2169         }
   2170         break;
   2171     case QCAMERA_SM_EVT_SEND_COMMAND:
   2172         {
   2173             qcamera_sm_evt_command_payload_t *cmd_payload =
   2174                 (qcamera_sm_evt_command_payload_t *)payload;
   2175             rc = m_parent->sendCommand(cmd_payload->cmd,
   2176                                        cmd_payload->arg1,
   2177                                        cmd_payload->arg2);
   2178             result.status = rc;
   2179             result.request_api = evt;
   2180             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2181             m_parent->signalAPIResult(&result);
   2182         }
   2183         break;
   2184     case QCAMERA_SM_EVT_TAKE_PICTURE:
   2185         {
   2186             m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
   2187             rc = m_parent->takeLiveSnapshot();
   2188             if (rc != NO_ERROR) {
   2189                 m_state = QCAMERA_SM_STATE_RECORDING;
   2190             }
   2191             result.status = rc;
   2192             result.request_api = evt;
   2193             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2194             m_parent->signalAPIResult(&result);
   2195         }
   2196         break;
   2197     case QCAMERA_SM_EVT_START_RECORDING:
   2198         {
   2199             // no ops here
   2200             CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__);
   2201             rc = 0;
   2202             result.status = rc;
   2203             result.request_api = evt;
   2204             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2205             m_parent->signalAPIResult(&result);
   2206         }
   2207         break;
   2208     case QCAMERA_SM_EVT_STOP_RECORDING:
   2209         {
   2210             rc = m_parent->stopRecording();
   2211             m_state = QCAMERA_SM_STATE_PREVIEWING;
   2212             result.status = rc;
   2213             result.request_api = evt;
   2214             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2215             m_parent->signalAPIResult(&result);
   2216         }
   2217         break;
   2218     case QCAMERA_SM_EVT_STOP_PREVIEW:
   2219         {
   2220             rc = m_parent->stopRecording();
   2221             m_state = QCAMERA_SM_STATE_PREVIEWING;
   2222 
   2223             rc = m_parent->stopPreview();
   2224             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   2225 
   2226             result.status = rc;
   2227             result.request_api = evt;
   2228             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2229             m_parent->signalAPIResult(&result);
   2230         }
   2231         break;
   2232     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
   2233         {
   2234             rc = m_parent->releaseRecordingFrame((const void *)payload);
   2235             result.status = rc;
   2236             result.request_api = evt;
   2237             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2238             m_parent->signalAPIResult(&result);
   2239         }
   2240         break;
   2241     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
   2242         {
   2243             int32_t faceID = 0;
   2244             qcamera_sm_evt_reg_face_payload_t *reg_payload =
   2245                 (qcamera_sm_evt_reg_face_payload_t *)payload;
   2246             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
   2247                                              reg_payload->config,
   2248                                              faceID);
   2249             result.status = rc;
   2250             result.request_api = evt;
   2251             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
   2252             result.handle = faceID;
   2253             m_parent->signalAPIResult(&result);
   2254         }
   2255         break;
   2256     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
   2257         {
   2258             //In Video snapshot, prepare hardware is a no-op.
   2259             result.status = NO_ERROR;
   2260             result.request_api = evt;
   2261             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2262             m_parent->signalAPIResult(&result);
   2263         }
   2264         break;
   2265     case QCAMERA_SM_EVT_CANCEL_PICTURE:
   2266     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
   2267     case QCAMERA_SM_EVT_RELEASE:
   2268         {
   2269             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2270             rc = INVALID_OPERATION;
   2271             result.status = rc;
   2272             result.request_api = evt;
   2273             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2274             m_parent->signalAPIResult(&result);
   2275         }
   2276         break;
   2277     case QCAMERA_SM_EVT_EVT_INTERNAL:
   2278         {
   2279             qcamera_sm_internal_evt_payload_t *internal_evt =
   2280                 (qcamera_sm_internal_evt_payload_t *)payload;
   2281             switch (internal_evt->evt_type) {
   2282             case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
   2283                 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
   2284                 break;
   2285             case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
   2286                 break;
   2287             case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
   2288                 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
   2289                 break;
   2290             case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
   2291                 rc = m_parent->processHistogramStats(internal_evt->stats_data);
   2292                 break;
   2293             case QCAMERA_INTERNAL_EVT_CROP_INFO:
   2294                 rc = m_parent->processZoomEvent(internal_evt->crop_data);
   2295                 break;
   2296             case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
   2297                 rc = m_parent->processASDUpdate(internal_evt->asd_data);
   2298                 break;
   2299             case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
   2300                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2301                 break;
   2302             case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
   2303                 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
   2304                 break;
   2305             case QCAMERA_INTERNAL_EVT_AE_UPDATE:
   2306                 rc = m_parent->processAEInfo(internal_evt->ae_data);
   2307                 break;
   2308             case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
   2309                 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
   2310                 break;
   2311             case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
   2312                 rc = m_parent->processHDRData(internal_evt->hdr_data);
   2313                 break;
   2314             case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
   2315                 rc = m_parent->processRetroAECUnlock();
   2316                 break;
   2317             case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
   2318                 rc = m_parent->processZSLCaptureDone();
   2319                 break;
   2320             default:
   2321                 break;
   2322             }
   2323         }
   2324         break;
   2325     case QCAMERA_SM_EVT_EVT_NOTIFY:
   2326         {
   2327             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
   2328             switch (cam_evt->server_event_type) {
   2329             case CAM_EVENT_TYPE_DAEMON_DIED:
   2330                 {
   2331                     //close the camera backend
   2332                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
   2333                     if (handle && handle->ops) {
   2334                         handle->ops->error_close_camera(handle->camera_handle);
   2335                     } else {
   2336                         ALOGE("%s: Could not close because the handle or ops is NULL",
   2337                                 __func__);
   2338                     }
   2339                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
   2340                                             CAMERA_ERROR_SERVER_DIED,
   2341                                             0);
   2342                 }
   2343                 break;
   2344             default:
   2345                 ALOGE("%s: Invalid internal event %d in state(%d)",
   2346                             __func__, cam_evt->server_event_type, m_state);
   2347                 break;
   2348             }
   2349         }
   2350         break;
   2351     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
   2352         {
   2353             rc = m_parent->updateThermalLevel(payload);
   2354         }
   2355         break;
   2356     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
   2357         {
   2358             // No ops, but need to notify
   2359             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2360             result.status = rc;
   2361             result.request_api = evt;
   2362             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2363             m_parent->signalEvtResult(&result);
   2364         }
   2365        break;
   2366     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
   2367     default:
   2368         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2369         break;
   2370     }
   2371 
   2372     return rc;
   2373 }
   2374 
   2375 /*===========================================================================
   2376  * FUNCTION   : procEvtVideoPicTakingState
   2377  *
   2378  * DESCRIPTION: finite state machine function to handle event in state of
   2379  *              QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
   2380  *
   2381  * PARAMETERS :
   2382  *   @evt      : event to be processed
   2383  *   @payload  : event payload. Can be NULL if not needed.
   2384  *
   2385  * RETURN     : int32_t type of status
   2386  *              NO_ERROR  -- success
   2387  *              none-zero failure code
   2388  *==========================================================================*/
   2389 int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
   2390                                                         void *payload)
   2391 {
   2392     int32_t rc = NO_ERROR;
   2393     qcamera_api_result_t result;
   2394     memset(&result, 0, sizeof(qcamera_api_result_t));
   2395 
   2396     ALOGV("%s: event (%d)", __func__, evt);
   2397     switch (evt) {
   2398     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
   2399         {
   2400             // Error setting preview window during previewing
   2401             ALOGE("Error!! cannot set preview window when preview is running");
   2402             rc = INVALID_OPERATION;
   2403             result.status = rc;
   2404             result.request_api = evt;
   2405             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2406             m_parent->signalAPIResult(&result);
   2407         }
   2408         break;
   2409     case QCAMERA_SM_EVT_SET_CALLBACKS:
   2410         {
   2411             qcamera_sm_evt_setcb_payload_t *setcbs =
   2412                 (qcamera_sm_evt_setcb_payload_t *)payload;
   2413             rc = m_parent->setCallBacks(setcbs->notify_cb,
   2414                                         setcbs->data_cb,
   2415                                         setcbs->data_cb_timestamp,
   2416                                         setcbs->get_memory,
   2417                                         setcbs->user);
   2418             result.status = rc;
   2419             result.request_api = evt;
   2420             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2421             m_parent->signalAPIResult(&result);
   2422         }
   2423         break;
   2424     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
   2425         {
   2426             rc = m_parent->enableMsgType(*((int32_t *)payload));
   2427             result.status = rc;
   2428             result.request_api = evt;
   2429             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2430             m_parent->signalAPIResult(&result);
   2431         }
   2432         break;
   2433     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
   2434         {
   2435             rc = m_parent->disableMsgType(*((int32_t *)payload));
   2436             result.status = rc;
   2437             result.request_api = evt;
   2438             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2439             m_parent->signalAPIResult(&result);
   2440         }
   2441         break;
   2442     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
   2443         {
   2444             int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
   2445             result.status = rc;
   2446             result.request_api = evt;
   2447             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2448             result.enabled = enabled;
   2449             m_parent->signalAPIResult(&result);
   2450         }
   2451         break;
   2452     case QCAMERA_SM_EVT_SET_PARAMS:
   2453         {
   2454             bool needRestart = false;
   2455             rc = m_parent->updateParameters((char*)payload, needRestart);
   2456             if (rc == NO_ERROR) {
   2457                 if (needRestart) {
   2458                     // cannot set parameters that requires restart during recording
   2459                     ALOGE("%s: Error!! cannot set parameters that requires restart during recording",
   2460                           __func__);
   2461                     rc = BAD_VALUE;
   2462                 } else {
   2463                     rc = m_parent->commitParameterChanges();
   2464                 }
   2465             }
   2466             result.status = rc;
   2467             result.request_api = evt;
   2468             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2469             m_parent->signalAPIResult(&result);
   2470         }
   2471         break;
   2472     case QCAMERA_SM_EVT_GET_PARAMS:
   2473         {
   2474             result.params = m_parent->getParameters();
   2475             rc = NO_ERROR;
   2476             result.status = rc;
   2477             result.request_api = evt;
   2478             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
   2479             m_parent->signalAPIResult(&result);
   2480         }
   2481         break;
   2482     case QCAMERA_SM_EVT_PUT_PARAMS:
   2483         {
   2484             rc = m_parent->putParameters((char*)payload);
   2485             result.status = rc;
   2486             result.request_api = evt;
   2487             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2488             m_parent->signalAPIResult(&result);
   2489         }
   2490         break;
   2491     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
   2492         {
   2493             rc = NO_ERROR;
   2494             result.status = rc;
   2495             result.request_api = evt;
   2496             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2497             result.enabled = 1;
   2498             m_parent->signalAPIResult(&result);
   2499         }
   2500         break;
   2501     case QCAMERA_SM_EVT_RECORDING_ENABLED:
   2502         {
   2503             rc = NO_ERROR;
   2504             result.status = rc;
   2505             result.request_api = evt;
   2506             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2507             result.enabled = 1;
   2508             m_parent->signalAPIResult(&result);
   2509         }
   2510         break;
   2511     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
   2512         {
   2513             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
   2514             result.status = rc;
   2515             result.request_api = evt;
   2516             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2517             m_parent->signalAPIResult(&result);
   2518         }
   2519         break;
   2520     case QCAMERA_SM_EVT_DUMP:
   2521         {
   2522             rc = m_parent->dump(*((int *)payload));
   2523             result.status = rc;
   2524             result.request_api = evt;
   2525             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2526             m_parent->signalAPIResult(&result);
   2527         }
   2528         break;
   2529     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
   2530         {
   2531             rc = m_parent->autoFocus();
   2532             result.status = rc;
   2533             result.request_api = evt;
   2534             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2535             m_parent->signalAPIResult(&result);
   2536         }
   2537         break;
   2538     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
   2539         {
   2540             rc = m_parent->cancelAutoFocus();
   2541             result.status = rc;
   2542             result.request_api = evt;
   2543             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2544             m_parent->signalAPIResult(&result);
   2545         }
   2546         break;
   2547     case QCAMERA_SM_EVT_SEND_COMMAND:
   2548         {
   2549             qcamera_sm_evt_command_payload_t *cmd_payload =
   2550                 (qcamera_sm_evt_command_payload_t *)payload;
   2551             rc = m_parent->sendCommand(cmd_payload->cmd,
   2552                                        cmd_payload->arg1,
   2553                                        cmd_payload->arg2);
   2554             result.status = rc;
   2555             result.request_api = evt;
   2556             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2557             m_parent->signalAPIResult(&result);
   2558         }
   2559         break;
   2560     case QCAMERA_SM_EVT_STOP_RECORDING:
   2561         {
   2562             rc = m_parent->cancelLiveSnapshot();
   2563             m_state = QCAMERA_SM_STATE_RECORDING;
   2564 
   2565             rc = m_parent->stopRecording();
   2566             m_state = QCAMERA_SM_STATE_PREVIEWING;
   2567 
   2568             result.status = rc;
   2569             result.request_api = evt;
   2570             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2571             m_parent->signalAPIResult(&result);
   2572         }
   2573         break;
   2574     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
   2575         {
   2576             rc = m_parent->releaseRecordingFrame((const void *)payload);
   2577             result.status = rc;
   2578             result.request_api = evt;
   2579             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2580             m_parent->signalAPIResult(&result);
   2581         }
   2582         break;
   2583     case QCAMERA_SM_EVT_CANCEL_PICTURE:
   2584         {
   2585             rc = m_parent->cancelLiveSnapshot();
   2586             m_state = QCAMERA_SM_STATE_RECORDING;
   2587             result.status = rc;
   2588             result.request_api = evt;
   2589             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2590             m_parent->signalAPIResult(&result);
   2591         }
   2592         break;
   2593     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
   2594         {
   2595             int32_t faceID = 0;
   2596             qcamera_sm_evt_reg_face_payload_t *reg_payload =
   2597                 (qcamera_sm_evt_reg_face_payload_t *)payload;
   2598             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
   2599                                              reg_payload->config,
   2600                                              faceID);
   2601             result.status = rc;
   2602             result.request_api = evt;
   2603             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
   2604             result.handle = faceID;
   2605             m_parent->signalAPIResult(&result);
   2606         }
   2607         break;
   2608     case QCAMERA_SM_EVT_STOP_PREVIEW:
   2609         {
   2610             rc = m_parent->cancelLiveSnapshot();
   2611             m_state = QCAMERA_SM_STATE_RECORDING;
   2612 
   2613             rc = m_parent->stopRecording();
   2614             m_state = QCAMERA_SM_STATE_PREVIEWING;
   2615 
   2616             rc = m_parent->stopPreview();
   2617             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   2618 
   2619             result.status = rc;
   2620             result.request_api = evt;
   2621             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2622             m_parent->signalAPIResult(&result);
   2623         }
   2624         break;
   2625     case QCAMERA_SM_EVT_START_RECORDING:
   2626     case QCAMERA_SM_EVT_START_PREVIEW:
   2627     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
   2628     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
   2629     case QCAMERA_SM_EVT_TAKE_PICTURE:
   2630     case QCAMERA_SM_EVT_RELEASE:
   2631         {
   2632             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2633             rc = INVALID_OPERATION;
   2634             result.status = rc;
   2635             result.request_api = evt;
   2636             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2637             m_parent->signalAPIResult(&result);
   2638         }
   2639         break;
   2640     case QCAMERA_SM_EVT_EVT_INTERNAL:
   2641         {
   2642             qcamera_sm_internal_evt_payload_t *internal_evt =
   2643                 (qcamera_sm_internal_evt_payload_t *)payload;
   2644             switch (internal_evt->evt_type) {
   2645             case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
   2646                 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
   2647                 break;
   2648             case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
   2649                 break;
   2650             case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
   2651                 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
   2652                 break;
   2653             case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
   2654                 rc = m_parent->processHistogramStats(internal_evt->stats_data);
   2655                 break;
   2656             case QCAMERA_INTERNAL_EVT_CROP_INFO:
   2657                 rc = m_parent->processZoomEvent(internal_evt->crop_data);
   2658                 break;
   2659             case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
   2660                 rc = m_parent->processASDUpdate(internal_evt->asd_data);
   2661                 break;
   2662             case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
   2663                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2664                 break;
   2665             case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
   2666                 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
   2667                 break;
   2668             case QCAMERA_INTERNAL_EVT_AE_UPDATE:
   2669                 rc = m_parent->processAEInfo(internal_evt->ae_data);
   2670                 break;
   2671             case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
   2672                 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
   2673                 break;
   2674             case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
   2675                 rc = m_parent->processHDRData(internal_evt->hdr_data);
   2676                 break;
   2677             case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
   2678                 rc = m_parent->processRetroAECUnlock();
   2679                 break;
   2680             case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
   2681                 rc = m_parent->processZSLCaptureDone();
   2682                 break;
   2683             default:
   2684                 break;
   2685             }
   2686         }
   2687         break;
   2688     case QCAMERA_SM_EVT_EVT_NOTIFY:
   2689         {
   2690             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
   2691             switch (cam_evt->server_event_type) {
   2692             case CAM_EVENT_TYPE_DAEMON_DIED:
   2693                 {
   2694                     //close the camera backend
   2695                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
   2696                     if (handle && handle->ops) {
   2697                         handle->ops->error_close_camera(handle->camera_handle);
   2698                     } else {
   2699                         ALOGE("%s: Could not close because the handle or ops is NULL",
   2700                                 __func__);
   2701                     }
   2702                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
   2703                                             CAMERA_ERROR_SERVER_DIED,
   2704                                             0);
   2705                 }
   2706                 break;
   2707             default:
   2708                 ALOGE("%s: Invalid internal event %d in state(%d)",
   2709                             __func__, cam_evt->server_event_type, m_state);
   2710                 break;
   2711             }
   2712         }
   2713         break;
   2714     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
   2715         {
   2716             qcamera_jpeg_evt_payload_t *jpeg_job =
   2717                 (qcamera_jpeg_evt_payload_t *)payload;
   2718             rc = m_parent->processJpegNotify(jpeg_job);
   2719         }
   2720         break;
   2721     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
   2722         {
   2723             rc = m_parent->cancelLiveSnapshot();
   2724             m_state = QCAMERA_SM_STATE_RECORDING;
   2725             result.status = rc;
   2726             result.request_api = evt;
   2727             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2728             m_parent->signalEvtResult(&result);
   2729         }
   2730         break;
   2731     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
   2732         {
   2733             rc = m_parent->updateThermalLevel(payload);
   2734         }
   2735         break;
   2736     default:
   2737         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   2738         break;
   2739     }
   2740 
   2741     return rc;
   2742 }
   2743 
   2744 /*===========================================================================
   2745  * FUNCTION   : procEvtPreviewPicTakingState
   2746  *
   2747  * DESCRIPTION: finite state machine function to handle event in state of
   2748  *              QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
   2749  *
   2750  * PARAMETERS :
   2751  *   @evt      : event to be processed
   2752  *   @payload  : event payload. Can be NULL if not needed.
   2753  *
   2754  * RETURN     : int32_t type of status
   2755  *              NO_ERROR  -- success
   2756  *              none-zero failure code
   2757  *==========================================================================*/
   2758 int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
   2759                                                           void *payload)
   2760 {
   2761     int32_t rc = NO_ERROR;
   2762     qcamera_api_result_t result;
   2763     memset(&result, 0, sizeof(qcamera_api_result_t));
   2764 
   2765     ALOGV("%s: event (%d)", __func__, evt);
   2766     switch (evt) {
   2767     case QCAMERA_SM_EVT_SET_CALLBACKS:
   2768         {
   2769             qcamera_sm_evt_setcb_payload_t *setcbs =
   2770                 (qcamera_sm_evt_setcb_payload_t *)payload;
   2771             rc = m_parent->setCallBacks(setcbs->notify_cb,
   2772                                         setcbs->data_cb,
   2773                                         setcbs->data_cb_timestamp,
   2774                                         setcbs->get_memory,
   2775                                         setcbs->user);
   2776             result.status = rc;
   2777             result.request_api = evt;
   2778             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2779             m_parent->signalAPIResult(&result);
   2780         }
   2781         break;
   2782     case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
   2783         {
   2784             rc = m_parent->enableMsgType(*((int32_t *)payload));
   2785             result.status = rc;
   2786             result.request_api = evt;
   2787             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2788             m_parent->signalAPIResult(&result);
   2789         }
   2790         break;
   2791     case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
   2792         {
   2793             rc = m_parent->disableMsgType(*((int32_t *)payload));
   2794             result.status = rc;
   2795             result.request_api = evt;
   2796             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2797             m_parent->signalAPIResult(&result);
   2798         }
   2799         break;
   2800     case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
   2801         {
   2802             int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
   2803             result.status = rc;
   2804             result.request_api = evt;
   2805             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2806             result.enabled = enabled;
   2807             m_parent->signalAPIResult(&result);
   2808         }
   2809         break;
   2810     case QCAMERA_SM_EVT_SET_PARAMS:
   2811         {
   2812             bool needRestart = false;
   2813             rc = m_parent->updateParameters((char*)payload, needRestart);
   2814             if (rc == NO_ERROR) {
   2815                 if (needRestart) {
   2816                     // need restart preview for parameters to take effect
   2817                     // stop preview
   2818                     m_parent->stopPreview();
   2819                     // Clear memory pools
   2820                     m_parent->m_memoryPool.clear();
   2821                     // commit parameter changes to server
   2822                     m_parent->commitParameterChanges();
   2823                     // start preview again
   2824                     rc = m_parent->preparePreview();
   2825                     if (rc == NO_ERROR) {
   2826                         applyDelayedMsgs();
   2827                         rc = m_parent->startPreview();
   2828                         if (rc != NO_ERROR) {
   2829                             m_parent->unpreparePreview();
   2830                         }
   2831                     }
   2832                     if (rc != NO_ERROR) {
   2833                         m_state = QCAMERA_SM_STATE_PIC_TAKING;
   2834                     }
   2835                 } else {
   2836                     rc = m_parent->commitParameterChanges();
   2837                 }
   2838             }
   2839             result.status = rc;
   2840             result.request_api = evt;
   2841             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2842             m_parent->signalAPIResult(&result);
   2843         }
   2844         break;
   2845     case QCAMERA_SM_EVT_GET_PARAMS:
   2846         {
   2847             result.params = m_parent->getParameters();
   2848             rc = NO_ERROR;
   2849             result.status = rc;
   2850             result.request_api = evt;
   2851             result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
   2852             m_parent->signalAPIResult(&result);
   2853         }
   2854         break;
   2855     case QCAMERA_SM_EVT_PUT_PARAMS:
   2856         {
   2857             rc = m_parent->putParameters((char*)payload);
   2858             result.status = rc;
   2859             result.request_api = evt;
   2860             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2861             m_parent->signalAPIResult(&result);
   2862         }
   2863         break;
   2864     case QCAMERA_SM_EVT_PREVIEW_ENABLED:
   2865         {
   2866             rc = NO_ERROR;
   2867             result.status = rc;
   2868             result.request_api = evt;
   2869             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2870             result.enabled = 1;
   2871             m_parent->signalAPIResult(&result);
   2872         }
   2873         break;
   2874     case QCAMERA_SM_EVT_RECORDING_ENABLED:
   2875         {
   2876             rc = NO_ERROR;
   2877             result.status = rc;
   2878             result.request_api = evt;
   2879             result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
   2880             result.enabled = 0;
   2881             m_parent->signalAPIResult(&result);
   2882         }
   2883         break;
   2884     case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
   2885         {
   2886             rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
   2887             result.status = rc;
   2888             result.request_api = evt;
   2889             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2890             m_parent->signalAPIResult(&result);
   2891         }
   2892         break;
   2893     case QCAMERA_SM_EVT_DUMP:
   2894         {
   2895             rc = m_parent->dump(*((int *)payload));
   2896             result.status = rc;
   2897             result.request_api = evt;
   2898             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2899             m_parent->signalAPIResult(&result);
   2900         }
   2901         break;
   2902     case QCAMERA_SM_EVT_START_AUTO_FOCUS:
   2903         {
   2904             rc = m_parent->autoFocus();
   2905             result.status = rc;
   2906             result.request_api = evt;
   2907             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2908             m_parent->signalAPIResult(&result);
   2909         }
   2910         break;
   2911     case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
   2912         {
   2913             rc = m_parent->cancelAutoFocus();
   2914             result.status = rc;
   2915             result.request_api = evt;
   2916             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2917             m_parent->signalAPIResult(&result);
   2918         }
   2919         break;
   2920     case QCAMERA_SM_EVT_SEND_COMMAND:
   2921         {
   2922             qcamera_sm_evt_command_payload_t *cmd_payload =
   2923                 (qcamera_sm_evt_command_payload_t *)payload;
   2924             rc = m_parent->sendCommand(cmd_payload->cmd,
   2925                                        cmd_payload->arg1,
   2926                                        cmd_payload->arg2);
   2927 #ifndef VANILLA_HAL
   2928             if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
   2929                 // move state to previewing state
   2930                 m_state = QCAMERA_SM_STATE_PREVIEWING;
   2931             }
   2932 #endif
   2933             result.status = rc;
   2934             result.request_api = evt;
   2935             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2936             m_parent->signalAPIResult(&result);
   2937         }
   2938         break;
   2939     case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
   2940         {
   2941             rc = m_parent->releaseRecordingFrame((const void *)payload);
   2942             result.status = rc;
   2943             result.request_api = evt;
   2944             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2945             m_parent->signalAPIResult(&result);
   2946         }
   2947         break;
   2948     case QCAMERA_SM_EVT_CANCEL_PICTURE:
   2949         {
   2950             if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
   2951                 rc = m_parent->cancelPicture();
   2952             } else {
   2953                 rc = m_parent->cancelLiveSnapshot();
   2954             }
   2955             m_state = QCAMERA_SM_STATE_PREVIEWING;
   2956             result.status = rc;
   2957             result.request_api = evt;
   2958             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2959             m_parent->signalAPIResult(&result);
   2960         }
   2961         break;
   2962     case QCAMERA_SM_EVT_STOP_PREVIEW:
   2963         {
   2964             if (m_parent->isZSLMode()) {
   2965                 // cancel picture first
   2966                 rc = m_parent->cancelPicture();
   2967                 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
   2968             } else if (m_parent->isLongshotEnabled()) {
   2969                 // just cancel picture
   2970                 rc = m_parent->cancelPicture();
   2971             } else {
   2972                 rc = m_parent->cancelLiveSnapshot();
   2973                 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
   2974             }
   2975             // unprepare preview
   2976             m_parent->unpreparePreview();
   2977             m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
   2978             result.status = rc;
   2979             result.request_api = evt;
   2980             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   2981             m_parent->signalAPIResult(&result);
   2982         }
   2983         break;
   2984     case QCAMERA_SM_EVT_START_RECORDING:
   2985         {
   2986             if (m_parent->isZSLMode()) {
   2987                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d) in ZSL mode",
   2988                       __func__, evt, m_state);
   2989                 rc = INVALID_OPERATION;
   2990             } else if (m_parent->isLongshotEnabled()) {
   2991                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d) in Longshot mode",
   2992                       __func__, evt, m_state);
   2993                 rc = INVALID_OPERATION;
   2994             } else {
   2995                 rc = m_parent->startRecording();
   2996                 if (rc == NO_ERROR) {
   2997                     m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
   2998                 }
   2999             }
   3000             result.status = rc;
   3001             result.request_api = evt;
   3002             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3003             m_parent->signalAPIResult(&result);
   3004         }
   3005         break;
   3006     case QCAMERA_SM_EVT_REG_FACE_IMAGE:
   3007         {
   3008             int32_t faceID = 0;
   3009             qcamera_sm_evt_reg_face_payload_t *reg_payload =
   3010                 (qcamera_sm_evt_reg_face_payload_t *)payload;
   3011             rc = m_parent->registerFaceImage(reg_payload->img_ptr,
   3012                                              reg_payload->config,
   3013                                              faceID);
   3014             result.status = rc;
   3015             result.request_api = evt;
   3016             result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
   3017             result.handle = faceID;
   3018             m_parent->signalAPIResult(&result);
   3019         }
   3020         break;
   3021     case QCAMERA_SM_EVT_TAKE_PICTURE:
   3022         {
   3023             if ( m_parent->isLongshotEnabled() ) {
   3024                rc = m_parent->longShot();
   3025             } else {
   3026                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   3027                 rc = INVALID_OPERATION;
   3028             }
   3029 
   3030             result.status = rc;
   3031             result.request_api = evt;
   3032             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3033             m_parent->signalAPIResult(&result);
   3034         }
   3035         break;
   3036 
   3037     case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
   3038         {
   3039           ALOGD("%s: [ZSL Retro]Prepare Snapshot", __func__);
   3040           if (m_parent->isRetroPicture()) {
   3041               ALOGD("%s: [ZSL Retro] Prepare Snapshot in Retro Mode", __func__);
   3042               rc = m_parent->prepareHardwareForSnapshot(FALSE);
   3043               if (rc != NO_ERROR) {
   3044                   ALOGE("%s: [ZSL Retro]prepareHardwareForSnapshot failed %d",
   3045                       __func__, rc);
   3046                   result.status = rc;
   3047                   result.request_api = evt;
   3048                   result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3049                   m_parent->signalAPIResult(&result);
   3050               }
   3051           }
   3052           else {
   3053               ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)",
   3054                 __func__, evt, m_state);
   3055               rc = INVALID_OPERATION;
   3056               result.status = rc;
   3057               result.request_api = evt;
   3058               result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3059               m_parent->signalAPIResult(&result);
   3060           }
   3061         }
   3062         break;
   3063     case QCAMERA_SM_EVT_STOP_RECORDING:
   3064     case QCAMERA_SM_EVT_START_PREVIEW:
   3065     case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
   3066     case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
   3067     case QCAMERA_SM_EVT_RELEASE:
   3068         {
   3069             ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   3070             rc = INVALID_OPERATION;
   3071             result.status = rc;
   3072             result.request_api = evt;
   3073             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3074             m_parent->signalAPIResult(&result);
   3075         }
   3076         break;
   3077     case QCAMERA_SM_EVT_EVT_INTERNAL:
   3078         {
   3079             qcamera_sm_internal_evt_payload_t *internal_evt =
   3080                 (qcamera_sm_internal_evt_payload_t *)payload;
   3081             switch (internal_evt->evt_type) {
   3082             case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
   3083                 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
   3084                 break;
   3085             case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
   3086                 ALOGD("%s: [ZSL Retro]Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
   3087                         __func__);
   3088                 if (m_parent->isRetroPicture()) {
   3089                     m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
   3090                     ALOGD("%s: [ZSL Retro] Retro picture", __func__);
   3091                     result.status = NO_ERROR;
   3092                     result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
   3093                     result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3094                     m_parent->signalAPIResult(&result);
   3095                 }
   3096                 else {
   3097                     ALOGE("%s: [ZSL Retro] Invalid Case for  "
   3098                             "QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event", __func__);
   3099                 }
   3100                 break;
   3101             case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
   3102                 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
   3103                 break;
   3104             case QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT:
   3105                 // This is valid only in Retro picture Mode
   3106                 if (m_parent->isRetroPicture()) {
   3107                     ALOGD("%s: [ZSL Retro] Received QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event",
   3108                             __func__);
   3109                     result.status = NO_ERROR;
   3110                     result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE;
   3111                     result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3112                     m_parent->signalAPIResult(&result);
   3113                 }
   3114                 else {
   3115                     ALOGD("%s: [ZSL Retro] Wrong Case for  "
   3116                            "QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event", __func__);
   3117                 }
   3118                 break;
   3119             case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
   3120                 rc = m_parent->processHistogramStats(internal_evt->stats_data);
   3121                 break;
   3122             case QCAMERA_INTERNAL_EVT_CROP_INFO:
   3123                 rc = m_parent->processZoomEvent(internal_evt->crop_data);
   3124                 break;
   3125             case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
   3126                 rc = m_parent->processASDUpdate(internal_evt->asd_data);
   3127                 break;
   3128             case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE:
   3129                 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   3130                 break;
   3131             case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
   3132                 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data);
   3133                 break;
   3134             case QCAMERA_INTERNAL_EVT_AE_UPDATE:
   3135                 rc = m_parent->processAEInfo(internal_evt->ae_data);
   3136                 break;
   3137             case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE:
   3138                 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos);
   3139                 break;
   3140             case QCAMERA_INTERNAL_EVT_HDR_UPDATE:
   3141                 rc = m_parent->processHDRData(internal_evt->hdr_data);
   3142                 break;
   3143             case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK:
   3144                 rc = m_parent->processRetroAECUnlock();
   3145                 break;
   3146             case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE:
   3147                 rc = m_parent->processZSLCaptureDone();
   3148                 break;
   3149             default:
   3150                 break;
   3151             }
   3152         }
   3153         break;
   3154     case QCAMERA_SM_EVT_EVT_NOTIFY:
   3155         {
   3156             mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
   3157             switch (cam_evt->server_event_type) {
   3158             case CAM_EVENT_TYPE_DAEMON_DIED:
   3159                 {
   3160                     //close the camera backend
   3161                     mm_camera_vtbl_t* handle = m_parent->mCameraHandle;
   3162                     if (handle && handle->ops) {
   3163                         handle->ops->error_close_camera(handle->camera_handle);
   3164                     } else {
   3165                         ALOGE("%s: Could not close because the handle or ops is NULL",
   3166                                 __func__);
   3167                     }
   3168                     m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
   3169                                             CAMERA_ERROR_SERVER_DIED,
   3170                                             0);
   3171                 }
   3172                 break;
   3173             default:
   3174                 ALOGE("%s: Invalid internal event %d in state(%d)",
   3175                             __func__, cam_evt->server_event_type, m_state);
   3176                 break;
   3177             }
   3178         }
   3179         break;
   3180     case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
   3181         {
   3182             ALOGV("%s: [ZSL Retro] Calling Process Jpeg Notify",
   3183             __func__);
   3184             qcamera_jpeg_evt_payload_t *jpeg_job =
   3185                 (qcamera_jpeg_evt_payload_t *)payload;
   3186             rc = m_parent->processJpegNotify(jpeg_job);
   3187         }
   3188         break;
   3189     case QCAMERA_SM_EVT_SNAPSHOT_DONE:
   3190         {
   3191             ALOGV("%s: [ZSL Retro] Snapshot Done", __func__);
   3192             if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
   3193                 rc = m_parent->cancelPicture();
   3194             } else {
   3195                 rc = m_parent->cancelLiveSnapshot();
   3196             }
   3197             m_state = QCAMERA_SM_STATE_PREVIEWING;
   3198             if (m_parent->isRetroPicture()){
   3199                 result.status = rc;
   3200                 result.request_api = evt;
   3201                 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3202                 ALOGV("\n Signalling for JPEG snapshot done!!");
   3203                 m_parent->signalAPIResult(&result);
   3204 
   3205             }
   3206             result.status = rc;
   3207             result.request_api = evt;
   3208             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
   3209             m_parent->signalEvtResult(&result);
   3210         }
   3211         break;
   3212     case QCAMERA_SM_EVT_THERMAL_NOTIFY:
   3213         {
   3214             rc = m_parent->updateThermalLevel(payload);
   3215         }
   3216         break;
   3217     default:
   3218         ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
   3219         break;
   3220     }
   3221 
   3222     return rc;
   3223 }
   3224 
   3225 /*===========================================================================
   3226  * FUNCTION   : isRecording
   3227  *
   3228  * DESCRIPTION: check if recording is in process.
   3229  *
   3230  * PARAMETERS : None
   3231  *
   3232  * RETURN     : true -- recording
   3233  *              false -- not in recording mode
   3234  *==========================================================================*/
   3235 bool QCameraStateMachine::isRecording()
   3236 {
   3237     switch (m_state) {
   3238     case QCAMERA_SM_STATE_RECORDING:
   3239     case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
   3240         return true;
   3241     default:
   3242         return false;
   3243     }
   3244 }
   3245 
   3246 /*===========================================================================
   3247  * FUNCTION   : isPreviewRunning
   3248  *
   3249  * DESCRIPTION: check if preview is in process.
   3250  *
   3251  * PARAMETERS : None
   3252  *
   3253  * RETURN     : true -- preview running
   3254  *              false -- preview stopped
   3255  *==========================================================================*/
   3256 bool QCameraStateMachine::isPreviewRunning()
   3257 {
   3258     switch (m_state) {
   3259     case QCAMERA_SM_STATE_PREVIEWING:
   3260     case QCAMERA_SM_STATE_RECORDING:
   3261     case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
   3262     case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
   3263     case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
   3264     case QCAMERA_SM_STATE_PREVIEW_READY:
   3265         return true;
   3266     default:
   3267         return false;
   3268     }
   3269 }
   3270 
   3271 /*===========================================================================
   3272  * FUNCTION   : isPreviewReady
   3273  *
   3274  * DESCRIPTION: check if preview is in ready state.
   3275  *
   3276  * PARAMETERS : None
   3277  *
   3278  * RETURN     : true -- preview is in ready state
   3279  *              false -- preview is stopped
   3280  *==========================================================================*/
   3281 bool QCameraStateMachine::isPreviewReady()
   3282 {
   3283     switch (m_state) {
   3284     case QCAMERA_SM_STATE_PREVIEW_READY:
   3285         return true;
   3286     default:
   3287         return false;
   3288     }
   3289 }
   3290 
   3291 /*===========================================================================
   3292  * FUNCTION   : isCaptureRunning
   3293  *
   3294  * DESCRIPTION: check if image capture is in process.
   3295  *
   3296  * PARAMETERS : None
   3297  *
   3298  * RETURN     : true -- capture running
   3299  *              false -- capture stopped
   3300  *==========================================================================*/
   3301 bool QCameraStateMachine::isCaptureRunning()
   3302 {
   3303     switch (m_state) {
   3304     case QCAMERA_SM_STATE_PIC_TAKING:
   3305     case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
   3306     case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
   3307         return true;
   3308     default:
   3309         return false;
   3310     }
   3311 }
   3312 /*===========================================================================
   3313  * FUNCTION   : isNonZSLCaptureRunning
   3314  *
   3315  * DESCRIPTION: check if image capture is in process in non ZSL mode.
   3316  *
   3317  * PARAMETERS : None
   3318  *
   3319  * RETURN     : true -- capture running in non ZSL mode
   3320  *              false -- Either in not capture mode or captur is not in non ZSL mode
   3321  *==========================================================================*/
   3322 bool QCameraStateMachine::isNonZSLCaptureRunning()
   3323 {
   3324     switch (m_state) {
   3325     case QCAMERA_SM_STATE_PIC_TAKING:
   3326         return true;
   3327     default:
   3328         return false;
   3329     }
   3330 }
   3331 
   3332 /*===========================================================================
   3333  * FUNCTION   : dump
   3334  *
   3335  * DESCRIPTION: Composes a string based on current configuration
   3336  *
   3337  * PARAMETERS : none
   3338  *
   3339  * RETURN     : Formatted string
   3340  *==========================================================================*/
   3341 String8 QCameraStateMachine::dump()
   3342 {
   3343     String8 str("\n");
   3344     char s[128];
   3345 
   3346     snprintf(s, 128, "Is Preview Running: %d\n", isPreviewRunning());
   3347     str += s;
   3348 
   3349     snprintf(s, 128, "Is Capture Running: %d\n", isCaptureRunning());
   3350     str += s;
   3351 
   3352     snprintf(s, 128, "Is Non ZSL Capture Running: %d\n",
   3353         isNonZSLCaptureRunning());
   3354     str += s;
   3355 
   3356     snprintf(s, 128, "Current State: %d \n", m_state);
   3357     str += s;
   3358 
   3359     switch(m_state){
   3360         case QCAMERA_SM_STATE_PREVIEW_STOPPED:
   3361         snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_STOPPED \n");
   3362         break;
   3363 
   3364         case QCAMERA_SM_STATE_PREVIEW_READY:
   3365         snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_READY \n");
   3366         break;
   3367 
   3368         case QCAMERA_SM_STATE_PREVIEWING:
   3369         snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEWING \n");
   3370         break;
   3371 
   3372         case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
   3373         snprintf(s, 128, " QCAMERA_SM_STATE_PREPARE_SNAPSHOT \n");
   3374         break;
   3375 
   3376         case QCAMERA_SM_STATE_PIC_TAKING:
   3377         snprintf(s, 128, " QCAMERA_SM_STATE_PIC_TAKING \n");
   3378         break;
   3379 
   3380         case QCAMERA_SM_STATE_RECORDING:
   3381         snprintf(s, 128, " QCAMERA_SM_STATE_RECORDING \n");
   3382         break;
   3383 
   3384         case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
   3385         snprintf(s, 128, " QCAMERA_SM_STATE_VIDEO_PIC_TAKING \n");
   3386         break;
   3387 
   3388         case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
   3389         snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_PIC_TAKING \n");
   3390         break;
   3391     }
   3392     str += s;
   3393 
   3394     return str;
   3395 }
   3396 
   3397 }; // namespace qcamera
   3398