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