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 default: 1640 LOGE("Invalid internal event %d in state(%d)", 1641 internal_evt->evt_type, m_state); 1642 break; 1643 } 1644 } 1645 break; 1646 case QCAMERA_SM_EVT_EVT_NOTIFY: 1647 { 1648 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 1649 switch (cam_evt->server_event_type) { 1650 case CAM_EVENT_TYPE_DAEMON_DIED: 1651 { 1652 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 1653 CAMERA_ERROR_SERVER_DIED, 1654 0); 1655 } 1656 break; 1657 default: 1658 LOGW("no handling for server evt (%d) at this state", 1659 cam_evt->server_event_type); 1660 break; 1661 } 1662 } 1663 break; 1664 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 1665 { 1666 rc = m_parent->updateThermalLevel(payload); 1667 } 1668 break; 1669 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 1670 { 1671 // No ops, but need to notify 1672 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 1673 result.status = rc; 1674 result.request_api = evt; 1675 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1676 m_parent->signalEvtResult(&result); 1677 } 1678 break; 1679 case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW: 1680 { 1681 m_parent->stopPreview(); 1682 result.status = rc; 1683 result.request_api = evt; 1684 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1685 m_parent->signalAPIResult(&result); 1686 } 1687 break; 1688 case QCAMERA_SM_EVT_RESTART_START_PREVIEW: 1689 { 1690 rc = m_parent->preparePreview(); 1691 if (rc == NO_ERROR) { 1692 rc = m_parent->startPreview(); 1693 } 1694 result.status = rc; 1695 result.request_api = evt; 1696 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1697 m_parent->signalAPIResult(&result); 1698 } 1699 break; 1700 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 1701 default: 1702 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 1703 break; 1704 } 1705 1706 return rc; 1707 } 1708 1709 /*=========================================================================== 1710 * FUNCTION : procEvtPrepareSnapshotState 1711 * 1712 * DESCRIPTION: finite state machine function to handle event in state of 1713 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT. 1714 * 1715 * PARAMETERS : 1716 * @evt : event to be processed 1717 * @payload : event payload. Can be NULL if not needed. 1718 * 1719 * RETURN : int32_t type of status 1720 * NO_ERROR -- success 1721 * none-zero failure code 1722 *==========================================================================*/ 1723 int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt, 1724 void *payload) 1725 { 1726 int32_t rc = NO_ERROR; 1727 qcamera_api_result_t result; 1728 memset(&result, 0, sizeof(qcamera_api_result_t)); 1729 1730 LOGL("event (%d)", evt); 1731 switch (evt) { 1732 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 1733 case QCAMERA_SM_EVT_SET_CALLBACKS: 1734 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 1735 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 1736 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 1737 case QCAMERA_SM_EVT_SET_PARAMS: 1738 case QCAMERA_SM_EVT_SET_PARAMS_STOP: 1739 case QCAMERA_SM_EVT_SET_PARAMS_COMMIT: 1740 case QCAMERA_SM_EVT_SET_PARAMS_RESTART: 1741 case QCAMERA_SM_EVT_GET_PARAMS: 1742 case QCAMERA_SM_EVT_PUT_PARAMS: 1743 case QCAMERA_SM_EVT_PREPARE_PREVIEW: 1744 case QCAMERA_SM_EVT_START_PREVIEW: 1745 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 1746 case QCAMERA_SM_EVT_STOP_PREVIEW: 1747 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 1748 case QCAMERA_SM_EVT_RECORDING_ENABLED: 1749 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 1750 case QCAMERA_SM_EVT_DUMP: 1751 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 1752 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 1753 case QCAMERA_SM_EVT_PRE_START_RECORDING: 1754 case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW: 1755 case QCAMERA_SM_EVT_RESTART_START_PREVIEW: 1756 case QCAMERA_SM_EVT_START_RECORDING: 1757 case QCAMERA_SM_EVT_PRE_TAKE_PICTURE: 1758 case QCAMERA_SM_EVT_TAKE_PICTURE: 1759 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 1760 case QCAMERA_SM_EVT_SEND_COMMAND: 1761 case QCAMERA_SM_EVT_CANCEL_PICTURE: 1762 case QCAMERA_SM_EVT_STOP_RECORDING: 1763 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 1764 case QCAMERA_SM_EVT_RELEASE: 1765 { 1766 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 1767 rc = INVALID_OPERATION; 1768 result.status = rc; 1769 result.request_api = evt; 1770 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1771 m_parent->signalAPIResult(&result); 1772 } 1773 break; 1774 case QCAMERA_SM_EVT_EVT_INTERNAL: 1775 { 1776 qcamera_sm_internal_evt_payload_t *internal_evt = 1777 (qcamera_sm_internal_evt_payload_t *)payload; 1778 switch (internal_evt->evt_type) { 1779 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 1780 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 1781 break; 1782 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 1783 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state); 1784 m_state = QCAMERA_SM_STATE_PREVIEWING; 1785 1786 result.status = NO_ERROR; 1787 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 1788 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1789 m_parent->signalAPIResult(&result); 1790 break; 1791 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 1792 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 1793 break; 1794 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 1795 rc = m_parent->processHistogramStats(internal_evt->stats_data); 1796 break; 1797 case QCAMERA_INTERNAL_EVT_CROP_INFO: 1798 rc = m_parent->processZoomEvent(internal_evt->crop_data); 1799 break; 1800 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 1801 rc = m_parent->processASDUpdate(internal_evt->asd_data); 1802 break; 1803 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 1804 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 1805 break; 1806 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 1807 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 1808 break; 1809 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 1810 rc = m_parent->processAEInfo(internal_evt->ae_data); 1811 break; 1812 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 1813 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 1814 break; 1815 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 1816 rc = m_parent->processHDRData(internal_evt->hdr_data); 1817 break; 1818 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 1819 rc = m_parent->processRetroAECUnlock(); 1820 break; 1821 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 1822 rc = m_parent->processZSLCaptureDone(); 1823 break; 1824 default: 1825 LOGE("Invalid internal event %d in state(%d)", 1826 internal_evt->evt_type, m_state); 1827 break; 1828 } 1829 } 1830 break; 1831 case QCAMERA_SM_EVT_EVT_NOTIFY: 1832 { 1833 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 1834 switch (cam_evt->server_event_type) { 1835 case CAM_EVENT_TYPE_DAEMON_DIED: 1836 { 1837 // Send internal events to stop indefinite wait on prepare 1838 // snapshot done event. 1839 result.status = rc; 1840 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 1841 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1842 m_parent->signalAPIResult(&result); 1843 1844 result.status = rc; 1845 result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE; 1846 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1847 m_parent->signalAPIResult(&result); 1848 1849 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 1850 CAMERA_ERROR_SERVER_DIED, 1851 0); 1852 } 1853 break; 1854 default: 1855 LOGE("Invalid internal event %d in state(%d)", 1856 cam_evt->server_event_type, m_state); 1857 break; 1858 } 1859 } 1860 break; 1861 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 1862 { 1863 // No ops, but need to notify 1864 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 1865 result.status = rc; 1866 result.request_api = evt; 1867 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1868 m_parent->signalEvtResult(&result); 1869 } 1870 break; 1871 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 1872 { 1873 rc = m_parent->updateThermalLevel(payload); 1874 } 1875 break; 1876 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 1877 default: 1878 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 1879 break; 1880 } 1881 1882 return rc; 1883 } 1884 1885 /*=========================================================================== 1886 * FUNCTION : procEvtPicTakingState 1887 * 1888 * DESCRIPTION: finite state machine function to handle event in state of 1889 * QCAMERA_SM_STATE_PIC_TAKING. 1890 * 1891 * PARAMETERS : 1892 * @evt : event to be processed 1893 * @payload : event payload. Can be NULL if not needed. 1894 * 1895 * RETURN : int32_t type of status 1896 * NO_ERROR -- success 1897 * none-zero failure code 1898 *==========================================================================*/ 1899 int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt, 1900 void *payload) 1901 { 1902 int32_t rc = NO_ERROR; 1903 qcamera_api_result_t result; 1904 memset(&result, 0, sizeof(qcamera_api_result_t)); 1905 1906 LOGL("event (%d)", evt); 1907 switch (evt) { 1908 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 1909 { 1910 // Error setting preview window during previewing 1911 LOGE("Error!! cannot set preview window when preview is running"); 1912 rc = INVALID_OPERATION; 1913 result.status = rc; 1914 result.request_api = evt; 1915 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1916 m_parent->signalAPIResult(&result); 1917 } 1918 break; 1919 case QCAMERA_SM_EVT_SET_CALLBACKS: 1920 { 1921 qcamera_sm_evt_setcb_payload_t *setcbs = 1922 (qcamera_sm_evt_setcb_payload_t *)payload; 1923 rc = m_parent->setCallBacks(setcbs->notify_cb, 1924 setcbs->data_cb, 1925 setcbs->data_cb_timestamp, 1926 setcbs->get_memory, 1927 setcbs->user); 1928 result.status = rc; 1929 result.request_api = evt; 1930 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1931 m_parent->signalAPIResult(&result); 1932 } 1933 break; 1934 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 1935 { 1936 rc = m_parent->enableMsgType(*((int32_t *)payload)); 1937 result.status = rc; 1938 result.request_api = evt; 1939 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1940 m_parent->signalAPIResult(&result); 1941 } 1942 break; 1943 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 1944 { 1945 rc = m_parent->disableMsgType(*((int32_t *)payload)); 1946 result.status = rc; 1947 result.request_api = evt; 1948 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1949 m_parent->signalAPIResult(&result); 1950 } 1951 break; 1952 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 1953 { 1954 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 1955 result.status = rc; 1956 result.request_api = evt; 1957 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 1958 result.enabled = enabled; 1959 m_parent->signalAPIResult(&result); 1960 } 1961 break; 1962 case QCAMERA_SM_EVT_SET_PARAMS: 1963 { 1964 bool needRestart = false; 1965 rc = m_parent->updateParameters((char*)payload, needRestart); 1966 result.status = rc; 1967 result.request_api = evt; 1968 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1969 m_parent->signalAPIResult(&result); 1970 } 1971 break; 1972 case QCAMERA_SM_EVT_SET_PARAMS_STOP: 1973 { 1974 result.status = rc; 1975 result.request_api = evt; 1976 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1977 m_parent->signalAPIResult(&result); 1978 } 1979 break; 1980 case QCAMERA_SM_EVT_SET_PARAMS_COMMIT: 1981 { 1982 rc = m_parent->commitParameterChanges(); 1983 result.status = rc; 1984 result.request_api = evt; 1985 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1986 m_parent->signalAPIResult(&result); 1987 } 1988 break; 1989 case QCAMERA_SM_EVT_SET_PARAMS_RESTART: 1990 { 1991 m_parent->setNeedRestart(false); 1992 result.status = rc; 1993 result.request_api = evt; 1994 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 1995 m_parent->signalAPIResult(&result); 1996 } 1997 break; 1998 case QCAMERA_SM_EVT_GET_PARAMS: 1999 { 2000 result.params = m_parent->getParameters(); 2001 rc = result.params ? NO_ERROR : UNKNOWN_ERROR; 2002 result.status = rc; 2003 result.request_api = evt; 2004 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 2005 m_parent->signalAPIResult(&result); 2006 } 2007 break; 2008 case QCAMERA_SM_EVT_PUT_PARAMS: 2009 { 2010 rc = m_parent->putParameters((char*)payload); 2011 result.status = rc; 2012 result.request_api = evt; 2013 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2014 m_parent->signalAPIResult(&result); 2015 } 2016 break; 2017 case QCAMERA_SM_EVT_STOP_PREVIEW: 2018 { 2019 // cancel picture first 2020 rc = m_parent->cancelPicture(); 2021 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2022 2023 result.status = rc; 2024 result.request_api = evt; 2025 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2026 m_parent->signalAPIResult(&result); 2027 } 2028 break; 2029 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 2030 { 2031 rc = NO_ERROR; 2032 result.status = rc; 2033 result.request_api = evt; 2034 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2035 result.enabled = 0; 2036 m_parent->signalAPIResult(&result); 2037 } 2038 break; 2039 case QCAMERA_SM_EVT_RECORDING_ENABLED: 2040 { 2041 rc = NO_ERROR; 2042 result.status = rc; 2043 result.request_api = evt; 2044 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2045 result.enabled = 0; 2046 m_parent->signalAPIResult(&result); 2047 } 2048 break; 2049 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 2050 { 2051 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 2052 result.status = rc; 2053 result.request_api = evt; 2054 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2055 m_parent->signalAPIResult(&result); 2056 } 2057 break; 2058 case QCAMERA_SM_EVT_DUMP: 2059 { 2060 rc = m_parent->dump(*((int *)payload)); 2061 result.status = rc; 2062 result.request_api = evt; 2063 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2064 m_parent->signalAPIResult(&result); 2065 } 2066 break; 2067 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 2068 { 2069 rc = m_parent->autoFocus(); 2070 result.status = rc; 2071 result.request_api = evt; 2072 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2073 m_parent->signalAPIResult(&result); 2074 } 2075 break; 2076 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 2077 { 2078 rc = m_parent->cancelAutoFocus(); 2079 result.status = rc; 2080 result.request_api = evt; 2081 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2082 m_parent->signalAPIResult(&result); 2083 } 2084 break; 2085 case QCAMERA_SM_EVT_SEND_COMMAND: 2086 { 2087 qcamera_sm_evt_command_payload_t *cmd_payload = 2088 (qcamera_sm_evt_command_payload_t *)payload; 2089 rc = m_parent->sendCommand(cmd_payload->cmd, 2090 cmd_payload->arg1, 2091 cmd_payload->arg2); 2092 #ifndef VANILLA_HAL 2093 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) { 2094 // move state to previewing state 2095 m_state = QCAMERA_SM_STATE_PREVIEWING; 2096 } 2097 #endif 2098 result.status = rc; 2099 result.request_api = evt; 2100 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2101 m_parent->signalAPIResult(&result); 2102 } 2103 break; 2104 case QCAMERA_SM_EVT_CANCEL_PICTURE: 2105 { 2106 rc = m_parent->cancelPicture(); 2107 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2108 result.status = rc; 2109 result.request_api = evt; 2110 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2111 m_parent->signalAPIResult(&result); 2112 } 2113 break; 2114 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 2115 { 2116 int32_t faceID = 0; 2117 qcamera_sm_evt_reg_face_payload_t *reg_payload = 2118 (qcamera_sm_evt_reg_face_payload_t *)payload; 2119 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 2120 reg_payload->config, 2121 faceID); 2122 result.status = rc; 2123 result.request_api = evt; 2124 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 2125 result.handle = faceID; 2126 m_parent->signalAPIResult(&result); 2127 } 2128 break; 2129 case QCAMERA_SM_EVT_PRE_TAKE_PICTURE: 2130 { 2131 if ( m_parent->isLongshotEnabled() ) { 2132 // no ops here, need to singal NO_ERROR 2133 rc = NO_ERROR; 2134 } else { 2135 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 2136 rc = INVALID_OPERATION; 2137 } 2138 2139 result.status = rc; 2140 result.request_api = evt; 2141 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2142 m_parent->signalAPIResult(&result); 2143 } 2144 break; 2145 case QCAMERA_SM_EVT_TAKE_PICTURE: 2146 { 2147 if ( m_parent->isLongshotEnabled() ) { 2148 rc = m_parent->longShot(); 2149 } else { 2150 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 2151 rc = INVALID_OPERATION; 2152 } 2153 2154 result.status = rc; 2155 result.request_api = evt; 2156 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2157 m_parent->signalAPIResult(&result); 2158 } 2159 break; 2160 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 2161 case QCAMERA_SM_EVT_PRE_START_RECORDING: 2162 case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW: 2163 case QCAMERA_SM_EVT_RESTART_START_PREVIEW: 2164 case QCAMERA_SM_EVT_START_RECORDING: 2165 case QCAMERA_SM_EVT_STOP_RECORDING: 2166 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 2167 case QCAMERA_SM_EVT_PREPARE_PREVIEW: 2168 case QCAMERA_SM_EVT_START_PREVIEW: 2169 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 2170 case QCAMERA_SM_EVT_RELEASE: 2171 { 2172 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 2173 rc = INVALID_OPERATION; 2174 result.status = rc; 2175 result.request_api = evt; 2176 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2177 m_parent->signalAPIResult(&result); 2178 } 2179 break; 2180 case QCAMERA_SM_EVT_EVT_INTERNAL: 2181 { 2182 qcamera_sm_internal_evt_payload_t *internal_evt = 2183 (qcamera_sm_internal_evt_payload_t *)payload; 2184 switch (internal_evt->evt_type) { 2185 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 2186 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 2187 break; 2188 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 2189 break; 2190 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 2191 break; 2192 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 2193 break; 2194 case QCAMERA_INTERNAL_EVT_CROP_INFO: 2195 rc = m_parent->processZoomEvent(internal_evt->crop_data); 2196 break; 2197 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 2198 rc = m_parent->processASDUpdate(internal_evt->asd_data); 2199 break; 2200 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 2201 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 2202 break; 2203 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 2204 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 2205 break; 2206 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 2207 rc = m_parent->processAEInfo(internal_evt->ae_data); 2208 break; 2209 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 2210 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 2211 break; 2212 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 2213 rc = m_parent->processHDRData(internal_evt->hdr_data); 2214 break; 2215 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 2216 rc = m_parent->processRetroAECUnlock(); 2217 break; 2218 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 2219 rc = m_parent->processZSLCaptureDone(); 2220 break; 2221 default: 2222 break; 2223 } 2224 } 2225 break; 2226 case QCAMERA_SM_EVT_EVT_NOTIFY: 2227 { 2228 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 2229 switch (cam_evt->server_event_type) { 2230 case CAM_EVENT_TYPE_DAEMON_DIED: 2231 { 2232 // Send internal events to stop indefinite wait on prepare 2233 // snapshot done event. 2234 result.status = rc; 2235 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 2236 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2237 m_parent->signalAPIResult(&result); 2238 2239 result.status = rc; 2240 result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE; 2241 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2242 m_parent->signalAPIResult(&result); 2243 2244 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 2245 CAMERA_ERROR_SERVER_DIED, 2246 0); 2247 } 2248 break; 2249 case CAM_EVENT_TYPE_CAC_DONE: 2250 if (m_parent->isCACEnabled() || m_parent->mParameters.isOEMFeatEnabled()) { 2251 LOGD("[LONG_SHOT_DBG] : Received CAC Done"); 2252 if (m_parent->isLongshotEnabled() 2253 && !m_parent->isCaptureShutterEnabled()) { 2254 // play shutter sound for longshot 2255 // after CAC stage is done 2256 m_parent->playShutter(); 2257 } 2258 m_parent->mCACDoneReceived = TRUE; 2259 } 2260 break; 2261 default: 2262 LOGH("no handling for server evt (%d) at this state", 2263 cam_evt->server_event_type); 2264 break; 2265 } 2266 } 2267 break; 2268 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 2269 { 2270 qcamera_jpeg_evt_payload_t *jpeg_job = 2271 (qcamera_jpeg_evt_payload_t *)payload; 2272 rc = m_parent->processJpegNotify(jpeg_job); 2273 } 2274 break; 2275 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL: 2276 { 2277 bool restartPreview = m_parent->isPreviewRestartEnabled(); 2278 rc = m_parent->stopCaptureChannel(restartPreview); 2279 2280 if (restartPreview && (NO_ERROR == rc)) { 2281 rc = m_parent->preparePreview(); 2282 if (NO_ERROR == rc) { 2283 m_parent->m_bPreviewStarted = true; 2284 applyDelayedMsgs(); 2285 rc = m_parent->startPreview(); 2286 } 2287 } 2288 2289 result.status = rc; 2290 result.request_api = evt; 2291 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2292 m_parent->signalAPIResult(&result); 2293 } 2294 break; 2295 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 2296 { 2297 rc = m_parent->cancelPicture(); 2298 2299 bool restartPreview = m_parent->isPreviewRestartEnabled(); 2300 if (restartPreview) { 2301 if (m_parent->mParameters.getManualCaptureMode() 2302 >= CAM_MANUAL_CAPTURE_TYPE_3) { 2303 m_parent->mParameters.updateZSLModeValue(m_RestoreZSL); 2304 m_RestoreZSL = FALSE; 2305 rc = m_parent->preparePreview(); 2306 if (NO_ERROR == rc) { 2307 m_parent->m_bPreviewStarted = true; 2308 applyDelayedMsgs(); 2309 rc = m_parent->startPreview(); 2310 } 2311 } 2312 m_state = QCAMERA_SM_STATE_PREVIEWING; 2313 } else { 2314 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2315 } 2316 2317 result.status = rc; 2318 result.request_api = evt; 2319 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2320 m_parent->signalEvtResult(&result); 2321 } 2322 break; 2323 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 2324 { 2325 rc = m_parent->updateThermalLevel(payload); 2326 } 2327 break; 2328 default: 2329 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 2330 break; 2331 } 2332 2333 return rc; 2334 } 2335 2336 /*=========================================================================== 2337 * FUNCTION : procEvtRecordingState 2338 * 2339 * DESCRIPTION: finite state machine function to handle event in state of 2340 * QCAMERA_SM_STATE_RECORDING. 2341 * 2342 * PARAMETERS : 2343 * @evt : event to be processed 2344 * @payload : event payload. Can be NULL if not needed. 2345 * 2346 * RETURN : int32_t type of status 2347 * NO_ERROR -- success 2348 * none-zero failure code 2349 *==========================================================================*/ 2350 int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt, 2351 void *payload) 2352 { 2353 int32_t rc = NO_ERROR; 2354 qcamera_api_result_t result; 2355 memset(&result, 0, sizeof(qcamera_api_result_t)); 2356 2357 LOGL("event (%d)", evt); 2358 switch (evt) { 2359 case QCAMERA_SM_EVT_PREPARE_PREVIEW: 2360 case QCAMERA_SM_EVT_START_PREVIEW: 2361 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 2362 { 2363 // WA: CTS test VideoSnapshot will try to 2364 // start preview during video recording. 2365 LOGH("CTS video restart op"); 2366 rc = NO_ERROR; 2367 result.status = rc; 2368 result.request_api = evt; 2369 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2370 m_parent->signalAPIResult(&result); 2371 } 2372 break; 2373 case QCAMERA_SM_EVT_SET_CALLBACKS: 2374 { 2375 qcamera_sm_evt_setcb_payload_t *setcbs = 2376 (qcamera_sm_evt_setcb_payload_t *)payload; 2377 rc = m_parent->setCallBacks(setcbs->notify_cb, 2378 setcbs->data_cb, 2379 setcbs->data_cb_timestamp, 2380 setcbs->get_memory, 2381 setcbs->user); 2382 result.status = rc; 2383 result.request_api = evt; 2384 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2385 m_parent->signalAPIResult(&result); 2386 } 2387 break; 2388 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 2389 { 2390 rc = m_parent->enableMsgType(*((int32_t *)payload)); 2391 result.status = rc; 2392 result.request_api = evt; 2393 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2394 m_parent->signalAPIResult(&result); 2395 } 2396 break; 2397 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 2398 { 2399 rc = m_parent->disableMsgType(*((int32_t *)payload)); 2400 result.status = rc; 2401 result.request_api = evt; 2402 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2403 m_parent->signalAPIResult(&result); 2404 } 2405 break; 2406 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 2407 { 2408 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 2409 result.status = rc; 2410 result.request_api = evt; 2411 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2412 result.enabled = enabled; 2413 m_parent->signalAPIResult(&result); 2414 } 2415 break; 2416 case QCAMERA_SM_EVT_SET_PARAMS: 2417 { 2418 bool needRestart = false; 2419 rc = m_parent->updateParameters((char*)payload, needRestart); 2420 if (rc == NO_ERROR) { 2421 if (needRestart) { 2422 // cannot set parameters that requires restart during recording 2423 LOGE("Error!! cannot set parameters that requires restart during recording"); 2424 rc = BAD_VALUE; 2425 } 2426 } 2427 if (rc != NO_ERROR) { 2428 m_parent->setNeedRestart(false); 2429 } 2430 result.status = rc; 2431 result.request_api = evt; 2432 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2433 m_parent->signalAPIResult(&result); 2434 } 2435 break; 2436 case QCAMERA_SM_EVT_SET_PARAMS_COMMIT: 2437 { 2438 rc = m_parent->commitParameterChanges(); 2439 result.status = rc; 2440 result.request_api = evt; 2441 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2442 m_parent->signalAPIResult(&result); 2443 } 2444 break; 2445 case QCAMERA_SM_EVT_SET_PARAMS_STOP: 2446 case QCAMERA_SM_EVT_SET_PARAMS_RESTART: 2447 { 2448 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2449 rc = INVALID_OPERATION; 2450 result.status = rc; 2451 result.request_api = evt; 2452 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2453 m_parent->signalAPIResult(&result); 2454 } 2455 break; 2456 case QCAMERA_SM_EVT_GET_PARAMS: 2457 { 2458 result.params = m_parent->getParameters(); 2459 rc = result.params ? NO_ERROR : UNKNOWN_ERROR; 2460 result.status = rc; 2461 result.request_api = evt; 2462 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 2463 m_parent->signalAPIResult(&result); 2464 } 2465 break; 2466 case QCAMERA_SM_EVT_PUT_PARAMS: 2467 { 2468 rc = m_parent->putParameters((char*)payload); 2469 result.status = rc; 2470 result.request_api = evt; 2471 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2472 m_parent->signalAPIResult(&result); 2473 } 2474 break; 2475 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 2476 { 2477 rc = NO_ERROR; 2478 result.status = rc; 2479 result.request_api = evt; 2480 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2481 result.enabled = 0; 2482 m_parent->signalAPIResult(&result); 2483 } 2484 break; 2485 case QCAMERA_SM_EVT_RECORDING_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 = 1; 2492 m_parent->signalAPIResult(&result); 2493 } 2494 break; 2495 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 2496 { 2497 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 2498 result.status = rc; 2499 result.request_api = evt; 2500 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2501 m_parent->signalAPIResult(&result); 2502 } 2503 break; 2504 case QCAMERA_SM_EVT_DUMP: 2505 { 2506 rc = m_parent->dump(*((int *)payload)); 2507 result.status = rc; 2508 result.request_api = evt; 2509 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2510 m_parent->signalAPIResult(&result); 2511 } 2512 break; 2513 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 2514 { 2515 rc = m_parent->autoFocus(); 2516 result.status = rc; 2517 result.request_api = evt; 2518 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2519 m_parent->signalAPIResult(&result); 2520 } 2521 break; 2522 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 2523 { 2524 rc = m_parent->cancelAutoFocus(); 2525 result.status = rc; 2526 result.request_api = evt; 2527 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2528 m_parent->signalAPIResult(&result); 2529 } 2530 break; 2531 case QCAMERA_SM_EVT_SEND_COMMAND: 2532 { 2533 qcamera_sm_evt_command_payload_t *cmd_payload = 2534 (qcamera_sm_evt_command_payload_t *)payload; 2535 rc = m_parent->sendCommand(cmd_payload->cmd, 2536 cmd_payload->arg1, 2537 cmd_payload->arg2); 2538 result.status = rc; 2539 result.request_api = evt; 2540 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2541 m_parent->signalAPIResult(&result); 2542 } 2543 break; 2544 case QCAMERA_SM_EVT_PRE_TAKE_PICTURE: 2545 { 2546 // No ops here, send NO_ERROR. 2547 rc = NO_ERROR; 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_TAKE_PICTURE: 2555 { 2556 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING; 2557 rc = m_parent->takeLiveSnapshot(); 2558 if (rc != NO_ERROR) { 2559 m_parent->unconfigureAdvancedCapture(); 2560 m_state = QCAMERA_SM_STATE_RECORDING; 2561 } 2562 result.status = rc; 2563 result.request_api = evt; 2564 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2565 m_parent->signalAPIResult(&result); 2566 } 2567 break; 2568 case QCAMERA_SM_EVT_PRE_START_RECORDING: 2569 case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW: 2570 case QCAMERA_SM_EVT_RESTART_START_PREVIEW: 2571 case QCAMERA_SM_EVT_START_RECORDING: 2572 { 2573 // no ops here 2574 LOGW("already in recording state, no ops for start_recording"); 2575 rc = 0; 2576 result.status = rc; 2577 result.request_api = evt; 2578 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2579 m_parent->signalAPIResult(&result); 2580 } 2581 break; 2582 case QCAMERA_SM_EVT_STOP_RECORDING: 2583 { 2584 rc = m_parent->stopRecording(); 2585 m_state = QCAMERA_SM_STATE_PREVIEWING; 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_PREVIEW: 2593 { 2594 rc = m_parent->stopRecording(); 2595 m_state = QCAMERA_SM_STATE_PREVIEWING; 2596 2597 rc = m_parent->stopPreview(); 2598 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 2599 2600 result.status = rc; 2601 result.request_api = evt; 2602 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2603 m_parent->signalAPIResult(&result); 2604 } 2605 break; 2606 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 2607 { 2608 rc = m_parent->releaseRecordingFrame((const void *)payload); 2609 result.status = rc; 2610 result.request_api = evt; 2611 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2612 m_parent->signalAPIResult(&result); 2613 } 2614 break; 2615 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 2616 { 2617 int32_t faceID = 0; 2618 qcamera_sm_evt_reg_face_payload_t *reg_payload = 2619 (qcamera_sm_evt_reg_face_payload_t *)payload; 2620 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 2621 reg_payload->config, 2622 faceID); 2623 result.status = rc; 2624 result.request_api = evt; 2625 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 2626 result.handle = faceID; 2627 m_parent->signalAPIResult(&result); 2628 } 2629 break; 2630 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 2631 { 2632 //In Video snapshot, prepare hardware is a no-op. 2633 result.status = NO_ERROR; 2634 result.request_api = evt; 2635 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2636 m_parent->signalAPIResult(&result); 2637 } 2638 break; 2639 case QCAMERA_SM_EVT_CANCEL_PICTURE: 2640 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 2641 case QCAMERA_SM_EVT_RELEASE: 2642 { 2643 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 2644 rc = INVALID_OPERATION; 2645 result.status = rc; 2646 result.request_api = evt; 2647 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2648 m_parent->signalAPIResult(&result); 2649 } 2650 break; 2651 case QCAMERA_SM_EVT_EVT_INTERNAL: 2652 { 2653 qcamera_sm_internal_evt_payload_t *internal_evt = 2654 (qcamera_sm_internal_evt_payload_t *)payload; 2655 switch (internal_evt->evt_type) { 2656 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 2657 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 2658 break; 2659 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 2660 break; 2661 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 2662 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 2663 break; 2664 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 2665 rc = m_parent->processHistogramStats(internal_evt->stats_data); 2666 break; 2667 case QCAMERA_INTERNAL_EVT_CROP_INFO: 2668 rc = m_parent->processZoomEvent(internal_evt->crop_data); 2669 break; 2670 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 2671 rc = m_parent->processASDUpdate(internal_evt->asd_data); 2672 break; 2673 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 2674 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 2675 break; 2676 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 2677 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 2678 break; 2679 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 2680 rc = m_parent->processAEInfo(internal_evt->ae_data); 2681 break; 2682 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 2683 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 2684 break; 2685 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 2686 rc = m_parent->processHDRData(internal_evt->hdr_data); 2687 break; 2688 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 2689 rc = m_parent->processRetroAECUnlock(); 2690 break; 2691 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 2692 rc = m_parent->processZSLCaptureDone(); 2693 break; 2694 default: 2695 break; 2696 } 2697 } 2698 break; 2699 case QCAMERA_SM_EVT_EVT_NOTIFY: 2700 { 2701 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 2702 switch (cam_evt->server_event_type) { 2703 case CAM_EVENT_TYPE_DAEMON_DIED: 2704 { 2705 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 2706 CAMERA_ERROR_SERVER_DIED, 2707 0); 2708 } 2709 break; 2710 default: 2711 LOGE("Invalid internal event %d in state(%d)", 2712 cam_evt->server_event_type, m_state); 2713 break; 2714 } 2715 } 2716 break; 2717 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 2718 { 2719 rc = m_parent->updateThermalLevel(payload); 2720 } 2721 break; 2722 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 2723 { 2724 // No ops, but need to notify 2725 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 2726 result.status = rc; 2727 result.request_api = evt; 2728 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2729 m_parent->signalEvtResult(&result); 2730 } 2731 break; 2732 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 2733 default: 2734 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 2735 break; 2736 } 2737 2738 return rc; 2739 } 2740 2741 /*=========================================================================== 2742 * FUNCTION : procEvtVideoPicTakingState 2743 * 2744 * DESCRIPTION: finite state machine function to handle event in state of 2745 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING. 2746 * 2747 * PARAMETERS : 2748 * @evt : event to be processed 2749 * @payload : event payload. Can be NULL if not needed. 2750 * 2751 * RETURN : int32_t type of status 2752 * NO_ERROR -- success 2753 * none-zero failure code 2754 *==========================================================================*/ 2755 int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt, 2756 void *payload) 2757 { 2758 int32_t rc = NO_ERROR; 2759 qcamera_api_result_t result; 2760 memset(&result, 0, sizeof(qcamera_api_result_t)); 2761 2762 LOGL("event (%d)", evt); 2763 switch (evt) { 2764 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 2765 { 2766 // Error setting preview window during previewing 2767 LOGE("Error!! cannot set preview window when preview is running"); 2768 rc = INVALID_OPERATION; 2769 result.status = rc; 2770 result.request_api = evt; 2771 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2772 m_parent->signalAPIResult(&result); 2773 } 2774 break; 2775 case QCAMERA_SM_EVT_SET_CALLBACKS: 2776 { 2777 qcamera_sm_evt_setcb_payload_t *setcbs = 2778 (qcamera_sm_evt_setcb_payload_t *)payload; 2779 rc = m_parent->setCallBacks(setcbs->notify_cb, 2780 setcbs->data_cb, 2781 setcbs->data_cb_timestamp, 2782 setcbs->get_memory, 2783 setcbs->user); 2784 result.status = rc; 2785 result.request_api = evt; 2786 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2787 m_parent->signalAPIResult(&result); 2788 } 2789 break; 2790 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 2791 { 2792 rc = m_parent->enableMsgType(*((int32_t *)payload)); 2793 result.status = rc; 2794 result.request_api = evt; 2795 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2796 m_parent->signalAPIResult(&result); 2797 } 2798 break; 2799 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 2800 { 2801 rc = m_parent->disableMsgType(*((int32_t *)payload)); 2802 result.status = rc; 2803 result.request_api = evt; 2804 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2805 m_parent->signalAPIResult(&result); 2806 } 2807 break; 2808 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 2809 { 2810 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 2811 result.status = rc; 2812 result.request_api = evt; 2813 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2814 result.enabled = enabled; 2815 m_parent->signalAPIResult(&result); 2816 } 2817 break; 2818 case QCAMERA_SM_EVT_SET_PARAMS: 2819 { 2820 bool needRestart = false; 2821 rc = m_parent->updateParameters((char*)payload, needRestart); 2822 if (rc == NO_ERROR) { 2823 if (needRestart) { 2824 // cannot set parameters that requires restart during recording 2825 LOGE("Error!! cannot set parameters that requires restart during recording"); 2826 rc = BAD_VALUE; 2827 } 2828 } 2829 if (rc != NO_ERROR) { 2830 m_parent->setNeedRestart(false); 2831 } 2832 result.status = rc; 2833 result.request_api = evt; 2834 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2835 m_parent->signalAPIResult(&result); 2836 } 2837 break; 2838 case QCAMERA_SM_EVT_SET_PARAMS_COMMIT: 2839 { 2840 rc = m_parent->commitParameterChanges(); 2841 result.status = rc; 2842 result.request_api = evt; 2843 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2844 m_parent->signalAPIResult(&result); 2845 } 2846 break; 2847 case QCAMERA_SM_EVT_SET_PARAMS_STOP: 2848 case QCAMERA_SM_EVT_SET_PARAMS_RESTART: 2849 { 2850 ALOGE("%s: Error!! cannot handle evt(%d) in state(%d)", __func__, evt, m_state); 2851 rc = INVALID_OPERATION; 2852 result.status = rc; 2853 result.request_api = evt; 2854 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2855 m_parent->signalAPIResult(&result); 2856 } 2857 break; 2858 case QCAMERA_SM_EVT_GET_PARAMS: 2859 { 2860 result.params = m_parent->getParameters(); 2861 rc = result.params ? NO_ERROR : UNKNOWN_ERROR; 2862 result.status = rc; 2863 result.request_api = evt; 2864 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 2865 m_parent->signalAPIResult(&result); 2866 } 2867 break; 2868 case QCAMERA_SM_EVT_PUT_PARAMS: 2869 { 2870 rc = m_parent->putParameters((char*)payload); 2871 result.status = rc; 2872 result.request_api = evt; 2873 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2874 m_parent->signalAPIResult(&result); 2875 } 2876 break; 2877 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 2878 { 2879 rc = NO_ERROR; 2880 result.status = rc; 2881 result.request_api = evt; 2882 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2883 result.enabled = 1; 2884 m_parent->signalAPIResult(&result); 2885 } 2886 break; 2887 case QCAMERA_SM_EVT_RECORDING_ENABLED: 2888 { 2889 rc = NO_ERROR; 2890 result.status = rc; 2891 result.request_api = evt; 2892 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 2893 result.enabled = 1; 2894 m_parent->signalAPIResult(&result); 2895 } 2896 break; 2897 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 2898 { 2899 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 2900 result.status = rc; 2901 result.request_api = evt; 2902 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2903 m_parent->signalAPIResult(&result); 2904 } 2905 break; 2906 case QCAMERA_SM_EVT_DUMP: 2907 { 2908 rc = m_parent->dump(*((int *)payload)); 2909 result.status = rc; 2910 result.request_api = evt; 2911 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2912 m_parent->signalAPIResult(&result); 2913 } 2914 break; 2915 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 2916 { 2917 rc = m_parent->autoFocus(); 2918 result.status = rc; 2919 result.request_api = evt; 2920 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2921 m_parent->signalAPIResult(&result); 2922 } 2923 break; 2924 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 2925 { 2926 rc = m_parent->cancelAutoFocus(); 2927 result.status = rc; 2928 result.request_api = evt; 2929 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2930 m_parent->signalAPIResult(&result); 2931 } 2932 break; 2933 case QCAMERA_SM_EVT_SEND_COMMAND: 2934 { 2935 qcamera_sm_evt_command_payload_t *cmd_payload = 2936 (qcamera_sm_evt_command_payload_t *)payload; 2937 rc = m_parent->sendCommand(cmd_payload->cmd, 2938 cmd_payload->arg1, 2939 cmd_payload->arg2); 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_STOP_RECORDING: 2947 { 2948 rc = m_parent->cancelLiveSnapshot(); 2949 m_state = QCAMERA_SM_STATE_RECORDING; 2950 2951 rc = m_parent->stopRecording(); 2952 m_state = QCAMERA_SM_STATE_PREVIEWING; 2953 2954 result.status = rc; 2955 result.request_api = evt; 2956 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2957 m_parent->signalAPIResult(&result); 2958 } 2959 break; 2960 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 2961 { 2962 rc = m_parent->releaseRecordingFrame((const void *)payload); 2963 result.status = rc; 2964 result.request_api = evt; 2965 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2966 m_parent->signalAPIResult(&result); 2967 } 2968 break; 2969 case QCAMERA_SM_EVT_CANCEL_PICTURE: 2970 { 2971 rc = m_parent->cancelLiveSnapshot(); 2972 m_state = QCAMERA_SM_STATE_RECORDING; 2973 result.status = rc; 2974 result.request_api = evt; 2975 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 2976 m_parent->signalAPIResult(&result); 2977 } 2978 break; 2979 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 2980 { 2981 int32_t faceID = 0; 2982 qcamera_sm_evt_reg_face_payload_t *reg_payload = 2983 (qcamera_sm_evt_reg_face_payload_t *)payload; 2984 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 2985 reg_payload->config, 2986 faceID); 2987 result.status = rc; 2988 result.request_api = evt; 2989 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 2990 result.handle = faceID; 2991 m_parent->signalAPIResult(&result); 2992 } 2993 break; 2994 case QCAMERA_SM_EVT_STOP_PREVIEW: 2995 { 2996 rc = m_parent->cancelLiveSnapshot(); 2997 m_state = QCAMERA_SM_STATE_RECORDING; 2998 2999 rc = m_parent->stopRecording(); 3000 m_state = QCAMERA_SM_STATE_PREVIEWING; 3001 3002 rc = m_parent->stopPreview(); 3003 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 3004 3005 result.status = rc; 3006 result.request_api = evt; 3007 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3008 m_parent->signalAPIResult(&result); 3009 } 3010 break; 3011 case QCAMERA_SM_EVT_PRE_START_RECORDING: 3012 case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW: 3013 case QCAMERA_SM_EVT_RESTART_START_PREVIEW: 3014 case QCAMERA_SM_EVT_START_RECORDING: 3015 case QCAMERA_SM_EVT_PREPARE_PREVIEW: 3016 case QCAMERA_SM_EVT_START_PREVIEW: 3017 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 3018 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 3019 case QCAMERA_SM_EVT_PRE_TAKE_PICTURE: 3020 case QCAMERA_SM_EVT_TAKE_PICTURE: 3021 case QCAMERA_SM_EVT_RELEASE: 3022 { 3023 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 3024 rc = INVALID_OPERATION; 3025 result.status = rc; 3026 result.request_api = evt; 3027 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3028 m_parent->signalAPIResult(&result); 3029 } 3030 break; 3031 case QCAMERA_SM_EVT_EVT_INTERNAL: 3032 { 3033 qcamera_sm_internal_evt_payload_t *internal_evt = 3034 (qcamera_sm_internal_evt_payload_t *)payload; 3035 switch (internal_evt->evt_type) { 3036 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 3037 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 3038 break; 3039 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 3040 break; 3041 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 3042 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 3043 break; 3044 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 3045 rc = m_parent->processHistogramStats(internal_evt->stats_data); 3046 break; 3047 case QCAMERA_INTERNAL_EVT_CROP_INFO: 3048 rc = m_parent->processZoomEvent(internal_evt->crop_data); 3049 break; 3050 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 3051 rc = m_parent->processASDUpdate(internal_evt->asd_data); 3052 break; 3053 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 3054 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 3055 break; 3056 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 3057 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 3058 break; 3059 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 3060 rc = m_parent->processAEInfo(internal_evt->ae_data); 3061 break; 3062 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 3063 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 3064 break; 3065 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 3066 rc = m_parent->processHDRData(internal_evt->hdr_data); 3067 break; 3068 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 3069 rc = m_parent->processRetroAECUnlock(); 3070 break; 3071 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 3072 rc = m_parent->processZSLCaptureDone(); 3073 break; 3074 default: 3075 break; 3076 } 3077 } 3078 break; 3079 case QCAMERA_SM_EVT_EVT_NOTIFY: 3080 { 3081 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 3082 switch (cam_evt->server_event_type) { 3083 case CAM_EVENT_TYPE_DAEMON_DIED: 3084 { 3085 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 3086 CAMERA_ERROR_SERVER_DIED, 3087 0); 3088 } 3089 break; 3090 default: 3091 LOGE("Invalid internal event %d in state(%d)", 3092 cam_evt->server_event_type, m_state); 3093 break; 3094 } 3095 } 3096 break; 3097 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 3098 { 3099 qcamera_jpeg_evt_payload_t *jpeg_job = 3100 (qcamera_jpeg_evt_payload_t *)payload; 3101 rc = m_parent->processJpegNotify(jpeg_job); 3102 } 3103 break; 3104 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 3105 { 3106 rc = m_parent->cancelLiveSnapshot(); 3107 m_state = QCAMERA_SM_STATE_RECORDING; 3108 result.status = rc; 3109 result.request_api = evt; 3110 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3111 m_parent->signalEvtResult(&result); 3112 } 3113 break; 3114 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 3115 { 3116 rc = m_parent->updateThermalLevel(payload); 3117 } 3118 break; 3119 default: 3120 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 3121 break; 3122 } 3123 3124 return rc; 3125 } 3126 3127 /*=========================================================================== 3128 * FUNCTION : procEvtPreviewPicTakingState 3129 * 3130 * DESCRIPTION: finite state machine function to handle event in state of 3131 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING. 3132 * 3133 * PARAMETERS : 3134 * @evt : event to be processed 3135 * @payload : event payload. Can be NULL if not needed. 3136 * 3137 * RETURN : int32_t type of status 3138 * NO_ERROR -- success 3139 * none-zero failure code 3140 *==========================================================================*/ 3141 int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt, 3142 void *payload) 3143 { 3144 int32_t rc = NO_ERROR; 3145 qcamera_api_result_t result; 3146 memset(&result, 0, sizeof(qcamera_api_result_t)); 3147 3148 LOGL("event (%d)", evt); 3149 switch (evt) { 3150 case QCAMERA_SM_EVT_SET_CALLBACKS: 3151 { 3152 qcamera_sm_evt_setcb_payload_t *setcbs = 3153 (qcamera_sm_evt_setcb_payload_t *)payload; 3154 rc = m_parent->setCallBacks(setcbs->notify_cb, 3155 setcbs->data_cb, 3156 setcbs->data_cb_timestamp, 3157 setcbs->get_memory, 3158 setcbs->user); 3159 result.status = rc; 3160 result.request_api = evt; 3161 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3162 m_parent->signalAPIResult(&result); 3163 } 3164 break; 3165 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE: 3166 { 3167 rc = m_parent->enableMsgType(*((int32_t *)payload)); 3168 result.status = rc; 3169 result.request_api = evt; 3170 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3171 m_parent->signalAPIResult(&result); 3172 } 3173 break; 3174 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE: 3175 { 3176 rc = m_parent->disableMsgType(*((int32_t *)payload)); 3177 result.status = rc; 3178 result.request_api = evt; 3179 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3180 m_parent->signalAPIResult(&result); 3181 } 3182 break; 3183 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED: 3184 { 3185 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload)); 3186 result.status = rc; 3187 result.request_api = evt; 3188 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 3189 result.enabled = enabled; 3190 m_parent->signalAPIResult(&result); 3191 } 3192 break; 3193 case QCAMERA_SM_EVT_SET_PARAMS: 3194 { 3195 bool needRestart = false; 3196 rc = m_parent->updateParameters((char*)payload, needRestart); 3197 result.status = rc; 3198 result.request_api = evt; 3199 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3200 m_parent->signalAPIResult(&result); 3201 } 3202 break; 3203 case QCAMERA_SM_EVT_SET_PARAMS_STOP: 3204 { 3205 // need restart preview for parameters to take effect 3206 LOGD("Stopping preview..."); 3207 // stop preview 3208 rc = m_parent->stopPreview(); 3209 // Clear memory pools 3210 m_parent->m_memoryPool.clear(); 3211 result.status = rc; 3212 result.request_api = evt; 3213 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3214 m_parent->signalAPIResult(&result); 3215 } 3216 break; 3217 case QCAMERA_SM_EVT_SET_PARAMS_COMMIT: 3218 { 3219 // commit parameter changes to server 3220 rc = m_parent->commitParameterChanges(); 3221 result.status = rc; 3222 result.request_api = evt; 3223 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3224 m_parent->signalAPIResult(&result); 3225 } 3226 break; 3227 case QCAMERA_SM_EVT_SET_PARAMS_RESTART: 3228 { 3229 // start preview again 3230 rc = m_parent->preparePreview(); 3231 if (rc == NO_ERROR) { 3232 applyDelayedMsgs(); 3233 rc = m_parent->startPreview(); 3234 if (rc != NO_ERROR) { 3235 m_parent->unpreparePreview(); 3236 } 3237 } 3238 if (rc != NO_ERROR) { 3239 m_state = QCAMERA_SM_STATE_PIC_TAKING; 3240 } 3241 m_parent->setNeedRestart(false); 3242 result.status = rc; 3243 result.request_api = evt; 3244 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3245 m_parent->signalAPIResult(&result); 3246 } 3247 break; 3248 case QCAMERA_SM_EVT_GET_PARAMS: 3249 { 3250 result.params = m_parent->getParameters(); 3251 rc = result.params ? NO_ERROR : UNKNOWN_ERROR; 3252 result.status = rc; 3253 result.request_api = evt; 3254 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS; 3255 m_parent->signalAPIResult(&result); 3256 } 3257 break; 3258 case QCAMERA_SM_EVT_PUT_PARAMS: 3259 { 3260 rc = m_parent->putParameters((char*)payload); 3261 result.status = rc; 3262 result.request_api = evt; 3263 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3264 m_parent->signalAPIResult(&result); 3265 } 3266 break; 3267 case QCAMERA_SM_EVT_PREVIEW_ENABLED: 3268 { 3269 rc = NO_ERROR; 3270 result.status = rc; 3271 result.request_api = evt; 3272 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 3273 result.enabled = 1; 3274 m_parent->signalAPIResult(&result); 3275 } 3276 break; 3277 case QCAMERA_SM_EVT_RECORDING_ENABLED: 3278 { 3279 rc = NO_ERROR; 3280 result.status = rc; 3281 result.request_api = evt; 3282 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG; 3283 result.enabled = 0; 3284 m_parent->signalAPIResult(&result); 3285 } 3286 break; 3287 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS: 3288 { 3289 rc = m_parent->storeMetaDataInBuffers(*((int *)payload)); 3290 result.status = rc; 3291 result.request_api = evt; 3292 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3293 m_parent->signalAPIResult(&result); 3294 } 3295 break; 3296 case QCAMERA_SM_EVT_DUMP: 3297 { 3298 rc = m_parent->dump(*((int *)payload)); 3299 result.status = rc; 3300 result.request_api = evt; 3301 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3302 m_parent->signalAPIResult(&result); 3303 } 3304 break; 3305 case QCAMERA_SM_EVT_START_AUTO_FOCUS: 3306 { 3307 rc = m_parent->autoFocus(); 3308 result.status = rc; 3309 result.request_api = evt; 3310 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3311 m_parent->signalAPIResult(&result); 3312 } 3313 break; 3314 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS: 3315 { 3316 rc = m_parent->cancelAutoFocus(); 3317 result.status = rc; 3318 result.request_api = evt; 3319 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3320 m_parent->signalAPIResult(&result); 3321 } 3322 break; 3323 case QCAMERA_SM_EVT_SEND_COMMAND: 3324 { 3325 qcamera_sm_evt_command_payload_t *cmd_payload = 3326 (qcamera_sm_evt_command_payload_t *)payload; 3327 rc = m_parent->sendCommand(cmd_payload->cmd, 3328 cmd_payload->arg1, 3329 cmd_payload->arg2); 3330 #ifndef VANILLA_HAL 3331 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) { 3332 // move state to previewing state 3333 m_state = QCAMERA_SM_STATE_PREVIEWING; 3334 } 3335 #endif 3336 result.status = rc; 3337 result.request_api = evt; 3338 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3339 m_parent->signalAPIResult(&result); 3340 } 3341 break; 3342 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME: 3343 { 3344 rc = m_parent->releaseRecordingFrame((const void *)payload); 3345 result.status = rc; 3346 result.request_api = evt; 3347 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3348 m_parent->signalAPIResult(&result); 3349 } 3350 break; 3351 case QCAMERA_SM_EVT_CANCEL_PICTURE: 3352 { 3353 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) { 3354 rc = m_parent->cancelPicture(); 3355 } else { 3356 rc = m_parent->cancelLiveSnapshot(); 3357 } 3358 m_state = QCAMERA_SM_STATE_PREVIEWING; 3359 result.status = rc; 3360 result.request_api = evt; 3361 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3362 m_parent->signalAPIResult(&result); 3363 } 3364 break; 3365 case QCAMERA_SM_EVT_STOP_PREVIEW: 3366 { 3367 if (m_parent->isZSLMode()) { 3368 // cancel picture first 3369 rc = m_parent->cancelPicture(); 3370 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL); 3371 } else if (m_parent->isLongshotEnabled()) { 3372 // just cancel picture 3373 rc = m_parent->cancelPicture(); 3374 } else { 3375 rc = m_parent->cancelLiveSnapshot(); 3376 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW); 3377 } 3378 // unprepare preview 3379 m_parent->unpreparePreview(); 3380 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED; 3381 result.status = rc; 3382 result.request_api = evt; 3383 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3384 m_parent->signalAPIResult(&result); 3385 } 3386 break; 3387 case QCAMERA_SM_EVT_PRE_START_RECORDING: 3388 { 3389 if (m_parent->isZSLMode()) { 3390 LOGE("Error!! cannot handle evt(%d) in state(%d) in ZSL mode", evt, m_state); 3391 rc = INVALID_OPERATION; 3392 } else if (m_parent->isLongshotEnabled()) { 3393 LOGE("Error!! cannot handle evt(%d) in state(%d) in Longshot mode", evt, m_state); 3394 rc = INVALID_OPERATION; 3395 } else { 3396 rc = m_parent->preStartRecording(); 3397 } 3398 result.status = rc; 3399 result.request_api = evt; 3400 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3401 m_parent->signalAPIResult(&result); 3402 } 3403 break; 3404 case QCAMERA_SM_EVT_START_RECORDING: 3405 { 3406 if (m_parent->isZSLMode()) { 3407 LOGE("Error!! cannot handle evt(%d) in state(%d) in ZSL mode", 3408 evt, m_state); 3409 rc = INVALID_OPERATION; 3410 } else if (m_parent->isLongshotEnabled()) { 3411 LOGE("Error!! cannot handle evt(%d) in state(%d) in Longshot mode", 3412 evt, m_state); 3413 rc = INVALID_OPERATION; 3414 } else { 3415 rc = m_parent->startRecording(); 3416 if (rc == NO_ERROR) { 3417 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING; 3418 } 3419 } 3420 result.status = rc; 3421 result.request_api = evt; 3422 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3423 m_parent->signalAPIResult(&result); 3424 } 3425 break; 3426 case QCAMERA_SM_EVT_REG_FACE_IMAGE: 3427 { 3428 int32_t faceID = 0; 3429 qcamera_sm_evt_reg_face_payload_t *reg_payload = 3430 (qcamera_sm_evt_reg_face_payload_t *)payload; 3431 rc = m_parent->registerFaceImage(reg_payload->img_ptr, 3432 reg_payload->config, 3433 faceID); 3434 result.status = rc; 3435 result.request_api = evt; 3436 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE; 3437 result.handle = faceID; 3438 m_parent->signalAPIResult(&result); 3439 } 3440 break; 3441 case QCAMERA_SM_EVT_PRE_TAKE_PICTURE: 3442 { 3443 if ( m_parent->isLongshotEnabled() ) { 3444 // no ops here, need to singal NO_ERROR 3445 rc = NO_ERROR; 3446 } else { 3447 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 3448 rc = INVALID_OPERATION; 3449 } 3450 3451 result.status = rc; 3452 result.request_api = evt; 3453 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3454 m_parent->signalAPIResult(&result); 3455 } 3456 break; 3457 case QCAMERA_SM_EVT_TAKE_PICTURE: 3458 { 3459 if ( m_parent->isLongshotEnabled() ) { 3460 rc = m_parent->longShot(); 3461 } else { 3462 LOGE("Error!! cannot handle evt(%d) in state(%d)", evt, m_state); 3463 rc = INVALID_OPERATION; 3464 } 3465 3466 result.status = rc; 3467 result.request_api = evt; 3468 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3469 m_parent->signalAPIResult(&result); 3470 } 3471 break; 3472 3473 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT: 3474 { 3475 LOGD("Prepare Snapshot"); 3476 if (m_parent->isRetroPicture()) { 3477 LOGD("Prepare Snapshot in Retro Mode"); 3478 rc = m_parent->prepareHardwareForSnapshot(FALSE); 3479 if (rc != NO_ERROR) { 3480 LOGE("prepareHardwareForSnapshot failed %d", 3481 rc); 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 } 3488 else { 3489 LOGE("Error!! cannot handle evt(%d) in state(%d)", 3490 evt, m_state); 3491 rc = INVALID_OPERATION; 3492 result.status = rc; 3493 result.request_api = evt; 3494 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3495 m_parent->signalAPIResult(&result); 3496 } 3497 } 3498 break; 3499 case QCAMERA_SM_EVT_STOP_RECORDING: 3500 case QCAMERA_SM_EVT_PREPARE_PREVIEW: 3501 case QCAMERA_SM_EVT_START_PREVIEW: 3502 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW: 3503 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW: 3504 case QCAMERA_SM_EVT_RELEASE: 3505 { 3506 LOGE("Error!! cannot handle evt(%d) in state(%d)", 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 break; 3514 case QCAMERA_SM_EVT_EVT_INTERNAL: 3515 { 3516 qcamera_sm_internal_evt_payload_t *internal_evt = 3517 (qcamera_sm_internal_evt_payload_t *)payload; 3518 switch (internal_evt->evt_type) { 3519 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE: 3520 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data); 3521 break; 3522 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE: 3523 LOGD("Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event"); 3524 if (m_parent->isRetroPicture()) { 3525 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state); 3526 LOGD("Retro picture"); 3527 result.status = NO_ERROR; 3528 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 3529 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3530 m_parent->signalAPIResult(&result); 3531 } 3532 else { 3533 LOGE("Invalid Case for " 3534 "QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event"); 3535 } 3536 break; 3537 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT: 3538 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data); 3539 break; 3540 case QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT: 3541 // This is valid only in Retro picture Mode 3542 if (m_parent->isRetroPicture()) { 3543 LOGD("Received QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event"); 3544 result.status = NO_ERROR; 3545 result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE; 3546 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3547 m_parent->signalAPIResult(&result); 3548 } 3549 else { 3550 LOGD("Wrong Case for QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT event"); 3551 } 3552 break; 3553 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS: 3554 rc = m_parent->processHistogramStats(internal_evt->stats_data); 3555 break; 3556 case QCAMERA_INTERNAL_EVT_CROP_INFO: 3557 rc = m_parent->processZoomEvent(internal_evt->crop_data); 3558 break; 3559 case QCAMERA_INTERNAL_EVT_ASD_UPDATE: 3560 rc = m_parent->processASDUpdate(internal_evt->asd_data); 3561 break; 3562 case QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE: 3563 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 3564 break; 3565 case QCAMERA_INTERNAL_EVT_AWB_UPDATE: 3566 rc = m_parent->transAwbMetaToParams(internal_evt->awb_data); 3567 break; 3568 case QCAMERA_INTERNAL_EVT_AE_UPDATE: 3569 rc = m_parent->processAEInfo(internal_evt->ae_data); 3570 break; 3571 case QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE: 3572 rc = m_parent->processFocusPositionInfo(internal_evt->focus_pos); 3573 break; 3574 case QCAMERA_INTERNAL_EVT_HDR_UPDATE: 3575 rc = m_parent->processHDRData(internal_evt->hdr_data); 3576 break; 3577 case QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK: 3578 rc = m_parent->processRetroAECUnlock(); 3579 break; 3580 case QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE: 3581 rc = m_parent->processZSLCaptureDone(); 3582 break; 3583 default: 3584 break; 3585 } 3586 } 3587 break; 3588 case QCAMERA_SM_EVT_EVT_NOTIFY: 3589 { 3590 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload; 3591 switch (cam_evt->server_event_type) { 3592 case CAM_EVENT_TYPE_DAEMON_DIED: 3593 { 3594 // Send internal events to stop indefinite wait on prepare 3595 // snapshot done event. 3596 result.status = rc; 3597 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT; 3598 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3599 m_parent->signalAPIResult(&result); 3600 3601 result.status = rc; 3602 result.request_api = QCAMERA_SM_EVT_TAKE_PICTURE; 3603 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3604 m_parent->signalAPIResult(&result); 3605 3606 m_parent->sendEvtNotify(CAMERA_MSG_ERROR, 3607 CAMERA_ERROR_SERVER_DIED, 3608 0); 3609 } 3610 break; 3611 case CAM_EVENT_TYPE_CAC_DONE: 3612 if (m_parent->isCACEnabled() || m_parent->mParameters.isOEMFeatEnabled()) { 3613 LOGD("[LONG_SHOT_DBG] : Received CAC Done"); 3614 if ((m_parent->isLongshotEnabled()) 3615 && (!m_parent->isCaptureShutterEnabled())) { 3616 // play shutter sound for longshot 3617 // after CAC stage is done 3618 m_parent->playShutter(); 3619 } 3620 m_parent->mCACDoneReceived = TRUE; 3621 } 3622 break; 3623 default: 3624 LOGE("Invalid internal event %d in state(%d)", 3625 cam_evt->server_event_type, m_state); 3626 break; 3627 } 3628 } 3629 break; 3630 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY: 3631 { 3632 LOGL("Calling Process Jpeg Notify"); 3633 qcamera_jpeg_evt_payload_t *jpeg_job = 3634 (qcamera_jpeg_evt_payload_t *)payload; 3635 rc = m_parent->processJpegNotify(jpeg_job); 3636 } 3637 break; 3638 case QCAMERA_SM_EVT_SNAPSHOT_DONE: 3639 { 3640 LOGL("Snapshot Done"); 3641 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) { 3642 rc = m_parent->cancelPicture(); 3643 } else { 3644 rc = m_parent->cancelLiveSnapshot(); 3645 } 3646 m_state = QCAMERA_SM_STATE_PREVIEWING; 3647 if (m_parent->isRetroPicture()){ 3648 result.status = rc; 3649 result.request_api = evt; 3650 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3651 LOGL("\n Signalling for JPEG snapshot done!!"); 3652 m_parent->signalAPIResult(&result); 3653 3654 } 3655 result.status = rc; 3656 result.request_api = evt; 3657 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3658 m_parent->signalEvtResult(&result); 3659 } 3660 break; 3661 case QCAMERA_SM_EVT_THERMAL_NOTIFY: 3662 { 3663 rc = m_parent->updateThermalLevel(payload); 3664 } 3665 break; 3666 case QCAMERA_SM_EVT_RESTART_STOP_PREVIEW: 3667 { 3668 m_parent->stopPreview(); 3669 result.status = rc; 3670 result.request_api = evt; 3671 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3672 m_parent->signalAPIResult(&result); 3673 } 3674 break; 3675 case QCAMERA_SM_EVT_RESTART_START_PREVIEW: 3676 { 3677 rc = m_parent->preparePreview(); 3678 if (rc == NO_ERROR) { 3679 rc = m_parent->startPreview(); 3680 } 3681 result.status = rc; 3682 result.request_api = evt; 3683 result.result_type = QCAMERA_API_RESULT_TYPE_DEF; 3684 m_parent->signalAPIResult(&result); 3685 } 3686 break; 3687 default: 3688 LOGW("Cannot handle evt(%d) in state(%d)", evt, m_state); 3689 break; 3690 } 3691 3692 return rc; 3693 } 3694 3695 /*=========================================================================== 3696 * FUNCTION : isRecording 3697 * 3698 * DESCRIPTION: check if recording is in process. 3699 * 3700 * PARAMETERS : None 3701 * 3702 * RETURN : true -- recording 3703 * false -- not in recording mode 3704 *==========================================================================*/ 3705 bool QCameraStateMachine::isRecording() 3706 { 3707 switch (m_state) { 3708 case QCAMERA_SM_STATE_RECORDING: 3709 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3710 return true; 3711 default: 3712 return false; 3713 } 3714 } 3715 3716 /*=========================================================================== 3717 * FUNCTION : isPreviewRunning 3718 * 3719 * DESCRIPTION: check if preview is in process. 3720 * 3721 * PARAMETERS : None 3722 * 3723 * RETURN : true -- preview running 3724 * false -- preview stopped 3725 *==========================================================================*/ 3726 bool QCameraStateMachine::isPreviewRunning() 3727 { 3728 switch (m_state) { 3729 case QCAMERA_SM_STATE_PREVIEWING: 3730 case QCAMERA_SM_STATE_RECORDING: 3731 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3732 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 3733 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT: 3734 case QCAMERA_SM_STATE_PREVIEW_READY: 3735 return true; 3736 default: 3737 return false; 3738 } 3739 } 3740 3741 /*=========================================================================== 3742 * FUNCTION : isPreviewReady 3743 * 3744 * DESCRIPTION: check if preview is in ready state. 3745 * 3746 * PARAMETERS : None 3747 * 3748 * RETURN : true -- preview is in ready state 3749 * false -- preview is stopped 3750 *==========================================================================*/ 3751 bool QCameraStateMachine::isPreviewReady() 3752 { 3753 switch (m_state) { 3754 case QCAMERA_SM_STATE_PREVIEW_READY: 3755 return true; 3756 default: 3757 return false; 3758 } 3759 } 3760 3761 /*=========================================================================== 3762 * FUNCTION : isCaptureRunning 3763 * 3764 * DESCRIPTION: check if image capture is in process. 3765 * 3766 * PARAMETERS : None 3767 * 3768 * RETURN : true -- capture running 3769 * false -- capture stopped 3770 *==========================================================================*/ 3771 bool QCameraStateMachine::isCaptureRunning() 3772 { 3773 switch (m_state) { 3774 case QCAMERA_SM_STATE_PIC_TAKING: 3775 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3776 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 3777 return true; 3778 default: 3779 return false; 3780 } 3781 } 3782 /*=========================================================================== 3783 * FUNCTION : isNonZSLCaptureRunning 3784 * 3785 * DESCRIPTION: check if image capture is in process in non ZSL mode. 3786 * 3787 * PARAMETERS : None 3788 * 3789 * RETURN : true -- capture running in non ZSL mode 3790 * false -- Either in not capture mode or captur is not in non ZSL mode 3791 *==========================================================================*/ 3792 bool QCameraStateMachine::isNonZSLCaptureRunning() 3793 { 3794 switch (m_state) { 3795 case QCAMERA_SM_STATE_PIC_TAKING: 3796 return true; 3797 default: 3798 return false; 3799 } 3800 } 3801 3802 /*=========================================================================== 3803 * FUNCTION : dump 3804 * 3805 * DESCRIPTION: Composes a string based on current configuration 3806 * 3807 * PARAMETERS : none 3808 * 3809 * RETURN : Formatted string 3810 *==========================================================================*/ 3811 String8 QCameraStateMachine::dump() 3812 { 3813 String8 str("\n"); 3814 char s[128]; 3815 3816 snprintf(s, 128, "Is Preview Running: %d\n", isPreviewRunning()); 3817 str += s; 3818 3819 snprintf(s, 128, "Is Capture Running: %d\n", isCaptureRunning()); 3820 str += s; 3821 3822 snprintf(s, 128, "Is Non ZSL Capture Running: %d\n", 3823 isNonZSLCaptureRunning()); 3824 str += s; 3825 3826 snprintf(s, 128, "Current State: %d \n", m_state); 3827 str += s; 3828 3829 switch(m_state){ 3830 case QCAMERA_SM_STATE_PREVIEW_STOPPED: 3831 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_STOPPED \n"); 3832 break; 3833 3834 case QCAMERA_SM_STATE_PREVIEW_READY: 3835 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_READY \n"); 3836 break; 3837 3838 case QCAMERA_SM_STATE_PREVIEWING: 3839 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEWING \n"); 3840 break; 3841 3842 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT: 3843 snprintf(s, 128, " QCAMERA_SM_STATE_PREPARE_SNAPSHOT \n"); 3844 break; 3845 3846 case QCAMERA_SM_STATE_PIC_TAKING: 3847 snprintf(s, 128, " QCAMERA_SM_STATE_PIC_TAKING \n"); 3848 break; 3849 3850 case QCAMERA_SM_STATE_RECORDING: 3851 snprintf(s, 128, " QCAMERA_SM_STATE_RECORDING \n"); 3852 break; 3853 3854 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING: 3855 snprintf(s, 128, " QCAMERA_SM_STATE_VIDEO_PIC_TAKING \n"); 3856 break; 3857 3858 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING: 3859 snprintf(s, 128, " QCAMERA_SM_STATE_PREVIEW_PIC_TAKING \n"); 3860 break; 3861 } 3862 str += s; 3863 3864 return str; 3865 } 3866 3867 }; // namespace qcamera 3868