blob: 9dc67e9b9a24d26a9a91a9f384a1d46d75f1f48f [file] [log] [blame]
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05301/* Copyright (c) 2012-2014, The Linux Foundataion. All rights reserved.
Muhua Libc9a8082012-11-07 15:51:28 -08002*
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
Muhua Libc9a8082012-11-07 15:51:28 -080032#include <utils/Errors.h>
33#include "QCamera2HWI.h"
34#include "QCameraStateMachine.h"
35
Shuzhen Wang89635cf2012-12-20 13:47:22 -080036namespace qcamera {
Muhua Libc9a8082012-11-07 15:51:28 -080037
Muhua Lida2c4be2012-11-26 09:14:16 -080038/*===========================================================================
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 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -080049void *QCameraStateMachine::smEvtProcRoutine(void *data)
50{
51 int running = 1, ret;
52 QCameraStateMachine *pme = (QCameraStateMachine *)data;
53
54 ALOGD("%s: E", __func__);
55 do {
56 do {
Shuzhen Wang2da44612012-12-20 10:51:57 -080057 ret = cam_sem_wait(&pme->cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -080058 if (ret != 0 && errno != EINVAL) {
Shuzhen Wang2da44612012-12-20 10:51:57 -080059 ALOGE("%s: cam_sem_wait error (%s)",
Muhua Libc9a8082012-11-07 15:51:28 -080060 __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:
Muhua Li31eaee02012-12-11 08:56:45 -080075 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;
Muhua Libc9a8082012-11-07 15:51:28 -080079 case QCAMERA_SM_CMD_TYPE_EVT:
80 pme->stateMachine(node->evt, node->evt_payload);
Muhua Li31eaee02012-12-11 08:56:45 -080081
82 // EVT is async call, so payload need to be free after use
83 free(node->evt_payload);
84 node->evt_payload = NULL;
Muhua Libc9a8082012-11-07 15:51:28 -080085 break;
86 case QCAMERA_SM_CMD_TYPE_EXIT:
87 running = 0;
88 break;
89 default:
90 break;
91 }
Muhua Li31eaee02012-12-11 08:56:45 -080092 free(node);
93 node = NULL;
Muhua Libc9a8082012-11-07 15:51:28 -080094 }
95 } while (running);
96 ALOGD("%s: X", __func__);
97 return NULL;
98}
99
Muhua Lida2c4be2012-11-26 09:14:16 -0800100/*===========================================================================
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 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800110QCameraStateMachine::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;
Shuzhen Wang2da44612012-12-20 10:51:57 -0800117 cam_sem_init(&cmd_sem, 0);
Muhua Libc9a8082012-11-07 15:51:28 -0800118 pthread_create(&cmd_pid,
119 NULL,
120 smEvtProcRoutine,
121 this);
122}
123
Muhua Lida2c4be2012-11-26 09:14:16 -0800124/*===========================================================================
125 * FUNCTION : ~QCameraStateMachine
126 *
127 * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
128 *
129 * PARAMETERS : none
130 *
131 * RETURN : none
132 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800133QCameraStateMachine::~QCameraStateMachine()
134{
135 if (cmd_pid != 0) {
136 qcamera_sm_cmd_t *node =
137 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
138 if (NULL != node) {
139 memset(node, 0, sizeof(qcamera_sm_cmd_t));
140 node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
141
142 api_queue.enqueue((void *)node);
Shuzhen Wang2da44612012-12-20 10:51:57 -0800143 cam_sem_post(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800144
145 /* wait until cmd thread exits */
146 if (pthread_join(cmd_pid, NULL) != 0) {
147 ALOGD("%s: pthread dead already\n", __func__);
148 }
149 }
150 cmd_pid = 0;
151 }
Shuzhen Wang2da44612012-12-20 10:51:57 -0800152 cam_sem_destroy(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800153}
154
Muhua Lida2c4be2012-11-26 09:14:16 -0800155/*===========================================================================
156 * FUNCTION : procAPI
157 *
158 * DESCRIPTION: process incoming API request from framework layer.
159 *
160 * PARAMETERS :
161 * @evt : event to be processed
162 * @api_payload : API payload. Can be NULL if not needed.
163 *
164 * RETURN : int32_t type of status
165 * NO_ERROR -- success
166 * none-zero failure code
167 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800168int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
169 void *api_payload)
170{
171 qcamera_sm_cmd_t *node =
172 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800173 if (NULL == node) {
174 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
175 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800176 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800177
178 memset(node, 0, sizeof(qcamera_sm_cmd_t));
179 node->cmd = QCAMERA_SM_CMD_TYPE_API;
180 node->evt = evt;
181 node->evt_payload = api_payload;
182 if (api_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800183 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800184 return NO_ERROR;
185 } else {
186 free(node);
187 return UNKNOWN_ERROR;
188 }
Muhua Libc9a8082012-11-07 15:51:28 -0800189}
190
Muhua Lida2c4be2012-11-26 09:14:16 -0800191/*===========================================================================
192 * FUNCTION : procEvt
193 *
194 * DESCRIPTION: process incoming envent from mm-camera-interface and
195 * mm-jpeg-interface.
196 *
197 * PARAMETERS :
198 * @evt : event to be processed
199 * @evt_payload : event payload. Can be NULL if not needed.
200 *
201 * RETURN : int32_t type of status
202 * NO_ERROR -- success
203 * none-zero failure code
204 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800205int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
206 void *evt_payload)
207{
208 qcamera_sm_cmd_t *node =
209 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800210 if (NULL == node) {
211 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
212 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800213 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800214
215 memset(node, 0, sizeof(qcamera_sm_cmd_t));
216 node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
217 node->evt = evt;
218 node->evt_payload = evt_payload;
219 if (evt_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800220 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800221 return NO_ERROR;
222 } else {
223 free(node);
224 return UNKNOWN_ERROR;
225 }
Muhua Libc9a8082012-11-07 15:51:28 -0800226}
227
Muhua Lida2c4be2012-11-26 09:14:16 -0800228/*===========================================================================
229 * FUNCTION : stateMachine
230 *
231 * DESCRIPTION: finite state machine entry function. Depends on state,
232 * incoming event will be handled differently.
233 *
234 * PARAMETERS :
235 * @evt : event to be processed
236 * @payload : event payload. Can be NULL if not needed.
237 *
238 * RETURN : int32_t type of status
239 * NO_ERROR -- success
240 * none-zero failure code
241 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800242int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
243{
244 int32_t rc = NO_ERROR;
245 switch (m_state) {
246 case QCAMERA_SM_STATE_PREVIEW_STOPPED:
247 rc = procEvtPreviewStoppedState(evt, payload);
248 break;
249 case QCAMERA_SM_STATE_PREVIEW_READY:
250 rc = procEvtPreviewReadyState(evt, payload);
251 break;
252 case QCAMERA_SM_STATE_PREVIEWING:
253 rc = procEvtPreviewingState(evt, payload);
254 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -0800255 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
256 rc = procEvtPrepareSnapshotState(evt, payload);
257 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800258 case QCAMERA_SM_STATE_PIC_TAKING:
259 rc = procEvtPicTakingState(evt, payload);
260 break;
261 case QCAMERA_SM_STATE_RECORDING:
262 rc = procEvtRecordingState(evt, payload);
263 break;
264 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
265 rc = procEvtVideoPicTakingState(evt, payload);
266 break;
267 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
268 rc = procEvtPreviewPicTakingState(evt, payload);
269 break;
270 default:
271 break;
272 }
273
274 return rc;
275}
276
Muhua Lida2c4be2012-11-26 09:14:16 -0800277/*===========================================================================
278 * FUNCTION : procEvtPreviewStoppedState
279 *
280 * DESCRIPTION: finite state machine function to handle event in state of
281 * QCAMERA_SM_STATE_PREVIEW_STOPPED.
282 *
283 * PARAMETERS :
284 * @evt : event to be processed
285 * @payload : event payload. Can be NULL if not needed.
286 *
287 * RETURN : int32_t type of status
288 * NO_ERROR -- success
289 * none-zero failure code
290 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800291int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
292 void *payload)
293{
294 int32_t rc = NO_ERROR;
295 qcamera_api_result_t result;
296 memset(&result, 0, sizeof(qcamera_api_result_t));
297
298 switch (evt) {
299 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
300 {
301 rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
302 result.status = rc;
303 result.request_api = evt;
304 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
305 m_parent->signalAPIResult(&result);
306 }
307 break;
308 case QCAMERA_SM_EVT_SET_CALLBACKS:
309 {
310 qcamera_sm_evt_setcb_payload_t *setcbs =
311 (qcamera_sm_evt_setcb_payload_t *)payload;
312 rc = m_parent->setCallBacks(setcbs->notify_cb,
313 setcbs->data_cb,
314 setcbs->data_cb_timestamp,
315 setcbs->get_memory,
316 setcbs->user);
317 result.status = rc;
318 result.request_api = evt;
319 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
320 m_parent->signalAPIResult(&result);
321 }
322 break;
323 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
324 {
325 rc = m_parent->enableMsgType(int32_t(payload));
326 result.status = rc;
327 result.request_api = evt;
328 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
329 m_parent->signalAPIResult(&result);
330 }
331 break;
332 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
333 {
334 rc = m_parent->disableMsgType(int32_t(payload));
335 result.status = rc;
336 result.request_api = evt;
337 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
338 m_parent->signalAPIResult(&result);
339 }
340 break;
341 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
342 {
343 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
344 result.status = rc;
345 result.request_api = evt;
346 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
347 result.enabled = enabled;
348 m_parent->signalAPIResult(&result);
349 }
350 break;
351 case QCAMERA_SM_EVT_SET_PARAMS:
352 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800353 bool needRestart = false;
354 rc = m_parent->updateParameters((char*)payload, needRestart);
Emilian Peev9afd73b2013-10-31 08:19:57 -0700355 if (needRestart) {
356 // Clear memory pools
357 m_parent->m_memoryPool.clear();
358 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800359 if (rc == NO_ERROR) {
360 rc = m_parent->commitParameterChanges();
361 }
Muhua Libc9a8082012-11-07 15:51:28 -0800362 result.status = rc;
363 result.request_api = evt;
364 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
365 m_parent->signalAPIResult(&result);
366 }
367 break;
368 case QCAMERA_SM_EVT_GET_PARAMS:
369 {
370 result.params = m_parent->getParameters();
371 rc = NO_ERROR;
372 result.status = rc;
373 result.request_api = evt;
374 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
375 m_parent->signalAPIResult(&result);
376 }
377 break;
378 case QCAMERA_SM_EVT_PUT_PARAMS:
379 {
380 rc = m_parent->putParameters((char*)payload);
381 result.status = rc;
382 result.request_api = evt;
383 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
384 m_parent->signalAPIResult(&result);
385 }
386 break;
387 case QCAMERA_SM_EVT_START_PREVIEW:
388 {
389 if (m_parent->mPreviewWindow == NULL) {
Mansoor Aftab06c809c2013-01-23 19:44:47 -0800390 rc = m_parent->preparePreview();
391 if(rc == NO_ERROR) {
392 // preview window is not set yet, move to previewReady state
393 m_state = QCAMERA_SM_STATE_PREVIEW_READY;
394 } else {
395 ALOGE("%s: preparePreview failed",__func__);
396 }
Muhua Libc9a8082012-11-07 15:51:28 -0800397 } else {
398 rc = m_parent->preparePreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800399 if (rc == NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800400 rc = m_parent->startPreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800401 if (rc != NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800402 m_parent->unpreparePreview();
403 } else {
Muhua Lida2c4be2012-11-26 09:14:16 -0800404 // start preview success, move to previewing state
Muhua Libc9a8082012-11-07 15:51:28 -0800405 m_state = QCAMERA_SM_STATE_PREVIEWING;
406 }
407 }
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_START_NODISPLAY_PREVIEW:
416 {
417 rc = m_parent->preparePreview();
418 if (rc == NO_ERROR) {
419 rc = m_parent->startPreview();
420 if (rc != NO_ERROR) {
421 m_parent->unpreparePreview();
422 } else {
423 m_state = QCAMERA_SM_STATE_PREVIEWING;
424 }
425 }
426 result.status = rc;
427 result.request_api = evt;
428 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
429 m_parent->signalAPIResult(&result);
430 }
431 break;
432 case QCAMERA_SM_EVT_STOP_PREVIEW:
433 {
434 // no op needed here
435 ALOGD("%s: already in preview stopped state, do nothing", __func__);
436 result.status = NO_ERROR;
437 result.request_api = evt;
438 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
439 m_parent->signalAPIResult(&result);
440 }
441 break;
442 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
443 case QCAMERA_SM_EVT_RECORDING_ENABLED:
444 {
445 result.status = NO_ERROR;
446 result.request_api = evt;
447 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
448 result.enabled = 0;
449 m_parent->signalAPIResult(&result);
450 }
451 break;
452 case QCAMERA_SM_EVT_RELEASE:
453 {
454 rc = m_parent->release();
455 result.status = rc;
456 result.request_api = evt;
457 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
458 m_parent->signalAPIResult(&result);
459 }
460 break;
461 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
462 {
463 rc = m_parent->storeMetaDataInBuffers(int(payload));
464 result.status = rc;
465 result.request_api = evt;
466 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
467 m_parent->signalAPIResult(&result);
468 }
469 break;
470 case QCAMERA_SM_EVT_DUMP:
471 {
472 rc = m_parent->dump((int)payload);
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;
Ankit Premrajka3b00dc62012-12-14 18:37:52 -0800479 case QCAMERA_SM_EVT_SEND_COMMAND:
480 {
481 qcamera_sm_evt_command_payload_t *cmd_payload =
482 (qcamera_sm_evt_command_payload_t *)payload;
483 rc = m_parent->sendCommand(cmd_payload->cmd,
484 cmd_payload->arg1,
485 cmd_payload->arg2);
486 result.status = rc;
487 result.request_api = evt;
488 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
489 m_parent->signalAPIResult(&result);
490 }
491 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800492 case QCAMERA_SM_EVT_START_RECORDING:
493 case QCAMERA_SM_EVT_STOP_RECORDING:
494 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800495 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800496 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -0800497 {
498 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
499 rc = INVALID_OPERATION;
500 result.status = rc;
501 result.request_api = evt;
502 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
503 m_parent->signalAPIResult(&result);
504 }
505 break;
Georgi Hristv72d768f2013-10-02 17:47:59 +0300506 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
Muhua Li1612f422013-01-03 11:07:39 -0800507 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Li1612f422013-01-03 11:07:39 -0800508 {
509 // no op needed here
510 ALOGD("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
511 result.status = NO_ERROR;
512 result.request_api = evt;
513 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
514 m_parent->signalAPIResult(&result);
515 }
516 break;
Muhua Li0c14e432013-03-06 15:50:17 -0800517 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
518 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +0530519 bool isAFRunning = m_parent->isAFRunning();
Muhua Li0c14e432013-03-06 15:50:17 -0800520 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +0530521 if (!isAFRunning) {
522 result.status = rc;
523 result.request_api = evt;
524 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
525 m_parent->signalAPIResult(&result);
526 }
Muhua Li0c14e432013-03-06 15:50:17 -0800527 }
528 break;
Muhua Li5858c392013-02-04 17:53:34 -0800529 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
530 {
531 int32_t faceID = 0;
532 qcamera_sm_evt_reg_face_payload_t *reg_payload =
533 (qcamera_sm_evt_reg_face_payload_t *)payload;
534 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
535 reg_payload->config,
536 faceID);
537 result.status = rc;
538 result.request_api = evt;
539 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
540 result.handle = faceID;
541 m_parent->signalAPIResult(&result);
542 }
543 break;
Emilian Peev2ae455e2013-04-18 10:41:56 +0300544 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
545 {
546 rc = m_parent->updateThermalLevel(
547 *(qcamera_thermal_level_enum_t *)&payload);
548 }
549 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800550 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300551 {
552 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
553 switch (cam_evt->server_event_type) {
554 case CAM_EVENT_TYPE_DAEMON_DIED:
555 {
Emilian Peev15690592013-04-19 09:55:40 +0300556 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
557 CAMERA_ERROR_SERVER_DIED,
558 0);
559 }
560 break;
561 default:
562 ALOGE("%s: Invalid internal event %d in state(%d)",
563 __func__, cam_evt->server_event_type, m_state);
564 break;
565 }
566 }
567 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700568 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
569 {
570 // No ops, but need to notify
571 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
572 result.status = rc;
573 result.request_api = evt;
574 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
575 m_parent->signalEvtResult(&result);
576 }
577 break;
Emilian Peev15690592013-04-19 09:55:40 +0300578 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800579 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
580 default:
581 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
582 break;
583 }
584
585 return rc;
586}
587
Muhua Lida2c4be2012-11-26 09:14:16 -0800588/*===========================================================================
589 * FUNCTION : procEvtPreviewReadyState
590 *
591 * DESCRIPTION: finite state machine function to handle event in state of
592 * QCAMERA_SM_STATE_PREVIEW_READY.
593 *
594 * PARAMETERS :
595 * @evt : event to be processed
596 * @payload : event payload. Can be NULL if not needed.
597 *
598 * RETURN : int32_t type of status
599 * NO_ERROR -- success
600 * none-zero failure code
601 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800602int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
603 void *payload)
604{
605 int32_t rc = NO_ERROR;
606 qcamera_api_result_t result;
607 memset(&result, 0, sizeof(qcamera_api_result_t));
608
609 switch (evt) {
610 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
611 {
612 m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
613 if (m_parent->mPreviewWindow != NULL) {
614 rc = m_parent->startPreview();
615 if (rc != NO_ERROR) {
616 m_parent->unpreparePreview();
617 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
618 } else {
619 m_state = QCAMERA_SM_STATE_PREVIEWING;
620 }
621 }
622
623 result.status = rc;
624 result.request_api = evt;
625 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
626 m_parent->signalAPIResult(&result);
627 }
628 break;
629 case QCAMERA_SM_EVT_SET_CALLBACKS:
630 {
631 qcamera_sm_evt_setcb_payload_t *setcbs =
632 (qcamera_sm_evt_setcb_payload_t *)payload;
633 rc = m_parent->setCallBacks(setcbs->notify_cb,
634 setcbs->data_cb,
635 setcbs->data_cb_timestamp,
636 setcbs->get_memory,
637 setcbs->user);
638 result.status = rc;
639 result.request_api = evt;
640 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
641 m_parent->signalAPIResult(&result);
642 }
643 break;
644 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
645 {
646 rc = m_parent->enableMsgType(int32_t(payload));
647 result.status = rc;
648 result.request_api = evt;
649 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
650 m_parent->signalAPIResult(&result);
651 }
652 break;
653 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
654 {
655 rc = m_parent->disableMsgType(int32_t(payload));
656 result.status = rc;
657 result.request_api = evt;
658 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
659 m_parent->signalAPIResult(&result);
660 }
661 break;
662 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
663 {
664 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
665 result.status = rc;
666 result.request_api = evt;
667 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
668 result.enabled = enabled;
669 m_parent->signalAPIResult(&result);
670 }
671 break;
672 case QCAMERA_SM_EVT_SET_PARAMS:
673 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800674 bool needRestart = false;
675 rc = m_parent->updateParameters((char*)payload, needRestart);
676 if (rc == NO_ERROR) {
Muhua Li6d69e932013-01-24 16:39:27 -0800677 if (needRestart) {
678 // need restart preview for parameters to take effect
679 m_parent->unpreparePreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700680 // Clear memory pools
681 m_parent->m_memoryPool.clear();
Muhua Li6d69e932013-01-24 16:39:27 -0800682 // commit parameter changes to server
683 m_parent->commitParameterChanges();
684 // prepare preview again
685 rc = m_parent->preparePreview();
686 if (rc != NO_ERROR) {
687 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
688 }
689 } else {
690 rc = m_parent->commitParameterChanges();
691 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800692 }
Muhua Li6d69e932013-01-24 16:39:27 -0800693
Muhua Libc9a8082012-11-07 15:51:28 -0800694 result.status = rc;
695 result.request_api = evt;
696 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
697 m_parent->signalAPIResult(&result);
698 }
699 break;
700 case QCAMERA_SM_EVT_GET_PARAMS:
701 {
702 result.params = m_parent->getParameters();
703 rc = NO_ERROR;
704 result.status = rc;
705 result.request_api = evt;
706 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
707 m_parent->signalAPIResult(&result);
708 }
709 break;
710 case QCAMERA_SM_EVT_PUT_PARAMS:
711 {
712 rc = m_parent->putParameters((char*)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_START_PREVIEW:
720 {
721 // no ops here
722 rc = NO_ERROR;
723 result.status = rc;
724 result.request_api = evt;
725 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
726 m_parent->signalAPIResult(&result);
727 }
728 break;
729 case QCAMERA_SM_EVT_STOP_PREVIEW:
730 {
731 m_parent->unpreparePreview();
732 rc = 0;
733 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
734 result.status = rc;
735 result.request_api = evt;
736 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
737 m_parent->signalAPIResult(&result);
738 }
739 break;
740 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
741 {
742 rc = NO_ERROR;
743 result.status = rc;
744 result.request_api = evt;
745 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
746 result.enabled = 1;
747 m_parent->signalAPIResult(&result);
748 }
749 break;
750 case QCAMERA_SM_EVT_RECORDING_ENABLED:
751 {
752 rc = 0;
753 result.status = rc;
754 result.request_api = evt;
755 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
756 result.enabled = 0;
757 m_parent->signalAPIResult(&result);
758 }
759 break;
760 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
761 {
762 rc = m_parent->storeMetaDataInBuffers(int(payload));
763 result.status = rc;
764 result.request_api = evt;
765 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
766 m_parent->signalAPIResult(&result);
767 }
768 break;
769 case QCAMERA_SM_EVT_DUMP:
770 {
771 rc = m_parent->dump((int)payload);
772 result.status = rc;
773 result.request_api = evt;
774 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
775 m_parent->signalAPIResult(&result);
776 }
777 break;
778 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
779 {
780 rc = m_parent->autoFocus();
781 result.status = rc;
782 result.request_api = evt;
783 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
784 m_parent->signalAPIResult(&result);
785 }
786 break;
787 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
788 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +0530789 bool isAFRunning = m_parent->isAFRunning();
Muhua Libc9a8082012-11-07 15:51:28 -0800790 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +0530791 if (!isAFRunning) {
792 result.status = rc;
793 result.request_api = evt;
794 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
795 m_parent->signalAPIResult(&result);
796 }
Muhua Libc9a8082012-11-07 15:51:28 -0800797 }
798 break;
799 case QCAMERA_SM_EVT_SEND_COMMAND:
800 {
801 qcamera_sm_evt_command_payload_t *cmd_payload =
802 (qcamera_sm_evt_command_payload_t *)payload;
803 rc = m_parent->sendCommand(cmd_payload->cmd,
804 cmd_payload->arg1,
805 cmd_payload->arg2);
806 result.status = rc;
807 result.request_api = evt;
808 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
809 m_parent->signalAPIResult(&result);
810 }
811 break;
Muhua Li5858c392013-02-04 17:53:34 -0800812 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
813 {
814 int32_t faceID = 0;
815 qcamera_sm_evt_reg_face_payload_t *reg_payload =
816 (qcamera_sm_evt_reg_face_payload_t *)payload;
817 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
818 reg_payload->config,
819 faceID);
820 result.status = rc;
821 result.request_api = evt;
822 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
823 result.handle = faceID;
824 m_parent->signalAPIResult(&result);
825 }
826 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800827 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
828 case QCAMERA_SM_EVT_START_RECORDING:
829 case QCAMERA_SM_EVT_STOP_RECORDING:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800830 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800831 case QCAMERA_SM_EVT_TAKE_PICTURE:
832 case QCAMERA_SM_EVT_CANCEL_PICTURE:
833 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
834 case QCAMERA_SM_EVT_RELEASE:
835 {
836 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
837 rc = INVALID_OPERATION;
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_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300845 {
846 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
847 switch (cam_evt->server_event_type) {
848 case CAM_EVENT_TYPE_DAEMON_DIED:
849 {
Emilian Peev15690592013-04-19 09:55:40 +0300850 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
851 CAMERA_ERROR_SERVER_DIED,
852 0);
853 }
854 break;
855 default:
856 ALOGE("%s: Invalid internal event %d in state(%d)",
857 __func__, cam_evt->server_event_type, m_state);
858 break;
859 }
860 }
861 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700862 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
863 {
864 // No ops, but need to notify
865 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
866 result.status = rc;
867 result.request_api = evt;
868 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
869 m_parent->signalEvtResult(&result);
870 }
871 break;
Emilian Peev15690592013-04-19 09:55:40 +0300872 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800873 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wangaa829ce2013-01-09 14:41:49 -0800874 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -0800875 default:
876 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
877 break;
878 }
879
880 return rc;
881}
882
Muhua Lida2c4be2012-11-26 09:14:16 -0800883/*===========================================================================
884 * FUNCTION : procEvtPreviewingState
885 *
886 * DESCRIPTION: finite state machine function to handle event in state of
887 * QCAMERA_SM_STATE_PREVIEWING.
888 *
889 * PARAMETERS :
890 * @evt : event to be processed
891 * @payload : event payload. Can be NULL if not needed.
892 *
893 * RETURN : int32_t type of status
894 * NO_ERROR -- success
895 * none-zero failure code
896 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800897int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
898 void *payload)
899{
900 int32_t rc = NO_ERROR;
901 qcamera_api_result_t result;
902 memset(&result, 0, sizeof(qcamera_api_result_t));
903
904 switch (evt) {
905 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
906 {
907 // Error setting preview window during previewing
908 ALOGE("Cannot set preview window when preview is running");
909 rc = INVALID_OPERATION;
910 result.status = rc;
911 result.request_api = evt;
912 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
913 m_parent->signalAPIResult(&result);
914 }
915 break;
916 case QCAMERA_SM_EVT_SET_CALLBACKS:
917 {
918 qcamera_sm_evt_setcb_payload_t *setcbs =
919 (qcamera_sm_evt_setcb_payload_t *)payload;
920 rc = m_parent->setCallBacks(setcbs->notify_cb,
921 setcbs->data_cb,
922 setcbs->data_cb_timestamp,
923 setcbs->get_memory,
924 setcbs->user);
925 result.status = rc;
926 result.request_api = evt;
927 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
928 m_parent->signalAPIResult(&result);
929 }
930 break;
931 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
932 {
933 rc = m_parent->enableMsgType(int32_t(payload));
934 result.status = rc;
935 result.request_api = evt;
936 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
937 m_parent->signalAPIResult(&result);
938 }
939 break;
940 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
941 {
942 rc = m_parent->disableMsgType(int32_t(payload));
943 result.status = rc;
944 result.request_api = evt;
945 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
946 m_parent->signalAPIResult(&result);
947 }
948 break;
949 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
950 {
951 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
952 result.status = rc;
953 result.request_api = evt;
954 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
955 result.enabled = enabled;
956 m_parent->signalAPIResult(&result);
957 }
958 break;
959 case QCAMERA_SM_EVT_SET_PARAMS:
960 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800961 bool needRestart = false;
962 rc = m_parent->updateParameters((char*)payload, needRestart);
963 if (rc == NO_ERROR) {
964 if (needRestart) {
965 // need restart preview for parameters to take effect
966 // stop preview
967 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700968 // Clear memory pools
969 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -0800970 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -0800971 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -0800972 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -0800973 rc = m_parent->preparePreview();
974 if (rc == NO_ERROR) {
975 rc = m_parent->startPreview();
976 if (rc != NO_ERROR) {
977 m_parent->unpreparePreview();
978 }
979 }
980 if (rc != NO_ERROR) {
981 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
982 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800983 } else {
984 rc = m_parent->commitParameterChanges();
985 }
986 }
Muhua Libc9a8082012-11-07 15:51:28 -0800987 result.status = rc;
988 result.request_api = evt;
989 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
990 m_parent->signalAPIResult(&result);
991 }
992 break;
993 case QCAMERA_SM_EVT_GET_PARAMS:
994 {
995 result.params = m_parent->getParameters();
996 rc = NO_ERROR;
997 result.status = rc;
998 result.request_api = evt;
999 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1000 m_parent->signalAPIResult(&result);
1001 }
1002 break;
1003 case QCAMERA_SM_EVT_PUT_PARAMS:
1004 {
1005 rc = m_parent->putParameters((char*)payload);
1006 result.status = rc;
1007 result.request_api = evt;
1008 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1009 m_parent->signalAPIResult(&result);
1010 }
1011 break;
1012 case QCAMERA_SM_EVT_START_PREVIEW:
1013 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1014 {
1015 // no ops here
1016 ALOGD("%s: Already in previewing, no ops here to start preview", __func__);
1017 rc = NO_ERROR;
1018 result.status = rc;
1019 result.request_api = evt;
1020 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1021 m_parent->signalAPIResult(&result);
1022 }
1023 break;
1024 case QCAMERA_SM_EVT_STOP_PREVIEW:
1025 {
1026 rc = m_parent->stopPreview();
1027 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1028 result.status = rc;
1029 result.request_api = evt;
1030 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1031 m_parent->signalAPIResult(&result);
1032 }
1033 break;
1034 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1035 {
1036 rc = NO_ERROR;
1037 result.status = rc;
1038 result.request_api = evt;
1039 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1040 result.enabled = 1;
1041 m_parent->signalAPIResult(&result);
1042 }
1043 break;
1044 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1045 {
1046 rc = NO_ERROR;
1047 result.status = rc;
1048 result.request_api = evt;
1049 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1050 result.enabled = 0;
1051 m_parent->signalAPIResult(&result);
1052 }
1053 break;
1054 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1055 {
1056 rc = m_parent->storeMetaDataInBuffers(int(payload));
1057 result.status = rc;
1058 result.request_api = evt;
1059 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1060 m_parent->signalAPIResult(&result);
1061 }
1062 break;
1063 case QCAMERA_SM_EVT_DUMP:
1064 {
1065 rc = m_parent->dump((int)payload);
1066 result.status = rc;
1067 result.request_api = evt;
1068 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1069 m_parent->signalAPIResult(&result);
1070 }
1071 break;
1072 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1073 {
1074 rc = m_parent->autoFocus();
1075 result.status = rc;
1076 result.request_api = evt;
1077 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1078 m_parent->signalAPIResult(&result);
1079 }
1080 break;
1081 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1082 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05301083 bool isAFRunning = m_parent->isAFRunning();
Muhua Libc9a8082012-11-07 15:51:28 -08001084 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05301085 if (!isAFRunning) {
1086 result.status = rc;
1087 result.request_api = evt;
1088 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1089 m_parent->signalAPIResult(&result);
1090 }
Muhua Libc9a8082012-11-07 15:51:28 -08001091 }
1092 break;
1093 case QCAMERA_SM_EVT_START_RECORDING:
1094 {
1095 rc = m_parent->startRecording();
1096 if (rc == NO_ERROR) {
1097 // move state to recording state
1098 m_state = QCAMERA_SM_STATE_RECORDING;
1099 }
1100 result.status = rc;
1101 result.request_api = evt;
1102 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1103 m_parent->signalAPIResult(&result);
1104 }
1105 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001106 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001107 {
Muhua Li0c14e432013-03-06 15:50:17 -08001108 rc = m_parent->prepareHardwareForSnapshot(FALSE);
Muhua Libc9a8082012-11-07 15:51:28 -08001109 if (rc == NO_ERROR) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001110 // Do not signal API result in this case.
1111 // Need to wait for snapshot done in metadta.
1112 m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
1113 } else {
1114 // Do not change state in this case.
1115 ALOGE("%s: prepareHardwareForSnapshot failed %d",
1116 __func__, rc);
1117
1118 result.status = rc;
1119 result.request_api = evt;
1120 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1121 m_parent->signalAPIResult(&result);
1122 }
1123 }
1124 break;
1125 case QCAMERA_SM_EVT_TAKE_PICTURE:
1126 {
Muhua Li8e614bc2013-04-17 17:38:42 -07001127 if ( m_parent->mParameters.getRecordingHintValue() == false) {
Emilian Peeva43000b2013-09-27 14:27:21 -07001128 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001129 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001130 rc = m_parent->takePicture();
1131 if (rc != NO_ERROR) {
1132 // move state to previewing state
1133 m_state = QCAMERA_SM_STATE_PREVIEWING;
1134 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001135 } else {
1136 m_state = QCAMERA_SM_STATE_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001137 rc = m_parent->takePicture();
1138 if (rc != NO_ERROR) {
1139 // move state to preview stopped state
1140 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1141 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001142 }
Muhua Lia9dca012013-05-03 22:37:42 -07001143
1144 result.status = rc;
1145 result.request_api = evt;
1146 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1147 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001148 } else {
Muhua Lia9dca012013-05-03 22:37:42 -07001149 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001150 rc = m_parent->takeLiveSnapshot();
Muhua Lia9dca012013-05-03 22:37:42 -07001151 if (rc != NO_ERROR ) {
1152 m_state = QCAMERA_SM_STATE_PREVIEWING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001153 }
Muhua Lia9dca012013-05-03 22:37:42 -07001154 result.status = rc;
1155 result.request_api = evt;
1156 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1157 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001158 }
Muhua Libc9a8082012-11-07 15:51:28 -08001159 }
1160 break;
1161 case QCAMERA_SM_EVT_SEND_COMMAND:
1162 {
1163 qcamera_sm_evt_command_payload_t *cmd_payload =
1164 (qcamera_sm_evt_command_payload_t *)payload;
1165 rc = m_parent->sendCommand(cmd_payload->cmd,
1166 cmd_payload->arg1,
1167 cmd_payload->arg2);
Emilian Peevd17d2e12014-01-13 12:32:57 +02001168 if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
1169 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
1170 m_parent->stopPreview();
1171 // Clear memory pools
1172 m_parent->m_memoryPool.clear();
1173 // start preview again
1174 rc = m_parent->preparePreview();
1175 if (rc == NO_ERROR) {
1176 rc = m_parent->startPreview();
1177 if (rc != NO_ERROR) {
1178 m_parent->unpreparePreview();
1179 }
1180 }
1181 }
1182 }
Muhua Libc9a8082012-11-07 15:51:28 -08001183 result.status = rc;
1184 result.request_api = evt;
1185 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1186 m_parent->signalAPIResult(&result);
1187 }
1188 break;
Muhua Li5858c392013-02-04 17:53:34 -08001189 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1190 {
1191 int32_t faceID = 0;
1192 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1193 (qcamera_sm_evt_reg_face_payload_t *)payload;
1194 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1195 reg_payload->config,
1196 faceID);
1197 result.status = rc;
1198 result.request_api = evt;
1199 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1200 result.handle = faceID;
1201 m_parent->signalAPIResult(&result);
1202 }
1203 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001204 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1205 case QCAMERA_SM_EVT_STOP_RECORDING:
1206 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1207 case QCAMERA_SM_EVT_RELEASE:
1208 {
1209 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1210 rc = INVALID_OPERATION;
1211 result.status = rc;
1212 result.request_api = evt;
1213 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1214 m_parent->signalAPIResult(&result);
1215 }
1216 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001217 case QCAMERA_SM_EVT_EVT_INTERNAL:
1218 {
1219 qcamera_sm_internal_evt_payload_t *internal_evt =
1220 (qcamera_sm_internal_evt_payload_t *)payload;
1221 switch (internal_evt->evt_type) {
1222 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1223 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1224 break;
Muhua Li510aab22013-05-28 17:00:38 -07001225 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1226 break;
1227 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1228 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1229 break;
1230 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1231 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1232 break;
1233 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1234 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1235 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001236 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1237 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1238 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001239 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1240 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1241 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001242 default:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001243 ALOGE("%s: Invalid internal event %d in state(%d)",
1244 __func__, internal_evt->evt_type, m_state);
Muhua Li31eaee02012-12-11 08:56:45 -08001245 break;
1246 }
1247 }
1248 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001249 case QCAMERA_SM_EVT_EVT_NOTIFY:
1250 {
1251 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1252 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03001253 case CAM_EVENT_TYPE_DAEMON_DIED:
1254 {
Emilian Peev15690592013-04-19 09:55:40 +03001255 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1256 CAMERA_ERROR_SERVER_DIED,
1257 0);
1258 }
1259 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001260 default:
1261 ALOGD("%s: no handling for server evt (%d) at this state",
1262 __func__, cam_evt->server_event_type);
1263 break;
1264 }
1265 }
1266 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001267 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001268 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08001269 rc = m_parent->updateThermalLevel(
1270 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001271 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001272 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08001273 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07001274 {
1275 // No ops, but need to notify
1276 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1277 result.status = rc;
1278 result.request_api = evt;
1279 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1280 m_parent->signalEvtResult(&result);
1281 }
1282 break;
1283 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08001284 default:
1285 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1286 break;
1287 }
1288
1289 return rc;
1290}
1291
Muhua Lida2c4be2012-11-26 09:14:16 -08001292/*===========================================================================
Shuzhen Wang93f24112013-02-20 16:01:42 -08001293 * FUNCTION : procEvtPrepareSnapshotState
1294 *
1295 * DESCRIPTION: finite state machine function to handle event in state of
1296 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
1297 *
1298 * PARAMETERS :
1299 * @evt : event to be processed
1300 * @payload : event payload. Can be NULL if not needed.
1301 *
1302 * RETURN : int32_t type of status
1303 * NO_ERROR -- success
1304 * none-zero failure code
1305 *==========================================================================*/
1306int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
1307 void *payload)
1308{
1309 int32_t rc = NO_ERROR;
1310 qcamera_api_result_t result;
1311 memset(&result, 0, sizeof(qcamera_api_result_t));
1312
1313 switch (evt) {
1314 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1315 case QCAMERA_SM_EVT_SET_CALLBACKS:
1316 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1317 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1318 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1319 case QCAMERA_SM_EVT_SET_PARAMS:
1320 case QCAMERA_SM_EVT_GET_PARAMS:
1321 case QCAMERA_SM_EVT_PUT_PARAMS:
1322 case QCAMERA_SM_EVT_START_PREVIEW:
1323 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1324 case QCAMERA_SM_EVT_STOP_PREVIEW:
1325 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1326 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1327 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1328 case QCAMERA_SM_EVT_DUMP:
1329 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1330 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1331 case QCAMERA_SM_EVT_START_RECORDING:
1332 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Li510aab22013-05-28 17:00:38 -07001333 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001334 case QCAMERA_SM_EVT_SEND_COMMAND:
1335 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1336 case QCAMERA_SM_EVT_STOP_RECORDING:
1337 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1338 case QCAMERA_SM_EVT_RELEASE:
1339 {
1340 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1341 rc = INVALID_OPERATION;
1342 result.status = rc;
1343 result.request_api = evt;
1344 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1345 m_parent->signalAPIResult(&result);
1346 }
1347 break;
1348 case QCAMERA_SM_EVT_EVT_INTERNAL:
1349 {
1350 qcamera_sm_internal_evt_payload_t *internal_evt =
1351 (qcamera_sm_internal_evt_payload_t *)payload;
1352 switch (internal_evt->evt_type) {
Muhua Li6f3c5322013-05-08 17:20:17 -07001353 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1354 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1355 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001356 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1357 ALOGI("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
1358 __func__);
1359 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
1360 m_state = QCAMERA_SM_STATE_PREVIEWING;
1361
1362 result.status = NO_ERROR;
1363 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
1364 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1365 m_parent->signalAPIResult(&result);
1366 break;
Muhua Li510aab22013-05-28 17:00:38 -07001367 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1368 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1369 break;
1370 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1371 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1372 break;
1373 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1374 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1375 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001376 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1377 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1378 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001379 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1380 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1381 break;
1382
Shuzhen Wang93f24112013-02-20 16:01:42 -08001383 default:
1384 ALOGE("%s: Invalid internal event %d in state(%d)",
1385 __func__, internal_evt->evt_type, m_state);
1386 break;
1387 }
1388 }
1389 break;
1390 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +03001391 {
1392 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1393 switch (cam_evt->server_event_type) {
1394 case CAM_EVENT_TYPE_DAEMON_DIED:
1395 {
Emilian Peev15690592013-04-19 09:55:40 +03001396 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1397 CAMERA_ERROR_SERVER_DIED,
1398 0);
1399 }
1400 break;
1401 default:
1402 ALOGE("%s: Invalid internal event %d in state(%d)",
1403 __func__, cam_evt->server_event_type, m_state);
1404 break;
1405 }
1406 }
1407 break;
Muhua Lic9390df2013-05-22 17:54:13 -07001408 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1409 {
1410 // No ops, but need to notify
1411 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1412 result.status = rc;
1413 result.request_api = evt;
1414 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1415 m_parent->signalEvtResult(&result);
1416 }
1417 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001418 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
1419 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001420 default:
1421 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1422 break;
1423 }
1424
1425 return rc;
1426}
1427
1428/*===========================================================================
Muhua Lida2c4be2012-11-26 09:14:16 -08001429 * FUNCTION : procEvtPicTakingState
1430 *
1431 * DESCRIPTION: finite state machine function to handle event in state of
1432 * QCAMERA_SM_STATE_PIC_TAKING.
1433 *
1434 * PARAMETERS :
1435 * @evt : event to be processed
1436 * @payload : event payload. Can be NULL if not needed.
1437 *
1438 * RETURN : int32_t type of status
1439 * NO_ERROR -- success
1440 * none-zero failure code
1441 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001442int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
1443 void *payload)
1444{
1445 int32_t rc = NO_ERROR;
1446 qcamera_api_result_t result;
1447 memset(&result, 0, sizeof(qcamera_api_result_t));
1448
1449 switch (evt) {
1450 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1451 {
1452 // Error setting preview window during previewing
1453 ALOGE("Cannot set preview window when preview is running");
1454 rc = INVALID_OPERATION;
1455 result.status = rc;
1456 result.request_api = evt;
1457 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1458 m_parent->signalAPIResult(&result);
1459 }
1460 break;
1461 case QCAMERA_SM_EVT_SET_CALLBACKS:
1462 {
1463 qcamera_sm_evt_setcb_payload_t *setcbs =
1464 (qcamera_sm_evt_setcb_payload_t *)payload;
1465 rc = m_parent->setCallBacks(setcbs->notify_cb,
1466 setcbs->data_cb,
1467 setcbs->data_cb_timestamp,
1468 setcbs->get_memory,
1469 setcbs->user);
1470 result.status = rc;
1471 result.request_api = evt;
1472 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1473 m_parent->signalAPIResult(&result);
1474 }
1475 break;
1476 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1477 {
1478 rc = m_parent->enableMsgType(int32_t(payload));
1479 result.status = rc;
1480 result.request_api = evt;
1481 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1482 m_parent->signalAPIResult(&result);
1483 }
1484 break;
1485 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1486 {
1487 rc = m_parent->disableMsgType(int32_t(payload));
1488 result.status = rc;
1489 result.request_api = evt;
1490 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1491 m_parent->signalAPIResult(&result);
1492 }
1493 break;
1494 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1495 {
1496 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
1497 result.status = rc;
1498 result.request_api = evt;
1499 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1500 result.enabled = enabled;
1501 m_parent->signalAPIResult(&result);
1502 }
1503 break;
1504 case QCAMERA_SM_EVT_SET_PARAMS:
1505 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001506 bool needRestart = false;
1507 rc = m_parent->updateParameters((char*)payload, needRestart);
1508 if (rc == NO_ERROR) {
1509 rc = m_parent->commitParameterChanges();
1510 }
Muhua Libc9a8082012-11-07 15:51:28 -08001511 result.status = rc;
1512 result.request_api = evt;
1513 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1514 m_parent->signalAPIResult(&result);
1515 }
1516 break;
1517 case QCAMERA_SM_EVT_GET_PARAMS:
1518 {
1519 result.params = m_parent->getParameters();
1520 rc = NO_ERROR;
1521 result.status = rc;
1522 result.request_api = evt;
1523 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1524 m_parent->signalAPIResult(&result);
1525 }
1526 break;
1527 case QCAMERA_SM_EVT_PUT_PARAMS:
1528 {
1529 rc = m_parent->putParameters((char*)payload);
1530 result.status = rc;
1531 result.request_api = evt;
1532 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1533 m_parent->signalAPIResult(&result);
1534 }
1535 break;
1536 case QCAMERA_SM_EVT_STOP_PREVIEW:
1537 {
Muhua Libd1b6122013-03-05 15:25:27 -08001538 // cancel picture first
1539 rc = m_parent->cancelPicture();
1540 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1541
Muhua Libc9a8082012-11-07 15:51:28 -08001542 result.status = rc;
1543 result.request_api = evt;
1544 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1545 m_parent->signalAPIResult(&result);
1546 }
1547 break;
1548 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1549 {
1550 rc = NO_ERROR;
1551 result.status = rc;
1552 result.request_api = evt;
1553 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1554 result.enabled = 0;
1555 m_parent->signalAPIResult(&result);
1556 }
1557 break;
1558 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1559 {
1560 rc = NO_ERROR;
1561 result.status = rc;
1562 result.request_api = evt;
1563 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1564 result.enabled = 0;
1565 m_parent->signalAPIResult(&result);
1566 }
1567 break;
1568 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1569 {
1570 rc = m_parent->storeMetaDataInBuffers(int(payload));
1571 result.status = rc;
1572 result.request_api = evt;
1573 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1574 m_parent->signalAPIResult(&result);
1575 }
1576 break;
1577 case QCAMERA_SM_EVT_DUMP:
1578 {
1579 rc = m_parent->dump((int)payload);
1580 result.status = rc;
1581 result.request_api = evt;
1582 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1583 m_parent->signalAPIResult(&result);
1584 }
1585 break;
1586 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1587 {
1588 rc = m_parent->autoFocus();
1589 result.status = rc;
1590 result.request_api = evt;
1591 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1592 m_parent->signalAPIResult(&result);
1593 }
1594 break;
1595 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1596 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05301597 bool isAFRunning = m_parent->isAFRunning();
Muhua Libc9a8082012-11-07 15:51:28 -08001598 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05301599 if (!isAFRunning) {
1600 result.status = rc;
1601 result.request_api = evt;
1602 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1603 m_parent->signalAPIResult(&result);
1604 }
Muhua Libc9a8082012-11-07 15:51:28 -08001605 }
1606 break;
1607 case QCAMERA_SM_EVT_SEND_COMMAND:
1608 {
1609 qcamera_sm_evt_command_payload_t *cmd_payload =
1610 (qcamera_sm_evt_command_payload_t *)payload;
1611 rc = m_parent->sendCommand(cmd_payload->cmd,
1612 cmd_payload->arg1,
1613 cmd_payload->arg2);
Emilian Peeva43000b2013-09-27 14:27:21 -07001614 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
1615 // move state to previewing state
1616 m_state = QCAMERA_SM_STATE_PREVIEWING;
1617 }
Muhua Libc9a8082012-11-07 15:51:28 -08001618 result.status = rc;
1619 result.request_api = evt;
1620 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1621 m_parent->signalAPIResult(&result);
1622 }
1623 break;
1624 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1625 {
1626 rc = m_parent->cancelPicture();
1627 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
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;
Muhua Li5858c392013-02-04 17:53:34 -08001634 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1635 {
1636 int32_t faceID = 0;
1637 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1638 (qcamera_sm_evt_reg_face_payload_t *)payload;
1639 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1640 reg_payload->config,
1641 faceID);
1642 result.status = rc;
1643 result.request_api = evt;
1644 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1645 result.handle = faceID;
1646 m_parent->signalAPIResult(&result);
1647 }
1648 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001649 case QCAMERA_SM_EVT_TAKE_PICTURE:
Emilian Peeva43000b2013-09-27 14:27:21 -07001650 {
1651 if ( m_parent->isLongshotEnabled() ) {
1652 rc = m_parent->longShot();
1653 } else {
1654 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1655 rc = INVALID_OPERATION;
1656 }
1657
1658 result.status = rc;
1659 result.request_api = evt;
1660 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1661 m_parent->signalAPIResult(&result);
1662 }
1663 break;
1664 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001665 case QCAMERA_SM_EVT_START_RECORDING:
1666 case QCAMERA_SM_EVT_STOP_RECORDING:
1667 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1668 case QCAMERA_SM_EVT_START_PREVIEW:
1669 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1670 case QCAMERA_SM_EVT_RELEASE:
1671 {
1672 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1673 rc = INVALID_OPERATION;
1674 result.status = rc;
1675 result.request_api = evt;
1676 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1677 m_parent->signalAPIResult(&result);
1678 }
1679 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001680 case QCAMERA_SM_EVT_EVT_INTERNAL:
1681 {
1682 qcamera_sm_internal_evt_payload_t *internal_evt =
1683 (qcamera_sm_internal_evt_payload_t *)payload;
1684 switch (internal_evt->evt_type) {
1685 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1686 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1687 break;
Muhua Li510aab22013-05-28 17:00:38 -07001688 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1689 break;
1690 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1691 break;
1692 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1693 break;
1694 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1695 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1696 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001697 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1698 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1699 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001700 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1701 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1702 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001703 default:
1704 break;
1705 }
1706 }
1707 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001708 case QCAMERA_SM_EVT_EVT_NOTIFY:
1709 {
1710 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1711 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02001712 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
1713 {
1714 if ( m_parent->isLongshotEnabled() ) {
1715 if(!m_parent->m_postprocessor.getMultipleStages()) {
1716 m_parent->m_postprocessor.setMultipleStages(true);
1717 }
1718 m_parent->playShutter();
1719 }
1720 }
1721 break;
Emilian Peev15690592013-04-19 09:55:40 +03001722 case CAM_EVENT_TYPE_DAEMON_DIED:
1723 {
Emilian Peev15690592013-04-19 09:55:40 +03001724 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1725 CAMERA_ERROR_SERVER_DIED,
1726 0);
1727 }
1728 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001729 default:
1730 ALOGD("%s: no handling for server evt (%d) at this state",
1731 __func__, cam_evt->server_event_type);
1732 break;
1733 }
1734 }
1735 break;
1736 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
1737 {
1738 qcamera_jpeg_evt_payload_t *jpeg_job =
1739 (qcamera_jpeg_evt_payload_t *)payload;
1740 rc = m_parent->processJpegNotify(jpeg_job);
1741 }
1742 break;
Emilian Peev7d36a812013-11-20 00:15:54 -08001743 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
1744 {
Emilian Peev8a977232013-11-04 07:56:32 -08001745 bool restartPreview = m_parent->isPreviewRestartEnabled();
1746 rc = m_parent->stopCaptureChannel(restartPreview);
1747
1748 if (restartPreview && (NO_ERROR == rc)) {
1749 rc = m_parent->preparePreview();
1750 if (NO_ERROR == rc) {
1751 m_parent->m_bPreviewStarted = true;
1752 rc = m_parent->startPreview();
1753 }
1754 }
1755
Emilian Peev7d36a812013-11-20 00:15:54 -08001756 }
1757 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001758 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1759 {
1760 rc = m_parent->cancelPicture();
Emilian Peev8a977232013-11-04 07:56:32 -08001761
1762 bool restartPreview = m_parent->isPreviewRestartEnabled();
1763 if (restartPreview) {
1764 m_state = QCAMERA_SM_STATE_PREVIEWING;
1765 } else {
1766 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1767 }
1768
Emilian Peev6d90c1f2013-04-12 09:33:06 +03001769 result.status = rc;
1770 result.request_api = evt;
1771 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1772 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001773 }
1774 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001775 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peev2ae455e2013-04-18 10:41:56 +03001776 {
1777 rc = m_parent->updateThermalLevel(
1778 *(qcamera_thermal_level_enum_t *)&payload);
1779 }
1780 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001781 default:
1782 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1783 break;
1784 }
1785
1786 return rc;
1787}
1788
Muhua Lida2c4be2012-11-26 09:14:16 -08001789/*===========================================================================
1790 * FUNCTION : procEvtRecordingState
1791 *
1792 * DESCRIPTION: finite state machine function to handle event in state of
1793 * QCAMERA_SM_STATE_RECORDING.
1794 *
1795 * PARAMETERS :
1796 * @evt : event to be processed
1797 * @payload : event payload. Can be NULL if not needed.
1798 *
1799 * RETURN : int32_t type of status
1800 * NO_ERROR -- success
1801 * none-zero failure code
1802 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001803int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
1804 void *payload)
1805{
1806 int32_t rc = NO_ERROR;
1807 qcamera_api_result_t result;
1808 memset(&result, 0, sizeof(qcamera_api_result_t));
1809
1810 switch (evt) {
Emilian Peev88293e92013-06-07 12:37:18 +03001811 case QCAMERA_SM_EVT_START_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08001812 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1813 {
Emilian Peev88293e92013-06-07 12:37:18 +03001814 // WA: CTS test VideoSnapshot will try to
1815 // start preview during video recording.
1816 ALOGE("CTS video restart op");
1817 rc = NO_ERROR;
Muhua Libc9a8082012-11-07 15:51:28 -08001818 result.status = rc;
1819 result.request_api = evt;
1820 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1821 m_parent->signalAPIResult(&result);
1822 }
1823 break;
1824 case QCAMERA_SM_EVT_SET_CALLBACKS:
1825 {
1826 qcamera_sm_evt_setcb_payload_t *setcbs =
1827 (qcamera_sm_evt_setcb_payload_t *)payload;
1828 rc = m_parent->setCallBacks(setcbs->notify_cb,
1829 setcbs->data_cb,
1830 setcbs->data_cb_timestamp,
1831 setcbs->get_memory,
1832 setcbs->user);
1833 result.status = rc;
1834 result.request_api = evt;
1835 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1836 m_parent->signalAPIResult(&result);
1837 }
1838 break;
1839 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1840 {
1841 rc = m_parent->enableMsgType(int32_t(payload));
1842 result.status = rc;
1843 result.request_api = evt;
1844 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1845 m_parent->signalAPIResult(&result);
1846 }
1847 break;
1848 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1849 {
1850 rc = m_parent->disableMsgType(int32_t(payload));
1851 result.status = rc;
1852 result.request_api = evt;
1853 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1854 m_parent->signalAPIResult(&result);
1855 }
1856 break;
1857 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1858 {
1859 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
1860 result.status = rc;
1861 result.request_api = evt;
1862 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1863 result.enabled = enabled;
1864 m_parent->signalAPIResult(&result);
1865 }
1866 break;
1867 case QCAMERA_SM_EVT_SET_PARAMS:
1868 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001869 bool needRestart = false;
1870 rc = m_parent->updateParameters((char*)payload, needRestart);
1871 if (rc == NO_ERROR) {
1872 if (needRestart) {
1873 // cannot set parameters that requires restart during recording
1874 ALOGE("%s: Cannot set parameters that requires restart during recording",
1875 __func__);
1876 rc = BAD_VALUE;
1877 } else {
1878 rc = m_parent->commitParameterChanges();
1879 }
1880 }
Muhua Libc9a8082012-11-07 15:51:28 -08001881 result.status = rc;
1882 result.request_api = evt;
1883 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1884 m_parent->signalAPIResult(&result);
1885 }
1886 break;
1887 case QCAMERA_SM_EVT_GET_PARAMS:
1888 {
1889 result.params = m_parent->getParameters();
1890 rc = NO_ERROR;
1891 result.status = rc;
1892 result.request_api = evt;
1893 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1894 m_parent->signalAPIResult(&result);
1895 }
1896 break;
1897 case QCAMERA_SM_EVT_PUT_PARAMS:
1898 {
1899 rc = m_parent->putParameters((char*)payload);
1900 result.status = rc;
1901 result.request_api = evt;
1902 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1903 m_parent->signalAPIResult(&result);
1904 }
1905 break;
1906 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1907 {
1908 rc = NO_ERROR;
1909 result.status = rc;
1910 result.request_api = evt;
1911 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1912 result.enabled = 0;
1913 m_parent->signalAPIResult(&result);
1914 }
1915 break;
1916 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1917 {
1918 rc = NO_ERROR;
1919 result.status = rc;
1920 result.request_api = evt;
1921 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1922 result.enabled = 1;
1923 m_parent->signalAPIResult(&result);
1924 }
1925 break;
1926 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1927 {
1928 rc = m_parent->storeMetaDataInBuffers(int(payload));
1929 result.status = rc;
1930 result.request_api = evt;
1931 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1932 m_parent->signalAPIResult(&result);
1933 }
1934 break;
1935 case QCAMERA_SM_EVT_DUMP:
1936 {
1937 rc = m_parent->dump((int)payload);
1938 result.status = rc;
1939 result.request_api = evt;
1940 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1941 m_parent->signalAPIResult(&result);
1942 }
1943 break;
1944 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1945 {
1946 rc = m_parent->autoFocus();
1947 result.status = rc;
1948 result.request_api = evt;
1949 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1950 m_parent->signalAPIResult(&result);
1951 }
1952 break;
1953 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1954 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05301955 bool isAFRunning = m_parent->isAFRunning();
Muhua Libc9a8082012-11-07 15:51:28 -08001956 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05301957 if (!isAFRunning) {
1958 result.status = rc;
1959 result.request_api = evt;
1960 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1961 m_parent->signalAPIResult(&result);
1962 }
Muhua Libc9a8082012-11-07 15:51:28 -08001963 }
1964 break;
1965 case QCAMERA_SM_EVT_SEND_COMMAND:
1966 {
1967 qcamera_sm_evt_command_payload_t *cmd_payload =
1968 (qcamera_sm_evt_command_payload_t *)payload;
1969 rc = m_parent->sendCommand(cmd_payload->cmd,
1970 cmd_payload->arg1,
1971 cmd_payload->arg2);
1972 result.status = rc;
1973 result.request_api = evt;
1974 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1975 m_parent->signalAPIResult(&result);
1976 }
1977 break;
1978 case QCAMERA_SM_EVT_TAKE_PICTURE:
1979 {
Muhua Li1d0c4772013-02-22 15:39:45 -08001980 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
Muhua Libc9a8082012-11-07 15:51:28 -08001981 rc = m_parent->takeLiveSnapshot();
Muhua Li1d0c4772013-02-22 15:39:45 -08001982 if (rc != NO_ERROR) {
1983 m_state = QCAMERA_SM_STATE_RECORDING;
Muhua Libc9a8082012-11-07 15:51:28 -08001984 }
1985 result.status = rc;
1986 result.request_api = evt;
1987 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1988 m_parent->signalAPIResult(&result);
1989 }
1990 break;
1991 case QCAMERA_SM_EVT_START_RECORDING:
1992 {
1993 // no ops here
1994 ALOGD("%s: already in recording state, no ops for start_recording", __func__);
1995 rc = 0;
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_STOP_RECORDING:
2003 {
2004 rc = m_parent->stopRecording();
2005 m_state = QCAMERA_SM_STATE_PREVIEWING;
2006 result.status = rc;
2007 result.request_api = evt;
2008 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2009 m_parent->signalAPIResult(&result);
2010 }
2011 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002012 case QCAMERA_SM_EVT_STOP_PREVIEW:
2013 {
2014 rc = m_parent->stopRecording();
2015 m_state = QCAMERA_SM_STATE_PREVIEWING;
2016
2017 rc = m_parent->stopPreview();
2018 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2019
2020 result.status = rc;
2021 result.request_api = evt;
2022 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2023 m_parent->signalAPIResult(&result);
2024 }
2025 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002026 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2027 {
2028 rc = m_parent->releaseRecordingFrame((const void *)payload);
2029 result.status = rc;
2030 result.request_api = evt;
2031 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2032 m_parent->signalAPIResult(&result);
2033 }
2034 break;
Muhua Li5858c392013-02-04 17:53:34 -08002035 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2036 {
2037 int32_t faceID = 0;
2038 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2039 (qcamera_sm_evt_reg_face_payload_t *)payload;
2040 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2041 reg_payload->config,
2042 faceID);
2043 result.status = rc;
2044 result.request_api = evt;
2045 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2046 result.handle = faceID;
2047 m_parent->signalAPIResult(&result);
2048 }
2049 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08002050 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
2051 {
2052 //In Video snapshot, prepare hardware is a no-op.
2053 result.status = NO_ERROR;
2054 result.request_api = evt;
2055 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2056 m_parent->signalAPIResult(&result);
2057 }
2058 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002059 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -08002060 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002061 case QCAMERA_SM_EVT_RELEASE:
2062 {
2063 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2064 rc = INVALID_OPERATION;
2065 result.status = rc;
2066 result.request_api = evt;
2067 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2068 m_parent->signalAPIResult(&result);
2069 }
2070 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002071 case QCAMERA_SM_EVT_EVT_INTERNAL:
2072 {
2073 qcamera_sm_internal_evt_payload_t *internal_evt =
2074 (qcamera_sm_internal_evt_payload_t *)payload;
2075 switch (internal_evt->evt_type) {
2076 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2077 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2078 break;
Muhua Li510aab22013-05-28 17:00:38 -07002079 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2080 break;
2081 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2082 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2083 break;
2084 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2085 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2086 break;
2087 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2088 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2089 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002090 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2091 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2092 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002093 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2094 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2095 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002096 default:
2097 break;
2098 }
2099 }
2100 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002101 case QCAMERA_SM_EVT_EVT_NOTIFY:
2102 {
2103 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2104 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002105 case CAM_EVENT_TYPE_DAEMON_DIED:
2106 {
Emilian Peev15690592013-04-19 09:55:40 +03002107 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2108 CAMERA_ERROR_SERVER_DIED,
2109 0);
2110 }
2111 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002112 default:
Emilian Peev15690592013-04-19 09:55:40 +03002113 ALOGE("%s: Invalid internal event %d in state(%d)",
2114 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002115 break;
2116 }
2117 }
2118 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002119 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002120 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002121 rc = m_parent->updateThermalLevel(
2122 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002123 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002124 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08002125 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07002126 {
2127 // No ops, but need to notify
2128 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2129 result.status = rc;
2130 result.request_api = evt;
2131 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2132 m_parent->signalEvtResult(&result);
2133 }
2134 break;
2135 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08002136 default:
2137 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2138 break;
2139 }
2140
2141 return rc;
2142}
2143
Muhua Lida2c4be2012-11-26 09:14:16 -08002144/*===========================================================================
2145 * FUNCTION : procEvtVideoPicTakingState
2146 *
2147 * DESCRIPTION: finite state machine function to handle event in state of
2148 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
2149 *
2150 * PARAMETERS :
2151 * @evt : event to be processed
2152 * @payload : event payload. Can be NULL if not needed.
2153 *
2154 * RETURN : int32_t type of status
2155 * NO_ERROR -- success
2156 * none-zero failure code
2157 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002158int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
2159 void *payload)
2160{
2161 int32_t rc = NO_ERROR;
2162 qcamera_api_result_t result;
2163 memset(&result, 0, sizeof(qcamera_api_result_t));
2164
2165 switch (evt) {
2166 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2167 {
2168 // Error setting preview window during previewing
2169 ALOGE("Cannot set preview window when preview is running");
2170 rc = INVALID_OPERATION;
2171 result.status = rc;
2172 result.request_api = evt;
2173 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2174 m_parent->signalAPIResult(&result);
2175 }
2176 break;
2177 case QCAMERA_SM_EVT_SET_CALLBACKS:
2178 {
2179 qcamera_sm_evt_setcb_payload_t *setcbs =
2180 (qcamera_sm_evt_setcb_payload_t *)payload;
2181 rc = m_parent->setCallBacks(setcbs->notify_cb,
2182 setcbs->data_cb,
2183 setcbs->data_cb_timestamp,
2184 setcbs->get_memory,
2185 setcbs->user);
2186 result.status = rc;
2187 result.request_api = evt;
2188 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2189 m_parent->signalAPIResult(&result);
2190 }
2191 break;
2192 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2193 {
2194 rc = m_parent->enableMsgType(int32_t(payload));
2195 result.status = rc;
2196 result.request_api = evt;
2197 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2198 m_parent->signalAPIResult(&result);
2199 }
2200 break;
2201 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2202 {
2203 rc = m_parent->disableMsgType(int32_t(payload));
2204 result.status = rc;
2205 result.request_api = evt;
2206 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2207 m_parent->signalAPIResult(&result);
2208 }
2209 break;
2210 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2211 {
2212 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
2213 result.status = rc;
2214 result.request_api = evt;
2215 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2216 result.enabled = enabled;
2217 m_parent->signalAPIResult(&result);
2218 }
2219 break;
2220 case QCAMERA_SM_EVT_SET_PARAMS:
2221 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002222 bool needRestart = false;
2223 rc = m_parent->updateParameters((char*)payload, needRestart);
2224 if (rc == NO_ERROR) {
2225 if (needRestart) {
2226 // cannot set parameters that requires restart during recording
2227 ALOGE("%s: Cannot set parameters that requires restart during recording",
2228 __func__);
2229 rc = BAD_VALUE;
2230 } else {
2231 rc = m_parent->commitParameterChanges();
2232 }
2233 }
Muhua Libc9a8082012-11-07 15:51:28 -08002234 result.status = rc;
2235 result.request_api = evt;
2236 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2237 m_parent->signalAPIResult(&result);
2238 }
2239 break;
2240 case QCAMERA_SM_EVT_GET_PARAMS:
2241 {
2242 result.params = m_parent->getParameters();
2243 rc = NO_ERROR;
2244 result.status = rc;
2245 result.request_api = evt;
2246 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2247 m_parent->signalAPIResult(&result);
2248 }
2249 break;
2250 case QCAMERA_SM_EVT_PUT_PARAMS:
2251 {
2252 rc = m_parent->putParameters((char*)payload);
2253 result.status = rc;
2254 result.request_api = evt;
2255 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2256 m_parent->signalAPIResult(&result);
2257 }
2258 break;
2259 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2260 {
2261 rc = NO_ERROR;
2262 result.status = rc;
2263 result.request_api = evt;
2264 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2265 result.enabled = 1;
2266 m_parent->signalAPIResult(&result);
2267 }
2268 break;
2269 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2270 {
2271 rc = NO_ERROR;
2272 result.status = rc;
2273 result.request_api = evt;
2274 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2275 result.enabled = 1;
2276 m_parent->signalAPIResult(&result);
2277 }
2278 break;
2279 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2280 {
2281 rc = m_parent->storeMetaDataInBuffers(int(payload));
2282 result.status = rc;
2283 result.request_api = evt;
2284 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2285 m_parent->signalAPIResult(&result);
2286 }
2287 break;
2288 case QCAMERA_SM_EVT_DUMP:
2289 {
2290 rc = m_parent->dump((int)payload);
2291 result.status = rc;
2292 result.request_api = evt;
2293 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2294 m_parent->signalAPIResult(&result);
2295 }
2296 break;
2297 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2298 {
2299 rc = m_parent->autoFocus();
2300 result.status = rc;
2301 result.request_api = evt;
2302 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2303 m_parent->signalAPIResult(&result);
2304 }
2305 break;
2306 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2307 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05302308 bool isAFRunning = m_parent->isAFRunning();
Muhua Libc9a8082012-11-07 15:51:28 -08002309 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05302310 if (!isAFRunning) {
2311 result.status = rc;
2312 result.request_api = evt;
2313 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2314 m_parent->signalAPIResult(&result);
2315 }
Muhua Libc9a8082012-11-07 15:51:28 -08002316 }
2317 break;
2318 case QCAMERA_SM_EVT_SEND_COMMAND:
2319 {
2320 qcamera_sm_evt_command_payload_t *cmd_payload =
2321 (qcamera_sm_evt_command_payload_t *)payload;
2322 rc = m_parent->sendCommand(cmd_payload->cmd,
2323 cmd_payload->arg1,
2324 cmd_payload->arg2);
2325 result.status = rc;
2326 result.request_api = evt;
2327 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2328 m_parent->signalAPIResult(&result);
2329 }
2330 break;
2331 case QCAMERA_SM_EVT_STOP_RECORDING:
2332 {
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302333 rc = m_parent->cancelLiveSnapshot();
2334 m_state = QCAMERA_SM_STATE_RECORDING;
2335
Muhua Libc9a8082012-11-07 15:51:28 -08002336 rc = m_parent->stopRecording();
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302337 m_state = QCAMERA_SM_STATE_PREVIEWING;
2338
Muhua Libc9a8082012-11-07 15:51:28 -08002339 result.status = rc;
2340 result.request_api = evt;
2341 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2342 m_parent->signalAPIResult(&result);
2343 }
2344 break;
2345 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2346 {
2347 rc = m_parent->releaseRecordingFrame((const void *)payload);
2348 result.status = rc;
2349 result.request_api = evt;
2350 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2351 m_parent->signalAPIResult(&result);
2352 }
2353 break;
2354 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2355 {
2356 rc = m_parent->cancelLiveSnapshot();
2357 m_state = QCAMERA_SM_STATE_RECORDING;
2358 result.status = rc;
2359 result.request_api = evt;
2360 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2361 m_parent->signalAPIResult(&result);
2362 }
2363 break;
Muhua Li5858c392013-02-04 17:53:34 -08002364 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2365 {
2366 int32_t faceID = 0;
2367 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2368 (qcamera_sm_evt_reg_face_payload_t *)payload;
2369 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2370 reg_payload->config,
2371 faceID);
2372 result.status = rc;
2373 result.request_api = evt;
2374 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2375 result.handle = faceID;
2376 m_parent->signalAPIResult(&result);
2377 }
2378 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002379 case QCAMERA_SM_EVT_STOP_PREVIEW:
2380 {
2381 rc = m_parent->cancelLiveSnapshot();
2382 m_state = QCAMERA_SM_STATE_RECORDING;
2383
2384 rc = m_parent->stopRecording();
2385 m_state = QCAMERA_SM_STATE_PREVIEWING;
2386
2387 rc = m_parent->stopPreview();
2388 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2389
2390 result.status = rc;
2391 result.request_api = evt;
2392 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2393 m_parent->signalAPIResult(&result);
2394 }
2395 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002396 case QCAMERA_SM_EVT_START_RECORDING:
2397 case QCAMERA_SM_EVT_START_PREVIEW:
2398 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Li510aab22013-05-28 17:00:38 -07002399 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002400 case QCAMERA_SM_EVT_TAKE_PICTURE:
2401 case QCAMERA_SM_EVT_RELEASE:
2402 {
2403 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2404 rc = INVALID_OPERATION;
2405 result.status = rc;
2406 result.request_api = evt;
2407 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2408 m_parent->signalAPIResult(&result);
2409 }
2410 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002411 case QCAMERA_SM_EVT_EVT_INTERNAL:
2412 {
2413 qcamera_sm_internal_evt_payload_t *internal_evt =
2414 (qcamera_sm_internal_evt_payload_t *)payload;
2415 switch (internal_evt->evt_type) {
2416 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2417 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2418 break;
Muhua Li510aab22013-05-28 17:00:38 -07002419 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2420 break;
2421 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2422 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2423 break;
2424 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2425 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2426 break;
2427 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2428 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2429 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002430 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2431 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2432 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002433 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2434 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2435 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002436 default:
2437 break;
2438 }
2439 }
2440 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002441 case QCAMERA_SM_EVT_EVT_NOTIFY:
2442 {
2443 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2444 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002445 case CAM_EVENT_TYPE_DAEMON_DIED:
2446 {
Emilian Peev15690592013-04-19 09:55:40 +03002447 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2448 CAMERA_ERROR_SERVER_DIED,
2449 0);
2450 }
2451 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002452 default:
Emilian Peev15690592013-04-19 09:55:40 +03002453 ALOGE("%s: Invalid internal event %d in state(%d)",
2454 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002455 break;
2456 }
2457 }
2458 break;
2459 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2460 {
2461 qcamera_jpeg_evt_payload_t *jpeg_job =
2462 (qcamera_jpeg_evt_payload_t *)payload;
2463 rc = m_parent->processJpegNotify(jpeg_job);
2464 }
2465 break;
2466 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2467 {
2468 rc = m_parent->cancelLiveSnapshot();
2469 m_state = QCAMERA_SM_STATE_RECORDING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002470 result.status = rc;
2471 result.request_api = evt;
2472 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2473 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002474 }
2475 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002476 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002477 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002478 rc = m_parent->updateThermalLevel(
2479 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002480 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002481 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002482 default:
2483 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2484 break;
2485 }
2486
2487 return rc;
2488}
2489
Muhua Lida2c4be2012-11-26 09:14:16 -08002490/*===========================================================================
2491 * FUNCTION : procEvtPreviewPicTakingState
2492 *
2493 * DESCRIPTION: finite state machine function to handle event in state of
2494 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
2495 *
2496 * PARAMETERS :
2497 * @evt : event to be processed
2498 * @payload : event payload. Can be NULL if not needed.
2499 *
2500 * RETURN : int32_t type of status
2501 * NO_ERROR -- success
2502 * none-zero failure code
2503 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002504int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
2505 void *payload)
2506{
2507 int32_t rc = NO_ERROR;
2508 qcamera_api_result_t result;
2509 memset(&result, 0, sizeof(qcamera_api_result_t));
2510
2511 switch (evt) {
2512 case QCAMERA_SM_EVT_SET_CALLBACKS:
2513 {
2514 qcamera_sm_evt_setcb_payload_t *setcbs =
2515 (qcamera_sm_evt_setcb_payload_t *)payload;
2516 rc = m_parent->setCallBacks(setcbs->notify_cb,
2517 setcbs->data_cb,
2518 setcbs->data_cb_timestamp,
2519 setcbs->get_memory,
2520 setcbs->user);
2521 result.status = rc;
2522 result.request_api = evt;
2523 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2524 m_parent->signalAPIResult(&result);
2525 }
2526 break;
2527 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2528 {
2529 rc = m_parent->enableMsgType(int32_t(payload));
2530 result.status = rc;
2531 result.request_api = evt;
2532 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2533 m_parent->signalAPIResult(&result);
2534 }
2535 break;
2536 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2537 {
2538 rc = m_parent->disableMsgType(int32_t(payload));
2539 result.status = rc;
2540 result.request_api = evt;
2541 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2542 m_parent->signalAPIResult(&result);
2543 }
2544 break;
2545 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2546 {
2547 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
2548 result.status = rc;
2549 result.request_api = evt;
2550 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2551 result.enabled = enabled;
2552 m_parent->signalAPIResult(&result);
2553 }
2554 break;
2555 case QCAMERA_SM_EVT_SET_PARAMS:
2556 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002557 bool needRestart = false;
2558 rc = m_parent->updateParameters((char*)payload, needRestart);
2559 if (rc == NO_ERROR) {
2560 if (needRestart) {
2561 // need restart preview for parameters to take effect
2562 // stop preview
2563 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -07002564 // Clear memory pools
2565 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -08002566 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -08002567 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -08002568 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -08002569 rc = m_parent->preparePreview();
2570 if (rc == NO_ERROR) {
2571 rc = m_parent->startPreview();
2572 if (rc != NO_ERROR) {
2573 m_parent->unpreparePreview();
2574 }
2575 }
2576 if (rc != NO_ERROR) {
2577 m_state = QCAMERA_SM_STATE_PIC_TAKING;
2578 }
Muhua Lida2c4be2012-11-26 09:14:16 -08002579 } else {
2580 rc = m_parent->commitParameterChanges();
2581 }
2582 }
Muhua Libc9a8082012-11-07 15:51:28 -08002583 result.status = rc;
2584 result.request_api = evt;
2585 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2586 m_parent->signalAPIResult(&result);
2587 }
2588 break;
2589 case QCAMERA_SM_EVT_GET_PARAMS:
2590 {
2591 result.params = m_parent->getParameters();
2592 rc = NO_ERROR;
2593 result.status = rc;
2594 result.request_api = evt;
2595 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2596 m_parent->signalAPIResult(&result);
2597 }
2598 break;
2599 case QCAMERA_SM_EVT_PUT_PARAMS:
2600 {
2601 rc = m_parent->putParameters((char*)payload);
2602 result.status = rc;
2603 result.request_api = evt;
2604 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2605 m_parent->signalAPIResult(&result);
2606 }
2607 break;
2608 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2609 {
2610 rc = NO_ERROR;
2611 result.status = rc;
2612 result.request_api = evt;
2613 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2614 result.enabled = 1;
2615 m_parent->signalAPIResult(&result);
2616 }
2617 break;
2618 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2619 {
2620 rc = NO_ERROR;
2621 result.status = rc;
2622 result.request_api = evt;
2623 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2624 result.enabled = 0;
2625 m_parent->signalAPIResult(&result);
2626 }
2627 break;
2628 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2629 {
2630 rc = m_parent->storeMetaDataInBuffers(int(payload));
2631 result.status = rc;
2632 result.request_api = evt;
2633 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2634 m_parent->signalAPIResult(&result);
2635 }
2636 break;
2637 case QCAMERA_SM_EVT_DUMP:
2638 {
2639 rc = m_parent->dump((int)payload);
2640 result.status = rc;
2641 result.request_api = evt;
2642 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2643 m_parent->signalAPIResult(&result);
2644 }
2645 break;
2646 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2647 {
2648 rc = m_parent->autoFocus();
2649 result.status = rc;
2650 result.request_api = evt;
2651 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2652 m_parent->signalAPIResult(&result);
2653 }
2654 break;
2655 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2656 {
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05302657 bool isAFRunning = m_parent->isAFRunning();
Muhua Libc9a8082012-11-07 15:51:28 -08002658 rc = m_parent->cancelAutoFocus();
Sai Kumar Sanagavarapudd98a152014-01-06 19:23:50 +05302659 if (!isAFRunning) {
2660 result.status = rc;
2661 result.request_api = evt;
2662 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2663 m_parent->signalAPIResult(&result);
2664 }
Muhua Libc9a8082012-11-07 15:51:28 -08002665 }
2666 break;
2667 case QCAMERA_SM_EVT_SEND_COMMAND:
2668 {
2669 qcamera_sm_evt_command_payload_t *cmd_payload =
2670 (qcamera_sm_evt_command_payload_t *)payload;
2671 rc = m_parent->sendCommand(cmd_payload->cmd,
2672 cmd_payload->arg1,
2673 cmd_payload->arg2);
Emilian Peeve32d03b2013-08-13 16:15:41 +03002674 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
2675 // move state to previewing state
2676 m_state = QCAMERA_SM_STATE_PREVIEWING;
2677 }
Muhua Libc9a8082012-11-07 15:51:28 -08002678 result.status = rc;
2679 result.request_api = evt;
2680 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2681 m_parent->signalAPIResult(&result);
2682 }
2683 break;
2684 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2685 {
2686 rc = m_parent->releaseRecordingFrame((const void *)payload);
2687 result.status = rc;
2688 result.request_api = evt;
2689 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2690 m_parent->signalAPIResult(&result);
2691 }
2692 break;
2693 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2694 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002695 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002696 rc = m_parent->cancelPicture();
2697 } else {
2698 rc = m_parent->cancelLiveSnapshot();
2699 }
Muhua Libc9a8082012-11-07 15:51:28 -08002700 m_state = QCAMERA_SM_STATE_PREVIEWING;
2701 result.status = rc;
2702 result.request_api = evt;
2703 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2704 m_parent->signalAPIResult(&result);
2705 }
2706 break;
2707 case QCAMERA_SM_EVT_STOP_PREVIEW:
2708 {
Muhua Libd1b6122013-03-05 15:25:27 -08002709 if (m_parent->isZSLMode()) {
2710 // cancel picture first
2711 rc = m_parent->cancelPicture();
2712 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
Emilian Peeva43000b2013-09-27 14:27:21 -07002713 } else if (m_parent->isLongshotEnabled()) {
2714 // just cancel picture
2715 rc = m_parent->cancelPicture();
Muhua Libd1b6122013-03-05 15:25:27 -08002716 } else {
2717 rc = m_parent->cancelLiveSnapshot();
2718 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
2719 }
2720 // unprepare preview
2721 m_parent->unpreparePreview();
2722 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
Muhua Libc9a8082012-11-07 15:51:28 -08002723 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_START_RECORDING:
2730 {
Muhua Licf1cf672013-05-10 09:42:50 -07002731 if (m_parent->isZSLMode()) {
2732 ALOGE("%s: cannot handle evt(%d) in state(%d) in ZSL mode",
2733 __func__, evt, m_state);
2734 rc = INVALID_OPERATION;
Emilian Peeva43000b2013-09-27 14:27:21 -07002735 } else if (m_parent->isLongshotEnabled()) {
2736 ALOGE("%s: cannot handle evt(%d) in state(%d) in Longshot mode",
2737 __func__, evt, m_state);
2738 rc = INVALID_OPERATION;
Muhua Licf1cf672013-05-10 09:42:50 -07002739 } else {
2740 rc = m_parent->startRecording();
2741 if (rc == NO_ERROR) {
2742 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
2743 }
Muhua Libc9a8082012-11-07 15:51:28 -08002744 }
2745 result.status = rc;
2746 result.request_api = evt;
2747 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2748 m_parent->signalAPIResult(&result);
2749 }
2750 break;
Muhua Li5858c392013-02-04 17:53:34 -08002751 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2752 {
2753 int32_t faceID = 0;
2754 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2755 (qcamera_sm_evt_reg_face_payload_t *)payload;
2756 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2757 reg_payload->config,
2758 faceID);
2759 result.status = rc;
2760 result.request_api = evt;
2761 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2762 result.handle = faceID;
2763 m_parent->signalAPIResult(&result);
2764 }
2765 break;
Emilian Peeve32d03b2013-08-13 16:15:41 +03002766 case QCAMERA_SM_EVT_TAKE_PICTURE:
2767 {
2768 if ( m_parent->isLongshotEnabled() ) {
2769 rc = m_parent->longShot();
2770 } else {
2771 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2772 rc = INVALID_OPERATION;
2773 }
2774
2775 result.status = rc;
2776 result.request_api = evt;
2777 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2778 m_parent->signalAPIResult(&result);
2779 }
2780 break;
2781 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002782 case QCAMERA_SM_EVT_STOP_RECORDING:
2783 case QCAMERA_SM_EVT_START_PREVIEW:
2784 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002785 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2786 case QCAMERA_SM_EVT_RELEASE:
2787 {
2788 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2789 rc = INVALID_OPERATION;
2790 result.status = rc;
2791 result.request_api = evt;
2792 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2793 m_parent->signalAPIResult(&result);
2794 }
2795 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002796 case QCAMERA_SM_EVT_EVT_INTERNAL:
2797 {
2798 qcamera_sm_internal_evt_payload_t *internal_evt =
2799 (qcamera_sm_internal_evt_payload_t *)payload;
2800 switch (internal_evt->evt_type) {
2801 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2802 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2803 break;
Muhua Li510aab22013-05-28 17:00:38 -07002804 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2805 break;
2806 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2807 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2808 break;
2809 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2810 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2811 break;
2812 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2813 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2814 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002815 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2816 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2817 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002818 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2819 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2820 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002821 default:
2822 break;
2823 }
2824 }
2825 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002826 case QCAMERA_SM_EVT_EVT_NOTIFY:
2827 {
2828 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2829 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02002830 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
2831 {
2832 if ( m_parent->isLongshotEnabled() ) {
2833 if(!m_parent->m_postprocessor.getMultipleStages()) {
2834 m_parent->m_postprocessor.setMultipleStages(true);
2835 }
2836 m_parent->playShutter();
2837 }
2838 }
2839 break;
Emilian Peev15690592013-04-19 09:55:40 +03002840 case CAM_EVENT_TYPE_DAEMON_DIED:
2841 {
Emilian Peev15690592013-04-19 09:55:40 +03002842 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2843 CAMERA_ERROR_SERVER_DIED,
2844 0);
2845 }
2846 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002847 default:
Emilian Peev15690592013-04-19 09:55:40 +03002848 ALOGE("%s: Invalid internal event %d in state(%d)",
2849 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002850 break;
2851 }
2852 }
2853 break;
2854 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2855 {
2856 qcamera_jpeg_evt_payload_t *jpeg_job =
2857 (qcamera_jpeg_evt_payload_t *)payload;
2858 rc = m_parent->processJpegNotify(jpeg_job);
2859 }
2860 break;
2861 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2862 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002863 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002864 rc = m_parent->cancelPicture();
2865 } else {
2866 rc = m_parent->cancelLiveSnapshot();
2867 }
Muhua Libc9a8082012-11-07 15:51:28 -08002868 m_state = QCAMERA_SM_STATE_PREVIEWING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002869 result.status = rc;
2870 result.request_api = evt;
2871 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2872 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002873 }
2874 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002875 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002876 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002877 rc = m_parent->updateThermalLevel(
2878 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002879 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002880 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002881 default:
2882 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2883 break;
2884 }
2885
2886 return rc;
2887}
2888
Muhua Lida2c4be2012-11-26 09:14:16 -08002889/*===========================================================================
2890 * FUNCTION : isPreviewRunning
2891 *
2892 * DESCRIPTION: check if preview is in process.
2893 *
2894 * PARAMETERS : None
2895 *
2896 * RETURN : true -- preview running
2897 * false -- preview stopped
2898 *==========================================================================*/
2899bool QCameraStateMachine::isPreviewRunning()
2900{
2901 switch (m_state) {
2902 case QCAMERA_SM_STATE_PREVIEWING:
2903 case QCAMERA_SM_STATE_RECORDING:
2904 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2905 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
Muhua Libf818e52013-04-23 18:05:26 -07002906 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
chiza8491aa2014-03-21 13:02:39 +08002907 case QCAMERA_SM_STATE_PREVIEW_READY:
Muhua Lida2c4be2012-11-26 09:14:16 -08002908 return true;
2909 default:
2910 return false;
2911 }
2912}
2913
Emilian Peeve32d03b2013-08-13 16:15:41 +03002914/*===========================================================================
2915 * FUNCTION : isCaptureRunning
2916 *
2917 * DESCRIPTION: check if image capture is in process.
2918 *
2919 * PARAMETERS : None
2920 *
2921 * RETURN : true -- capture running
2922 * false -- capture stopped
2923 *==========================================================================*/
2924bool QCameraStateMachine::isCaptureRunning()
2925{
2926 switch (m_state) {
2927 case QCAMERA_SM_STATE_PIC_TAKING:
2928 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2929 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2930 return true;
2931 default:
2932 return false;
2933 }
2934}
Vijay kumar Tumatifa8d9b32013-09-23 16:09:07 +05302935/*===========================================================================
2936 * FUNCTION : isNonZSLCaptureRunning
2937 *
2938 * DESCRIPTION: check if image capture is in process in non ZSL mode.
2939 *
2940 * PARAMETERS : None
2941 *
2942 * RETURN : true -- capture running in non ZSL mode
2943 * false -- Either in not capture mode or captur is not in non ZSL mode
2944 *==========================================================================*/
2945bool QCameraStateMachine::isNonZSLCaptureRunning()
2946{
2947 switch (m_state) {
2948 case QCAMERA_SM_STATE_PIC_TAKING:
2949 return true;
2950 default:
2951 return false;
2952 }
2953}
2954
Emilian Peeve32d03b2013-08-13 16:15:41 +03002955
Shuzhen Wang89635cf2012-12-20 13:47:22 -08002956}; // namespace qcamera