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