blob: 79961e3a74cfde5300bc3ee71b9fe861dcb715c7 [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
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +053054 CDBG_HIGH("%s: E", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -080055 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);
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +053096 CDBG_HIGH("%s: X", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -080097 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);
Vladimir Petrovd942f542014-06-13 10:49:55 +0300122 pthread_setname_np(cmd_pid, "CAM_stMachine");
Muhua Libc9a8082012-11-07 15:51:28 -0800123}
124
Muhua Lida2c4be2012-11-26 09:14:16 -0800125/*===========================================================================
126 * FUNCTION : ~QCameraStateMachine
127 *
128 * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
129 *
130 * PARAMETERS : none
131 *
132 * RETURN : none
133 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800134QCameraStateMachine::~QCameraStateMachine()
135{
Emilian Peevb36bee32014-07-07 15:00:37 +0300136 cam_sem_destroy(&cmd_sem);
137}
138
139/*===========================================================================
140 * FUNCTION : releaseThread
141 *
142 * DESCRIPTION: Sends an exit command and terminates the state machine thread
143 *
144 * PARAMETERS : none
145 *
146 * RETURN : none
147 *==========================================================================*/
148void QCameraStateMachine::releaseThread()
149{
Muhua Libc9a8082012-11-07 15:51:28 -0800150 if (cmd_pid != 0) {
151 qcamera_sm_cmd_t *node =
152 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
153 if (NULL != node) {
154 memset(node, 0, sizeof(qcamera_sm_cmd_t));
155 node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
156
157 api_queue.enqueue((void *)node);
Shuzhen Wang2da44612012-12-20 10:51:57 -0800158 cam_sem_post(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800159
160 /* wait until cmd thread exits */
161 if (pthread_join(cmd_pid, NULL) != 0) {
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530162 CDBG_HIGH("%s: pthread dead already\n", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -0800163 }
164 }
165 cmd_pid = 0;
166 }
Muhua Libc9a8082012-11-07 15:51:28 -0800167}
168
Muhua Lida2c4be2012-11-26 09:14:16 -0800169/*===========================================================================
170 * FUNCTION : procAPI
171 *
172 * DESCRIPTION: process incoming API request from framework layer.
173 *
174 * PARAMETERS :
175 * @evt : event to be processed
176 * @api_payload : API payload. Can be NULL if not needed.
177 *
178 * RETURN : int32_t type of status
179 * NO_ERROR -- success
180 * none-zero failure code
181 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800182int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
183 void *api_payload)
184{
185 qcamera_sm_cmd_t *node =
186 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800187 if (NULL == node) {
188 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
189 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800190 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800191
192 memset(node, 0, sizeof(qcamera_sm_cmd_t));
193 node->cmd = QCAMERA_SM_CMD_TYPE_API;
194 node->evt = evt;
195 node->evt_payload = api_payload;
196 if (api_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800197 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800198 return NO_ERROR;
199 } else {
200 free(node);
201 return UNKNOWN_ERROR;
202 }
Muhua Libc9a8082012-11-07 15:51:28 -0800203}
204
Muhua Lida2c4be2012-11-26 09:14:16 -0800205/*===========================================================================
206 * FUNCTION : procEvt
207 *
208 * DESCRIPTION: process incoming envent from mm-camera-interface and
209 * mm-jpeg-interface.
210 *
211 * PARAMETERS :
212 * @evt : event to be processed
213 * @evt_payload : event payload. Can be NULL if not needed.
214 *
215 * RETURN : int32_t type of status
216 * NO_ERROR -- success
217 * none-zero failure code
218 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800219int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
220 void *evt_payload)
221{
222 qcamera_sm_cmd_t *node =
223 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800224 if (NULL == node) {
225 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
226 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800227 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800228
229 memset(node, 0, sizeof(qcamera_sm_cmd_t));
230 node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
231 node->evt = evt;
232 node->evt_payload = evt_payload;
233 if (evt_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800234 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800235 return NO_ERROR;
236 } else {
237 free(node);
238 return UNKNOWN_ERROR;
239 }
Muhua Libc9a8082012-11-07 15:51:28 -0800240}
241
Muhua Lida2c4be2012-11-26 09:14:16 -0800242/*===========================================================================
243 * FUNCTION : stateMachine
244 *
245 * DESCRIPTION: finite state machine entry function. Depends on state,
246 * incoming event will be handled differently.
247 *
248 * PARAMETERS :
249 * @evt : event to be processed
250 * @payload : event payload. Can be NULL if not needed.
251 *
252 * RETURN : int32_t type of status
253 * NO_ERROR -- success
254 * none-zero failure code
255 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800256int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
257{
258 int32_t rc = NO_ERROR;
259 switch (m_state) {
260 case QCAMERA_SM_STATE_PREVIEW_STOPPED:
261 rc = procEvtPreviewStoppedState(evt, payload);
262 break;
263 case QCAMERA_SM_STATE_PREVIEW_READY:
264 rc = procEvtPreviewReadyState(evt, payload);
265 break;
266 case QCAMERA_SM_STATE_PREVIEWING:
267 rc = procEvtPreviewingState(evt, payload);
268 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -0800269 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
270 rc = procEvtPrepareSnapshotState(evt, payload);
271 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800272 case QCAMERA_SM_STATE_PIC_TAKING:
273 rc = procEvtPicTakingState(evt, payload);
274 break;
275 case QCAMERA_SM_STATE_RECORDING:
276 rc = procEvtRecordingState(evt, payload);
277 break;
278 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
279 rc = procEvtVideoPicTakingState(evt, payload);
280 break;
281 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
282 rc = procEvtPreviewPicTakingState(evt, payload);
283 break;
284 default:
285 break;
286 }
287
288 return rc;
289}
290
Muhua Lida2c4be2012-11-26 09:14:16 -0800291/*===========================================================================
292 * FUNCTION : procEvtPreviewStoppedState
293 *
294 * DESCRIPTION: finite state machine function to handle event in state of
295 * QCAMERA_SM_STATE_PREVIEW_STOPPED.
296 *
297 * PARAMETERS :
298 * @evt : event to be processed
299 * @payload : event payload. Can be NULL if not needed.
300 *
301 * RETURN : int32_t type of status
302 * NO_ERROR -- success
303 * none-zero failure code
304 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800305int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
306 void *payload)
307{
308 int32_t rc = NO_ERROR;
309 qcamera_api_result_t result;
310 memset(&result, 0, sizeof(qcamera_api_result_t));
311
312 switch (evt) {
313 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
314 {
315 rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
316 result.status = rc;
317 result.request_api = evt;
318 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
319 m_parent->signalAPIResult(&result);
320 }
321 break;
322 case QCAMERA_SM_EVT_SET_CALLBACKS:
323 {
324 qcamera_sm_evt_setcb_payload_t *setcbs =
325 (qcamera_sm_evt_setcb_payload_t *)payload;
326 rc = m_parent->setCallBacks(setcbs->notify_cb,
327 setcbs->data_cb,
328 setcbs->data_cb_timestamp,
329 setcbs->get_memory,
330 setcbs->user);
331 result.status = rc;
332 result.request_api = evt;
333 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
334 m_parent->signalAPIResult(&result);
335 }
336 break;
337 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
338 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300339 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800340 result.status = rc;
341 result.request_api = evt;
342 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
343 m_parent->signalAPIResult(&result);
344 }
345 break;
346 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
347 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300348 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800349 result.status = rc;
350 result.request_api = evt;
351 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
352 m_parent->signalAPIResult(&result);
353 }
354 break;
355 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
356 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300357 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800358 result.status = rc;
359 result.request_api = evt;
360 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
361 result.enabled = enabled;
362 m_parent->signalAPIResult(&result);
363 }
364 break;
365 case QCAMERA_SM_EVT_SET_PARAMS:
366 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800367 bool needRestart = false;
368 rc = m_parent->updateParameters((char*)payload, needRestart);
Emilian Peev9afd73b2013-10-31 08:19:57 -0700369 if (needRestart) {
370 // Clear memory pools
371 m_parent->m_memoryPool.clear();
372 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800373 if (rc == NO_ERROR) {
374 rc = m_parent->commitParameterChanges();
375 }
Muhua Libc9a8082012-11-07 15:51:28 -0800376 result.status = rc;
377 result.request_api = evt;
378 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
379 m_parent->signalAPIResult(&result);
380 }
381 break;
382 case QCAMERA_SM_EVT_GET_PARAMS:
383 {
384 result.params = m_parent->getParameters();
385 rc = NO_ERROR;
386 result.status = rc;
387 result.request_api = evt;
388 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
389 m_parent->signalAPIResult(&result);
390 }
391 break;
392 case QCAMERA_SM_EVT_PUT_PARAMS:
393 {
394 rc = m_parent->putParameters((char*)payload);
395 result.status = rc;
396 result.request_api = evt;
397 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
398 m_parent->signalAPIResult(&result);
399 }
400 break;
401 case QCAMERA_SM_EVT_START_PREVIEW:
402 {
403 if (m_parent->mPreviewWindow == NULL) {
Mansoor Aftab06c809c2013-01-23 19:44:47 -0800404 rc = m_parent->preparePreview();
405 if(rc == NO_ERROR) {
406 // preview window is not set yet, move to previewReady state
407 m_state = QCAMERA_SM_STATE_PREVIEW_READY;
408 } else {
409 ALOGE("%s: preparePreview failed",__func__);
410 }
Muhua Libc9a8082012-11-07 15:51:28 -0800411 } else {
412 rc = m_parent->preparePreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800413 if (rc == NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800414 rc = m_parent->startPreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800415 if (rc != NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800416 m_parent->unpreparePreview();
417 } else {
Muhua Lida2c4be2012-11-26 09:14:16 -0800418 // start preview success, move to previewing state
Muhua Libc9a8082012-11-07 15:51:28 -0800419 m_state = QCAMERA_SM_STATE_PREVIEWING;
420 }
421 }
422 }
423 result.status = rc;
424 result.request_api = evt;
425 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
426 m_parent->signalAPIResult(&result);
427 }
428 break;
429 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
430 {
431 rc = m_parent->preparePreview();
432 if (rc == NO_ERROR) {
433 rc = m_parent->startPreview();
434 if (rc != NO_ERROR) {
435 m_parent->unpreparePreview();
436 } else {
437 m_state = QCAMERA_SM_STATE_PREVIEWING;
438 }
439 }
440 result.status = rc;
441 result.request_api = evt;
442 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
443 m_parent->signalAPIResult(&result);
444 }
445 break;
446 case QCAMERA_SM_EVT_STOP_PREVIEW:
447 {
448 // no op needed here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530449 CDBG_HIGH("%s: already in preview stopped state, do nothing", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -0800450 result.status = NO_ERROR;
451 result.request_api = evt;
452 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
453 m_parent->signalAPIResult(&result);
454 }
455 break;
456 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
457 case QCAMERA_SM_EVT_RECORDING_ENABLED:
458 {
459 result.status = NO_ERROR;
460 result.request_api = evt;
461 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
462 result.enabled = 0;
463 m_parent->signalAPIResult(&result);
464 }
465 break;
466 case QCAMERA_SM_EVT_RELEASE:
467 {
468 rc = m_parent->release();
469 result.status = rc;
470 result.request_api = evt;
471 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
472 m_parent->signalAPIResult(&result);
473 }
474 break;
475 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
476 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300477 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800478 result.status = rc;
479 result.request_api = evt;
480 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
481 m_parent->signalAPIResult(&result);
482 }
483 break;
484 case QCAMERA_SM_EVT_DUMP:
485 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300486 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800487 result.status = rc;
488 result.request_api = evt;
489 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
490 m_parent->signalAPIResult(&result);
491 }
492 break;
Ankit Premrajka3b00dc62012-12-14 18:37:52 -0800493 case QCAMERA_SM_EVT_SEND_COMMAND:
494 {
495 qcamera_sm_evt_command_payload_t *cmd_payload =
496 (qcamera_sm_evt_command_payload_t *)payload;
497 rc = m_parent->sendCommand(cmd_payload->cmd,
498 cmd_payload->arg1,
499 cmd_payload->arg2);
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;
Muhua Libc9a8082012-11-07 15:51:28 -0800506 case QCAMERA_SM_EVT_START_RECORDING:
507 case QCAMERA_SM_EVT_STOP_RECORDING:
508 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800509 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800510 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -0800511 {
512 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
513 rc = INVALID_OPERATION;
514 result.status = rc;
515 result.request_api = evt;
516 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
517 m_parent->signalAPIResult(&result);
518 }
519 break;
Georgi Hristv72d768f2013-10-02 17:47:59 +0300520 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
Muhua Li1612f422013-01-03 11:07:39 -0800521 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Li1612f422013-01-03 11:07:39 -0800522 {
523 // no op needed here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530524 CDBG_HIGH("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
Muhua Li1612f422013-01-03 11:07:39 -0800525 result.status = NO_ERROR;
526 result.request_api = evt;
527 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
528 m_parent->signalAPIResult(&result);
529 }
530 break;
Muhua Li0c14e432013-03-06 15:50:17 -0800531 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
532 {
533 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +0530534 result.status = rc;
535 result.request_api = evt;
536 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
537 m_parent->signalAPIResult(&result);
Muhua Li0c14e432013-03-06 15:50:17 -0800538 }
539 break;
Muhua Li5858c392013-02-04 17:53:34 -0800540 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
541 {
542 int32_t faceID = 0;
543 qcamera_sm_evt_reg_face_payload_t *reg_payload =
544 (qcamera_sm_evt_reg_face_payload_t *)payload;
545 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
546 reg_payload->config,
547 faceID);
548 result.status = rc;
549 result.request_api = evt;
550 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
551 result.handle = faceID;
552 m_parent->signalAPIResult(&result);
553 }
554 break;
Emilian Peev2ae455e2013-04-18 10:41:56 +0300555 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
556 {
557 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300558 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peev2ae455e2013-04-18 10:41:56 +0300559 }
560 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800561 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300562 {
563 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
564 switch (cam_evt->server_event_type) {
565 case CAM_EVENT_TYPE_DAEMON_DIED:
566 {
Emilian Peev15690592013-04-19 09:55:40 +0300567 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
568 CAMERA_ERROR_SERVER_DIED,
569 0);
570 }
571 break;
572 default:
573 ALOGE("%s: Invalid internal event %d in state(%d)",
574 __func__, cam_evt->server_event_type, m_state);
575 break;
576 }
577 }
578 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700579 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
580 {
581 // No ops, but need to notify
582 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
583 result.status = rc;
584 result.request_api = evt;
585 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
586 m_parent->signalEvtResult(&result);
587 }
588 break;
Emilian Peev15690592013-04-19 09:55:40 +0300589 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800590 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
591 default:
592 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
593 break;
594 }
595
596 return rc;
597}
598
Muhua Lida2c4be2012-11-26 09:14:16 -0800599/*===========================================================================
600 * FUNCTION : procEvtPreviewReadyState
601 *
602 * DESCRIPTION: finite state machine function to handle event in state of
603 * QCAMERA_SM_STATE_PREVIEW_READY.
604 *
605 * PARAMETERS :
606 * @evt : event to be processed
607 * @payload : event payload. Can be NULL if not needed.
608 *
609 * RETURN : int32_t type of status
610 * NO_ERROR -- success
611 * none-zero failure code
612 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800613int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
614 void *payload)
615{
616 int32_t rc = NO_ERROR;
617 qcamera_api_result_t result;
618 memset(&result, 0, sizeof(qcamera_api_result_t));
619
620 switch (evt) {
621 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
622 {
623 m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
624 if (m_parent->mPreviewWindow != NULL) {
625 rc = m_parent->startPreview();
626 if (rc != NO_ERROR) {
627 m_parent->unpreparePreview();
628 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
629 } else {
630 m_state = QCAMERA_SM_STATE_PREVIEWING;
631 }
632 }
633
634 result.status = rc;
635 result.request_api = evt;
636 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
637 m_parent->signalAPIResult(&result);
638 }
639 break;
640 case QCAMERA_SM_EVT_SET_CALLBACKS:
641 {
642 qcamera_sm_evt_setcb_payload_t *setcbs =
643 (qcamera_sm_evt_setcb_payload_t *)payload;
644 rc = m_parent->setCallBacks(setcbs->notify_cb,
645 setcbs->data_cb,
646 setcbs->data_cb_timestamp,
647 setcbs->get_memory,
648 setcbs->user);
649 result.status = rc;
650 result.request_api = evt;
651 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
652 m_parent->signalAPIResult(&result);
653 }
654 break;
655 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
656 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300657 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800658 result.status = rc;
659 result.request_api = evt;
660 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
661 m_parent->signalAPIResult(&result);
662 }
663 break;
664 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
665 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300666 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800667 result.status = rc;
668 result.request_api = evt;
669 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
670 m_parent->signalAPIResult(&result);
671 }
672 break;
673 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
674 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300675 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800676 result.status = rc;
677 result.request_api = evt;
678 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
679 result.enabled = enabled;
680 m_parent->signalAPIResult(&result);
681 }
682 break;
683 case QCAMERA_SM_EVT_SET_PARAMS:
684 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800685 bool needRestart = false;
686 rc = m_parent->updateParameters((char*)payload, needRestart);
687 if (rc == NO_ERROR) {
Muhua Li6d69e932013-01-24 16:39:27 -0800688 if (needRestart) {
689 // need restart preview for parameters to take effect
690 m_parent->unpreparePreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700691 // Clear memory pools
692 m_parent->m_memoryPool.clear();
Muhua Li6d69e932013-01-24 16:39:27 -0800693 // commit parameter changes to server
694 m_parent->commitParameterChanges();
695 // prepare preview again
696 rc = m_parent->preparePreview();
697 if (rc != NO_ERROR) {
698 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
699 }
700 } else {
701 rc = m_parent->commitParameterChanges();
702 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800703 }
Muhua Li6d69e932013-01-24 16:39:27 -0800704
Muhua Libc9a8082012-11-07 15:51:28 -0800705 result.status = rc;
706 result.request_api = evt;
707 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
708 m_parent->signalAPIResult(&result);
709 }
710 break;
711 case QCAMERA_SM_EVT_GET_PARAMS:
712 {
713 result.params = m_parent->getParameters();
714 rc = NO_ERROR;
715 result.status = rc;
716 result.request_api = evt;
717 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
718 m_parent->signalAPIResult(&result);
719 }
720 break;
721 case QCAMERA_SM_EVT_PUT_PARAMS:
722 {
723 rc = m_parent->putParameters((char*)payload);
724 result.status = rc;
725 result.request_api = evt;
726 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
727 m_parent->signalAPIResult(&result);
728 }
729 break;
730 case QCAMERA_SM_EVT_START_PREVIEW:
731 {
732 // no ops here
733 rc = NO_ERROR;
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_STOP_PREVIEW:
741 {
742 m_parent->unpreparePreview();
743 rc = 0;
744 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
745 result.status = rc;
746 result.request_api = evt;
747 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
748 m_parent->signalAPIResult(&result);
749 }
750 break;
751 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
752 {
753 rc = NO_ERROR;
754 result.status = rc;
755 result.request_api = evt;
756 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
757 result.enabled = 1;
758 m_parent->signalAPIResult(&result);
759 }
760 break;
761 case QCAMERA_SM_EVT_RECORDING_ENABLED:
762 {
763 rc = 0;
764 result.status = rc;
765 result.request_api = evt;
766 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
767 result.enabled = 0;
768 m_parent->signalAPIResult(&result);
769 }
770 break;
771 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
772 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300773 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800774 result.status = rc;
775 result.request_api = evt;
776 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
777 m_parent->signalAPIResult(&result);
778 }
779 break;
780 case QCAMERA_SM_EVT_DUMP:
781 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300782 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800783 result.status = rc;
784 result.request_api = evt;
785 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
786 m_parent->signalAPIResult(&result);
787 }
788 break;
789 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
790 {
791 rc = m_parent->autoFocus();
792 result.status = rc;
793 result.request_api = evt;
794 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
795 m_parent->signalAPIResult(&result);
796 }
797 break;
798 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
799 {
800 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +0530801 result.status = rc;
802 result.request_api = evt;
803 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
804 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -0800805 }
806 break;
807 case QCAMERA_SM_EVT_SEND_COMMAND:
808 {
809 qcamera_sm_evt_command_payload_t *cmd_payload =
810 (qcamera_sm_evt_command_payload_t *)payload;
811 rc = m_parent->sendCommand(cmd_payload->cmd,
812 cmd_payload->arg1,
813 cmd_payload->arg2);
814 result.status = rc;
815 result.request_api = evt;
816 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
817 m_parent->signalAPIResult(&result);
818 }
819 break;
Muhua Li5858c392013-02-04 17:53:34 -0800820 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
821 {
822 int32_t faceID = 0;
823 qcamera_sm_evt_reg_face_payload_t *reg_payload =
824 (qcamera_sm_evt_reg_face_payload_t *)payload;
825 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
826 reg_payload->config,
827 faceID);
828 result.status = rc;
829 result.request_api = evt;
830 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
831 result.handle = faceID;
832 m_parent->signalAPIResult(&result);
833 }
834 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800835 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
836 case QCAMERA_SM_EVT_START_RECORDING:
837 case QCAMERA_SM_EVT_STOP_RECORDING:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800838 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800839 case QCAMERA_SM_EVT_TAKE_PICTURE:
840 case QCAMERA_SM_EVT_CANCEL_PICTURE:
841 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
842 case QCAMERA_SM_EVT_RELEASE:
843 {
844 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
845 rc = INVALID_OPERATION;
846 result.status = rc;
847 result.request_api = evt;
848 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
849 m_parent->signalAPIResult(&result);
850 }
851 break;
852 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300853 {
854 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
855 switch (cam_evt->server_event_type) {
856 case CAM_EVENT_TYPE_DAEMON_DIED:
857 {
Emilian Peev15690592013-04-19 09:55:40 +0300858 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
859 CAMERA_ERROR_SERVER_DIED,
860 0);
861 }
862 break;
863 default:
864 ALOGE("%s: Invalid internal event %d in state(%d)",
865 __func__, cam_evt->server_event_type, m_state);
866 break;
867 }
868 }
869 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700870 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
871 {
872 // No ops, but need to notify
873 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
874 result.status = rc;
875 result.request_api = evt;
876 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
877 m_parent->signalEvtResult(&result);
878 }
879 break;
Emilian Peev15690592013-04-19 09:55:40 +0300880 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800881 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wangaa829ce2013-01-09 14:41:49 -0800882 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -0800883 default:
884 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
885 break;
886 }
887
888 return rc;
889}
890
Muhua Lida2c4be2012-11-26 09:14:16 -0800891/*===========================================================================
892 * FUNCTION : procEvtPreviewingState
893 *
894 * DESCRIPTION: finite state machine function to handle event in state of
895 * QCAMERA_SM_STATE_PREVIEWING.
896 *
897 * PARAMETERS :
898 * @evt : event to be processed
899 * @payload : event payload. Can be NULL if not needed.
900 *
901 * RETURN : int32_t type of status
902 * NO_ERROR -- success
903 * none-zero failure code
904 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800905int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
906 void *payload)
907{
908 int32_t rc = NO_ERROR;
909 qcamera_api_result_t result;
910 memset(&result, 0, sizeof(qcamera_api_result_t));
911
912 switch (evt) {
913 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
914 {
915 // Error setting preview window during previewing
916 ALOGE("Cannot set preview window when preview is running");
917 rc = INVALID_OPERATION;
918 result.status = rc;
919 result.request_api = evt;
920 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
921 m_parent->signalAPIResult(&result);
922 }
923 break;
924 case QCAMERA_SM_EVT_SET_CALLBACKS:
925 {
926 qcamera_sm_evt_setcb_payload_t *setcbs =
927 (qcamera_sm_evt_setcb_payload_t *)payload;
928 rc = m_parent->setCallBacks(setcbs->notify_cb,
929 setcbs->data_cb,
930 setcbs->data_cb_timestamp,
931 setcbs->get_memory,
932 setcbs->user);
933 result.status = rc;
934 result.request_api = evt;
935 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
936 m_parent->signalAPIResult(&result);
937 }
938 break;
939 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
940 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300941 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800942 result.status = rc;
943 result.request_api = evt;
944 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
945 m_parent->signalAPIResult(&result);
946 }
947 break;
948 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
949 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300950 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800951 result.status = rc;
952 result.request_api = evt;
953 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
954 m_parent->signalAPIResult(&result);
955 }
956 break;
957 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
958 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +0300959 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -0800960 result.status = rc;
961 result.request_api = evt;
962 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
963 result.enabled = enabled;
964 m_parent->signalAPIResult(&result);
965 }
966 break;
967 case QCAMERA_SM_EVT_SET_PARAMS:
968 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800969 bool needRestart = false;
970 rc = m_parent->updateParameters((char*)payload, needRestart);
971 if (rc == NO_ERROR) {
972 if (needRestart) {
973 // need restart preview for parameters to take effect
974 // stop preview
975 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700976 // Clear memory pools
977 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -0800978 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -0800979 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -0800980 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -0800981 rc = m_parent->preparePreview();
982 if (rc == NO_ERROR) {
983 rc = m_parent->startPreview();
984 if (rc != NO_ERROR) {
985 m_parent->unpreparePreview();
986 }
987 }
988 if (rc != NO_ERROR) {
989 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
990 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800991 } else {
992 rc = m_parent->commitParameterChanges();
993 }
994 }
Muhua Libc9a8082012-11-07 15:51:28 -0800995 result.status = rc;
996 result.request_api = evt;
997 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
998 m_parent->signalAPIResult(&result);
999 }
1000 break;
1001 case QCAMERA_SM_EVT_GET_PARAMS:
1002 {
1003 result.params = m_parent->getParameters();
1004 rc = NO_ERROR;
1005 result.status = rc;
1006 result.request_api = evt;
1007 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1008 m_parent->signalAPIResult(&result);
1009 }
1010 break;
1011 case QCAMERA_SM_EVT_PUT_PARAMS:
1012 {
1013 rc = m_parent->putParameters((char*)payload);
1014 result.status = rc;
1015 result.request_api = evt;
1016 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1017 m_parent->signalAPIResult(&result);
1018 }
1019 break;
1020 case QCAMERA_SM_EVT_START_PREVIEW:
1021 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1022 {
1023 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301024 CDBG_HIGH("%s: Already in previewing, no ops here to start preview", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08001025 rc = NO_ERROR;
1026 result.status = rc;
1027 result.request_api = evt;
1028 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1029 m_parent->signalAPIResult(&result);
1030 }
1031 break;
1032 case QCAMERA_SM_EVT_STOP_PREVIEW:
1033 {
1034 rc = m_parent->stopPreview();
1035 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1036 result.status = rc;
1037 result.request_api = evt;
1038 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1039 m_parent->signalAPIResult(&result);
1040 }
1041 break;
1042 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1043 {
1044 rc = NO_ERROR;
1045 result.status = rc;
1046 result.request_api = evt;
1047 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1048 result.enabled = 1;
1049 m_parent->signalAPIResult(&result);
1050 }
1051 break;
1052 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1053 {
1054 rc = NO_ERROR;
1055 result.status = rc;
1056 result.request_api = evt;
1057 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1058 result.enabled = 0;
1059 m_parent->signalAPIResult(&result);
1060 }
1061 break;
1062 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1063 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001064 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001065 result.status = rc;
1066 result.request_api = evt;
1067 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1068 m_parent->signalAPIResult(&result);
1069 }
1070 break;
1071 case QCAMERA_SM_EVT_DUMP:
1072 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001073 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001074 result.status = rc;
1075 result.request_api = evt;
1076 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1077 m_parent->signalAPIResult(&result);
1078 }
1079 break;
1080 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1081 {
1082 rc = m_parent->autoFocus();
1083 result.status = rc;
1084 result.request_api = evt;
1085 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1086 m_parent->signalAPIResult(&result);
1087 }
1088 break;
1089 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1090 {
1091 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301092 result.status = rc;
1093 result.request_api = evt;
1094 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1095 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001096 }
1097 break;
1098 case QCAMERA_SM_EVT_START_RECORDING:
1099 {
1100 rc = m_parent->startRecording();
1101 if (rc == NO_ERROR) {
1102 // move state to recording state
1103 m_state = QCAMERA_SM_STATE_RECORDING;
1104 }
1105 result.status = rc;
1106 result.request_api = evt;
1107 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1108 m_parent->signalAPIResult(&result);
1109 }
1110 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001111 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001112 {
Muhua Li0c14e432013-03-06 15:50:17 -08001113 rc = m_parent->prepareHardwareForSnapshot(FALSE);
Muhua Libc9a8082012-11-07 15:51:28 -08001114 if (rc == NO_ERROR) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001115 // Do not signal API result in this case.
1116 // Need to wait for snapshot done in metadta.
1117 m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
1118 } else {
1119 // Do not change state in this case.
1120 ALOGE("%s: prepareHardwareForSnapshot failed %d",
1121 __func__, rc);
1122
1123 result.status = rc;
1124 result.request_api = evt;
1125 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1126 m_parent->signalAPIResult(&result);
1127 }
1128 }
1129 break;
1130 case QCAMERA_SM_EVT_TAKE_PICTURE:
liuxt0702c3d54862016-01-19 09:56:34 +08001131 // {
1132 // if ( m_parent->mParameters.getRecordingHintValue() == false) {
1133 // if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
1134 // m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
1135 // rc = m_parent->takePicture();
1136 // if (rc != NO_ERROR) {
1137 // // move state to previewing state
1138 // m_state = QCAMERA_SM_STATE_PREVIEWING;
1139 // }
1140 // } else {
1141 // m_state = QCAMERA_SM_STATE_PIC_TAKING;
1142 // rc = m_parent->takePicture();
1143 // if (rc != NO_ERROR) {
1144 // // move state to preview stopped state
1145 // m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1146 // }
1147 // }
Muhua Lia9dca012013-05-03 22:37:42 -07001148
liuxt0702c3d54862016-01-19 09:56:34 +08001149 // result.status = rc;
1150 // result.request_api = evt;
1151 // result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1152 // m_parent->signalAPIResult(&result);
1153 // } else {
1154 // m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
1155 // rc = m_parent->takeLiveSnapshot();
1156 // if (rc != NO_ERROR ) {
1157 // m_state = QCAMERA_SM_STATE_PREVIEWING;
1158 // }
1159 // result.status = rc;
1160 // result.request_api = evt;
1161 // result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1162 // m_parent->signalAPIResult(&result);
1163 // }
1164 // }
1165 // break;
1166 {
1167 if ( m_parent->mParameters.getRecordingHintValue() == true) {
1168 m_parent->stopPreview();
1169 m_parent->mParameters.updateRecordingHintValue(FALSE);
1170 // start preview again
1171 rc = m_parent->preparePreview();
1172 if (rc == NO_ERROR) {
1173 rc = m_parent->startPreview();
1174 if (rc != NO_ERROR) {
1175 m_parent->unpreparePreview();
1176 }
1177 }
1178 }
1179 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Muhua Lia9dca012013-05-03 22:37:42 -07001180 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
liuxt0702c3d54862016-01-19 09:56:34 +08001181 rc = m_parent->takePicture();
1182 if (rc != NO_ERROR) {
1183 // move state to previewing state
Muhua Lia9dca012013-05-03 22:37:42 -07001184 m_state = QCAMERA_SM_STATE_PREVIEWING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001185 }
liuxt0702c3d54862016-01-19 09:56:34 +08001186 } else {
1187 m_state = QCAMERA_SM_STATE_PIC_TAKING;
1188 rc = m_parent->takePicture();
1189 if (rc != NO_ERROR) {
1190 // move state to preview stopped state
1191 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1192 }
Muhua Li8e614bc2013-04-17 17:38:42 -07001193 }
liuxt0702c3d54862016-01-19 09:56:34 +08001194
1195 result.status = rc;
1196 result.request_api = evt;
1197 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1198 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001199 }
1200 break;
1201 case QCAMERA_SM_EVT_SEND_COMMAND:
1202 {
1203 qcamera_sm_evt_command_payload_t *cmd_payload =
1204 (qcamera_sm_evt_command_payload_t *)payload;
1205 rc = m_parent->sendCommand(cmd_payload->cmd,
1206 cmd_payload->arg1,
1207 cmd_payload->arg2);
Emilian Peevd17d2e12014-01-13 12:32:57 +02001208 if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
1209 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
1210 m_parent->stopPreview();
1211 // Clear memory pools
1212 m_parent->m_memoryPool.clear();
1213 // start preview again
1214 rc = m_parent->preparePreview();
1215 if (rc == NO_ERROR) {
1216 rc = m_parent->startPreview();
1217 if (rc != NO_ERROR) {
1218 m_parent->unpreparePreview();
1219 }
1220 }
1221 }
1222 }
Muhua Libc9a8082012-11-07 15:51:28 -08001223 result.status = rc;
1224 result.request_api = evt;
1225 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1226 m_parent->signalAPIResult(&result);
1227 }
1228 break;
Muhua Li5858c392013-02-04 17:53:34 -08001229 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1230 {
1231 int32_t faceID = 0;
1232 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1233 (qcamera_sm_evt_reg_face_payload_t *)payload;
1234 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1235 reg_payload->config,
1236 faceID);
1237 result.status = rc;
1238 result.request_api = evt;
1239 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1240 result.handle = faceID;
1241 m_parent->signalAPIResult(&result);
1242 }
1243 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001244 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1245 case QCAMERA_SM_EVT_STOP_RECORDING:
1246 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1247 case QCAMERA_SM_EVT_RELEASE:
1248 {
1249 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1250 rc = INVALID_OPERATION;
1251 result.status = rc;
1252 result.request_api = evt;
1253 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1254 m_parent->signalAPIResult(&result);
1255 }
1256 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001257 case QCAMERA_SM_EVT_EVT_INTERNAL:
1258 {
1259 qcamera_sm_internal_evt_payload_t *internal_evt =
1260 (qcamera_sm_internal_evt_payload_t *)payload;
1261 switch (internal_evt->evt_type) {
1262 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1263 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1264 break;
Muhua Li510aab22013-05-28 17:00:38 -07001265 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1266 break;
1267 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1268 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1269 break;
1270 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1271 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1272 break;
1273 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1274 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1275 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001276 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1277 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1278 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001279 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1280 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1281 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001282 default:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001283 ALOGE("%s: Invalid internal event %d in state(%d)",
1284 __func__, internal_evt->evt_type, m_state);
Muhua Li31eaee02012-12-11 08:56:45 -08001285 break;
1286 }
1287 }
1288 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001289 case QCAMERA_SM_EVT_EVT_NOTIFY:
1290 {
1291 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1292 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03001293 case CAM_EVENT_TYPE_DAEMON_DIED:
1294 {
Emilian Peev15690592013-04-19 09:55:40 +03001295 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1296 CAMERA_ERROR_SERVER_DIED,
1297 0);
1298 }
1299 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001300 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301301 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001302 __func__, cam_evt->server_event_type);
1303 break;
1304 }
1305 }
1306 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001307 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001308 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08001309 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001310 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001311 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001312 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08001313 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07001314 {
1315 // No ops, but need to notify
1316 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1317 result.status = rc;
1318 result.request_api = evt;
1319 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1320 m_parent->signalEvtResult(&result);
1321 }
1322 break;
1323 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08001324 default:
1325 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1326 break;
1327 }
1328
1329 return rc;
1330}
1331
Muhua Lida2c4be2012-11-26 09:14:16 -08001332/*===========================================================================
Shuzhen Wang93f24112013-02-20 16:01:42 -08001333 * FUNCTION : procEvtPrepareSnapshotState
1334 *
1335 * DESCRIPTION: finite state machine function to handle event in state of
1336 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
1337 *
1338 * PARAMETERS :
1339 * @evt : event to be processed
1340 * @payload : event payload. Can be NULL if not needed.
1341 *
1342 * RETURN : int32_t type of status
1343 * NO_ERROR -- success
1344 * none-zero failure code
1345 *==========================================================================*/
1346int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
1347 void *payload)
1348{
1349 int32_t rc = NO_ERROR;
1350 qcamera_api_result_t result;
1351 memset(&result, 0, sizeof(qcamera_api_result_t));
1352
1353 switch (evt) {
1354 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1355 case QCAMERA_SM_EVT_SET_CALLBACKS:
1356 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1357 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1358 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1359 case QCAMERA_SM_EVT_SET_PARAMS:
1360 case QCAMERA_SM_EVT_GET_PARAMS:
1361 case QCAMERA_SM_EVT_PUT_PARAMS:
1362 case QCAMERA_SM_EVT_START_PREVIEW:
1363 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1364 case QCAMERA_SM_EVT_STOP_PREVIEW:
1365 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1366 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1367 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1368 case QCAMERA_SM_EVT_DUMP:
1369 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1370 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1371 case QCAMERA_SM_EVT_START_RECORDING:
1372 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Li510aab22013-05-28 17:00:38 -07001373 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001374 case QCAMERA_SM_EVT_SEND_COMMAND:
1375 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1376 case QCAMERA_SM_EVT_STOP_RECORDING:
1377 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1378 case QCAMERA_SM_EVT_RELEASE:
1379 {
1380 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1381 rc = INVALID_OPERATION;
1382 result.status = rc;
1383 result.request_api = evt;
1384 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1385 m_parent->signalAPIResult(&result);
1386 }
1387 break;
1388 case QCAMERA_SM_EVT_EVT_INTERNAL:
1389 {
1390 qcamera_sm_internal_evt_payload_t *internal_evt =
1391 (qcamera_sm_internal_evt_payload_t *)payload;
1392 switch (internal_evt->evt_type) {
Muhua Li6f3c5322013-05-08 17:20:17 -07001393 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1394 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1395 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001396 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301397 CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
Shuzhen Wang93f24112013-02-20 16:01:42 -08001398 __func__);
1399 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
1400 m_state = QCAMERA_SM_STATE_PREVIEWING;
1401
1402 result.status = NO_ERROR;
1403 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
1404 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1405 m_parent->signalAPIResult(&result);
1406 break;
Muhua Li510aab22013-05-28 17:00:38 -07001407 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1408 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1409 break;
1410 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1411 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1412 break;
1413 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1414 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1415 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001416 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1417 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1418 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001419 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1420 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1421 break;
1422
Shuzhen Wang93f24112013-02-20 16:01:42 -08001423 default:
1424 ALOGE("%s: Invalid internal event %d in state(%d)",
1425 __func__, internal_evt->evt_type, m_state);
1426 break;
1427 }
1428 }
1429 break;
1430 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +03001431 {
1432 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1433 switch (cam_evt->server_event_type) {
1434 case CAM_EVENT_TYPE_DAEMON_DIED:
1435 {
Emilian Peev15690592013-04-19 09:55:40 +03001436 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1437 CAMERA_ERROR_SERVER_DIED,
1438 0);
1439 }
1440 break;
1441 default:
1442 ALOGE("%s: Invalid internal event %d in state(%d)",
1443 __func__, cam_evt->server_event_type, m_state);
1444 break;
1445 }
1446 }
1447 break;
Muhua Lic9390df2013-05-22 17:54:13 -07001448 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1449 {
1450 // No ops, but need to notify
1451 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1452 result.status = rc;
1453 result.request_api = evt;
1454 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1455 m_parent->signalEvtResult(&result);
1456 }
1457 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001458 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
1459 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001460 default:
1461 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1462 break;
1463 }
1464
1465 return rc;
1466}
1467
1468/*===========================================================================
Muhua Lida2c4be2012-11-26 09:14:16 -08001469 * FUNCTION : procEvtPicTakingState
1470 *
1471 * DESCRIPTION: finite state machine function to handle event in state of
1472 * QCAMERA_SM_STATE_PIC_TAKING.
1473 *
1474 * PARAMETERS :
1475 * @evt : event to be processed
1476 * @payload : event payload. Can be NULL if not needed.
1477 *
1478 * RETURN : int32_t type of status
1479 * NO_ERROR -- success
1480 * none-zero failure code
1481 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001482int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
1483 void *payload)
1484{
1485 int32_t rc = NO_ERROR;
1486 qcamera_api_result_t result;
1487 memset(&result, 0, sizeof(qcamera_api_result_t));
1488
1489 switch (evt) {
1490 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1491 {
1492 // Error setting preview window during previewing
1493 ALOGE("Cannot set preview window when preview is running");
1494 rc = INVALID_OPERATION;
1495 result.status = rc;
1496 result.request_api = evt;
1497 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1498 m_parent->signalAPIResult(&result);
1499 }
1500 break;
1501 case QCAMERA_SM_EVT_SET_CALLBACKS:
1502 {
1503 qcamera_sm_evt_setcb_payload_t *setcbs =
1504 (qcamera_sm_evt_setcb_payload_t *)payload;
1505 rc = m_parent->setCallBacks(setcbs->notify_cb,
1506 setcbs->data_cb,
1507 setcbs->data_cb_timestamp,
1508 setcbs->get_memory,
1509 setcbs->user);
1510 result.status = rc;
1511 result.request_api = evt;
1512 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1513 m_parent->signalAPIResult(&result);
1514 }
1515 break;
1516 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1517 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001518 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001519 result.status = rc;
1520 result.request_api = evt;
1521 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1522 m_parent->signalAPIResult(&result);
1523 }
1524 break;
1525 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1526 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001527 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001528 result.status = rc;
1529 result.request_api = evt;
1530 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1531 m_parent->signalAPIResult(&result);
1532 }
1533 break;
1534 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1535 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001536 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001537 result.status = rc;
1538 result.request_api = evt;
1539 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1540 result.enabled = enabled;
1541 m_parent->signalAPIResult(&result);
1542 }
1543 break;
1544 case QCAMERA_SM_EVT_SET_PARAMS:
1545 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001546 bool needRestart = false;
1547 rc = m_parent->updateParameters((char*)payload, needRestart);
1548 if (rc == NO_ERROR) {
1549 rc = m_parent->commitParameterChanges();
1550 }
Muhua Libc9a8082012-11-07 15:51:28 -08001551 result.status = rc;
1552 result.request_api = evt;
1553 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1554 m_parent->signalAPIResult(&result);
1555 }
1556 break;
1557 case QCAMERA_SM_EVT_GET_PARAMS:
1558 {
1559 result.params = m_parent->getParameters();
1560 rc = NO_ERROR;
1561 result.status = rc;
1562 result.request_api = evt;
1563 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1564 m_parent->signalAPIResult(&result);
1565 }
1566 break;
1567 case QCAMERA_SM_EVT_PUT_PARAMS:
1568 {
1569 rc = m_parent->putParameters((char*)payload);
1570 result.status = rc;
1571 result.request_api = evt;
1572 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1573 m_parent->signalAPIResult(&result);
1574 }
1575 break;
1576 case QCAMERA_SM_EVT_STOP_PREVIEW:
1577 {
Muhua Libd1b6122013-03-05 15:25:27 -08001578 // cancel picture first
1579 rc = m_parent->cancelPicture();
1580 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1581
Muhua Libc9a8082012-11-07 15:51:28 -08001582 result.status = rc;
1583 result.request_api = evt;
1584 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1585 m_parent->signalAPIResult(&result);
1586 }
1587 break;
1588 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1589 {
1590 rc = NO_ERROR;
1591 result.status = rc;
1592 result.request_api = evt;
1593 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1594 result.enabled = 0;
1595 m_parent->signalAPIResult(&result);
1596 }
1597 break;
1598 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1599 {
1600 rc = NO_ERROR;
1601 result.status = rc;
1602 result.request_api = evt;
1603 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1604 result.enabled = 0;
1605 m_parent->signalAPIResult(&result);
1606 }
1607 break;
1608 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1609 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001610 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001611 result.status = rc;
1612 result.request_api = evt;
1613 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1614 m_parent->signalAPIResult(&result);
1615 }
1616 break;
1617 case QCAMERA_SM_EVT_DUMP:
1618 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001619 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001620 result.status = rc;
1621 result.request_api = evt;
1622 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1623 m_parent->signalAPIResult(&result);
1624 }
1625 break;
1626 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1627 {
1628 rc = m_parent->autoFocus();
1629 result.status = rc;
1630 result.request_api = evt;
1631 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1632 m_parent->signalAPIResult(&result);
1633 }
1634 break;
1635 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1636 {
1637 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301638 result.status = rc;
1639 result.request_api = evt;
1640 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1641 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001642 }
1643 break;
1644 case QCAMERA_SM_EVT_SEND_COMMAND:
1645 {
1646 qcamera_sm_evt_command_payload_t *cmd_payload =
1647 (qcamera_sm_evt_command_payload_t *)payload;
1648 rc = m_parent->sendCommand(cmd_payload->cmd,
1649 cmd_payload->arg1,
1650 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001651#ifndef VANILLA_HAL
Emilian Peeva43000b2013-09-27 14:27:21 -07001652 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
1653 // move state to previewing state
1654 m_state = QCAMERA_SM_STATE_PREVIEWING;
1655 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001656#endif
Muhua Libc9a8082012-11-07 15:51:28 -08001657 result.status = rc;
1658 result.request_api = evt;
1659 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1660 m_parent->signalAPIResult(&result);
1661 }
1662 break;
1663 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1664 {
1665 rc = m_parent->cancelPicture();
1666 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1667 result.status = rc;
1668 result.request_api = evt;
1669 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1670 m_parent->signalAPIResult(&result);
1671 }
1672 break;
Muhua Li5858c392013-02-04 17:53:34 -08001673 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1674 {
1675 int32_t faceID = 0;
1676 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1677 (qcamera_sm_evt_reg_face_payload_t *)payload;
1678 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1679 reg_payload->config,
1680 faceID);
1681 result.status = rc;
1682 result.request_api = evt;
1683 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1684 result.handle = faceID;
1685 m_parent->signalAPIResult(&result);
1686 }
1687 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001688 case QCAMERA_SM_EVT_TAKE_PICTURE:
Emilian Peeva43000b2013-09-27 14:27:21 -07001689 {
1690 if ( m_parent->isLongshotEnabled() ) {
1691 rc = m_parent->longShot();
1692 } else {
1693 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1694 rc = INVALID_OPERATION;
1695 }
1696
1697 result.status = rc;
1698 result.request_api = evt;
1699 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1700 m_parent->signalAPIResult(&result);
1701 }
1702 break;
1703 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001704 case QCAMERA_SM_EVT_START_RECORDING:
1705 case QCAMERA_SM_EVT_STOP_RECORDING:
1706 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1707 case QCAMERA_SM_EVT_START_PREVIEW:
1708 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1709 case QCAMERA_SM_EVT_RELEASE:
1710 {
1711 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1712 rc = INVALID_OPERATION;
1713 result.status = rc;
1714 result.request_api = evt;
1715 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1716 m_parent->signalAPIResult(&result);
1717 }
1718 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001719 case QCAMERA_SM_EVT_EVT_INTERNAL:
1720 {
1721 qcamera_sm_internal_evt_payload_t *internal_evt =
1722 (qcamera_sm_internal_evt_payload_t *)payload;
1723 switch (internal_evt->evt_type) {
1724 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1725 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1726 break;
Muhua Li510aab22013-05-28 17:00:38 -07001727 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1728 break;
1729 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1730 break;
1731 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1732 break;
1733 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1734 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1735 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001736 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1737 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1738 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001739 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1740 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1741 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001742 default:
1743 break;
1744 }
1745 }
1746 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001747 case QCAMERA_SM_EVT_EVT_NOTIFY:
1748 {
1749 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1750 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02001751 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
1752 {
1753 if ( m_parent->isLongshotEnabled() ) {
1754 if(!m_parent->m_postprocessor.getMultipleStages()) {
1755 m_parent->m_postprocessor.setMultipleStages(true);
1756 }
1757 m_parent->playShutter();
1758 }
1759 }
1760 break;
Emilian Peev15690592013-04-19 09:55:40 +03001761 case CAM_EVENT_TYPE_DAEMON_DIED:
1762 {
Emilian Peev15690592013-04-19 09:55:40 +03001763 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1764 CAMERA_ERROR_SERVER_DIED,
1765 0);
1766 }
1767 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001768 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301769 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001770 __func__, cam_evt->server_event_type);
1771 break;
1772 }
1773 }
1774 break;
1775 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
1776 {
1777 qcamera_jpeg_evt_payload_t *jpeg_job =
1778 (qcamera_jpeg_evt_payload_t *)payload;
1779 rc = m_parent->processJpegNotify(jpeg_job);
1780 }
1781 break;
Emilian Peev7d36a812013-11-20 00:15:54 -08001782 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
1783 {
Emilian Peev8a977232013-11-04 07:56:32 -08001784 bool restartPreview = m_parent->isPreviewRestartEnabled();
1785 rc = m_parent->stopCaptureChannel(restartPreview);
1786
1787 if (restartPreview && (NO_ERROR == rc)) {
1788 rc = m_parent->preparePreview();
1789 if (NO_ERROR == rc) {
1790 m_parent->m_bPreviewStarted = true;
1791 rc = m_parent->startPreview();
1792 }
1793 }
1794
Emilian Peev7d36a812013-11-20 00:15:54 -08001795 }
1796 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001797 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1798 {
1799 rc = m_parent->cancelPicture();
Emilian Peev8a977232013-11-04 07:56:32 -08001800
1801 bool restartPreview = m_parent->isPreviewRestartEnabled();
1802 if (restartPreview) {
1803 m_state = QCAMERA_SM_STATE_PREVIEWING;
1804 } else {
1805 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1806 }
1807
Emilian Peev6d90c1f2013-04-12 09:33:06 +03001808 result.status = rc;
1809 result.request_api = evt;
1810 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1811 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001812 }
1813 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001814 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peev2ae455e2013-04-18 10:41:56 +03001815 {
1816 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001817 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peev2ae455e2013-04-18 10:41:56 +03001818 }
1819 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001820 default:
1821 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1822 break;
1823 }
1824
1825 return rc;
1826}
1827
Muhua Lida2c4be2012-11-26 09:14:16 -08001828/*===========================================================================
1829 * FUNCTION : procEvtRecordingState
1830 *
1831 * DESCRIPTION: finite state machine function to handle event in state of
1832 * QCAMERA_SM_STATE_RECORDING.
1833 *
1834 * PARAMETERS :
1835 * @evt : event to be processed
1836 * @payload : event payload. Can be NULL if not needed.
1837 *
1838 * RETURN : int32_t type of status
1839 * NO_ERROR -- success
1840 * none-zero failure code
1841 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001842int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
1843 void *payload)
1844{
1845 int32_t rc = NO_ERROR;
1846 qcamera_api_result_t result;
1847 memset(&result, 0, sizeof(qcamera_api_result_t));
1848
1849 switch (evt) {
Emilian Peev88293e92013-06-07 12:37:18 +03001850 case QCAMERA_SM_EVT_START_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08001851 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1852 {
Emilian Peev88293e92013-06-07 12:37:18 +03001853 // WA: CTS test VideoSnapshot will try to
1854 // start preview during video recording.
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301855 CDBG_HIGH("CTS video restart op");
Emilian Peev88293e92013-06-07 12:37:18 +03001856 rc = NO_ERROR;
Muhua Libc9a8082012-11-07 15:51:28 -08001857 result.status = rc;
1858 result.request_api = evt;
1859 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1860 m_parent->signalAPIResult(&result);
1861 }
1862 break;
1863 case QCAMERA_SM_EVT_SET_CALLBACKS:
1864 {
1865 qcamera_sm_evt_setcb_payload_t *setcbs =
1866 (qcamera_sm_evt_setcb_payload_t *)payload;
1867 rc = m_parent->setCallBacks(setcbs->notify_cb,
1868 setcbs->data_cb,
1869 setcbs->data_cb_timestamp,
1870 setcbs->get_memory,
1871 setcbs->user);
1872 result.status = rc;
1873 result.request_api = evt;
1874 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1875 m_parent->signalAPIResult(&result);
1876 }
1877 break;
1878 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1879 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001880 rc = m_parent->enableMsgType(*((int32_t *)payload));
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_DISABLE_MSG_TYPE:
1888 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001889 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001890 result.status = rc;
1891 result.request_api = evt;
1892 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1893 m_parent->signalAPIResult(&result);
1894 }
1895 break;
1896 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1897 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001898 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001899 result.status = rc;
1900 result.request_api = evt;
1901 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1902 result.enabled = enabled;
1903 m_parent->signalAPIResult(&result);
1904 }
1905 break;
1906 case QCAMERA_SM_EVT_SET_PARAMS:
1907 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001908 bool needRestart = false;
1909 rc = m_parent->updateParameters((char*)payload, needRestart);
1910 if (rc == NO_ERROR) {
1911 if (needRestart) {
1912 // cannot set parameters that requires restart during recording
1913 ALOGE("%s: Cannot set parameters that requires restart during recording",
1914 __func__);
1915 rc = BAD_VALUE;
1916 } else {
1917 rc = m_parent->commitParameterChanges();
1918 }
1919 }
Muhua Libc9a8082012-11-07 15:51:28 -08001920 result.status = rc;
1921 result.request_api = evt;
1922 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1923 m_parent->signalAPIResult(&result);
1924 }
1925 break;
1926 case QCAMERA_SM_EVT_GET_PARAMS:
1927 {
1928 result.params = m_parent->getParameters();
1929 rc = NO_ERROR;
1930 result.status = rc;
1931 result.request_api = evt;
1932 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1933 m_parent->signalAPIResult(&result);
1934 }
1935 break;
1936 case QCAMERA_SM_EVT_PUT_PARAMS:
1937 {
1938 rc = m_parent->putParameters((char*)payload);
1939 result.status = rc;
1940 result.request_api = evt;
1941 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1942 m_parent->signalAPIResult(&result);
1943 }
1944 break;
1945 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1946 {
1947 rc = NO_ERROR;
1948 result.status = rc;
1949 result.request_api = evt;
1950 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1951 result.enabled = 0;
1952 m_parent->signalAPIResult(&result);
1953 }
1954 break;
1955 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1956 {
1957 rc = NO_ERROR;
1958 result.status = rc;
1959 result.request_api = evt;
1960 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1961 result.enabled = 1;
1962 m_parent->signalAPIResult(&result);
1963 }
1964 break;
1965 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1966 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001967 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001968 result.status = rc;
1969 result.request_api = evt;
1970 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1971 m_parent->signalAPIResult(&result);
1972 }
1973 break;
1974 case QCAMERA_SM_EVT_DUMP:
1975 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001976 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001977 result.status = rc;
1978 result.request_api = evt;
1979 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1980 m_parent->signalAPIResult(&result);
1981 }
1982 break;
1983 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1984 {
1985 rc = m_parent->autoFocus();
1986 result.status = rc;
1987 result.request_api = evt;
1988 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1989 m_parent->signalAPIResult(&result);
1990 }
1991 break;
1992 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1993 {
1994 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301995 result.status = rc;
1996 result.request_api = evt;
1997 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1998 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001999 }
2000 break;
2001 case QCAMERA_SM_EVT_SEND_COMMAND:
2002 {
2003 qcamera_sm_evt_command_payload_t *cmd_payload =
2004 (qcamera_sm_evt_command_payload_t *)payload;
2005 rc = m_parent->sendCommand(cmd_payload->cmd,
2006 cmd_payload->arg1,
2007 cmd_payload->arg2);
2008 result.status = rc;
2009 result.request_api = evt;
2010 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2011 m_parent->signalAPIResult(&result);
2012 }
2013 break;
2014 case QCAMERA_SM_EVT_TAKE_PICTURE:
2015 {
Muhua Li1d0c4772013-02-22 15:39:45 -08002016 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
Muhua Libc9a8082012-11-07 15:51:28 -08002017 rc = m_parent->takeLiveSnapshot();
Muhua Li1d0c4772013-02-22 15:39:45 -08002018 if (rc != NO_ERROR) {
2019 m_state = QCAMERA_SM_STATE_RECORDING;
Muhua Libc9a8082012-11-07 15:51:28 -08002020 }
2021 result.status = rc;
2022 result.request_api = evt;
2023 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2024 m_parent->signalAPIResult(&result);
2025 }
2026 break;
2027 case QCAMERA_SM_EVT_START_RECORDING:
2028 {
2029 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05302030 CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08002031 rc = 0;
2032 result.status = rc;
2033 result.request_api = evt;
2034 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2035 m_parent->signalAPIResult(&result);
2036 }
2037 break;
2038 case QCAMERA_SM_EVT_STOP_RECORDING:
2039 {
2040 rc = m_parent->stopRecording();
2041 m_state = QCAMERA_SM_STATE_PREVIEWING;
2042 result.status = rc;
2043 result.request_api = evt;
2044 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2045 m_parent->signalAPIResult(&result);
2046 }
2047 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002048 case QCAMERA_SM_EVT_STOP_PREVIEW:
2049 {
2050 rc = m_parent->stopRecording();
2051 m_state = QCAMERA_SM_STATE_PREVIEWING;
2052
2053 rc = m_parent->stopPreview();
2054 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2055
2056 result.status = rc;
2057 result.request_api = evt;
2058 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2059 m_parent->signalAPIResult(&result);
2060 }
2061 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002062 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2063 {
2064 rc = m_parent->releaseRecordingFrame((const void *)payload);
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 Li5858c392013-02-04 17:53:34 -08002071 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2072 {
2073 int32_t faceID = 0;
2074 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2075 (qcamera_sm_evt_reg_face_payload_t *)payload;
2076 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2077 reg_payload->config,
2078 faceID);
2079 result.status = rc;
2080 result.request_api = evt;
2081 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2082 result.handle = faceID;
2083 m_parent->signalAPIResult(&result);
2084 }
2085 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08002086 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
2087 {
2088 //In Video snapshot, prepare hardware is a no-op.
2089 result.status = NO_ERROR;
2090 result.request_api = evt;
2091 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2092 m_parent->signalAPIResult(&result);
2093 }
2094 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002095 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -08002096 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002097 case QCAMERA_SM_EVT_RELEASE:
2098 {
2099 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2100 rc = INVALID_OPERATION;
2101 result.status = rc;
2102 result.request_api = evt;
2103 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2104 m_parent->signalAPIResult(&result);
2105 }
2106 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002107 case QCAMERA_SM_EVT_EVT_INTERNAL:
2108 {
2109 qcamera_sm_internal_evt_payload_t *internal_evt =
2110 (qcamera_sm_internal_evt_payload_t *)payload;
2111 switch (internal_evt->evt_type) {
2112 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2113 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2114 break;
Muhua Li510aab22013-05-28 17:00:38 -07002115 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2116 break;
2117 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2118 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2119 break;
2120 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2121 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2122 break;
2123 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2124 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2125 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002126 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2127 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2128 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002129 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2130 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2131 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002132 default:
2133 break;
2134 }
2135 }
2136 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002137 case QCAMERA_SM_EVT_EVT_NOTIFY:
2138 {
2139 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2140 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002141 case CAM_EVENT_TYPE_DAEMON_DIED:
2142 {
Emilian Peev15690592013-04-19 09:55:40 +03002143 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2144 CAMERA_ERROR_SERVER_DIED,
2145 0);
2146 }
2147 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002148 default:
Emilian Peev15690592013-04-19 09:55:40 +03002149 ALOGE("%s: Invalid internal event %d in state(%d)",
2150 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002151 break;
2152 }
2153 }
2154 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002155 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002156 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002157 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002158 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002159 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002160 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08002161 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07002162 {
2163 // No ops, but need to notify
2164 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2165 result.status = rc;
2166 result.request_api = evt;
2167 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2168 m_parent->signalEvtResult(&result);
2169 }
2170 break;
2171 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08002172 default:
2173 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2174 break;
2175 }
2176
2177 return rc;
2178}
2179
Muhua Lida2c4be2012-11-26 09:14:16 -08002180/*===========================================================================
2181 * FUNCTION : procEvtVideoPicTakingState
2182 *
2183 * DESCRIPTION: finite state machine function to handle event in state of
2184 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
2185 *
2186 * PARAMETERS :
2187 * @evt : event to be processed
2188 * @payload : event payload. Can be NULL if not needed.
2189 *
2190 * RETURN : int32_t type of status
2191 * NO_ERROR -- success
2192 * none-zero failure code
2193 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002194int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
2195 void *payload)
2196{
2197 int32_t rc = NO_ERROR;
2198 qcamera_api_result_t result;
2199 memset(&result, 0, sizeof(qcamera_api_result_t));
2200
2201 switch (evt) {
2202 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2203 {
2204 // Error setting preview window during previewing
2205 ALOGE("Cannot set preview window when preview is running");
2206 rc = INVALID_OPERATION;
2207 result.status = rc;
2208 result.request_api = evt;
2209 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2210 m_parent->signalAPIResult(&result);
2211 }
2212 break;
2213 case QCAMERA_SM_EVT_SET_CALLBACKS:
2214 {
2215 qcamera_sm_evt_setcb_payload_t *setcbs =
2216 (qcamera_sm_evt_setcb_payload_t *)payload;
2217 rc = m_parent->setCallBacks(setcbs->notify_cb,
2218 setcbs->data_cb,
2219 setcbs->data_cb_timestamp,
2220 setcbs->get_memory,
2221 setcbs->user);
2222 result.status = rc;
2223 result.request_api = evt;
2224 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2225 m_parent->signalAPIResult(&result);
2226 }
2227 break;
2228 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2229 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002230 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002231 result.status = rc;
2232 result.request_api = evt;
2233 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2234 m_parent->signalAPIResult(&result);
2235 }
2236 break;
2237 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2238 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002239 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002240 result.status = rc;
2241 result.request_api = evt;
2242 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2243 m_parent->signalAPIResult(&result);
2244 }
2245 break;
2246 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2247 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002248 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002249 result.status = rc;
2250 result.request_api = evt;
2251 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2252 result.enabled = enabled;
2253 m_parent->signalAPIResult(&result);
2254 }
2255 break;
2256 case QCAMERA_SM_EVT_SET_PARAMS:
2257 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002258 bool needRestart = false;
2259 rc = m_parent->updateParameters((char*)payload, needRestart);
2260 if (rc == NO_ERROR) {
2261 if (needRestart) {
2262 // cannot set parameters that requires restart during recording
2263 ALOGE("%s: Cannot set parameters that requires restart during recording",
2264 __func__);
2265 rc = BAD_VALUE;
2266 } else {
2267 rc = m_parent->commitParameterChanges();
2268 }
2269 }
Muhua Libc9a8082012-11-07 15:51:28 -08002270 result.status = rc;
2271 result.request_api = evt;
2272 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2273 m_parent->signalAPIResult(&result);
2274 }
2275 break;
2276 case QCAMERA_SM_EVT_GET_PARAMS:
2277 {
2278 result.params = m_parent->getParameters();
2279 rc = NO_ERROR;
2280 result.status = rc;
2281 result.request_api = evt;
2282 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2283 m_parent->signalAPIResult(&result);
2284 }
2285 break;
2286 case QCAMERA_SM_EVT_PUT_PARAMS:
2287 {
2288 rc = m_parent->putParameters((char*)payload);
2289 result.status = rc;
2290 result.request_api = evt;
2291 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2292 m_parent->signalAPIResult(&result);
2293 }
2294 break;
2295 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2296 {
2297 rc = NO_ERROR;
2298 result.status = rc;
2299 result.request_api = evt;
2300 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2301 result.enabled = 1;
2302 m_parent->signalAPIResult(&result);
2303 }
2304 break;
2305 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2306 {
2307 rc = NO_ERROR;
2308 result.status = rc;
2309 result.request_api = evt;
2310 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2311 result.enabled = 1;
2312 m_parent->signalAPIResult(&result);
2313 }
2314 break;
2315 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2316 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002317 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002318 result.status = rc;
2319 result.request_api = evt;
2320 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2321 m_parent->signalAPIResult(&result);
2322 }
2323 break;
2324 case QCAMERA_SM_EVT_DUMP:
2325 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002326 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002327 result.status = rc;
2328 result.request_api = evt;
2329 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2330 m_parent->signalAPIResult(&result);
2331 }
2332 break;
2333 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2334 {
2335 rc = m_parent->autoFocus();
2336 result.status = rc;
2337 result.request_api = evt;
2338 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2339 m_parent->signalAPIResult(&result);
2340 }
2341 break;
2342 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2343 {
2344 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302345 result.status = rc;
2346 result.request_api = evt;
2347 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2348 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002349 }
2350 break;
2351 case QCAMERA_SM_EVT_SEND_COMMAND:
2352 {
2353 qcamera_sm_evt_command_payload_t *cmd_payload =
2354 (qcamera_sm_evt_command_payload_t *)payload;
2355 rc = m_parent->sendCommand(cmd_payload->cmd,
2356 cmd_payload->arg1,
2357 cmd_payload->arg2);
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;
2364 case QCAMERA_SM_EVT_STOP_RECORDING:
2365 {
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302366 rc = m_parent->cancelLiveSnapshot();
2367 m_state = QCAMERA_SM_STATE_RECORDING;
2368
Muhua Libc9a8082012-11-07 15:51:28 -08002369 rc = m_parent->stopRecording();
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302370 m_state = QCAMERA_SM_STATE_PREVIEWING;
2371
Muhua Libc9a8082012-11-07 15:51:28 -08002372 result.status = rc;
2373 result.request_api = evt;
2374 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2375 m_parent->signalAPIResult(&result);
2376 }
2377 break;
2378 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2379 {
2380 rc = m_parent->releaseRecordingFrame((const void *)payload);
2381 result.status = rc;
2382 result.request_api = evt;
2383 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2384 m_parent->signalAPIResult(&result);
2385 }
2386 break;
2387 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2388 {
2389 rc = m_parent->cancelLiveSnapshot();
2390 m_state = QCAMERA_SM_STATE_RECORDING;
2391 result.status = rc;
2392 result.request_api = evt;
2393 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2394 m_parent->signalAPIResult(&result);
2395 }
2396 break;
Muhua Li5858c392013-02-04 17:53:34 -08002397 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2398 {
2399 int32_t faceID = 0;
2400 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2401 (qcamera_sm_evt_reg_face_payload_t *)payload;
2402 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2403 reg_payload->config,
2404 faceID);
2405 result.status = rc;
2406 result.request_api = evt;
2407 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2408 result.handle = faceID;
2409 m_parent->signalAPIResult(&result);
2410 }
2411 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002412 case QCAMERA_SM_EVT_STOP_PREVIEW:
2413 {
2414 rc = m_parent->cancelLiveSnapshot();
2415 m_state = QCAMERA_SM_STATE_RECORDING;
2416
2417 rc = m_parent->stopRecording();
2418 m_state = QCAMERA_SM_STATE_PREVIEWING;
2419
2420 rc = m_parent->stopPreview();
2421 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2422
2423 result.status = rc;
2424 result.request_api = evt;
2425 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2426 m_parent->signalAPIResult(&result);
2427 }
2428 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002429 case QCAMERA_SM_EVT_START_RECORDING:
2430 case QCAMERA_SM_EVT_START_PREVIEW:
2431 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Li510aab22013-05-28 17:00:38 -07002432 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002433 case QCAMERA_SM_EVT_TAKE_PICTURE:
2434 case QCAMERA_SM_EVT_RELEASE:
2435 {
2436 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2437 rc = INVALID_OPERATION;
2438 result.status = rc;
2439 result.request_api = evt;
2440 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2441 m_parent->signalAPIResult(&result);
2442 }
2443 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002444 case QCAMERA_SM_EVT_EVT_INTERNAL:
2445 {
2446 qcamera_sm_internal_evt_payload_t *internal_evt =
2447 (qcamera_sm_internal_evt_payload_t *)payload;
2448 switch (internal_evt->evt_type) {
2449 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2450 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2451 break;
Muhua Li510aab22013-05-28 17:00:38 -07002452 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2453 break;
2454 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2455 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2456 break;
2457 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2458 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2459 break;
2460 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2461 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2462 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002463 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2464 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2465 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002466 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2467 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2468 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002469 default:
2470 break;
2471 }
2472 }
2473 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002474 case QCAMERA_SM_EVT_EVT_NOTIFY:
2475 {
2476 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2477 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002478 case CAM_EVENT_TYPE_DAEMON_DIED:
2479 {
Emilian Peev15690592013-04-19 09:55:40 +03002480 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2481 CAMERA_ERROR_SERVER_DIED,
2482 0);
2483 }
2484 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002485 default:
Emilian Peev15690592013-04-19 09:55:40 +03002486 ALOGE("%s: Invalid internal event %d in state(%d)",
2487 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002488 break;
2489 }
2490 }
2491 break;
2492 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2493 {
2494 qcamera_jpeg_evt_payload_t *jpeg_job =
2495 (qcamera_jpeg_evt_payload_t *)payload;
2496 rc = m_parent->processJpegNotify(jpeg_job);
2497 }
2498 break;
2499 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2500 {
2501 rc = m_parent->cancelLiveSnapshot();
2502 m_state = QCAMERA_SM_STATE_RECORDING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002503 result.status = rc;
2504 result.request_api = evt;
2505 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2506 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002507 }
2508 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002509 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002510 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002511 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002512 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002513 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002514 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002515 default:
2516 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2517 break;
2518 }
2519
2520 return rc;
2521}
2522
Muhua Lida2c4be2012-11-26 09:14:16 -08002523/*===========================================================================
2524 * FUNCTION : procEvtPreviewPicTakingState
2525 *
2526 * DESCRIPTION: finite state machine function to handle event in state of
2527 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
2528 *
2529 * PARAMETERS :
2530 * @evt : event to be processed
2531 * @payload : event payload. Can be NULL if not needed.
2532 *
2533 * RETURN : int32_t type of status
2534 * NO_ERROR -- success
2535 * none-zero failure code
2536 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002537int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
2538 void *payload)
2539{
2540 int32_t rc = NO_ERROR;
2541 qcamera_api_result_t result;
2542 memset(&result, 0, sizeof(qcamera_api_result_t));
2543
2544 switch (evt) {
2545 case QCAMERA_SM_EVT_SET_CALLBACKS:
2546 {
2547 qcamera_sm_evt_setcb_payload_t *setcbs =
2548 (qcamera_sm_evt_setcb_payload_t *)payload;
2549 rc = m_parent->setCallBacks(setcbs->notify_cb,
2550 setcbs->data_cb,
2551 setcbs->data_cb_timestamp,
2552 setcbs->get_memory,
2553 setcbs->user);
2554 result.status = rc;
2555 result.request_api = evt;
2556 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2557 m_parent->signalAPIResult(&result);
2558 }
2559 break;
2560 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2561 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002562 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002563 result.status = rc;
2564 result.request_api = evt;
2565 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2566 m_parent->signalAPIResult(&result);
2567 }
2568 break;
2569 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2570 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002571 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002572 result.status = rc;
2573 result.request_api = evt;
2574 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2575 m_parent->signalAPIResult(&result);
2576 }
2577 break;
2578 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2579 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002580 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002581 result.status = rc;
2582 result.request_api = evt;
2583 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2584 result.enabled = enabled;
2585 m_parent->signalAPIResult(&result);
2586 }
2587 break;
2588 case QCAMERA_SM_EVT_SET_PARAMS:
2589 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002590 bool needRestart = false;
2591 rc = m_parent->updateParameters((char*)payload, needRestart);
2592 if (rc == NO_ERROR) {
2593 if (needRestart) {
2594 // need restart preview for parameters to take effect
2595 // stop preview
2596 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -07002597 // Clear memory pools
2598 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -08002599 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -08002600 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -08002601 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -08002602 rc = m_parent->preparePreview();
2603 if (rc == NO_ERROR) {
2604 rc = m_parent->startPreview();
2605 if (rc != NO_ERROR) {
2606 m_parent->unpreparePreview();
2607 }
2608 }
2609 if (rc != NO_ERROR) {
2610 m_state = QCAMERA_SM_STATE_PIC_TAKING;
2611 }
Muhua Lida2c4be2012-11-26 09:14:16 -08002612 } else {
2613 rc = m_parent->commitParameterChanges();
2614 }
2615 }
Muhua Libc9a8082012-11-07 15:51:28 -08002616 result.status = rc;
2617 result.request_api = evt;
2618 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2619 m_parent->signalAPIResult(&result);
2620 }
2621 break;
2622 case QCAMERA_SM_EVT_GET_PARAMS:
2623 {
2624 result.params = m_parent->getParameters();
2625 rc = NO_ERROR;
2626 result.status = rc;
2627 result.request_api = evt;
2628 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2629 m_parent->signalAPIResult(&result);
2630 }
2631 break;
2632 case QCAMERA_SM_EVT_PUT_PARAMS:
2633 {
2634 rc = m_parent->putParameters((char*)payload);
2635 result.status = rc;
2636 result.request_api = evt;
2637 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2638 m_parent->signalAPIResult(&result);
2639 }
2640 break;
2641 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2642 {
2643 rc = NO_ERROR;
2644 result.status = rc;
2645 result.request_api = evt;
2646 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2647 result.enabled = 1;
2648 m_parent->signalAPIResult(&result);
2649 }
2650 break;
2651 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2652 {
2653 rc = NO_ERROR;
2654 result.status = rc;
2655 result.request_api = evt;
2656 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2657 result.enabled = 0;
2658 m_parent->signalAPIResult(&result);
2659 }
2660 break;
2661 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2662 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002663 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002664 result.status = rc;
2665 result.request_api = evt;
2666 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2667 m_parent->signalAPIResult(&result);
2668 }
2669 break;
2670 case QCAMERA_SM_EVT_DUMP:
2671 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002672 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002673 result.status = rc;
2674 result.request_api = evt;
2675 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2676 m_parent->signalAPIResult(&result);
2677 }
2678 break;
2679 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2680 {
2681 rc = m_parent->autoFocus();
2682 result.status = rc;
2683 result.request_api = evt;
2684 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2685 m_parent->signalAPIResult(&result);
2686 }
2687 break;
2688 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2689 {
2690 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302691 result.status = rc;
2692 result.request_api = evt;
2693 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2694 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002695 }
2696 break;
2697 case QCAMERA_SM_EVT_SEND_COMMAND:
2698 {
2699 qcamera_sm_evt_command_payload_t *cmd_payload =
2700 (qcamera_sm_evt_command_payload_t *)payload;
2701 rc = m_parent->sendCommand(cmd_payload->cmd,
2702 cmd_payload->arg1,
2703 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002704#ifndef VANILLA_HAL
Emilian Peeve32d03b2013-08-13 16:15:41 +03002705 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
2706 // move state to previewing state
2707 m_state = QCAMERA_SM_STATE_PREVIEWING;
2708 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002709#endif
Muhua Libc9a8082012-11-07 15:51:28 -08002710 result.status = rc;
2711 result.request_api = evt;
2712 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2713 m_parent->signalAPIResult(&result);
2714 }
2715 break;
2716 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2717 {
2718 rc = m_parent->releaseRecordingFrame((const void *)payload);
2719 result.status = rc;
2720 result.request_api = evt;
2721 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2722 m_parent->signalAPIResult(&result);
2723 }
2724 break;
2725 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2726 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002727 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002728 rc = m_parent->cancelPicture();
2729 } else {
2730 rc = m_parent->cancelLiveSnapshot();
2731 }
Muhua Libc9a8082012-11-07 15:51:28 -08002732 m_state = QCAMERA_SM_STATE_PREVIEWING;
2733 result.status = rc;
2734 result.request_api = evt;
2735 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2736 m_parent->signalAPIResult(&result);
2737 }
2738 break;
2739 case QCAMERA_SM_EVT_STOP_PREVIEW:
2740 {
Muhua Libd1b6122013-03-05 15:25:27 -08002741 if (m_parent->isZSLMode()) {
2742 // cancel picture first
2743 rc = m_parent->cancelPicture();
2744 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
Emilian Peeva43000b2013-09-27 14:27:21 -07002745 } else if (m_parent->isLongshotEnabled()) {
2746 // just cancel picture
2747 rc = m_parent->cancelPicture();
Muhua Libd1b6122013-03-05 15:25:27 -08002748 } else {
2749 rc = m_parent->cancelLiveSnapshot();
2750 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
2751 }
2752 // unprepare preview
2753 m_parent->unpreparePreview();
2754 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
Muhua Libc9a8082012-11-07 15:51:28 -08002755 result.status = rc;
2756 result.request_api = evt;
2757 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2758 m_parent->signalAPIResult(&result);
2759 }
2760 break;
2761 case QCAMERA_SM_EVT_START_RECORDING:
2762 {
Muhua Licf1cf672013-05-10 09:42:50 -07002763 if (m_parent->isZSLMode()) {
2764 ALOGE("%s: cannot handle evt(%d) in state(%d) in ZSL mode",
2765 __func__, evt, m_state);
2766 rc = INVALID_OPERATION;
Emilian Peeva43000b2013-09-27 14:27:21 -07002767 } else if (m_parent->isLongshotEnabled()) {
2768 ALOGE("%s: cannot handle evt(%d) in state(%d) in Longshot mode",
2769 __func__, evt, m_state);
2770 rc = INVALID_OPERATION;
Muhua Licf1cf672013-05-10 09:42:50 -07002771 } else {
2772 rc = m_parent->startRecording();
2773 if (rc == NO_ERROR) {
2774 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
2775 }
Muhua Libc9a8082012-11-07 15:51:28 -08002776 }
2777 result.status = rc;
2778 result.request_api = evt;
2779 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2780 m_parent->signalAPIResult(&result);
2781 }
2782 break;
Muhua Li5858c392013-02-04 17:53:34 -08002783 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2784 {
2785 int32_t faceID = 0;
2786 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2787 (qcamera_sm_evt_reg_face_payload_t *)payload;
2788 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2789 reg_payload->config,
2790 faceID);
2791 result.status = rc;
2792 result.request_api = evt;
2793 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2794 result.handle = faceID;
2795 m_parent->signalAPIResult(&result);
2796 }
2797 break;
Emilian Peeve32d03b2013-08-13 16:15:41 +03002798 case QCAMERA_SM_EVT_TAKE_PICTURE:
2799 {
2800 if ( m_parent->isLongshotEnabled() ) {
2801 rc = m_parent->longShot();
2802 } else {
2803 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2804 rc = INVALID_OPERATION;
2805 }
2806
2807 result.status = rc;
2808 result.request_api = evt;
2809 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2810 m_parent->signalAPIResult(&result);
2811 }
2812 break;
2813 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002814 case QCAMERA_SM_EVT_STOP_RECORDING:
2815 case QCAMERA_SM_EVT_START_PREVIEW:
2816 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002817 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2818 case QCAMERA_SM_EVT_RELEASE:
2819 {
2820 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2821 rc = INVALID_OPERATION;
2822 result.status = rc;
2823 result.request_api = evt;
2824 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2825 m_parent->signalAPIResult(&result);
2826 }
2827 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002828 case QCAMERA_SM_EVT_EVT_INTERNAL:
2829 {
2830 qcamera_sm_internal_evt_payload_t *internal_evt =
2831 (qcamera_sm_internal_evt_payload_t *)payload;
2832 switch (internal_evt->evt_type) {
2833 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2834 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2835 break;
Muhua Li510aab22013-05-28 17:00:38 -07002836 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2837 break;
2838 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2839 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2840 break;
2841 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2842 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2843 break;
2844 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2845 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2846 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002847 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2848 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2849 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002850 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2851 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2852 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002853 default:
2854 break;
2855 }
2856 }
2857 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002858 case QCAMERA_SM_EVT_EVT_NOTIFY:
2859 {
2860 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2861 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02002862 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
2863 {
2864 if ( m_parent->isLongshotEnabled() ) {
2865 if(!m_parent->m_postprocessor.getMultipleStages()) {
2866 m_parent->m_postprocessor.setMultipleStages(true);
2867 }
2868 m_parent->playShutter();
2869 }
2870 }
2871 break;
Emilian Peev15690592013-04-19 09:55:40 +03002872 case CAM_EVENT_TYPE_DAEMON_DIED:
2873 {
Emilian Peev15690592013-04-19 09:55:40 +03002874 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2875 CAMERA_ERROR_SERVER_DIED,
2876 0);
2877 }
2878 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002879 default:
Emilian Peev15690592013-04-19 09:55:40 +03002880 ALOGE("%s: Invalid internal event %d in state(%d)",
2881 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002882 break;
2883 }
2884 }
2885 break;
2886 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2887 {
2888 qcamera_jpeg_evt_payload_t *jpeg_job =
2889 (qcamera_jpeg_evt_payload_t *)payload;
2890 rc = m_parent->processJpegNotify(jpeg_job);
2891 }
2892 break;
2893 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2894 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002895 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002896 rc = m_parent->cancelPicture();
2897 } else {
2898 rc = m_parent->cancelLiveSnapshot();
2899 }
Muhua Libc9a8082012-11-07 15:51:28 -08002900 m_state = QCAMERA_SM_STATE_PREVIEWING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002901 result.status = rc;
2902 result.request_api = evt;
2903 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2904 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002905 }
2906 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002907 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002908 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002909 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002910 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002911 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002912 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002913 default:
2914 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2915 break;
2916 }
2917
2918 return rc;
2919}
2920
Muhua Lida2c4be2012-11-26 09:14:16 -08002921/*===========================================================================
2922 * FUNCTION : isPreviewRunning
2923 *
2924 * DESCRIPTION: check if preview is in process.
2925 *
2926 * PARAMETERS : None
2927 *
2928 * RETURN : true -- preview running
2929 * false -- preview stopped
2930 *==========================================================================*/
2931bool QCameraStateMachine::isPreviewRunning()
2932{
2933 switch (m_state) {
2934 case QCAMERA_SM_STATE_PREVIEWING:
2935 case QCAMERA_SM_STATE_RECORDING:
2936 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2937 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
Muhua Libf818e52013-04-23 18:05:26 -07002938 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
chiza8491aa2014-03-21 13:02:39 +08002939 case QCAMERA_SM_STATE_PREVIEW_READY:
Muhua Lida2c4be2012-11-26 09:14:16 -08002940 return true;
2941 default:
2942 return false;
2943 }
2944}
2945
Emilian Peeve32d03b2013-08-13 16:15:41 +03002946/*===========================================================================
Emilian Peev7890d1f2014-04-30 15:13:41 -07002947 * FUNCTION : isPreviewReady
2948 *
2949 * DESCRIPTION: check if preview is in ready state.
2950 *
2951 * PARAMETERS : None
2952 *
2953 * RETURN : true -- preview is in ready state
2954 * false -- preview is stopped
2955 *==========================================================================*/
2956bool QCameraStateMachine::isPreviewReady()
2957{
2958 switch (m_state) {
2959 case QCAMERA_SM_STATE_PREVIEW_READY:
2960 return true;
2961 default:
2962 return false;
2963 }
2964}
2965
2966/*===========================================================================
Emilian Peeve32d03b2013-08-13 16:15:41 +03002967 * FUNCTION : isCaptureRunning
2968 *
2969 * DESCRIPTION: check if image capture is in process.
2970 *
2971 * PARAMETERS : None
2972 *
2973 * RETURN : true -- capture running
2974 * false -- capture stopped
2975 *==========================================================================*/
2976bool QCameraStateMachine::isCaptureRunning()
2977{
2978 switch (m_state) {
2979 case QCAMERA_SM_STATE_PIC_TAKING:
2980 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2981 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2982 return true;
2983 default:
2984 return false;
2985 }
2986}
Vijay kumar Tumatifa8d9b32013-09-23 16:09:07 +05302987/*===========================================================================
2988 * FUNCTION : isNonZSLCaptureRunning
2989 *
2990 * DESCRIPTION: check if image capture is in process in non ZSL mode.
2991 *
2992 * PARAMETERS : None
2993 *
2994 * RETURN : true -- capture running in non ZSL mode
2995 * false -- Either in not capture mode or captur is not in non ZSL mode
2996 *==========================================================================*/
2997bool QCameraStateMachine::isNonZSLCaptureRunning()
2998{
2999 switch (m_state) {
3000 case QCAMERA_SM_STATE_PIC_TAKING:
3001 return true;
3002 default:
3003 return false;
3004 }
3005}
3006
Emilian Peeve32d03b2013-08-13 16:15:41 +03003007
Shuzhen Wang89635cf2012-12-20 13:47:22 -08003008}; // namespace qcamera