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