blob: f803524ef7d47ac5cca727915a404714e8d0fa97 [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:
1131 {
Muhua Li8e614bc2013-04-17 17:38:42 -07001132 if ( m_parent->mParameters.getRecordingHintValue() == false) {
Emilian Peeva43000b2013-09-27 14:27:21 -07001133 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001134 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001135 rc = m_parent->takePicture();
1136 if (rc != NO_ERROR) {
1137 // move state to previewing state
1138 m_state = QCAMERA_SM_STATE_PREVIEWING;
1139 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001140 } else {
1141 m_state = QCAMERA_SM_STATE_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001142 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 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001147 }
Muhua Lia9dca012013-05-03 22:37:42 -07001148
1149 result.status = rc;
1150 result.request_api = evt;
1151 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1152 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001153 } else {
Muhua Lia9dca012013-05-03 22:37:42 -07001154 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001155 rc = m_parent->takeLiveSnapshot();
Muhua Lia9dca012013-05-03 22:37:42 -07001156 if (rc != NO_ERROR ) {
1157 m_state = QCAMERA_SM_STATE_PREVIEWING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001158 }
Muhua Lia9dca012013-05-03 22:37:42 -07001159 result.status = rc;
1160 result.request_api = evt;
1161 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1162 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001163 }
Muhua Libc9a8082012-11-07 15:51:28 -08001164 }
1165 break;
1166 case QCAMERA_SM_EVT_SEND_COMMAND:
1167 {
1168 qcamera_sm_evt_command_payload_t *cmd_payload =
1169 (qcamera_sm_evt_command_payload_t *)payload;
1170 rc = m_parent->sendCommand(cmd_payload->cmd,
1171 cmd_payload->arg1,
1172 cmd_payload->arg2);
Emilian Peevd17d2e12014-01-13 12:32:57 +02001173 if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
1174 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
1175 m_parent->stopPreview();
1176 // Clear memory pools
1177 m_parent->m_memoryPool.clear();
1178 // start preview again
1179 rc = m_parent->preparePreview();
1180 if (rc == NO_ERROR) {
1181 rc = m_parent->startPreview();
1182 if (rc != NO_ERROR) {
1183 m_parent->unpreparePreview();
1184 }
1185 }
1186 }
1187 }
Muhua Libc9a8082012-11-07 15:51:28 -08001188 result.status = rc;
1189 result.request_api = evt;
1190 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1191 m_parent->signalAPIResult(&result);
1192 }
1193 break;
Muhua Li5858c392013-02-04 17:53:34 -08001194 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1195 {
1196 int32_t faceID = 0;
1197 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1198 (qcamera_sm_evt_reg_face_payload_t *)payload;
1199 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1200 reg_payload->config,
1201 faceID);
1202 result.status = rc;
1203 result.request_api = evt;
1204 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1205 result.handle = faceID;
1206 m_parent->signalAPIResult(&result);
1207 }
1208 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001209 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1210 case QCAMERA_SM_EVT_STOP_RECORDING:
1211 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1212 case QCAMERA_SM_EVT_RELEASE:
1213 {
1214 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1215 rc = INVALID_OPERATION;
1216 result.status = rc;
1217 result.request_api = evt;
1218 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1219 m_parent->signalAPIResult(&result);
1220 }
1221 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001222 case QCAMERA_SM_EVT_EVT_INTERNAL:
1223 {
1224 qcamera_sm_internal_evt_payload_t *internal_evt =
1225 (qcamera_sm_internal_evt_payload_t *)payload;
1226 switch (internal_evt->evt_type) {
1227 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1228 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1229 break;
Muhua Li510aab22013-05-28 17:00:38 -07001230 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1231 break;
1232 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1233 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1234 break;
1235 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1236 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1237 break;
1238 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1239 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1240 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001241 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1242 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1243 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001244 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1245 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1246 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001247 default:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001248 ALOGE("%s: Invalid internal event %d in state(%d)",
1249 __func__, internal_evt->evt_type, m_state);
Muhua Li31eaee02012-12-11 08:56:45 -08001250 break;
1251 }
1252 }
1253 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001254 case QCAMERA_SM_EVT_EVT_NOTIFY:
1255 {
1256 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1257 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03001258 case CAM_EVENT_TYPE_DAEMON_DIED:
1259 {
Emilian Peev15690592013-04-19 09:55:40 +03001260 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1261 CAMERA_ERROR_SERVER_DIED,
1262 0);
1263 }
1264 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001265 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301266 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001267 __func__, cam_evt->server_event_type);
1268 break;
1269 }
1270 }
1271 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001272 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001273 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08001274 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001275 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001276 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001277 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08001278 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07001279 {
1280 // No ops, but need to notify
1281 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1282 result.status = rc;
1283 result.request_api = evt;
1284 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1285 m_parent->signalEvtResult(&result);
1286 }
1287 break;
1288 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08001289 default:
1290 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1291 break;
1292 }
1293
1294 return rc;
1295}
1296
Muhua Lida2c4be2012-11-26 09:14:16 -08001297/*===========================================================================
Shuzhen Wang93f24112013-02-20 16:01:42 -08001298 * FUNCTION : procEvtPrepareSnapshotState
1299 *
1300 * DESCRIPTION: finite state machine function to handle event in state of
1301 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
1302 *
1303 * PARAMETERS :
1304 * @evt : event to be processed
1305 * @payload : event payload. Can be NULL if not needed.
1306 *
1307 * RETURN : int32_t type of status
1308 * NO_ERROR -- success
1309 * none-zero failure code
1310 *==========================================================================*/
1311int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
1312 void *payload)
1313{
1314 int32_t rc = NO_ERROR;
1315 qcamera_api_result_t result;
1316 memset(&result, 0, sizeof(qcamera_api_result_t));
1317
1318 switch (evt) {
1319 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1320 case QCAMERA_SM_EVT_SET_CALLBACKS:
1321 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1322 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1323 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1324 case QCAMERA_SM_EVT_SET_PARAMS:
1325 case QCAMERA_SM_EVT_GET_PARAMS:
1326 case QCAMERA_SM_EVT_PUT_PARAMS:
1327 case QCAMERA_SM_EVT_START_PREVIEW:
1328 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1329 case QCAMERA_SM_EVT_STOP_PREVIEW:
1330 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1331 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1332 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1333 case QCAMERA_SM_EVT_DUMP:
1334 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1335 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1336 case QCAMERA_SM_EVT_START_RECORDING:
1337 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Li510aab22013-05-28 17:00:38 -07001338 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001339 case QCAMERA_SM_EVT_SEND_COMMAND:
1340 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1341 case QCAMERA_SM_EVT_STOP_RECORDING:
1342 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1343 case QCAMERA_SM_EVT_RELEASE:
1344 {
1345 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1346 rc = INVALID_OPERATION;
1347 result.status = rc;
1348 result.request_api = evt;
1349 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1350 m_parent->signalAPIResult(&result);
1351 }
1352 break;
1353 case QCAMERA_SM_EVT_EVT_INTERNAL:
1354 {
1355 qcamera_sm_internal_evt_payload_t *internal_evt =
1356 (qcamera_sm_internal_evt_payload_t *)payload;
1357 switch (internal_evt->evt_type) {
Muhua Li6f3c5322013-05-08 17:20:17 -07001358 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1359 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1360 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001361 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301362 CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
Shuzhen Wang93f24112013-02-20 16:01:42 -08001363 __func__);
1364 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
1365 m_state = QCAMERA_SM_STATE_PREVIEWING;
1366
1367 result.status = NO_ERROR;
1368 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
1369 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1370 m_parent->signalAPIResult(&result);
1371 break;
Muhua Li510aab22013-05-28 17:00:38 -07001372 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1373 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1374 break;
1375 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1376 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1377 break;
1378 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1379 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1380 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001381 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1382 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1383 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001384 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1385 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1386 break;
1387
Shuzhen Wang93f24112013-02-20 16:01:42 -08001388 default:
1389 ALOGE("%s: Invalid internal event %d in state(%d)",
1390 __func__, internal_evt->evt_type, m_state);
1391 break;
1392 }
1393 }
1394 break;
1395 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +03001396 {
1397 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1398 switch (cam_evt->server_event_type) {
1399 case CAM_EVENT_TYPE_DAEMON_DIED:
1400 {
Emilian Peev15690592013-04-19 09:55:40 +03001401 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1402 CAMERA_ERROR_SERVER_DIED,
1403 0);
1404 }
1405 break;
1406 default:
1407 ALOGE("%s: Invalid internal event %d in state(%d)",
1408 __func__, cam_evt->server_event_type, m_state);
1409 break;
1410 }
1411 }
1412 break;
Muhua Lic9390df2013-05-22 17:54:13 -07001413 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1414 {
1415 // No ops, but need to notify
1416 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1417 result.status = rc;
1418 result.request_api = evt;
1419 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1420 m_parent->signalEvtResult(&result);
1421 }
1422 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001423 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
1424 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001425 default:
1426 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1427 break;
1428 }
1429
1430 return rc;
1431}
1432
1433/*===========================================================================
Muhua Lida2c4be2012-11-26 09:14:16 -08001434 * FUNCTION : procEvtPicTakingState
1435 *
1436 * DESCRIPTION: finite state machine function to handle event in state of
1437 * QCAMERA_SM_STATE_PIC_TAKING.
1438 *
1439 * PARAMETERS :
1440 * @evt : event to be processed
1441 * @payload : event payload. Can be NULL if not needed.
1442 *
1443 * RETURN : int32_t type of status
1444 * NO_ERROR -- success
1445 * none-zero failure code
1446 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001447int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
1448 void *payload)
1449{
1450 int32_t rc = NO_ERROR;
1451 qcamera_api_result_t result;
1452 memset(&result, 0, sizeof(qcamera_api_result_t));
1453
1454 switch (evt) {
1455 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1456 {
1457 // Error setting preview window during previewing
1458 ALOGE("Cannot set preview window when preview is running");
1459 rc = INVALID_OPERATION;
1460 result.status = rc;
1461 result.request_api = evt;
1462 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1463 m_parent->signalAPIResult(&result);
1464 }
1465 break;
1466 case QCAMERA_SM_EVT_SET_CALLBACKS:
1467 {
1468 qcamera_sm_evt_setcb_payload_t *setcbs =
1469 (qcamera_sm_evt_setcb_payload_t *)payload;
1470 rc = m_parent->setCallBacks(setcbs->notify_cb,
1471 setcbs->data_cb,
1472 setcbs->data_cb_timestamp,
1473 setcbs->get_memory,
1474 setcbs->user);
1475 result.status = rc;
1476 result.request_api = evt;
1477 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1478 m_parent->signalAPIResult(&result);
1479 }
1480 break;
1481 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1482 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001483 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001484 result.status = rc;
1485 result.request_api = evt;
1486 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1487 m_parent->signalAPIResult(&result);
1488 }
1489 break;
1490 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1491 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001492 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001493 result.status = rc;
1494 result.request_api = evt;
1495 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1496 m_parent->signalAPIResult(&result);
1497 }
1498 break;
1499 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1500 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001501 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001502 result.status = rc;
1503 result.request_api = evt;
1504 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1505 result.enabled = enabled;
1506 m_parent->signalAPIResult(&result);
1507 }
1508 break;
1509 case QCAMERA_SM_EVT_SET_PARAMS:
1510 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001511 bool needRestart = false;
1512 rc = m_parent->updateParameters((char*)payload, needRestart);
1513 if (rc == NO_ERROR) {
1514 rc = m_parent->commitParameterChanges();
1515 }
Muhua Libc9a8082012-11-07 15:51:28 -08001516 result.status = rc;
1517 result.request_api = evt;
1518 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1519 m_parent->signalAPIResult(&result);
1520 }
1521 break;
1522 case QCAMERA_SM_EVT_GET_PARAMS:
1523 {
1524 result.params = m_parent->getParameters();
1525 rc = NO_ERROR;
1526 result.status = rc;
1527 result.request_api = evt;
1528 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1529 m_parent->signalAPIResult(&result);
1530 }
1531 break;
1532 case QCAMERA_SM_EVT_PUT_PARAMS:
1533 {
1534 rc = m_parent->putParameters((char*)payload);
1535 result.status = rc;
1536 result.request_api = evt;
1537 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1538 m_parent->signalAPIResult(&result);
1539 }
1540 break;
1541 case QCAMERA_SM_EVT_STOP_PREVIEW:
1542 {
Muhua Libd1b6122013-03-05 15:25:27 -08001543 // cancel picture first
1544 rc = m_parent->cancelPicture();
1545 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1546
Muhua Libc9a8082012-11-07 15:51:28 -08001547 result.status = rc;
1548 result.request_api = evt;
1549 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1550 m_parent->signalAPIResult(&result);
1551 }
1552 break;
1553 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1554 {
1555 rc = NO_ERROR;
1556 result.status = rc;
1557 result.request_api = evt;
1558 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1559 result.enabled = 0;
1560 m_parent->signalAPIResult(&result);
1561 }
1562 break;
1563 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1564 {
1565 rc = NO_ERROR;
1566 result.status = rc;
1567 result.request_api = evt;
1568 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1569 result.enabled = 0;
1570 m_parent->signalAPIResult(&result);
1571 }
1572 break;
1573 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1574 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001575 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001576 result.status = rc;
1577 result.request_api = evt;
1578 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1579 m_parent->signalAPIResult(&result);
1580 }
1581 break;
1582 case QCAMERA_SM_EVT_DUMP:
1583 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001584 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001585 result.status = rc;
1586 result.request_api = evt;
1587 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1588 m_parent->signalAPIResult(&result);
1589 }
1590 break;
1591 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1592 {
1593 rc = m_parent->autoFocus();
1594 result.status = rc;
1595 result.request_api = evt;
1596 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1597 m_parent->signalAPIResult(&result);
1598 }
1599 break;
1600 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1601 {
1602 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301603 result.status = rc;
1604 result.request_api = evt;
1605 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1606 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001607 }
1608 break;
1609 case QCAMERA_SM_EVT_SEND_COMMAND:
1610 {
1611 qcamera_sm_evt_command_payload_t *cmd_payload =
1612 (qcamera_sm_evt_command_payload_t *)payload;
1613 rc = m_parent->sendCommand(cmd_payload->cmd,
1614 cmd_payload->arg1,
1615 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001616#ifndef VANILLA_HAL
Emilian Peeva43000b2013-09-27 14:27:21 -07001617 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
1618 // move state to previewing state
1619 m_state = QCAMERA_SM_STATE_PREVIEWING;
1620 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001621#endif
Muhua Libc9a8082012-11-07 15:51:28 -08001622 result.status = rc;
1623 result.request_api = evt;
1624 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1625 m_parent->signalAPIResult(&result);
1626 }
1627 break;
1628 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1629 {
1630 rc = m_parent->cancelPicture();
1631 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1632 result.status = rc;
1633 result.request_api = evt;
1634 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1635 m_parent->signalAPIResult(&result);
1636 }
1637 break;
Muhua Li5858c392013-02-04 17:53:34 -08001638 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1639 {
1640 int32_t faceID = 0;
1641 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1642 (qcamera_sm_evt_reg_face_payload_t *)payload;
1643 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1644 reg_payload->config,
1645 faceID);
1646 result.status = rc;
1647 result.request_api = evt;
1648 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1649 result.handle = faceID;
1650 m_parent->signalAPIResult(&result);
1651 }
1652 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001653 case QCAMERA_SM_EVT_TAKE_PICTURE:
Emilian Peeva43000b2013-09-27 14:27:21 -07001654 {
1655 if ( m_parent->isLongshotEnabled() ) {
1656 rc = m_parent->longShot();
1657 } else {
1658 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1659 rc = INVALID_OPERATION;
1660 }
1661
1662 result.status = rc;
1663 result.request_api = evt;
1664 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1665 m_parent->signalAPIResult(&result);
1666 }
1667 break;
1668 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001669 case QCAMERA_SM_EVT_START_RECORDING:
1670 case QCAMERA_SM_EVT_STOP_RECORDING:
1671 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1672 case QCAMERA_SM_EVT_START_PREVIEW:
1673 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1674 case QCAMERA_SM_EVT_RELEASE:
1675 {
1676 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1677 rc = INVALID_OPERATION;
1678 result.status = rc;
1679 result.request_api = evt;
1680 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1681 m_parent->signalAPIResult(&result);
1682 }
1683 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001684 case QCAMERA_SM_EVT_EVT_INTERNAL:
1685 {
1686 qcamera_sm_internal_evt_payload_t *internal_evt =
1687 (qcamera_sm_internal_evt_payload_t *)payload;
1688 switch (internal_evt->evt_type) {
1689 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1690 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1691 break;
Muhua Li510aab22013-05-28 17:00:38 -07001692 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1693 break;
1694 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1695 break;
1696 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1697 break;
1698 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1699 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1700 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001701 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1702 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1703 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001704 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1705 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1706 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001707 default:
1708 break;
1709 }
1710 }
1711 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001712 case QCAMERA_SM_EVT_EVT_NOTIFY:
1713 {
1714 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1715 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02001716 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
1717 {
1718 if ( m_parent->isLongshotEnabled() ) {
1719 if(!m_parent->m_postprocessor.getMultipleStages()) {
1720 m_parent->m_postprocessor.setMultipleStages(true);
1721 }
1722 m_parent->playShutter();
1723 }
1724 }
1725 break;
Emilian Peev15690592013-04-19 09:55:40 +03001726 case CAM_EVENT_TYPE_DAEMON_DIED:
1727 {
Emilian Peev15690592013-04-19 09:55:40 +03001728 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1729 CAMERA_ERROR_SERVER_DIED,
1730 0);
1731 }
1732 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001733 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301734 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001735 __func__, cam_evt->server_event_type);
1736 break;
1737 }
1738 }
1739 break;
1740 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
1741 {
1742 qcamera_jpeg_evt_payload_t *jpeg_job =
1743 (qcamera_jpeg_evt_payload_t *)payload;
1744 rc = m_parent->processJpegNotify(jpeg_job);
1745 }
1746 break;
Emilian Peev7d36a812013-11-20 00:15:54 -08001747 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
1748 {
Emilian Peev8a977232013-11-04 07:56:32 -08001749 bool restartPreview = m_parent->isPreviewRestartEnabled();
1750 rc = m_parent->stopCaptureChannel(restartPreview);
1751
1752 if (restartPreview && (NO_ERROR == rc)) {
1753 rc = m_parent->preparePreview();
1754 if (NO_ERROR == rc) {
1755 m_parent->m_bPreviewStarted = true;
1756 rc = m_parent->startPreview();
1757 }
1758 }
1759
Emilian Peev7d36a812013-11-20 00:15:54 -08001760 }
1761 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001762 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1763 {
1764 rc = m_parent->cancelPicture();
Emilian Peev8a977232013-11-04 07:56:32 -08001765
1766 bool restartPreview = m_parent->isPreviewRestartEnabled();
1767 if (restartPreview) {
1768 m_state = QCAMERA_SM_STATE_PREVIEWING;
1769 } else {
1770 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1771 }
1772
Emilian Peev6d90c1f2013-04-12 09:33:06 +03001773 result.status = rc;
1774 result.request_api = evt;
1775 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1776 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001777 }
1778 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001779 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peev2ae455e2013-04-18 10:41:56 +03001780 {
1781 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001782 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peev2ae455e2013-04-18 10:41:56 +03001783 }
1784 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001785 default:
1786 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1787 break;
1788 }
1789
1790 return rc;
1791}
1792
Muhua Lida2c4be2012-11-26 09:14:16 -08001793/*===========================================================================
1794 * FUNCTION : procEvtRecordingState
1795 *
1796 * DESCRIPTION: finite state machine function to handle event in state of
1797 * QCAMERA_SM_STATE_RECORDING.
1798 *
1799 * PARAMETERS :
1800 * @evt : event to be processed
1801 * @payload : event payload. Can be NULL if not needed.
1802 *
1803 * RETURN : int32_t type of status
1804 * NO_ERROR -- success
1805 * none-zero failure code
1806 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001807int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
1808 void *payload)
1809{
1810 int32_t rc = NO_ERROR;
1811 qcamera_api_result_t result;
1812 memset(&result, 0, sizeof(qcamera_api_result_t));
1813
1814 switch (evt) {
Emilian Peev88293e92013-06-07 12:37:18 +03001815 case QCAMERA_SM_EVT_START_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08001816 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1817 {
Emilian Peev88293e92013-06-07 12:37:18 +03001818 // WA: CTS test VideoSnapshot will try to
1819 // start preview during video recording.
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301820 CDBG_HIGH("CTS video restart op");
Emilian Peev88293e92013-06-07 12:37:18 +03001821 rc = NO_ERROR;
Muhua Libc9a8082012-11-07 15:51:28 -08001822 result.status = rc;
1823 result.request_api = evt;
1824 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1825 m_parent->signalAPIResult(&result);
1826 }
1827 break;
1828 case QCAMERA_SM_EVT_SET_CALLBACKS:
1829 {
1830 qcamera_sm_evt_setcb_payload_t *setcbs =
1831 (qcamera_sm_evt_setcb_payload_t *)payload;
1832 rc = m_parent->setCallBacks(setcbs->notify_cb,
1833 setcbs->data_cb,
1834 setcbs->data_cb_timestamp,
1835 setcbs->get_memory,
1836 setcbs->user);
1837 result.status = rc;
1838 result.request_api = evt;
1839 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1840 m_parent->signalAPIResult(&result);
1841 }
1842 break;
1843 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1844 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001845 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001846 result.status = rc;
1847 result.request_api = evt;
1848 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1849 m_parent->signalAPIResult(&result);
1850 }
1851 break;
1852 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1853 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001854 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001855 result.status = rc;
1856 result.request_api = evt;
1857 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1858 m_parent->signalAPIResult(&result);
1859 }
1860 break;
1861 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1862 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001863 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001864 result.status = rc;
1865 result.request_api = evt;
1866 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1867 result.enabled = enabled;
1868 m_parent->signalAPIResult(&result);
1869 }
1870 break;
1871 case QCAMERA_SM_EVT_SET_PARAMS:
1872 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001873 bool needRestart = false;
1874 rc = m_parent->updateParameters((char*)payload, needRestart);
1875 if (rc == NO_ERROR) {
1876 if (needRestart) {
1877 // cannot set parameters that requires restart during recording
1878 ALOGE("%s: Cannot set parameters that requires restart during recording",
1879 __func__);
1880 rc = BAD_VALUE;
1881 } else {
1882 rc = m_parent->commitParameterChanges();
1883 }
1884 }
Muhua Libc9a8082012-11-07 15:51:28 -08001885 result.status = rc;
1886 result.request_api = evt;
1887 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1888 m_parent->signalAPIResult(&result);
1889 }
1890 break;
1891 case QCAMERA_SM_EVT_GET_PARAMS:
1892 {
1893 result.params = m_parent->getParameters();
1894 rc = NO_ERROR;
1895 result.status = rc;
1896 result.request_api = evt;
1897 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1898 m_parent->signalAPIResult(&result);
1899 }
1900 break;
1901 case QCAMERA_SM_EVT_PUT_PARAMS:
1902 {
1903 rc = m_parent->putParameters((char*)payload);
1904 result.status = rc;
1905 result.request_api = evt;
1906 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1907 m_parent->signalAPIResult(&result);
1908 }
1909 break;
1910 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1911 {
1912 rc = NO_ERROR;
1913 result.status = rc;
1914 result.request_api = evt;
1915 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1916 result.enabled = 0;
1917 m_parent->signalAPIResult(&result);
1918 }
1919 break;
1920 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1921 {
1922 rc = NO_ERROR;
1923 result.status = rc;
1924 result.request_api = evt;
1925 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1926 result.enabled = 1;
1927 m_parent->signalAPIResult(&result);
1928 }
1929 break;
1930 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1931 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001932 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001933 result.status = rc;
1934 result.request_api = evt;
1935 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1936 m_parent->signalAPIResult(&result);
1937 }
1938 break;
1939 case QCAMERA_SM_EVT_DUMP:
1940 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03001941 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08001942 result.status = rc;
1943 result.request_api = evt;
1944 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1945 m_parent->signalAPIResult(&result);
1946 }
1947 break;
1948 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1949 {
1950 rc = m_parent->autoFocus();
1951 result.status = rc;
1952 result.request_api = evt;
1953 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1954 m_parent->signalAPIResult(&result);
1955 }
1956 break;
1957 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1958 {
1959 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301960 result.status = rc;
1961 result.request_api = evt;
1962 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1963 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001964 }
1965 break;
1966 case QCAMERA_SM_EVT_SEND_COMMAND:
1967 {
1968 qcamera_sm_evt_command_payload_t *cmd_payload =
1969 (qcamera_sm_evt_command_payload_t *)payload;
1970 rc = m_parent->sendCommand(cmd_payload->cmd,
1971 cmd_payload->arg1,
1972 cmd_payload->arg2);
1973 result.status = rc;
1974 result.request_api = evt;
1975 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1976 m_parent->signalAPIResult(&result);
1977 }
1978 break;
1979 case QCAMERA_SM_EVT_TAKE_PICTURE:
1980 {
Muhua Li1d0c4772013-02-22 15:39:45 -08001981 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
Muhua Libc9a8082012-11-07 15:51:28 -08001982 rc = m_parent->takeLiveSnapshot();
Muhua Li1d0c4772013-02-22 15:39:45 -08001983 if (rc != NO_ERROR) {
1984 m_state = QCAMERA_SM_STATE_RECORDING;
Muhua Libc9a8082012-11-07 15:51:28 -08001985 }
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_START_RECORDING:
1993 {
1994 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301995 CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08001996 rc = 0;
1997 result.status = rc;
1998 result.request_api = evt;
1999 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2000 m_parent->signalAPIResult(&result);
2001 }
2002 break;
2003 case QCAMERA_SM_EVT_STOP_RECORDING:
2004 {
2005 rc = m_parent->stopRecording();
2006 m_state = QCAMERA_SM_STATE_PREVIEWING;
2007 result.status = rc;
2008 result.request_api = evt;
2009 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2010 m_parent->signalAPIResult(&result);
2011 }
2012 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002013 case QCAMERA_SM_EVT_STOP_PREVIEW:
2014 {
2015 rc = m_parent->stopRecording();
2016 m_state = QCAMERA_SM_STATE_PREVIEWING;
2017
2018 rc = m_parent->stopPreview();
2019 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2020
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;
Muhua Libc9a8082012-11-07 15:51:28 -08002027 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2028 {
2029 rc = m_parent->releaseRecordingFrame((const void *)payload);
2030 result.status = rc;
2031 result.request_api = evt;
2032 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2033 m_parent->signalAPIResult(&result);
2034 }
2035 break;
Muhua Li5858c392013-02-04 17:53:34 -08002036 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2037 {
2038 int32_t faceID = 0;
2039 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2040 (qcamera_sm_evt_reg_face_payload_t *)payload;
2041 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2042 reg_payload->config,
2043 faceID);
2044 result.status = rc;
2045 result.request_api = evt;
2046 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2047 result.handle = faceID;
2048 m_parent->signalAPIResult(&result);
2049 }
2050 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08002051 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
2052 {
2053 //In Video snapshot, prepare hardware is a no-op.
2054 result.status = NO_ERROR;
2055 result.request_api = evt;
2056 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2057 m_parent->signalAPIResult(&result);
2058 }
2059 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002060 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -08002061 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002062 case QCAMERA_SM_EVT_RELEASE:
2063 {
2064 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2065 rc = INVALID_OPERATION;
2066 result.status = rc;
2067 result.request_api = evt;
2068 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2069 m_parent->signalAPIResult(&result);
2070 }
2071 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002072 case QCAMERA_SM_EVT_EVT_INTERNAL:
2073 {
2074 qcamera_sm_internal_evt_payload_t *internal_evt =
2075 (qcamera_sm_internal_evt_payload_t *)payload;
2076 switch (internal_evt->evt_type) {
2077 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2078 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2079 break;
Muhua Li510aab22013-05-28 17:00:38 -07002080 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2081 break;
2082 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2083 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2084 break;
2085 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2086 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2087 break;
2088 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2089 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2090 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002091 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2092 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2093 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002094 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2095 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2096 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002097 default:
2098 break;
2099 }
2100 }
2101 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002102 case QCAMERA_SM_EVT_EVT_NOTIFY:
2103 {
2104 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2105 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002106 case CAM_EVENT_TYPE_DAEMON_DIED:
2107 {
Emilian Peev15690592013-04-19 09:55:40 +03002108 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2109 CAMERA_ERROR_SERVER_DIED,
2110 0);
2111 }
2112 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002113 default:
Emilian Peev15690592013-04-19 09:55:40 +03002114 ALOGE("%s: Invalid internal event %d in state(%d)",
2115 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002116 break;
2117 }
2118 }
2119 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002120 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002121 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002122 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002123 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002124 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002125 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08002126 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07002127 {
2128 // No ops, but need to notify
2129 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2130 result.status = rc;
2131 result.request_api = evt;
2132 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2133 m_parent->signalEvtResult(&result);
2134 }
2135 break;
2136 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08002137 default:
2138 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2139 break;
2140 }
2141
2142 return rc;
2143}
2144
Muhua Lida2c4be2012-11-26 09:14:16 -08002145/*===========================================================================
2146 * FUNCTION : procEvtVideoPicTakingState
2147 *
2148 * DESCRIPTION: finite state machine function to handle event in state of
2149 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
2150 *
2151 * PARAMETERS :
2152 * @evt : event to be processed
2153 * @payload : event payload. Can be NULL if not needed.
2154 *
2155 * RETURN : int32_t type of status
2156 * NO_ERROR -- success
2157 * none-zero failure code
2158 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002159int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
2160 void *payload)
2161{
2162 int32_t rc = NO_ERROR;
2163 qcamera_api_result_t result;
2164 memset(&result, 0, sizeof(qcamera_api_result_t));
2165
2166 switch (evt) {
2167 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2168 {
2169 // Error setting preview window during previewing
2170 ALOGE("Cannot set preview window when preview is running");
2171 rc = INVALID_OPERATION;
2172 result.status = rc;
2173 result.request_api = evt;
2174 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2175 m_parent->signalAPIResult(&result);
2176 }
2177 break;
2178 case QCAMERA_SM_EVT_SET_CALLBACKS:
2179 {
2180 qcamera_sm_evt_setcb_payload_t *setcbs =
2181 (qcamera_sm_evt_setcb_payload_t *)payload;
2182 rc = m_parent->setCallBacks(setcbs->notify_cb,
2183 setcbs->data_cb,
2184 setcbs->data_cb_timestamp,
2185 setcbs->get_memory,
2186 setcbs->user);
2187 result.status = rc;
2188 result.request_api = evt;
2189 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2190 m_parent->signalAPIResult(&result);
2191 }
2192 break;
2193 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2194 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002195 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002196 result.status = rc;
2197 result.request_api = evt;
2198 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2199 m_parent->signalAPIResult(&result);
2200 }
2201 break;
2202 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2203 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002204 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002205 result.status = rc;
2206 result.request_api = evt;
2207 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2208 m_parent->signalAPIResult(&result);
2209 }
2210 break;
2211 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2212 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002213 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002214 result.status = rc;
2215 result.request_api = evt;
2216 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2217 result.enabled = enabled;
2218 m_parent->signalAPIResult(&result);
2219 }
2220 break;
2221 case QCAMERA_SM_EVT_SET_PARAMS:
2222 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002223 bool needRestart = false;
2224 rc = m_parent->updateParameters((char*)payload, needRestart);
2225 if (rc == NO_ERROR) {
2226 if (needRestart) {
2227 // cannot set parameters that requires restart during recording
2228 ALOGE("%s: Cannot set parameters that requires restart during recording",
2229 __func__);
2230 rc = BAD_VALUE;
2231 } else {
2232 rc = m_parent->commitParameterChanges();
2233 }
2234 }
Muhua Libc9a8082012-11-07 15:51:28 -08002235 result.status = rc;
2236 result.request_api = evt;
2237 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2238 m_parent->signalAPIResult(&result);
2239 }
2240 break;
2241 case QCAMERA_SM_EVT_GET_PARAMS:
2242 {
2243 result.params = m_parent->getParameters();
2244 rc = NO_ERROR;
2245 result.status = rc;
2246 result.request_api = evt;
2247 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2248 m_parent->signalAPIResult(&result);
2249 }
2250 break;
2251 case QCAMERA_SM_EVT_PUT_PARAMS:
2252 {
2253 rc = m_parent->putParameters((char*)payload);
2254 result.status = rc;
2255 result.request_api = evt;
2256 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2257 m_parent->signalAPIResult(&result);
2258 }
2259 break;
2260 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2261 {
2262 rc = NO_ERROR;
2263 result.status = rc;
2264 result.request_api = evt;
2265 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2266 result.enabled = 1;
2267 m_parent->signalAPIResult(&result);
2268 }
2269 break;
2270 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2271 {
2272 rc = NO_ERROR;
2273 result.status = rc;
2274 result.request_api = evt;
2275 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2276 result.enabled = 1;
2277 m_parent->signalAPIResult(&result);
2278 }
2279 break;
2280 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2281 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002282 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002283 result.status = rc;
2284 result.request_api = evt;
2285 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2286 m_parent->signalAPIResult(&result);
2287 }
2288 break;
2289 case QCAMERA_SM_EVT_DUMP:
2290 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002291 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002292 result.status = rc;
2293 result.request_api = evt;
2294 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2295 m_parent->signalAPIResult(&result);
2296 }
2297 break;
2298 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2299 {
2300 rc = m_parent->autoFocus();
2301 result.status = rc;
2302 result.request_api = evt;
2303 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2304 m_parent->signalAPIResult(&result);
2305 }
2306 break;
2307 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2308 {
2309 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302310 result.status = rc;
2311 result.request_api = evt;
2312 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2313 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002314 }
2315 break;
2316 case QCAMERA_SM_EVT_SEND_COMMAND:
2317 {
2318 qcamera_sm_evt_command_payload_t *cmd_payload =
2319 (qcamera_sm_evt_command_payload_t *)payload;
2320 rc = m_parent->sendCommand(cmd_payload->cmd,
2321 cmd_payload->arg1,
2322 cmd_payload->arg2);
2323 result.status = rc;
2324 result.request_api = evt;
2325 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2326 m_parent->signalAPIResult(&result);
2327 }
2328 break;
2329 case QCAMERA_SM_EVT_STOP_RECORDING:
2330 {
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302331 rc = m_parent->cancelLiveSnapshot();
2332 m_state = QCAMERA_SM_STATE_RECORDING;
2333
Muhua Libc9a8082012-11-07 15:51:28 -08002334 rc = m_parent->stopRecording();
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302335 m_state = QCAMERA_SM_STATE_PREVIEWING;
2336
Muhua Libc9a8082012-11-07 15:51:28 -08002337 result.status = rc;
2338 result.request_api = evt;
2339 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2340 m_parent->signalAPIResult(&result);
2341 }
2342 break;
2343 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2344 {
2345 rc = m_parent->releaseRecordingFrame((const void *)payload);
2346 result.status = rc;
2347 result.request_api = evt;
2348 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2349 m_parent->signalAPIResult(&result);
2350 }
2351 break;
2352 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2353 {
2354 rc = m_parent->cancelLiveSnapshot();
2355 m_state = QCAMERA_SM_STATE_RECORDING;
2356 result.status = rc;
2357 result.request_api = evt;
2358 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2359 m_parent->signalAPIResult(&result);
2360 }
2361 break;
Muhua Li5858c392013-02-04 17:53:34 -08002362 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2363 {
2364 int32_t faceID = 0;
2365 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2366 (qcamera_sm_evt_reg_face_payload_t *)payload;
2367 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2368 reg_payload->config,
2369 faceID);
2370 result.status = rc;
2371 result.request_api = evt;
2372 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2373 result.handle = faceID;
2374 m_parent->signalAPIResult(&result);
2375 }
2376 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002377 case QCAMERA_SM_EVT_STOP_PREVIEW:
2378 {
2379 rc = m_parent->cancelLiveSnapshot();
2380 m_state = QCAMERA_SM_STATE_RECORDING;
2381
2382 rc = m_parent->stopRecording();
2383 m_state = QCAMERA_SM_STATE_PREVIEWING;
2384
2385 rc = m_parent->stopPreview();
2386 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2387
2388 result.status = rc;
2389 result.request_api = evt;
2390 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2391 m_parent->signalAPIResult(&result);
2392 }
2393 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002394 case QCAMERA_SM_EVT_START_RECORDING:
2395 case QCAMERA_SM_EVT_START_PREVIEW:
2396 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Li510aab22013-05-28 17:00:38 -07002397 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002398 case QCAMERA_SM_EVT_TAKE_PICTURE:
2399 case QCAMERA_SM_EVT_RELEASE:
2400 {
2401 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2402 rc = INVALID_OPERATION;
2403 result.status = rc;
2404 result.request_api = evt;
2405 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2406 m_parent->signalAPIResult(&result);
2407 }
2408 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002409 case QCAMERA_SM_EVT_EVT_INTERNAL:
2410 {
2411 qcamera_sm_internal_evt_payload_t *internal_evt =
2412 (qcamera_sm_internal_evt_payload_t *)payload;
2413 switch (internal_evt->evt_type) {
2414 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2415 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2416 break;
Muhua Li510aab22013-05-28 17:00:38 -07002417 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2418 break;
2419 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2420 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2421 break;
2422 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2423 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2424 break;
2425 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2426 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2427 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002428 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2429 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2430 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002431 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2432 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2433 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002434 default:
2435 break;
2436 }
2437 }
2438 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002439 case QCAMERA_SM_EVT_EVT_NOTIFY:
2440 {
2441 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2442 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002443 case CAM_EVENT_TYPE_DAEMON_DIED:
2444 {
Emilian Peev15690592013-04-19 09:55:40 +03002445 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2446 CAMERA_ERROR_SERVER_DIED,
2447 0);
2448 }
2449 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002450 default:
Emilian Peev15690592013-04-19 09:55:40 +03002451 ALOGE("%s: Invalid internal event %d in state(%d)",
2452 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002453 break;
2454 }
2455 }
2456 break;
2457 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2458 {
2459 qcamera_jpeg_evt_payload_t *jpeg_job =
2460 (qcamera_jpeg_evt_payload_t *)payload;
2461 rc = m_parent->processJpegNotify(jpeg_job);
2462 }
2463 break;
2464 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2465 {
2466 rc = m_parent->cancelLiveSnapshot();
2467 m_state = QCAMERA_SM_STATE_RECORDING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002468 result.status = rc;
2469 result.request_api = evt;
2470 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2471 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002472 }
2473 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002474 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002475 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002476 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002477 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002478 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002479 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002480 default:
2481 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2482 break;
2483 }
2484
2485 return rc;
2486}
2487
Muhua Lida2c4be2012-11-26 09:14:16 -08002488/*===========================================================================
2489 * FUNCTION : procEvtPreviewPicTakingState
2490 *
2491 * DESCRIPTION: finite state machine function to handle event in state of
2492 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
2493 *
2494 * PARAMETERS :
2495 * @evt : event to be processed
2496 * @payload : event payload. Can be NULL if not needed.
2497 *
2498 * RETURN : int32_t type of status
2499 * NO_ERROR -- success
2500 * none-zero failure code
2501 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002502int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
2503 void *payload)
2504{
2505 int32_t rc = NO_ERROR;
2506 qcamera_api_result_t result;
2507 memset(&result, 0, sizeof(qcamera_api_result_t));
2508
2509 switch (evt) {
2510 case QCAMERA_SM_EVT_SET_CALLBACKS:
2511 {
2512 qcamera_sm_evt_setcb_payload_t *setcbs =
2513 (qcamera_sm_evt_setcb_payload_t *)payload;
2514 rc = m_parent->setCallBacks(setcbs->notify_cb,
2515 setcbs->data_cb,
2516 setcbs->data_cb_timestamp,
2517 setcbs->get_memory,
2518 setcbs->user);
2519 result.status = rc;
2520 result.request_api = evt;
2521 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2522 m_parent->signalAPIResult(&result);
2523 }
2524 break;
2525 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2526 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002527 rc = m_parent->enableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002528 result.status = rc;
2529 result.request_api = evt;
2530 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2531 m_parent->signalAPIResult(&result);
2532 }
2533 break;
2534 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2535 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002536 rc = m_parent->disableMsgType(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002537 result.status = rc;
2538 result.request_api = evt;
2539 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2540 m_parent->signalAPIResult(&result);
2541 }
2542 break;
2543 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2544 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002545 int enabled = m_parent->msgTypeEnabled(*((int32_t *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002546 result.status = rc;
2547 result.request_api = evt;
2548 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2549 result.enabled = enabled;
2550 m_parent->signalAPIResult(&result);
2551 }
2552 break;
2553 case QCAMERA_SM_EVT_SET_PARAMS:
2554 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002555 bool needRestart = false;
2556 rc = m_parent->updateParameters((char*)payload, needRestart);
2557 if (rc == NO_ERROR) {
2558 if (needRestart) {
2559 // need restart preview for parameters to take effect
2560 // stop preview
2561 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -07002562 // Clear memory pools
2563 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -08002564 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -08002565 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -08002566 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -08002567 rc = m_parent->preparePreview();
2568 if (rc == NO_ERROR) {
2569 rc = m_parent->startPreview();
2570 if (rc != NO_ERROR) {
2571 m_parent->unpreparePreview();
2572 }
2573 }
2574 if (rc != NO_ERROR) {
2575 m_state = QCAMERA_SM_STATE_PIC_TAKING;
2576 }
Muhua Lida2c4be2012-11-26 09:14:16 -08002577 } else {
2578 rc = m_parent->commitParameterChanges();
2579 }
2580 }
Muhua Libc9a8082012-11-07 15:51:28 -08002581 result.status = rc;
2582 result.request_api = evt;
2583 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2584 m_parent->signalAPIResult(&result);
2585 }
2586 break;
2587 case QCAMERA_SM_EVT_GET_PARAMS:
2588 {
2589 result.params = m_parent->getParameters();
2590 rc = NO_ERROR;
2591 result.status = rc;
2592 result.request_api = evt;
2593 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2594 m_parent->signalAPIResult(&result);
2595 }
2596 break;
2597 case QCAMERA_SM_EVT_PUT_PARAMS:
2598 {
2599 rc = m_parent->putParameters((char*)payload);
2600 result.status = rc;
2601 result.request_api = evt;
2602 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2603 m_parent->signalAPIResult(&result);
2604 }
2605 break;
2606 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2607 {
2608 rc = NO_ERROR;
2609 result.status = rc;
2610 result.request_api = evt;
2611 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2612 result.enabled = 1;
2613 m_parent->signalAPIResult(&result);
2614 }
2615 break;
2616 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2617 {
2618 rc = NO_ERROR;
2619 result.status = rc;
2620 result.request_api = evt;
2621 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2622 result.enabled = 0;
2623 m_parent->signalAPIResult(&result);
2624 }
2625 break;
2626 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2627 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002628 rc = m_parent->storeMetaDataInBuffers(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002629 result.status = rc;
2630 result.request_api = evt;
2631 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2632 m_parent->signalAPIResult(&result);
2633 }
2634 break;
2635 case QCAMERA_SM_EVT_DUMP:
2636 {
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002637 rc = m_parent->dump(*((int *)payload));
Muhua Libc9a8082012-11-07 15:51:28 -08002638 result.status = rc;
2639 result.request_api = evt;
2640 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2641 m_parent->signalAPIResult(&result);
2642 }
2643 break;
2644 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2645 {
2646 rc = m_parent->autoFocus();
2647 result.status = rc;
2648 result.request_api = evt;
2649 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2650 m_parent->signalAPIResult(&result);
2651 }
2652 break;
2653 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2654 {
2655 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302656 result.status = rc;
2657 result.request_api = evt;
2658 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2659 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002660 }
2661 break;
2662 case QCAMERA_SM_EVT_SEND_COMMAND:
2663 {
2664 qcamera_sm_evt_command_payload_t *cmd_payload =
2665 (qcamera_sm_evt_command_payload_t *)payload;
2666 rc = m_parent->sendCommand(cmd_payload->cmd,
2667 cmd_payload->arg1,
2668 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002669#ifndef VANILLA_HAL
Emilian Peeve32d03b2013-08-13 16:15:41 +03002670 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
2671 // move state to previewing state
2672 m_state = QCAMERA_SM_STATE_PREVIEWING;
2673 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002674#endif
Muhua Libc9a8082012-11-07 15:51:28 -08002675 result.status = rc;
2676 result.request_api = evt;
2677 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2678 m_parent->signalAPIResult(&result);
2679 }
2680 break;
2681 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2682 {
2683 rc = m_parent->releaseRecordingFrame((const void *)payload);
2684 result.status = rc;
2685 result.request_api = evt;
2686 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2687 m_parent->signalAPIResult(&result);
2688 }
2689 break;
2690 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2691 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002692 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002693 rc = m_parent->cancelPicture();
2694 } else {
2695 rc = m_parent->cancelLiveSnapshot();
2696 }
Muhua Libc9a8082012-11-07 15:51:28 -08002697 m_state = QCAMERA_SM_STATE_PREVIEWING;
2698 result.status = rc;
2699 result.request_api = evt;
2700 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2701 m_parent->signalAPIResult(&result);
2702 }
2703 break;
2704 case QCAMERA_SM_EVT_STOP_PREVIEW:
2705 {
Muhua Libd1b6122013-03-05 15:25:27 -08002706 if (m_parent->isZSLMode()) {
2707 // cancel picture first
2708 rc = m_parent->cancelPicture();
2709 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
Emilian Peeva43000b2013-09-27 14:27:21 -07002710 } else if (m_parent->isLongshotEnabled()) {
2711 // just cancel picture
2712 rc = m_parent->cancelPicture();
Muhua Libd1b6122013-03-05 15:25:27 -08002713 } else {
2714 rc = m_parent->cancelLiveSnapshot();
2715 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
2716 }
2717 // unprepare preview
2718 m_parent->unpreparePreview();
2719 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
Muhua Libc9a8082012-11-07 15:51:28 -08002720 result.status = rc;
2721 result.request_api = evt;
2722 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2723 m_parent->signalAPIResult(&result);
2724 }
2725 break;
2726 case QCAMERA_SM_EVT_START_RECORDING:
2727 {
Muhua Licf1cf672013-05-10 09:42:50 -07002728 if (m_parent->isZSLMode()) {
2729 ALOGE("%s: cannot handle evt(%d) in state(%d) in ZSL mode",
2730 __func__, evt, m_state);
2731 rc = INVALID_OPERATION;
Emilian Peeva43000b2013-09-27 14:27:21 -07002732 } else if (m_parent->isLongshotEnabled()) {
2733 ALOGE("%s: cannot handle evt(%d) in state(%d) in Longshot mode",
2734 __func__, evt, m_state);
2735 rc = INVALID_OPERATION;
Muhua Licf1cf672013-05-10 09:42:50 -07002736 } else {
2737 rc = m_parent->startRecording();
2738 if (rc == NO_ERROR) {
2739 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
2740 }
Muhua Libc9a8082012-11-07 15:51:28 -08002741 }
2742 result.status = rc;
2743 result.request_api = evt;
2744 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2745 m_parent->signalAPIResult(&result);
2746 }
2747 break;
Muhua Li5858c392013-02-04 17:53:34 -08002748 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2749 {
2750 int32_t faceID = 0;
2751 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2752 (qcamera_sm_evt_reg_face_payload_t *)payload;
2753 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2754 reg_payload->config,
2755 faceID);
2756 result.status = rc;
2757 result.request_api = evt;
2758 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2759 result.handle = faceID;
2760 m_parent->signalAPIResult(&result);
2761 }
2762 break;
Emilian Peeve32d03b2013-08-13 16:15:41 +03002763 case QCAMERA_SM_EVT_TAKE_PICTURE:
2764 {
2765 if ( m_parent->isLongshotEnabled() ) {
2766 rc = m_parent->longShot();
2767 } else {
2768 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2769 rc = INVALID_OPERATION;
2770 }
2771
2772 result.status = rc;
2773 result.request_api = evt;
2774 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2775 m_parent->signalAPIResult(&result);
2776 }
2777 break;
2778 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002779 case QCAMERA_SM_EVT_STOP_RECORDING:
2780 case QCAMERA_SM_EVT_START_PREVIEW:
2781 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002782 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2783 case QCAMERA_SM_EVT_RELEASE:
2784 {
2785 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2786 rc = INVALID_OPERATION;
2787 result.status = rc;
2788 result.request_api = evt;
2789 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2790 m_parent->signalAPIResult(&result);
2791 }
2792 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002793 case QCAMERA_SM_EVT_EVT_INTERNAL:
2794 {
2795 qcamera_sm_internal_evt_payload_t *internal_evt =
2796 (qcamera_sm_internal_evt_payload_t *)payload;
2797 switch (internal_evt->evt_type) {
2798 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2799 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2800 break;
Muhua Li510aab22013-05-28 17:00:38 -07002801 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2802 break;
2803 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2804 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2805 break;
2806 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2807 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2808 break;
2809 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2810 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2811 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002812 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2813 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2814 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002815 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2816 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2817 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002818 default:
2819 break;
2820 }
2821 }
2822 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002823 case QCAMERA_SM_EVT_EVT_NOTIFY:
2824 {
2825 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2826 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02002827 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
2828 {
2829 if ( m_parent->isLongshotEnabled() ) {
2830 if(!m_parent->m_postprocessor.getMultipleStages()) {
2831 m_parent->m_postprocessor.setMultipleStages(true);
2832 }
2833 m_parent->playShutter();
2834 }
2835 }
2836 break;
Emilian Peev15690592013-04-19 09:55:40 +03002837 case CAM_EVENT_TYPE_DAEMON_DIED:
2838 {
Emilian Peev15690592013-04-19 09:55:40 +03002839 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2840 CAMERA_ERROR_SERVER_DIED,
2841 0);
2842 }
2843 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002844 default:
Emilian Peev15690592013-04-19 09:55:40 +03002845 ALOGE("%s: Invalid internal event %d in state(%d)",
2846 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002847 break;
2848 }
2849 }
2850 break;
2851 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2852 {
2853 qcamera_jpeg_evt_payload_t *jpeg_job =
2854 (qcamera_jpeg_evt_payload_t *)payload;
2855 rc = m_parent->processJpegNotify(jpeg_job);
2856 }
2857 break;
2858 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2859 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002860 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002861 rc = m_parent->cancelPicture();
2862 } else {
2863 rc = m_parent->cancelLiveSnapshot();
2864 }
Muhua Libc9a8082012-11-07 15:51:28 -08002865 m_state = QCAMERA_SM_STATE_PREVIEWING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002866 result.status = rc;
2867 result.request_api = evt;
2868 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2869 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002870 }
2871 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002872 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002873 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002874 rc = m_parent->updateThermalLevel(
Vladimir Petrovc12219f2014-08-06 18:55:54 +03002875 *((qcamera_thermal_level_enum_t *)payload));
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002876 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002877 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002878 default:
2879 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2880 break;
2881 }
2882
2883 return rc;
2884}
2885
Muhua Lida2c4be2012-11-26 09:14:16 -08002886/*===========================================================================
2887 * FUNCTION : isPreviewRunning
2888 *
2889 * DESCRIPTION: check if preview is in process.
2890 *
2891 * PARAMETERS : None
2892 *
2893 * RETURN : true -- preview running
2894 * false -- preview stopped
2895 *==========================================================================*/
2896bool QCameraStateMachine::isPreviewRunning()
2897{
2898 switch (m_state) {
2899 case QCAMERA_SM_STATE_PREVIEWING:
2900 case QCAMERA_SM_STATE_RECORDING:
2901 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2902 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
Muhua Libf818e52013-04-23 18:05:26 -07002903 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
chiza8491aa2014-03-21 13:02:39 +08002904 case QCAMERA_SM_STATE_PREVIEW_READY:
Muhua Lida2c4be2012-11-26 09:14:16 -08002905 return true;
2906 default:
2907 return false;
2908 }
2909}
2910
Emilian Peeve32d03b2013-08-13 16:15:41 +03002911/*===========================================================================
Emilian Peev7890d1f2014-04-30 15:13:41 -07002912 * FUNCTION : isPreviewReady
2913 *
2914 * DESCRIPTION: check if preview is in ready state.
2915 *
2916 * PARAMETERS : None
2917 *
2918 * RETURN : true -- preview is in ready state
2919 * false -- preview is stopped
2920 *==========================================================================*/
2921bool QCameraStateMachine::isPreviewReady()
2922{
2923 switch (m_state) {
2924 case QCAMERA_SM_STATE_PREVIEW_READY:
2925 return true;
2926 default:
2927 return false;
2928 }
2929}
2930
2931/*===========================================================================
Emilian Peeve32d03b2013-08-13 16:15:41 +03002932 * FUNCTION : isCaptureRunning
2933 *
2934 * DESCRIPTION: check if image capture is in process.
2935 *
2936 * PARAMETERS : None
2937 *
2938 * RETURN : true -- capture running
2939 * false -- capture stopped
2940 *==========================================================================*/
2941bool QCameraStateMachine::isCaptureRunning()
2942{
2943 switch (m_state) {
2944 case QCAMERA_SM_STATE_PIC_TAKING:
2945 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2946 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2947 return true;
2948 default:
2949 return false;
2950 }
2951}
Vijay kumar Tumatifa8d9b32013-09-23 16:09:07 +05302952/*===========================================================================
2953 * FUNCTION : isNonZSLCaptureRunning
2954 *
2955 * DESCRIPTION: check if image capture is in process in non ZSL mode.
2956 *
2957 * PARAMETERS : None
2958 *
2959 * RETURN : true -- capture running in non ZSL mode
2960 * false -- Either in not capture mode or captur is not in non ZSL mode
2961 *==========================================================================*/
2962bool QCameraStateMachine::isNonZSLCaptureRunning()
2963{
2964 switch (m_state) {
2965 case QCAMERA_SM_STATE_PIC_TAKING:
2966 return true;
2967 default:
2968 return false;
2969 }
2970}
2971
Emilian Peeve32d03b2013-08-13 16:15:41 +03002972
Shuzhen Wang89635cf2012-12-20 13:47:22 -08002973}; // namespace qcamera