blob: 8c7975707a0801aa5ef08f4d4a37e90ceade7207 [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);
122}
123
Muhua Lida2c4be2012-11-26 09:14:16 -0800124/*===========================================================================
125 * FUNCTION : ~QCameraStateMachine
126 *
127 * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
128 *
129 * PARAMETERS : none
130 *
131 * RETURN : none
132 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800133QCameraStateMachine::~QCameraStateMachine()
134{
135 if (cmd_pid != 0) {
136 qcamera_sm_cmd_t *node =
137 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
138 if (NULL != node) {
139 memset(node, 0, sizeof(qcamera_sm_cmd_t));
140 node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
141
142 api_queue.enqueue((void *)node);
Shuzhen Wang2da44612012-12-20 10:51:57 -0800143 cam_sem_post(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800144
145 /* wait until cmd thread exits */
146 if (pthread_join(cmd_pid, NULL) != 0) {
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530147 CDBG_HIGH("%s: pthread dead already\n", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -0800148 }
149 }
150 cmd_pid = 0;
151 }
Shuzhen Wang2da44612012-12-20 10:51:57 -0800152 cam_sem_destroy(&cmd_sem);
Muhua Libc9a8082012-11-07 15:51:28 -0800153}
154
Muhua Lida2c4be2012-11-26 09:14:16 -0800155/*===========================================================================
156 * FUNCTION : procAPI
157 *
158 * DESCRIPTION: process incoming API request from framework layer.
159 *
160 * PARAMETERS :
161 * @evt : event to be processed
162 * @api_payload : API payload. Can be NULL if not needed.
163 *
164 * RETURN : int32_t type of status
165 * NO_ERROR -- success
166 * none-zero failure code
167 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800168int32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
169 void *api_payload)
170{
171 qcamera_sm_cmd_t *node =
172 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800173 if (NULL == node) {
174 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
175 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800176 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800177
178 memset(node, 0, sizeof(qcamera_sm_cmd_t));
179 node->cmd = QCAMERA_SM_CMD_TYPE_API;
180 node->evt = evt;
181 node->evt_payload = api_payload;
182 if (api_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800183 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800184 return NO_ERROR;
185 } else {
186 free(node);
187 return UNKNOWN_ERROR;
188 }
Muhua Libc9a8082012-11-07 15:51:28 -0800189}
190
Muhua Lida2c4be2012-11-26 09:14:16 -0800191/*===========================================================================
192 * FUNCTION : procEvt
193 *
194 * DESCRIPTION: process incoming envent from mm-camera-interface and
195 * mm-jpeg-interface.
196 *
197 * PARAMETERS :
198 * @evt : event to be processed
199 * @evt_payload : event payload. Can be NULL if not needed.
200 *
201 * RETURN : int32_t type of status
202 * NO_ERROR -- success
203 * none-zero failure code
204 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800205int32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
206 void *evt_payload)
207{
208 qcamera_sm_cmd_t *node =
209 (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
Muhua Lida2c4be2012-11-26 09:14:16 -0800210 if (NULL == node) {
211 ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
212 return NO_MEMORY;
Muhua Libc9a8082012-11-07 15:51:28 -0800213 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800214
215 memset(node, 0, sizeof(qcamera_sm_cmd_t));
216 node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
217 node->evt = evt;
218 node->evt_payload = evt_payload;
219 if (evt_queue.enqueue((void *)node)) {
Shuzhen Wang2da44612012-12-20 10:51:57 -0800220 cam_sem_post(&cmd_sem);
Muhua Lida2c4be2012-11-26 09:14:16 -0800221 return NO_ERROR;
222 } else {
223 free(node);
224 return UNKNOWN_ERROR;
225 }
Muhua Libc9a8082012-11-07 15:51:28 -0800226}
227
Muhua Lida2c4be2012-11-26 09:14:16 -0800228/*===========================================================================
229 * FUNCTION : stateMachine
230 *
231 * DESCRIPTION: finite state machine entry function. Depends on state,
232 * incoming event will be handled differently.
233 *
234 * PARAMETERS :
235 * @evt : event to be processed
236 * @payload : event payload. Can be NULL if not needed.
237 *
238 * RETURN : int32_t type of status
239 * NO_ERROR -- success
240 * none-zero failure code
241 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800242int32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
243{
244 int32_t rc = NO_ERROR;
245 switch (m_state) {
246 case QCAMERA_SM_STATE_PREVIEW_STOPPED:
247 rc = procEvtPreviewStoppedState(evt, payload);
248 break;
249 case QCAMERA_SM_STATE_PREVIEW_READY:
250 rc = procEvtPreviewReadyState(evt, payload);
251 break;
252 case QCAMERA_SM_STATE_PREVIEWING:
253 rc = procEvtPreviewingState(evt, payload);
254 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -0800255 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
256 rc = procEvtPrepareSnapshotState(evt, payload);
257 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800258 case QCAMERA_SM_STATE_PIC_TAKING:
259 rc = procEvtPicTakingState(evt, payload);
260 break;
261 case QCAMERA_SM_STATE_RECORDING:
262 rc = procEvtRecordingState(evt, payload);
263 break;
264 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
265 rc = procEvtVideoPicTakingState(evt, payload);
266 break;
267 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
268 rc = procEvtPreviewPicTakingState(evt, payload);
269 break;
270 default:
271 break;
272 }
273
274 return rc;
275}
276
Muhua Lida2c4be2012-11-26 09:14:16 -0800277/*===========================================================================
278 * FUNCTION : procEvtPreviewStoppedState
279 *
280 * DESCRIPTION: finite state machine function to handle event in state of
281 * QCAMERA_SM_STATE_PREVIEW_STOPPED.
282 *
283 * PARAMETERS :
284 * @evt : event to be processed
285 * @payload : event payload. Can be NULL if not needed.
286 *
287 * RETURN : int32_t type of status
288 * NO_ERROR -- success
289 * none-zero failure code
290 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800291int32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
292 void *payload)
293{
294 int32_t rc = NO_ERROR;
295 qcamera_api_result_t result;
296 memset(&result, 0, sizeof(qcamera_api_result_t));
297
298 switch (evt) {
299 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
300 {
301 rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
302 result.status = rc;
303 result.request_api = evt;
304 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
305 m_parent->signalAPIResult(&result);
306 }
307 break;
308 case QCAMERA_SM_EVT_SET_CALLBACKS:
309 {
310 qcamera_sm_evt_setcb_payload_t *setcbs =
311 (qcamera_sm_evt_setcb_payload_t *)payload;
312 rc = m_parent->setCallBacks(setcbs->notify_cb,
313 setcbs->data_cb,
314 setcbs->data_cb_timestamp,
315 setcbs->get_memory,
316 setcbs->user);
317 result.status = rc;
318 result.request_api = evt;
319 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
320 m_parent->signalAPIResult(&result);
321 }
322 break;
323 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
324 {
325 rc = m_parent->enableMsgType(int32_t(payload));
326 result.status = rc;
327 result.request_api = evt;
328 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
329 m_parent->signalAPIResult(&result);
330 }
331 break;
332 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
333 {
334 rc = m_parent->disableMsgType(int32_t(payload));
335 result.status = rc;
336 result.request_api = evt;
337 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
338 m_parent->signalAPIResult(&result);
339 }
340 break;
341 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
342 {
343 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
344 result.status = rc;
345 result.request_api = evt;
346 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
347 result.enabled = enabled;
348 m_parent->signalAPIResult(&result);
349 }
350 break;
351 case QCAMERA_SM_EVT_SET_PARAMS:
352 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800353 bool needRestart = false;
354 rc = m_parent->updateParameters((char*)payload, needRestart);
Emilian Peev9afd73b2013-10-31 08:19:57 -0700355 if (needRestart) {
356 // Clear memory pools
357 m_parent->m_memoryPool.clear();
358 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800359 if (rc == NO_ERROR) {
360 rc = m_parent->commitParameterChanges();
361 }
Muhua Libc9a8082012-11-07 15:51:28 -0800362 result.status = rc;
363 result.request_api = evt;
364 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
365 m_parent->signalAPIResult(&result);
366 }
367 break;
368 case QCAMERA_SM_EVT_GET_PARAMS:
369 {
370 result.params = m_parent->getParameters();
371 rc = NO_ERROR;
372 result.status = rc;
373 result.request_api = evt;
374 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
375 m_parent->signalAPIResult(&result);
376 }
377 break;
378 case QCAMERA_SM_EVT_PUT_PARAMS:
379 {
380 rc = m_parent->putParameters((char*)payload);
381 result.status = rc;
382 result.request_api = evt;
383 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
384 m_parent->signalAPIResult(&result);
385 }
386 break;
387 case QCAMERA_SM_EVT_START_PREVIEW:
388 {
389 if (m_parent->mPreviewWindow == NULL) {
Mansoor Aftab06c809c2013-01-23 19:44:47 -0800390 rc = m_parent->preparePreview();
391 if(rc == NO_ERROR) {
392 // preview window is not set yet, move to previewReady state
393 m_state = QCAMERA_SM_STATE_PREVIEW_READY;
394 } else {
395 ALOGE("%s: preparePreview failed",__func__);
396 }
Muhua Libc9a8082012-11-07 15:51:28 -0800397 } else {
398 rc = m_parent->preparePreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800399 if (rc == NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800400 rc = m_parent->startPreview();
Muhua Lida2c4be2012-11-26 09:14:16 -0800401 if (rc != NO_ERROR) {
Muhua Libc9a8082012-11-07 15:51:28 -0800402 m_parent->unpreparePreview();
403 } else {
Muhua Lida2c4be2012-11-26 09:14:16 -0800404 // start preview success, move to previewing state
Muhua Libc9a8082012-11-07 15:51:28 -0800405 m_state = QCAMERA_SM_STATE_PREVIEWING;
406 }
407 }
408 }
409 result.status = rc;
410 result.request_api = evt;
411 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
412 m_parent->signalAPIResult(&result);
413 }
414 break;
415 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
416 {
417 rc = m_parent->preparePreview();
418 if (rc == NO_ERROR) {
419 rc = m_parent->startPreview();
420 if (rc != NO_ERROR) {
421 m_parent->unpreparePreview();
422 } else {
423 m_state = QCAMERA_SM_STATE_PREVIEWING;
424 }
425 }
426 result.status = rc;
427 result.request_api = evt;
428 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
429 m_parent->signalAPIResult(&result);
430 }
431 break;
432 case QCAMERA_SM_EVT_STOP_PREVIEW:
433 {
434 // no op needed here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530435 CDBG_HIGH("%s: already in preview stopped state, do nothing", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -0800436 result.status = NO_ERROR;
437 result.request_api = evt;
438 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
439 m_parent->signalAPIResult(&result);
440 }
441 break;
442 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
443 case QCAMERA_SM_EVT_RECORDING_ENABLED:
444 {
445 result.status = NO_ERROR;
446 result.request_api = evt;
447 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
448 result.enabled = 0;
449 m_parent->signalAPIResult(&result);
450 }
451 break;
452 case QCAMERA_SM_EVT_RELEASE:
453 {
454 rc = m_parent->release();
455 result.status = rc;
456 result.request_api = evt;
457 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
458 m_parent->signalAPIResult(&result);
459 }
460 break;
461 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
462 {
463 rc = m_parent->storeMetaDataInBuffers(int(payload));
464 result.status = rc;
465 result.request_api = evt;
466 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
467 m_parent->signalAPIResult(&result);
468 }
469 break;
470 case QCAMERA_SM_EVT_DUMP:
471 {
472 rc = m_parent->dump((int)payload);
473 result.status = rc;
474 result.request_api = evt;
475 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
476 m_parent->signalAPIResult(&result);
477 }
478 break;
Ankit Premrajka3b00dc62012-12-14 18:37:52 -0800479 case QCAMERA_SM_EVT_SEND_COMMAND:
480 {
481 qcamera_sm_evt_command_payload_t *cmd_payload =
482 (qcamera_sm_evt_command_payload_t *)payload;
483 rc = m_parent->sendCommand(cmd_payload->cmd,
484 cmd_payload->arg1,
485 cmd_payload->arg2);
486 result.status = rc;
487 result.request_api = evt;
488 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
489 m_parent->signalAPIResult(&result);
490 }
491 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800492 case QCAMERA_SM_EVT_START_RECORDING:
493 case QCAMERA_SM_EVT_STOP_RECORDING:
494 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800495 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800496 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -0800497 {
498 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
499 rc = INVALID_OPERATION;
500 result.status = rc;
501 result.request_api = evt;
502 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
503 m_parent->signalAPIResult(&result);
504 }
505 break;
Georgi Hristv72d768f2013-10-02 17:47:59 +0300506 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
Muhua Li1612f422013-01-03 11:07:39 -0800507 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Li1612f422013-01-03 11:07:39 -0800508 {
509 // no op needed here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +0530510 CDBG_HIGH("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
Muhua Li1612f422013-01-03 11:07:39 -0800511 result.status = NO_ERROR;
512 result.request_api = evt;
513 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
514 m_parent->signalAPIResult(&result);
515 }
516 break;
Muhua Li0c14e432013-03-06 15:50:17 -0800517 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
518 {
519 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +0530520 result.status = rc;
521 result.request_api = evt;
522 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
523 m_parent->signalAPIResult(&result);
Muhua Li0c14e432013-03-06 15:50:17 -0800524 }
525 break;
Muhua Li5858c392013-02-04 17:53:34 -0800526 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
527 {
528 int32_t faceID = 0;
529 qcamera_sm_evt_reg_face_payload_t *reg_payload =
530 (qcamera_sm_evt_reg_face_payload_t *)payload;
531 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
532 reg_payload->config,
533 faceID);
534 result.status = rc;
535 result.request_api = evt;
536 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
537 result.handle = faceID;
538 m_parent->signalAPIResult(&result);
539 }
540 break;
Emilian Peev2ae455e2013-04-18 10:41:56 +0300541 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
542 {
543 rc = m_parent->updateThermalLevel(
544 *(qcamera_thermal_level_enum_t *)&payload);
545 }
546 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800547 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300548 {
549 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
550 switch (cam_evt->server_event_type) {
551 case CAM_EVENT_TYPE_DAEMON_DIED:
552 {
Emilian Peev15690592013-04-19 09:55:40 +0300553 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
554 CAMERA_ERROR_SERVER_DIED,
555 0);
556 }
557 break;
558 default:
559 ALOGE("%s: Invalid internal event %d in state(%d)",
560 __func__, cam_evt->server_event_type, m_state);
561 break;
562 }
563 }
564 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700565 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
566 {
567 // No ops, but need to notify
568 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
569 result.status = rc;
570 result.request_api = evt;
571 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
572 m_parent->signalEvtResult(&result);
573 }
574 break;
Emilian Peev15690592013-04-19 09:55:40 +0300575 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800576 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
577 default:
578 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
579 break;
580 }
581
582 return rc;
583}
584
Muhua Lida2c4be2012-11-26 09:14:16 -0800585/*===========================================================================
586 * FUNCTION : procEvtPreviewReadyState
587 *
588 * DESCRIPTION: finite state machine function to handle event in state of
589 * QCAMERA_SM_STATE_PREVIEW_READY.
590 *
591 * PARAMETERS :
592 * @evt : event to be processed
593 * @payload : event payload. Can be NULL if not needed.
594 *
595 * RETURN : int32_t type of status
596 * NO_ERROR -- success
597 * none-zero failure code
598 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800599int32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
600 void *payload)
601{
602 int32_t rc = NO_ERROR;
603 qcamera_api_result_t result;
604 memset(&result, 0, sizeof(qcamera_api_result_t));
605
606 switch (evt) {
607 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
608 {
609 m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
610 if (m_parent->mPreviewWindow != NULL) {
611 rc = m_parent->startPreview();
612 if (rc != NO_ERROR) {
613 m_parent->unpreparePreview();
614 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
615 } else {
616 m_state = QCAMERA_SM_STATE_PREVIEWING;
617 }
618 }
619
620 result.status = rc;
621 result.request_api = evt;
622 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
623 m_parent->signalAPIResult(&result);
624 }
625 break;
626 case QCAMERA_SM_EVT_SET_CALLBACKS:
627 {
628 qcamera_sm_evt_setcb_payload_t *setcbs =
629 (qcamera_sm_evt_setcb_payload_t *)payload;
630 rc = m_parent->setCallBacks(setcbs->notify_cb,
631 setcbs->data_cb,
632 setcbs->data_cb_timestamp,
633 setcbs->get_memory,
634 setcbs->user);
635 result.status = rc;
636 result.request_api = evt;
637 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
638 m_parent->signalAPIResult(&result);
639 }
640 break;
641 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
642 {
643 rc = m_parent->enableMsgType(int32_t(payload));
644 result.status = rc;
645 result.request_api = evt;
646 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
647 m_parent->signalAPIResult(&result);
648 }
649 break;
650 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
651 {
652 rc = m_parent->disableMsgType(int32_t(payload));
653 result.status = rc;
654 result.request_api = evt;
655 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
656 m_parent->signalAPIResult(&result);
657 }
658 break;
659 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
660 {
661 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
662 result.status = rc;
663 result.request_api = evt;
664 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
665 result.enabled = enabled;
666 m_parent->signalAPIResult(&result);
667 }
668 break;
669 case QCAMERA_SM_EVT_SET_PARAMS:
670 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800671 bool needRestart = false;
672 rc = m_parent->updateParameters((char*)payload, needRestart);
673 if (rc == NO_ERROR) {
Muhua Li6d69e932013-01-24 16:39:27 -0800674 if (needRestart) {
675 // need restart preview for parameters to take effect
676 m_parent->unpreparePreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700677 // Clear memory pools
678 m_parent->m_memoryPool.clear();
Muhua Li6d69e932013-01-24 16:39:27 -0800679 // commit parameter changes to server
680 m_parent->commitParameterChanges();
681 // prepare preview again
682 rc = m_parent->preparePreview();
683 if (rc != NO_ERROR) {
684 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
685 }
686 } else {
687 rc = m_parent->commitParameterChanges();
688 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800689 }
Muhua Li6d69e932013-01-24 16:39:27 -0800690
Muhua Libc9a8082012-11-07 15:51:28 -0800691 result.status = rc;
692 result.request_api = evt;
693 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
694 m_parent->signalAPIResult(&result);
695 }
696 break;
697 case QCAMERA_SM_EVT_GET_PARAMS:
698 {
699 result.params = m_parent->getParameters();
700 rc = NO_ERROR;
701 result.status = rc;
702 result.request_api = evt;
703 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
704 m_parent->signalAPIResult(&result);
705 }
706 break;
707 case QCAMERA_SM_EVT_PUT_PARAMS:
708 {
709 rc = m_parent->putParameters((char*)payload);
710 result.status = rc;
711 result.request_api = evt;
712 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
713 m_parent->signalAPIResult(&result);
714 }
715 break;
716 case QCAMERA_SM_EVT_START_PREVIEW:
717 {
718 // no ops here
719 rc = NO_ERROR;
720 result.status = rc;
721 result.request_api = evt;
722 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
723 m_parent->signalAPIResult(&result);
724 }
725 break;
726 case QCAMERA_SM_EVT_STOP_PREVIEW:
727 {
728 m_parent->unpreparePreview();
729 rc = 0;
730 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
731 result.status = rc;
732 result.request_api = evt;
733 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
734 m_parent->signalAPIResult(&result);
735 }
736 break;
737 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
738 {
739 rc = NO_ERROR;
740 result.status = rc;
741 result.request_api = evt;
742 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
743 result.enabled = 1;
744 m_parent->signalAPIResult(&result);
745 }
746 break;
747 case QCAMERA_SM_EVT_RECORDING_ENABLED:
748 {
749 rc = 0;
750 result.status = rc;
751 result.request_api = evt;
752 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
753 result.enabled = 0;
754 m_parent->signalAPIResult(&result);
755 }
756 break;
757 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
758 {
759 rc = m_parent->storeMetaDataInBuffers(int(payload));
760 result.status = rc;
761 result.request_api = evt;
762 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
763 m_parent->signalAPIResult(&result);
764 }
765 break;
766 case QCAMERA_SM_EVT_DUMP:
767 {
768 rc = m_parent->dump((int)payload);
769 result.status = rc;
770 result.request_api = evt;
771 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
772 m_parent->signalAPIResult(&result);
773 }
774 break;
775 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
776 {
777 rc = m_parent->autoFocus();
778 result.status = rc;
779 result.request_api = evt;
780 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
781 m_parent->signalAPIResult(&result);
782 }
783 break;
784 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
785 {
786 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +0530787 result.status = rc;
788 result.request_api = evt;
789 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
790 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -0800791 }
792 break;
793 case QCAMERA_SM_EVT_SEND_COMMAND:
794 {
795 qcamera_sm_evt_command_payload_t *cmd_payload =
796 (qcamera_sm_evt_command_payload_t *)payload;
797 rc = m_parent->sendCommand(cmd_payload->cmd,
798 cmd_payload->arg1,
799 cmd_payload->arg2);
800 result.status = rc;
801 result.request_api = evt;
802 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
803 m_parent->signalAPIResult(&result);
804 }
805 break;
Muhua Li5858c392013-02-04 17:53:34 -0800806 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
807 {
808 int32_t faceID = 0;
809 qcamera_sm_evt_reg_face_payload_t *reg_payload =
810 (qcamera_sm_evt_reg_face_payload_t *)payload;
811 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
812 reg_payload->config,
813 faceID);
814 result.status = rc;
815 result.request_api = evt;
816 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
817 result.handle = faceID;
818 m_parent->signalAPIResult(&result);
819 }
820 break;
Muhua Libc9a8082012-11-07 15:51:28 -0800821 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
822 case QCAMERA_SM_EVT_START_RECORDING:
823 case QCAMERA_SM_EVT_STOP_RECORDING:
Shuzhen Wang93f24112013-02-20 16:01:42 -0800824 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -0800825 case QCAMERA_SM_EVT_TAKE_PICTURE:
826 case QCAMERA_SM_EVT_CANCEL_PICTURE:
827 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
828 case QCAMERA_SM_EVT_RELEASE:
829 {
830 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
831 rc = INVALID_OPERATION;
832 result.status = rc;
833 result.request_api = evt;
834 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
835 m_parent->signalAPIResult(&result);
836 }
837 break;
838 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +0300839 {
840 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
841 switch (cam_evt->server_event_type) {
842 case CAM_EVENT_TYPE_DAEMON_DIED:
843 {
Emilian Peev15690592013-04-19 09:55:40 +0300844 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
845 CAMERA_ERROR_SERVER_DIED,
846 0);
847 }
848 break;
849 default:
850 ALOGE("%s: Invalid internal event %d in state(%d)",
851 __func__, cam_evt->server_event_type, m_state);
852 break;
853 }
854 }
855 break;
Muhua Lic9390df2013-05-22 17:54:13 -0700856 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
857 {
858 // No ops, but need to notify
859 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
860 result.status = rc;
861 result.request_api = evt;
862 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
863 m_parent->signalEvtResult(&result);
864 }
865 break;
Emilian Peev15690592013-04-19 09:55:40 +0300866 case QCAMERA_SM_EVT_EVT_INTERNAL:
Muhua Libc9a8082012-11-07 15:51:28 -0800867 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wangaa829ce2013-01-09 14:41:49 -0800868 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -0800869 default:
870 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
871 break;
872 }
873
874 return rc;
875}
876
Muhua Lida2c4be2012-11-26 09:14:16 -0800877/*===========================================================================
878 * FUNCTION : procEvtPreviewingState
879 *
880 * DESCRIPTION: finite state machine function to handle event in state of
881 * QCAMERA_SM_STATE_PREVIEWING.
882 *
883 * PARAMETERS :
884 * @evt : event to be processed
885 * @payload : event payload. Can be NULL if not needed.
886 *
887 * RETURN : int32_t type of status
888 * NO_ERROR -- success
889 * none-zero failure code
890 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -0800891int32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
892 void *payload)
893{
894 int32_t rc = NO_ERROR;
895 qcamera_api_result_t result;
896 memset(&result, 0, sizeof(qcamera_api_result_t));
897
898 switch (evt) {
899 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
900 {
901 // Error setting preview window during previewing
902 ALOGE("Cannot set preview window when preview is running");
903 rc = INVALID_OPERATION;
904 result.status = rc;
905 result.request_api = evt;
906 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
907 m_parent->signalAPIResult(&result);
908 }
909 break;
910 case QCAMERA_SM_EVT_SET_CALLBACKS:
911 {
912 qcamera_sm_evt_setcb_payload_t *setcbs =
913 (qcamera_sm_evt_setcb_payload_t *)payload;
914 rc = m_parent->setCallBacks(setcbs->notify_cb,
915 setcbs->data_cb,
916 setcbs->data_cb_timestamp,
917 setcbs->get_memory,
918 setcbs->user);
919 result.status = rc;
920 result.request_api = evt;
921 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
922 m_parent->signalAPIResult(&result);
923 }
924 break;
925 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
926 {
927 rc = m_parent->enableMsgType(int32_t(payload));
928 result.status = rc;
929 result.request_api = evt;
930 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
931 m_parent->signalAPIResult(&result);
932 }
933 break;
934 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
935 {
936 rc = m_parent->disableMsgType(int32_t(payload));
937 result.status = rc;
938 result.request_api = evt;
939 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
940 m_parent->signalAPIResult(&result);
941 }
942 break;
943 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
944 {
945 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
946 result.status = rc;
947 result.request_api = evt;
948 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
949 result.enabled = enabled;
950 m_parent->signalAPIResult(&result);
951 }
952 break;
953 case QCAMERA_SM_EVT_SET_PARAMS:
954 {
Muhua Lida2c4be2012-11-26 09:14:16 -0800955 bool needRestart = false;
956 rc = m_parent->updateParameters((char*)payload, needRestart);
957 if (rc == NO_ERROR) {
958 if (needRestart) {
959 // need restart preview for parameters to take effect
960 // stop preview
961 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -0700962 // Clear memory pools
963 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -0800964 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -0800965 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -0800966 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -0800967 rc = m_parent->preparePreview();
968 if (rc == NO_ERROR) {
969 rc = m_parent->startPreview();
970 if (rc != NO_ERROR) {
971 m_parent->unpreparePreview();
972 }
973 }
974 if (rc != NO_ERROR) {
975 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
976 }
Muhua Lida2c4be2012-11-26 09:14:16 -0800977 } else {
978 rc = m_parent->commitParameterChanges();
979 }
980 }
Muhua Libc9a8082012-11-07 15:51:28 -0800981 result.status = rc;
982 result.request_api = evt;
983 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
984 m_parent->signalAPIResult(&result);
985 }
986 break;
987 case QCAMERA_SM_EVT_GET_PARAMS:
988 {
989 result.params = m_parent->getParameters();
990 rc = NO_ERROR;
991 result.status = rc;
992 result.request_api = evt;
993 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
994 m_parent->signalAPIResult(&result);
995 }
996 break;
997 case QCAMERA_SM_EVT_PUT_PARAMS:
998 {
999 rc = m_parent->putParameters((char*)payload);
1000 result.status = rc;
1001 result.request_api = evt;
1002 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1003 m_parent->signalAPIResult(&result);
1004 }
1005 break;
1006 case QCAMERA_SM_EVT_START_PREVIEW:
1007 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1008 {
1009 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301010 CDBG_HIGH("%s: Already in previewing, no ops here to start preview", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08001011 rc = NO_ERROR;
1012 result.status = rc;
1013 result.request_api = evt;
1014 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1015 m_parent->signalAPIResult(&result);
1016 }
1017 break;
1018 case QCAMERA_SM_EVT_STOP_PREVIEW:
1019 {
1020 rc = m_parent->stopPreview();
1021 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1022 result.status = rc;
1023 result.request_api = evt;
1024 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1025 m_parent->signalAPIResult(&result);
1026 }
1027 break;
1028 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1029 {
1030 rc = NO_ERROR;
1031 result.status = rc;
1032 result.request_api = evt;
1033 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1034 result.enabled = 1;
1035 m_parent->signalAPIResult(&result);
1036 }
1037 break;
1038 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1039 {
1040 rc = NO_ERROR;
1041 result.status = rc;
1042 result.request_api = evt;
1043 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1044 result.enabled = 0;
1045 m_parent->signalAPIResult(&result);
1046 }
1047 break;
1048 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1049 {
1050 rc = m_parent->storeMetaDataInBuffers(int(payload));
1051 result.status = rc;
1052 result.request_api = evt;
1053 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1054 m_parent->signalAPIResult(&result);
1055 }
1056 break;
1057 case QCAMERA_SM_EVT_DUMP:
1058 {
1059 rc = m_parent->dump((int)payload);
1060 result.status = rc;
1061 result.request_api = evt;
1062 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1063 m_parent->signalAPIResult(&result);
1064 }
1065 break;
1066 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1067 {
1068 rc = m_parent->autoFocus();
1069 result.status = rc;
1070 result.request_api = evt;
1071 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1072 m_parent->signalAPIResult(&result);
1073 }
1074 break;
1075 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1076 {
1077 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301078 result.status = rc;
1079 result.request_api = evt;
1080 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1081 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001082 }
1083 break;
1084 case QCAMERA_SM_EVT_START_RECORDING:
1085 {
1086 rc = m_parent->startRecording();
1087 if (rc == NO_ERROR) {
1088 // move state to recording state
1089 m_state = QCAMERA_SM_STATE_RECORDING;
1090 }
1091 result.status = rc;
1092 result.request_api = evt;
1093 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1094 m_parent->signalAPIResult(&result);
1095 }
1096 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001097 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001098 {
Muhua Li0c14e432013-03-06 15:50:17 -08001099 rc = m_parent->prepareHardwareForSnapshot(FALSE);
Muhua Libc9a8082012-11-07 15:51:28 -08001100 if (rc == NO_ERROR) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001101 // Do not signal API result in this case.
1102 // Need to wait for snapshot done in metadta.
1103 m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
1104 } else {
1105 // Do not change state in this case.
1106 ALOGE("%s: prepareHardwareForSnapshot failed %d",
1107 __func__, rc);
1108
1109 result.status = rc;
1110 result.request_api = evt;
1111 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1112 m_parent->signalAPIResult(&result);
1113 }
1114 }
1115 break;
1116 case QCAMERA_SM_EVT_TAKE_PICTURE:
1117 {
Muhua Li8e614bc2013-04-17 17:38:42 -07001118 if ( m_parent->mParameters.getRecordingHintValue() == false) {
Emilian Peeva43000b2013-09-27 14:27:21 -07001119 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08001120 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001121 rc = m_parent->takePicture();
1122 if (rc != NO_ERROR) {
1123 // move state to previewing state
1124 m_state = QCAMERA_SM_STATE_PREVIEWING;
1125 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001126 } else {
1127 m_state = QCAMERA_SM_STATE_PIC_TAKING;
Muhua Lia9dca012013-05-03 22:37:42 -07001128 rc = m_parent->takePicture();
1129 if (rc != NO_ERROR) {
1130 // move state to preview stopped state
1131 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1132 }
Shuzhen Wang93f24112013-02-20 16:01:42 -08001133 }
Muhua Lia9dca012013-05-03 22:37:42 -07001134
1135 result.status = rc;
1136 result.request_api = evt;
1137 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1138 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001139 } else {
Muhua Lia9dca012013-05-03 22:37:42 -07001140 m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001141 rc = m_parent->takeLiveSnapshot();
Muhua Lia9dca012013-05-03 22:37:42 -07001142 if (rc != NO_ERROR ) {
1143 m_state = QCAMERA_SM_STATE_PREVIEWING;
Muhua Li8e614bc2013-04-17 17:38:42 -07001144 }
Muhua Lia9dca012013-05-03 22:37:42 -07001145 result.status = rc;
1146 result.request_api = evt;
1147 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1148 m_parent->signalAPIResult(&result);
Muhua Li8e614bc2013-04-17 17:38:42 -07001149 }
Muhua Libc9a8082012-11-07 15:51:28 -08001150 }
1151 break;
1152 case QCAMERA_SM_EVT_SEND_COMMAND:
1153 {
1154 qcamera_sm_evt_command_payload_t *cmd_payload =
1155 (qcamera_sm_evt_command_payload_t *)payload;
1156 rc = m_parent->sendCommand(cmd_payload->cmd,
1157 cmd_payload->arg1,
1158 cmd_payload->arg2);
Emilian Peevd17d2e12014-01-13 12:32:57 +02001159 if (CAMERA_CMD_LONGSHOT_ON == cmd_payload->cmd) {
1160 if (QCAMERA_SM_EVT_RESTART_PERVIEW == cmd_payload->arg1) {
1161 m_parent->stopPreview();
1162 // Clear memory pools
1163 m_parent->m_memoryPool.clear();
1164 // start preview again
1165 rc = m_parent->preparePreview();
1166 if (rc == NO_ERROR) {
1167 rc = m_parent->startPreview();
1168 if (rc != NO_ERROR) {
1169 m_parent->unpreparePreview();
1170 }
1171 }
1172 }
1173 }
Muhua Libc9a8082012-11-07 15:51:28 -08001174 result.status = rc;
1175 result.request_api = evt;
1176 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1177 m_parent->signalAPIResult(&result);
1178 }
1179 break;
Muhua Li5858c392013-02-04 17:53:34 -08001180 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1181 {
1182 int32_t faceID = 0;
1183 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1184 (qcamera_sm_evt_reg_face_payload_t *)payload;
1185 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1186 reg_payload->config,
1187 faceID);
1188 result.status = rc;
1189 result.request_api = evt;
1190 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1191 result.handle = faceID;
1192 m_parent->signalAPIResult(&result);
1193 }
1194 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001195 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1196 case QCAMERA_SM_EVT_STOP_RECORDING:
1197 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1198 case QCAMERA_SM_EVT_RELEASE:
1199 {
1200 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1201 rc = INVALID_OPERATION;
1202 result.status = rc;
1203 result.request_api = evt;
1204 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1205 m_parent->signalAPIResult(&result);
1206 }
1207 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001208 case QCAMERA_SM_EVT_EVT_INTERNAL:
1209 {
1210 qcamera_sm_internal_evt_payload_t *internal_evt =
1211 (qcamera_sm_internal_evt_payload_t *)payload;
1212 switch (internal_evt->evt_type) {
1213 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1214 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1215 break;
Muhua Li510aab22013-05-28 17:00:38 -07001216 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1217 break;
1218 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1219 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1220 break;
1221 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1222 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1223 break;
1224 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1225 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1226 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001227 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1228 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1229 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001230 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1231 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1232 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001233 default:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001234 ALOGE("%s: Invalid internal event %d in state(%d)",
1235 __func__, internal_evt->evt_type, m_state);
Muhua Li31eaee02012-12-11 08:56:45 -08001236 break;
1237 }
1238 }
1239 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001240 case QCAMERA_SM_EVT_EVT_NOTIFY:
1241 {
1242 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1243 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03001244 case CAM_EVENT_TYPE_DAEMON_DIED:
1245 {
Emilian Peev15690592013-04-19 09:55:40 +03001246 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1247 CAMERA_ERROR_SERVER_DIED,
1248 0);
1249 }
1250 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001251 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301252 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001253 __func__, cam_evt->server_event_type);
1254 break;
1255 }
1256 }
1257 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001258 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001259 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08001260 rc = m_parent->updateThermalLevel(
1261 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08001262 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001263 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08001264 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07001265 {
1266 // No ops, but need to notify
1267 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1268 result.status = rc;
1269 result.request_api = evt;
1270 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1271 m_parent->signalEvtResult(&result);
1272 }
1273 break;
1274 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08001275 default:
1276 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1277 break;
1278 }
1279
1280 return rc;
1281}
1282
Muhua Lida2c4be2012-11-26 09:14:16 -08001283/*===========================================================================
Shuzhen Wang93f24112013-02-20 16:01:42 -08001284 * FUNCTION : procEvtPrepareSnapshotState
1285 *
1286 * DESCRIPTION: finite state machine function to handle event in state of
1287 * QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
1288 *
1289 * PARAMETERS :
1290 * @evt : event to be processed
1291 * @payload : event payload. Can be NULL if not needed.
1292 *
1293 * RETURN : int32_t type of status
1294 * NO_ERROR -- success
1295 * none-zero failure code
1296 *==========================================================================*/
1297int32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
1298 void *payload)
1299{
1300 int32_t rc = NO_ERROR;
1301 qcamera_api_result_t result;
1302 memset(&result, 0, sizeof(qcamera_api_result_t));
1303
1304 switch (evt) {
1305 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1306 case QCAMERA_SM_EVT_SET_CALLBACKS:
1307 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1308 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1309 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1310 case QCAMERA_SM_EVT_SET_PARAMS:
1311 case QCAMERA_SM_EVT_GET_PARAMS:
1312 case QCAMERA_SM_EVT_PUT_PARAMS:
1313 case QCAMERA_SM_EVT_START_PREVIEW:
1314 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1315 case QCAMERA_SM_EVT_STOP_PREVIEW:
1316 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1317 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1318 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1319 case QCAMERA_SM_EVT_DUMP:
1320 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1321 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1322 case QCAMERA_SM_EVT_START_RECORDING:
1323 case QCAMERA_SM_EVT_TAKE_PICTURE:
Muhua Li510aab22013-05-28 17:00:38 -07001324 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001325 case QCAMERA_SM_EVT_SEND_COMMAND:
1326 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1327 case QCAMERA_SM_EVT_STOP_RECORDING:
1328 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1329 case QCAMERA_SM_EVT_RELEASE:
1330 {
1331 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1332 rc = INVALID_OPERATION;
1333 result.status = rc;
1334 result.request_api = evt;
1335 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1336 m_parent->signalAPIResult(&result);
1337 }
1338 break;
1339 case QCAMERA_SM_EVT_EVT_INTERNAL:
1340 {
1341 qcamera_sm_internal_evt_payload_t *internal_evt =
1342 (qcamera_sm_internal_evt_payload_t *)payload;
1343 switch (internal_evt->evt_type) {
Muhua Li6f3c5322013-05-08 17:20:17 -07001344 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1345 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1346 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001347 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301348 CDBG("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
Shuzhen Wang93f24112013-02-20 16:01:42 -08001349 __func__);
1350 m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
1351 m_state = QCAMERA_SM_STATE_PREVIEWING;
1352
1353 result.status = NO_ERROR;
1354 result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
1355 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1356 m_parent->signalAPIResult(&result);
1357 break;
Muhua Li510aab22013-05-28 17:00:38 -07001358 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1359 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
1360 break;
1361 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1362 rc = m_parent->processHistogramStats(internal_evt->stats_data);
1363 break;
1364 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1365 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1366 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001367 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1368 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1369 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001370 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1371 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1372 break;
1373
Shuzhen Wang93f24112013-02-20 16:01:42 -08001374 default:
1375 ALOGE("%s: Invalid internal event %d in state(%d)",
1376 __func__, internal_evt->evt_type, m_state);
1377 break;
1378 }
1379 }
1380 break;
1381 case QCAMERA_SM_EVT_EVT_NOTIFY:
Emilian Peev15690592013-04-19 09:55:40 +03001382 {
1383 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1384 switch (cam_evt->server_event_type) {
1385 case CAM_EVENT_TYPE_DAEMON_DIED:
1386 {
Emilian Peev15690592013-04-19 09:55:40 +03001387 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1388 CAMERA_ERROR_SERVER_DIED,
1389 0);
1390 }
1391 break;
1392 default:
1393 ALOGE("%s: Invalid internal event %d in state(%d)",
1394 __func__, cam_evt->server_event_type, m_state);
1395 break;
1396 }
1397 }
1398 break;
Muhua Lic9390df2013-05-22 17:54:13 -07001399 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1400 {
1401 // No ops, but need to notify
1402 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1403 result.status = rc;
1404 result.request_api = evt;
1405 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1406 m_parent->signalEvtResult(&result);
1407 }
1408 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08001409 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
1410 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Shuzhen Wang93f24112013-02-20 16:01:42 -08001411 default:
1412 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1413 break;
1414 }
1415
1416 return rc;
1417}
1418
1419/*===========================================================================
Muhua Lida2c4be2012-11-26 09:14:16 -08001420 * FUNCTION : procEvtPicTakingState
1421 *
1422 * DESCRIPTION: finite state machine function to handle event in state of
1423 * QCAMERA_SM_STATE_PIC_TAKING.
1424 *
1425 * PARAMETERS :
1426 * @evt : event to be processed
1427 * @payload : event payload. Can be NULL if not needed.
1428 *
1429 * RETURN : int32_t type of status
1430 * NO_ERROR -- success
1431 * none-zero failure code
1432 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001433int32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
1434 void *payload)
1435{
1436 int32_t rc = NO_ERROR;
1437 qcamera_api_result_t result;
1438 memset(&result, 0, sizeof(qcamera_api_result_t));
1439
1440 switch (evt) {
1441 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1442 {
1443 // Error setting preview window during previewing
1444 ALOGE("Cannot set preview window when preview is running");
1445 rc = INVALID_OPERATION;
1446 result.status = rc;
1447 result.request_api = evt;
1448 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1449 m_parent->signalAPIResult(&result);
1450 }
1451 break;
1452 case QCAMERA_SM_EVT_SET_CALLBACKS:
1453 {
1454 qcamera_sm_evt_setcb_payload_t *setcbs =
1455 (qcamera_sm_evt_setcb_payload_t *)payload;
1456 rc = m_parent->setCallBacks(setcbs->notify_cb,
1457 setcbs->data_cb,
1458 setcbs->data_cb_timestamp,
1459 setcbs->get_memory,
1460 setcbs->user);
1461 result.status = rc;
1462 result.request_api = evt;
1463 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1464 m_parent->signalAPIResult(&result);
1465 }
1466 break;
1467 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1468 {
1469 rc = m_parent->enableMsgType(int32_t(payload));
1470 result.status = rc;
1471 result.request_api = evt;
1472 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1473 m_parent->signalAPIResult(&result);
1474 }
1475 break;
1476 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1477 {
1478 rc = m_parent->disableMsgType(int32_t(payload));
1479 result.status = rc;
1480 result.request_api = evt;
1481 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1482 m_parent->signalAPIResult(&result);
1483 }
1484 break;
1485 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1486 {
1487 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
1488 result.status = rc;
1489 result.request_api = evt;
1490 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1491 result.enabled = enabled;
1492 m_parent->signalAPIResult(&result);
1493 }
1494 break;
1495 case QCAMERA_SM_EVT_SET_PARAMS:
1496 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001497 bool needRestart = false;
1498 rc = m_parent->updateParameters((char*)payload, needRestart);
1499 if (rc == NO_ERROR) {
1500 rc = m_parent->commitParameterChanges();
1501 }
Muhua Libc9a8082012-11-07 15:51:28 -08001502 result.status = rc;
1503 result.request_api = evt;
1504 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1505 m_parent->signalAPIResult(&result);
1506 }
1507 break;
1508 case QCAMERA_SM_EVT_GET_PARAMS:
1509 {
1510 result.params = m_parent->getParameters();
1511 rc = NO_ERROR;
1512 result.status = rc;
1513 result.request_api = evt;
1514 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1515 m_parent->signalAPIResult(&result);
1516 }
1517 break;
1518 case QCAMERA_SM_EVT_PUT_PARAMS:
1519 {
1520 rc = m_parent->putParameters((char*)payload);
1521 result.status = rc;
1522 result.request_api = evt;
1523 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1524 m_parent->signalAPIResult(&result);
1525 }
1526 break;
1527 case QCAMERA_SM_EVT_STOP_PREVIEW:
1528 {
Muhua Libd1b6122013-03-05 15:25:27 -08001529 // cancel picture first
1530 rc = m_parent->cancelPicture();
1531 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1532
Muhua Libc9a8082012-11-07 15:51:28 -08001533 result.status = rc;
1534 result.request_api = evt;
1535 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1536 m_parent->signalAPIResult(&result);
1537 }
1538 break;
1539 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1540 {
1541 rc = NO_ERROR;
1542 result.status = rc;
1543 result.request_api = evt;
1544 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1545 result.enabled = 0;
1546 m_parent->signalAPIResult(&result);
1547 }
1548 break;
1549 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1550 {
1551 rc = NO_ERROR;
1552 result.status = rc;
1553 result.request_api = evt;
1554 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1555 result.enabled = 0;
1556 m_parent->signalAPIResult(&result);
1557 }
1558 break;
1559 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1560 {
1561 rc = m_parent->storeMetaDataInBuffers(int(payload));
1562 result.status = rc;
1563 result.request_api = evt;
1564 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1565 m_parent->signalAPIResult(&result);
1566 }
1567 break;
1568 case QCAMERA_SM_EVT_DUMP:
1569 {
1570 rc = m_parent->dump((int)payload);
1571 result.status = rc;
1572 result.request_api = evt;
1573 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1574 m_parent->signalAPIResult(&result);
1575 }
1576 break;
1577 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1578 {
1579 rc = m_parent->autoFocus();
1580 result.status = rc;
1581 result.request_api = evt;
1582 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1583 m_parent->signalAPIResult(&result);
1584 }
1585 break;
1586 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1587 {
1588 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301589 result.status = rc;
1590 result.request_api = evt;
1591 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1592 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001593 }
1594 break;
1595 case QCAMERA_SM_EVT_SEND_COMMAND:
1596 {
1597 qcamera_sm_evt_command_payload_t *cmd_payload =
1598 (qcamera_sm_evt_command_payload_t *)payload;
1599 rc = m_parent->sendCommand(cmd_payload->cmd,
1600 cmd_payload->arg1,
1601 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001602#ifndef VANILLA_HAL
Emilian Peeva43000b2013-09-27 14:27:21 -07001603 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
1604 // move state to previewing state
1605 m_state = QCAMERA_SM_STATE_PREVIEWING;
1606 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07001607#endif
Muhua Libc9a8082012-11-07 15:51:28 -08001608 result.status = rc;
1609 result.request_api = evt;
1610 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1611 m_parent->signalAPIResult(&result);
1612 }
1613 break;
1614 case QCAMERA_SM_EVT_CANCEL_PICTURE:
1615 {
1616 rc = m_parent->cancelPicture();
1617 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1618 result.status = rc;
1619 result.request_api = evt;
1620 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1621 m_parent->signalAPIResult(&result);
1622 }
1623 break;
Muhua Li5858c392013-02-04 17:53:34 -08001624 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
1625 {
1626 int32_t faceID = 0;
1627 qcamera_sm_evt_reg_face_payload_t *reg_payload =
1628 (qcamera_sm_evt_reg_face_payload_t *)payload;
1629 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
1630 reg_payload->config,
1631 faceID);
1632 result.status = rc;
1633 result.request_api = evt;
1634 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
1635 result.handle = faceID;
1636 m_parent->signalAPIResult(&result);
1637 }
1638 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001639 case QCAMERA_SM_EVT_TAKE_PICTURE:
Emilian Peeva43000b2013-09-27 14:27:21 -07001640 {
1641 if ( m_parent->isLongshotEnabled() ) {
1642 rc = m_parent->longShot();
1643 } else {
1644 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1645 rc = INVALID_OPERATION;
1646 }
1647
1648 result.status = rc;
1649 result.request_api = evt;
1650 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1651 m_parent->signalAPIResult(&result);
1652 }
1653 break;
1654 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08001655 case QCAMERA_SM_EVT_START_RECORDING:
1656 case QCAMERA_SM_EVT_STOP_RECORDING:
1657 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
1658 case QCAMERA_SM_EVT_START_PREVIEW:
1659 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
1660 case QCAMERA_SM_EVT_RELEASE:
1661 {
1662 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1663 rc = INVALID_OPERATION;
1664 result.status = rc;
1665 result.request_api = evt;
1666 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1667 m_parent->signalAPIResult(&result);
1668 }
1669 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001670 case QCAMERA_SM_EVT_EVT_INTERNAL:
1671 {
1672 qcamera_sm_internal_evt_payload_t *internal_evt =
1673 (qcamera_sm_internal_evt_payload_t *)payload;
1674 switch (internal_evt->evt_type) {
1675 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
1676 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
1677 break;
Muhua Li510aab22013-05-28 17:00:38 -07001678 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
1679 break;
1680 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
1681 break;
1682 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
1683 break;
1684 case QCAMERA_INTERNAL_EVT_CROP_INFO:
1685 rc = m_parent->processZoomEvent(internal_evt->crop_data);
1686 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08001687 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
1688 rc = m_parent->processASDUpdate(internal_evt->asd_data);
1689 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08001690 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
1691 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
1692 break;
Muhua Li31eaee02012-12-11 08:56:45 -08001693 default:
1694 break;
1695 }
1696 }
1697 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001698 case QCAMERA_SM_EVT_EVT_NOTIFY:
1699 {
1700 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1701 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02001702 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
1703 {
1704 if ( m_parent->isLongshotEnabled() ) {
1705 if(!m_parent->m_postprocessor.getMultipleStages()) {
1706 m_parent->m_postprocessor.setMultipleStages(true);
1707 }
1708 m_parent->playShutter();
1709 }
1710 }
1711 break;
Emilian Peev15690592013-04-19 09:55:40 +03001712 case CAM_EVENT_TYPE_DAEMON_DIED:
1713 {
Emilian Peev15690592013-04-19 09:55:40 +03001714 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1715 CAMERA_ERROR_SERVER_DIED,
1716 0);
1717 }
1718 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001719 default:
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301720 CDBG_HIGH("%s: no handling for server evt (%d) at this state",
Muhua Libc9a8082012-11-07 15:51:28 -08001721 __func__, cam_evt->server_event_type);
1722 break;
1723 }
1724 }
1725 break;
1726 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
1727 {
1728 qcamera_jpeg_evt_payload_t *jpeg_job =
1729 (qcamera_jpeg_evt_payload_t *)payload;
1730 rc = m_parent->processJpegNotify(jpeg_job);
1731 }
1732 break;
Emilian Peev7d36a812013-11-20 00:15:54 -08001733 case QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL:
1734 {
Emilian Peev8a977232013-11-04 07:56:32 -08001735 bool restartPreview = m_parent->isPreviewRestartEnabled();
1736 rc = m_parent->stopCaptureChannel(restartPreview);
1737
1738 if (restartPreview && (NO_ERROR == rc)) {
1739 rc = m_parent->preparePreview();
1740 if (NO_ERROR == rc) {
1741 m_parent->m_bPreviewStarted = true;
1742 rc = m_parent->startPreview();
1743 }
1744 }
1745
Emilian Peev7d36a812013-11-20 00:15:54 -08001746 }
1747 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001748 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
1749 {
1750 rc = m_parent->cancelPicture();
Emilian Peev8a977232013-11-04 07:56:32 -08001751
1752 bool restartPreview = m_parent->isPreviewRestartEnabled();
1753 if (restartPreview) {
1754 m_state = QCAMERA_SM_STATE_PREVIEWING;
1755 } else {
1756 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1757 }
1758
Emilian Peev6d90c1f2013-04-12 09:33:06 +03001759 result.status = rc;
1760 result.request_api = evt;
1761 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1762 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001763 }
1764 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08001765 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peev2ae455e2013-04-18 10:41:56 +03001766 {
1767 rc = m_parent->updateThermalLevel(
1768 *(qcamera_thermal_level_enum_t *)&payload);
1769 }
1770 break;
Muhua Libc9a8082012-11-07 15:51:28 -08001771 default:
1772 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
1773 break;
1774 }
1775
1776 return rc;
1777}
1778
Muhua Lida2c4be2012-11-26 09:14:16 -08001779/*===========================================================================
1780 * FUNCTION : procEvtRecordingState
1781 *
1782 * DESCRIPTION: finite state machine function to handle event in state of
1783 * QCAMERA_SM_STATE_RECORDING.
1784 *
1785 * PARAMETERS :
1786 * @evt : event to be processed
1787 * @payload : event payload. Can be NULL if not needed.
1788 *
1789 * RETURN : int32_t type of status
1790 * NO_ERROR -- success
1791 * none-zero failure code
1792 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08001793int32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
1794 void *payload)
1795{
1796 int32_t rc = NO_ERROR;
1797 qcamera_api_result_t result;
1798 memset(&result, 0, sizeof(qcamera_api_result_t));
1799
1800 switch (evt) {
Emilian Peev88293e92013-06-07 12:37:18 +03001801 case QCAMERA_SM_EVT_START_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08001802 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
1803 {
Emilian Peev88293e92013-06-07 12:37:18 +03001804 // WA: CTS test VideoSnapshot will try to
1805 // start preview during video recording.
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301806 CDBG_HIGH("CTS video restart op");
Emilian Peev88293e92013-06-07 12:37:18 +03001807 rc = NO_ERROR;
Muhua Libc9a8082012-11-07 15:51:28 -08001808 result.status = rc;
1809 result.request_api = evt;
1810 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1811 m_parent->signalAPIResult(&result);
1812 }
1813 break;
1814 case QCAMERA_SM_EVT_SET_CALLBACKS:
1815 {
1816 qcamera_sm_evt_setcb_payload_t *setcbs =
1817 (qcamera_sm_evt_setcb_payload_t *)payload;
1818 rc = m_parent->setCallBacks(setcbs->notify_cb,
1819 setcbs->data_cb,
1820 setcbs->data_cb_timestamp,
1821 setcbs->get_memory,
1822 setcbs->user);
1823 result.status = rc;
1824 result.request_api = evt;
1825 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1826 m_parent->signalAPIResult(&result);
1827 }
1828 break;
1829 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
1830 {
1831 rc = m_parent->enableMsgType(int32_t(payload));
1832 result.status = rc;
1833 result.request_api = evt;
1834 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1835 m_parent->signalAPIResult(&result);
1836 }
1837 break;
1838 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
1839 {
1840 rc = m_parent->disableMsgType(int32_t(payload));
1841 result.status = rc;
1842 result.request_api = evt;
1843 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1844 m_parent->signalAPIResult(&result);
1845 }
1846 break;
1847 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
1848 {
1849 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
1850 result.status = rc;
1851 result.request_api = evt;
1852 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1853 result.enabled = enabled;
1854 m_parent->signalAPIResult(&result);
1855 }
1856 break;
1857 case QCAMERA_SM_EVT_SET_PARAMS:
1858 {
Muhua Lida2c4be2012-11-26 09:14:16 -08001859 bool needRestart = false;
1860 rc = m_parent->updateParameters((char*)payload, needRestart);
1861 if (rc == NO_ERROR) {
1862 if (needRestart) {
1863 // cannot set parameters that requires restart during recording
1864 ALOGE("%s: Cannot set parameters that requires restart during recording",
1865 __func__);
1866 rc = BAD_VALUE;
1867 } else {
1868 rc = m_parent->commitParameterChanges();
1869 }
1870 }
Muhua Libc9a8082012-11-07 15:51:28 -08001871 result.status = rc;
1872 result.request_api = evt;
1873 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1874 m_parent->signalAPIResult(&result);
1875 }
1876 break;
1877 case QCAMERA_SM_EVT_GET_PARAMS:
1878 {
1879 result.params = m_parent->getParameters();
1880 rc = NO_ERROR;
1881 result.status = rc;
1882 result.request_api = evt;
1883 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
1884 m_parent->signalAPIResult(&result);
1885 }
1886 break;
1887 case QCAMERA_SM_EVT_PUT_PARAMS:
1888 {
1889 rc = m_parent->putParameters((char*)payload);
1890 result.status = rc;
1891 result.request_api = evt;
1892 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1893 m_parent->signalAPIResult(&result);
1894 }
1895 break;
1896 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
1897 {
1898 rc = NO_ERROR;
1899 result.status = rc;
1900 result.request_api = evt;
1901 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1902 result.enabled = 0;
1903 m_parent->signalAPIResult(&result);
1904 }
1905 break;
1906 case QCAMERA_SM_EVT_RECORDING_ENABLED:
1907 {
1908 rc = NO_ERROR;
1909 result.status = rc;
1910 result.request_api = evt;
1911 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
1912 result.enabled = 1;
1913 m_parent->signalAPIResult(&result);
1914 }
1915 break;
1916 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
1917 {
1918 rc = m_parent->storeMetaDataInBuffers(int(payload));
1919 result.status = rc;
1920 result.request_api = evt;
1921 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1922 m_parent->signalAPIResult(&result);
1923 }
1924 break;
1925 case QCAMERA_SM_EVT_DUMP:
1926 {
1927 rc = m_parent->dump((int)payload);
1928 result.status = rc;
1929 result.request_api = evt;
1930 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1931 m_parent->signalAPIResult(&result);
1932 }
1933 break;
1934 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
1935 {
1936 rc = m_parent->autoFocus();
1937 result.status = rc;
1938 result.request_api = evt;
1939 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1940 m_parent->signalAPIResult(&result);
1941 }
1942 break;
1943 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
1944 {
1945 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05301946 result.status = rc;
1947 result.request_api = evt;
1948 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1949 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08001950 }
1951 break;
1952 case QCAMERA_SM_EVT_SEND_COMMAND:
1953 {
1954 qcamera_sm_evt_command_payload_t *cmd_payload =
1955 (qcamera_sm_evt_command_payload_t *)payload;
1956 rc = m_parent->sendCommand(cmd_payload->cmd,
1957 cmd_payload->arg1,
1958 cmd_payload->arg2);
1959 result.status = rc;
1960 result.request_api = evt;
1961 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1962 m_parent->signalAPIResult(&result);
1963 }
1964 break;
1965 case QCAMERA_SM_EVT_TAKE_PICTURE:
1966 {
Muhua Li1d0c4772013-02-22 15:39:45 -08001967 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
Muhua Libc9a8082012-11-07 15:51:28 -08001968 rc = m_parent->takeLiveSnapshot();
Muhua Li1d0c4772013-02-22 15:39:45 -08001969 if (rc != NO_ERROR) {
1970 m_state = QCAMERA_SM_STATE_RECORDING;
Muhua Libc9a8082012-11-07 15:51:28 -08001971 }
1972 result.status = rc;
1973 result.request_api = evt;
1974 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1975 m_parent->signalAPIResult(&result);
1976 }
1977 break;
1978 case QCAMERA_SM_EVT_START_RECORDING:
1979 {
1980 // no ops here
satyavaraprasad yerramsetti087e0572014-04-22 19:39:52 +05301981 CDBG_HIGH("%s: already in recording state, no ops for start_recording", __func__);
Muhua Libc9a8082012-11-07 15:51:28 -08001982 rc = 0;
1983 result.status = rc;
1984 result.request_api = evt;
1985 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1986 m_parent->signalAPIResult(&result);
1987 }
1988 break;
1989 case QCAMERA_SM_EVT_STOP_RECORDING:
1990 {
1991 rc = m_parent->stopRecording();
1992 m_state = QCAMERA_SM_STATE_PREVIEWING;
1993 result.status = rc;
1994 result.request_api = evt;
1995 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1996 m_parent->signalAPIResult(&result);
1997 }
1998 break;
Emilian Peevf392f172013-05-13 16:29:53 -07001999 case QCAMERA_SM_EVT_STOP_PREVIEW:
2000 {
2001 rc = m_parent->stopRecording();
2002 m_state = QCAMERA_SM_STATE_PREVIEWING;
2003
2004 rc = m_parent->stopPreview();
2005 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2006
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;
Muhua Libc9a8082012-11-07 15:51:28 -08002013 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2014 {
2015 rc = m_parent->releaseRecordingFrame((const void *)payload);
2016 result.status = rc;
2017 result.request_api = evt;
2018 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2019 m_parent->signalAPIResult(&result);
2020 }
2021 break;
Muhua Li5858c392013-02-04 17:53:34 -08002022 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2023 {
2024 int32_t faceID = 0;
2025 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2026 (qcamera_sm_evt_reg_face_payload_t *)payload;
2027 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2028 reg_payload->config,
2029 faceID);
2030 result.status = rc;
2031 result.request_api = evt;
2032 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2033 result.handle = faceID;
2034 m_parent->signalAPIResult(&result);
2035 }
2036 break;
Shuzhen Wang93f24112013-02-20 16:01:42 -08002037 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
2038 {
2039 //In Video snapshot, prepare hardware is a no-op.
2040 result.status = NO_ERROR;
2041 result.request_api = evt;
2042 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2043 m_parent->signalAPIResult(&result);
2044 }
2045 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002046 case QCAMERA_SM_EVT_CANCEL_PICTURE:
Muhua Libc9a8082012-11-07 15:51:28 -08002047 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002048 case QCAMERA_SM_EVT_RELEASE:
2049 {
2050 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2051 rc = INVALID_OPERATION;
2052 result.status = rc;
2053 result.request_api = evt;
2054 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2055 m_parent->signalAPIResult(&result);
2056 }
2057 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002058 case QCAMERA_SM_EVT_EVT_INTERNAL:
2059 {
2060 qcamera_sm_internal_evt_payload_t *internal_evt =
2061 (qcamera_sm_internal_evt_payload_t *)payload;
2062 switch (internal_evt->evt_type) {
2063 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2064 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2065 break;
Muhua Li510aab22013-05-28 17:00:38 -07002066 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2067 break;
2068 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2069 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2070 break;
2071 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2072 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2073 break;
2074 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2075 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2076 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002077 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2078 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2079 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002080 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2081 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2082 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002083 default:
2084 break;
2085 }
2086 }
2087 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002088 case QCAMERA_SM_EVT_EVT_NOTIFY:
2089 {
2090 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2091 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002092 case CAM_EVENT_TYPE_DAEMON_DIED:
2093 {
Emilian Peev15690592013-04-19 09:55:40 +03002094 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2095 CAMERA_ERROR_SERVER_DIED,
2096 0);
2097 }
2098 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002099 default:
Emilian Peev15690592013-04-19 09:55:40 +03002100 ALOGE("%s: Invalid internal event %d in state(%d)",
2101 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002102 break;
2103 }
2104 }
2105 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002106 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002107 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002108 rc = m_parent->updateThermalLevel(
2109 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002110 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002111 break;
Muhua Lida2c4be2012-11-26 09:14:16 -08002112 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
Muhua Lic9390df2013-05-22 17:54:13 -07002113 {
2114 // No ops, but need to notify
2115 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2116 result.status = rc;
2117 result.request_api = evt;
2118 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2119 m_parent->signalEvtResult(&result);
2120 }
2121 break;
2122 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
Muhua Libc9a8082012-11-07 15:51:28 -08002123 default:
2124 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2125 break;
2126 }
2127
2128 return rc;
2129}
2130
Muhua Lida2c4be2012-11-26 09:14:16 -08002131/*===========================================================================
2132 * FUNCTION : procEvtVideoPicTakingState
2133 *
2134 * DESCRIPTION: finite state machine function to handle event in state of
2135 * QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
2136 *
2137 * PARAMETERS :
2138 * @evt : event to be processed
2139 * @payload : event payload. Can be NULL if not needed.
2140 *
2141 * RETURN : int32_t type of status
2142 * NO_ERROR -- success
2143 * none-zero failure code
2144 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002145int32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
2146 void *payload)
2147{
2148 int32_t rc = NO_ERROR;
2149 qcamera_api_result_t result;
2150 memset(&result, 0, sizeof(qcamera_api_result_t));
2151
2152 switch (evt) {
2153 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2154 {
2155 // Error setting preview window during previewing
2156 ALOGE("Cannot set preview window when preview is running");
2157 rc = INVALID_OPERATION;
2158 result.status = rc;
2159 result.request_api = evt;
2160 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2161 m_parent->signalAPIResult(&result);
2162 }
2163 break;
2164 case QCAMERA_SM_EVT_SET_CALLBACKS:
2165 {
2166 qcamera_sm_evt_setcb_payload_t *setcbs =
2167 (qcamera_sm_evt_setcb_payload_t *)payload;
2168 rc = m_parent->setCallBacks(setcbs->notify_cb,
2169 setcbs->data_cb,
2170 setcbs->data_cb_timestamp,
2171 setcbs->get_memory,
2172 setcbs->user);
2173 result.status = rc;
2174 result.request_api = evt;
2175 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2176 m_parent->signalAPIResult(&result);
2177 }
2178 break;
2179 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2180 {
2181 rc = m_parent->enableMsgType(int32_t(payload));
2182 result.status = rc;
2183 result.request_api = evt;
2184 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2185 m_parent->signalAPIResult(&result);
2186 }
2187 break;
2188 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2189 {
2190 rc = m_parent->disableMsgType(int32_t(payload));
2191 result.status = rc;
2192 result.request_api = evt;
2193 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2194 m_parent->signalAPIResult(&result);
2195 }
2196 break;
2197 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2198 {
2199 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
2200 result.status = rc;
2201 result.request_api = evt;
2202 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2203 result.enabled = enabled;
2204 m_parent->signalAPIResult(&result);
2205 }
2206 break;
2207 case QCAMERA_SM_EVT_SET_PARAMS:
2208 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002209 bool needRestart = false;
2210 rc = m_parent->updateParameters((char*)payload, needRestart);
2211 if (rc == NO_ERROR) {
2212 if (needRestart) {
2213 // cannot set parameters that requires restart during recording
2214 ALOGE("%s: Cannot set parameters that requires restart during recording",
2215 __func__);
2216 rc = BAD_VALUE;
2217 } else {
2218 rc = m_parent->commitParameterChanges();
2219 }
2220 }
Muhua Libc9a8082012-11-07 15:51:28 -08002221 result.status = rc;
2222 result.request_api = evt;
2223 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2224 m_parent->signalAPIResult(&result);
2225 }
2226 break;
2227 case QCAMERA_SM_EVT_GET_PARAMS:
2228 {
2229 result.params = m_parent->getParameters();
2230 rc = NO_ERROR;
2231 result.status = rc;
2232 result.request_api = evt;
2233 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2234 m_parent->signalAPIResult(&result);
2235 }
2236 break;
2237 case QCAMERA_SM_EVT_PUT_PARAMS:
2238 {
2239 rc = m_parent->putParameters((char*)payload);
2240 result.status = rc;
2241 result.request_api = evt;
2242 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2243 m_parent->signalAPIResult(&result);
2244 }
2245 break;
2246 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2247 {
2248 rc = NO_ERROR;
2249 result.status = rc;
2250 result.request_api = evt;
2251 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2252 result.enabled = 1;
2253 m_parent->signalAPIResult(&result);
2254 }
2255 break;
2256 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2257 {
2258 rc = NO_ERROR;
2259 result.status = rc;
2260 result.request_api = evt;
2261 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2262 result.enabled = 1;
2263 m_parent->signalAPIResult(&result);
2264 }
2265 break;
2266 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2267 {
2268 rc = m_parent->storeMetaDataInBuffers(int(payload));
2269 result.status = rc;
2270 result.request_api = evt;
2271 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2272 m_parent->signalAPIResult(&result);
2273 }
2274 break;
2275 case QCAMERA_SM_EVT_DUMP:
2276 {
2277 rc = m_parent->dump((int)payload);
2278 result.status = rc;
2279 result.request_api = evt;
2280 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2281 m_parent->signalAPIResult(&result);
2282 }
2283 break;
2284 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2285 {
2286 rc = m_parent->autoFocus();
2287 result.status = rc;
2288 result.request_api = evt;
2289 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2290 m_parent->signalAPIResult(&result);
2291 }
2292 break;
2293 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2294 {
2295 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302296 result.status = rc;
2297 result.request_api = evt;
2298 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2299 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002300 }
2301 break;
2302 case QCAMERA_SM_EVT_SEND_COMMAND:
2303 {
2304 qcamera_sm_evt_command_payload_t *cmd_payload =
2305 (qcamera_sm_evt_command_payload_t *)payload;
2306 rc = m_parent->sendCommand(cmd_payload->cmd,
2307 cmd_payload->arg1,
2308 cmd_payload->arg2);
2309 result.status = rc;
2310 result.request_api = evt;
2311 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2312 m_parent->signalAPIResult(&result);
2313 }
2314 break;
2315 case QCAMERA_SM_EVT_STOP_RECORDING:
2316 {
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302317 rc = m_parent->cancelLiveSnapshot();
2318 m_state = QCAMERA_SM_STATE_RECORDING;
2319
Muhua Libc9a8082012-11-07 15:51:28 -08002320 rc = m_parent->stopRecording();
Sai Kumar Sanagavarapud972ac12014-01-07 14:23:52 +05302321 m_state = QCAMERA_SM_STATE_PREVIEWING;
2322
Muhua Libc9a8082012-11-07 15:51:28 -08002323 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_RELEASE_RECORIDNG_FRAME:
2330 {
2331 rc = m_parent->releaseRecordingFrame((const void *)payload);
2332 result.status = rc;
2333 result.request_api = evt;
2334 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2335 m_parent->signalAPIResult(&result);
2336 }
2337 break;
2338 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2339 {
2340 rc = m_parent->cancelLiveSnapshot();
2341 m_state = QCAMERA_SM_STATE_RECORDING;
2342 result.status = rc;
2343 result.request_api = evt;
2344 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2345 m_parent->signalAPIResult(&result);
2346 }
2347 break;
Muhua Li5858c392013-02-04 17:53:34 -08002348 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2349 {
2350 int32_t faceID = 0;
2351 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2352 (qcamera_sm_evt_reg_face_payload_t *)payload;
2353 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2354 reg_payload->config,
2355 faceID);
2356 result.status = rc;
2357 result.request_api = evt;
2358 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2359 result.handle = faceID;
2360 m_parent->signalAPIResult(&result);
2361 }
2362 break;
Emilian Peevf392f172013-05-13 16:29:53 -07002363 case QCAMERA_SM_EVT_STOP_PREVIEW:
2364 {
2365 rc = m_parent->cancelLiveSnapshot();
2366 m_state = QCAMERA_SM_STATE_RECORDING;
2367
2368 rc = m_parent->stopRecording();
2369 m_state = QCAMERA_SM_STATE_PREVIEWING;
2370
2371 rc = m_parent->stopPreview();
2372 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
2373
2374 result.status = rc;
2375 result.request_api = evt;
2376 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2377 m_parent->signalAPIResult(&result);
2378 }
2379 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002380 case QCAMERA_SM_EVT_START_RECORDING:
2381 case QCAMERA_SM_EVT_START_PREVIEW:
2382 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Li510aab22013-05-28 17:00:38 -07002383 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002384 case QCAMERA_SM_EVT_TAKE_PICTURE:
2385 case QCAMERA_SM_EVT_RELEASE:
2386 {
2387 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2388 rc = INVALID_OPERATION;
2389 result.status = rc;
2390 result.request_api = evt;
2391 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2392 m_parent->signalAPIResult(&result);
2393 }
2394 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002395 case QCAMERA_SM_EVT_EVT_INTERNAL:
2396 {
2397 qcamera_sm_internal_evt_payload_t *internal_evt =
2398 (qcamera_sm_internal_evt_payload_t *)payload;
2399 switch (internal_evt->evt_type) {
2400 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2401 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2402 break;
Muhua Li510aab22013-05-28 17:00:38 -07002403 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2404 break;
2405 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2406 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2407 break;
2408 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2409 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2410 break;
2411 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2412 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2413 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002414 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2415 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2416 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002417 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2418 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2419 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002420 default:
2421 break;
2422 }
2423 }
2424 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002425 case QCAMERA_SM_EVT_EVT_NOTIFY:
2426 {
2427 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2428 switch (cam_evt->server_event_type) {
Emilian Peev15690592013-04-19 09:55:40 +03002429 case CAM_EVENT_TYPE_DAEMON_DIED:
2430 {
Emilian Peev15690592013-04-19 09:55:40 +03002431 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2432 CAMERA_ERROR_SERVER_DIED,
2433 0);
2434 }
2435 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002436 default:
Emilian Peev15690592013-04-19 09:55:40 +03002437 ALOGE("%s: Invalid internal event %d in state(%d)",
2438 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002439 break;
2440 }
2441 }
2442 break;
2443 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2444 {
2445 qcamera_jpeg_evt_payload_t *jpeg_job =
2446 (qcamera_jpeg_evt_payload_t *)payload;
2447 rc = m_parent->processJpegNotify(jpeg_job);
2448 }
2449 break;
2450 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2451 {
2452 rc = m_parent->cancelLiveSnapshot();
2453 m_state = QCAMERA_SM_STATE_RECORDING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002454 result.status = rc;
2455 result.request_api = evt;
2456 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2457 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002458 }
2459 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002460 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002461 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002462 rc = m_parent->updateThermalLevel(
2463 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002464 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002465 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002466 default:
2467 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2468 break;
2469 }
2470
2471 return rc;
2472}
2473
Muhua Lida2c4be2012-11-26 09:14:16 -08002474/*===========================================================================
2475 * FUNCTION : procEvtPreviewPicTakingState
2476 *
2477 * DESCRIPTION: finite state machine function to handle event in state of
2478 * QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
2479 *
2480 * PARAMETERS :
2481 * @evt : event to be processed
2482 * @payload : event payload. Can be NULL if not needed.
2483 *
2484 * RETURN : int32_t type of status
2485 * NO_ERROR -- success
2486 * none-zero failure code
2487 *==========================================================================*/
Muhua Libc9a8082012-11-07 15:51:28 -08002488int32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
2489 void *payload)
2490{
2491 int32_t rc = NO_ERROR;
2492 qcamera_api_result_t result;
2493 memset(&result, 0, sizeof(qcamera_api_result_t));
2494
2495 switch (evt) {
2496 case QCAMERA_SM_EVT_SET_CALLBACKS:
2497 {
2498 qcamera_sm_evt_setcb_payload_t *setcbs =
2499 (qcamera_sm_evt_setcb_payload_t *)payload;
2500 rc = m_parent->setCallBacks(setcbs->notify_cb,
2501 setcbs->data_cb,
2502 setcbs->data_cb_timestamp,
2503 setcbs->get_memory,
2504 setcbs->user);
2505 result.status = rc;
2506 result.request_api = evt;
2507 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2508 m_parent->signalAPIResult(&result);
2509 }
2510 break;
2511 case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
2512 {
2513 rc = m_parent->enableMsgType(int32_t(payload));
2514 result.status = rc;
2515 result.request_api = evt;
2516 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2517 m_parent->signalAPIResult(&result);
2518 }
2519 break;
2520 case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
2521 {
2522 rc = m_parent->disableMsgType(int32_t(payload));
2523 result.status = rc;
2524 result.request_api = evt;
2525 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2526 m_parent->signalAPIResult(&result);
2527 }
2528 break;
2529 case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
2530 {
2531 int enabled = m_parent->msgTypeEnabled(int32_t(payload));
2532 result.status = rc;
2533 result.request_api = evt;
2534 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2535 result.enabled = enabled;
2536 m_parent->signalAPIResult(&result);
2537 }
2538 break;
2539 case QCAMERA_SM_EVT_SET_PARAMS:
2540 {
Muhua Lida2c4be2012-11-26 09:14:16 -08002541 bool needRestart = false;
2542 rc = m_parent->updateParameters((char*)payload, needRestart);
2543 if (rc == NO_ERROR) {
2544 if (needRestart) {
2545 // need restart preview for parameters to take effect
2546 // stop preview
2547 m_parent->stopPreview();
Emilian Peev9afd73b2013-10-31 08:19:57 -07002548 // Clear memory pools
2549 m_parent->m_memoryPool.clear();
Muhua Lida2c4be2012-11-26 09:14:16 -08002550 // commit parameter changes to server
Muhua Li66f3b532013-01-23 17:19:05 -08002551 m_parent->commitParameterChanges();
Muhua Lida2c4be2012-11-26 09:14:16 -08002552 // start preview again
Muhua Li66f3b532013-01-23 17:19:05 -08002553 rc = m_parent->preparePreview();
2554 if (rc == NO_ERROR) {
2555 rc = m_parent->startPreview();
2556 if (rc != NO_ERROR) {
2557 m_parent->unpreparePreview();
2558 }
2559 }
2560 if (rc != NO_ERROR) {
2561 m_state = QCAMERA_SM_STATE_PIC_TAKING;
2562 }
Muhua Lida2c4be2012-11-26 09:14:16 -08002563 } else {
2564 rc = m_parent->commitParameterChanges();
2565 }
2566 }
Muhua Libc9a8082012-11-07 15:51:28 -08002567 result.status = rc;
2568 result.request_api = evt;
2569 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2570 m_parent->signalAPIResult(&result);
2571 }
2572 break;
2573 case QCAMERA_SM_EVT_GET_PARAMS:
2574 {
2575 result.params = m_parent->getParameters();
2576 rc = NO_ERROR;
2577 result.status = rc;
2578 result.request_api = evt;
2579 result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
2580 m_parent->signalAPIResult(&result);
2581 }
2582 break;
2583 case QCAMERA_SM_EVT_PUT_PARAMS:
2584 {
2585 rc = m_parent->putParameters((char*)payload);
2586 result.status = rc;
2587 result.request_api = evt;
2588 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2589 m_parent->signalAPIResult(&result);
2590 }
2591 break;
2592 case QCAMERA_SM_EVT_PREVIEW_ENABLED:
2593 {
2594 rc = NO_ERROR;
2595 result.status = rc;
2596 result.request_api = evt;
2597 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2598 result.enabled = 1;
2599 m_parent->signalAPIResult(&result);
2600 }
2601 break;
2602 case QCAMERA_SM_EVT_RECORDING_ENABLED:
2603 {
2604 rc = NO_ERROR;
2605 result.status = rc;
2606 result.request_api = evt;
2607 result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
2608 result.enabled = 0;
2609 m_parent->signalAPIResult(&result);
2610 }
2611 break;
2612 case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
2613 {
2614 rc = m_parent->storeMetaDataInBuffers(int(payload));
2615 result.status = rc;
2616 result.request_api = evt;
2617 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2618 m_parent->signalAPIResult(&result);
2619 }
2620 break;
2621 case QCAMERA_SM_EVT_DUMP:
2622 {
2623 rc = m_parent->dump((int)payload);
2624 result.status = rc;
2625 result.request_api = evt;
2626 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2627 m_parent->signalAPIResult(&result);
2628 }
2629 break;
2630 case QCAMERA_SM_EVT_START_AUTO_FOCUS:
2631 {
2632 rc = m_parent->autoFocus();
2633 result.status = rc;
2634 result.request_api = evt;
2635 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2636 m_parent->signalAPIResult(&result);
2637 }
2638 break;
2639 case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
2640 {
2641 rc = m_parent->cancelAutoFocus();
satyavaraprasad yerramsetti1d4b8842014-01-06 19:23:50 +05302642 result.status = rc;
2643 result.request_api = evt;
2644 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2645 m_parent->signalAPIResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002646 }
2647 break;
2648 case QCAMERA_SM_EVT_SEND_COMMAND:
2649 {
2650 qcamera_sm_evt_command_payload_t *cmd_payload =
2651 (qcamera_sm_evt_command_payload_t *)payload;
2652 rc = m_parent->sendCommand(cmd_payload->cmd,
2653 cmd_payload->arg1,
2654 cmd_payload->arg2);
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002655#ifndef VANILLA_HAL
Emilian Peeve32d03b2013-08-13 16:15:41 +03002656 if ( CAMERA_CMD_LONGSHOT_OFF == cmd_payload->cmd ) {
2657 // move state to previewing state
2658 m_state = QCAMERA_SM_STATE_PREVIEWING;
2659 }
Shuzhen Wang53e022d2014-06-04 22:17:25 -07002660#endif
Muhua Libc9a8082012-11-07 15:51:28 -08002661 result.status = rc;
2662 result.request_api = evt;
2663 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2664 m_parent->signalAPIResult(&result);
2665 }
2666 break;
2667 case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
2668 {
2669 rc = m_parent->releaseRecordingFrame((const void *)payload);
2670 result.status = rc;
2671 result.request_api = evt;
2672 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2673 m_parent->signalAPIResult(&result);
2674 }
2675 break;
2676 case QCAMERA_SM_EVT_CANCEL_PICTURE:
2677 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002678 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002679 rc = m_parent->cancelPicture();
2680 } else {
2681 rc = m_parent->cancelLiveSnapshot();
2682 }
Muhua Libc9a8082012-11-07 15:51:28 -08002683 m_state = QCAMERA_SM_STATE_PREVIEWING;
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_STOP_PREVIEW:
2691 {
Muhua Libd1b6122013-03-05 15:25:27 -08002692 if (m_parent->isZSLMode()) {
2693 // cancel picture first
2694 rc = m_parent->cancelPicture();
2695 m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
Emilian Peeva43000b2013-09-27 14:27:21 -07002696 } else if (m_parent->isLongshotEnabled()) {
2697 // just cancel picture
2698 rc = m_parent->cancelPicture();
Muhua Libd1b6122013-03-05 15:25:27 -08002699 } else {
2700 rc = m_parent->cancelLiveSnapshot();
2701 m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
2702 }
2703 // unprepare preview
2704 m_parent->unpreparePreview();
2705 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
Muhua Libc9a8082012-11-07 15:51:28 -08002706 result.status = rc;
2707 result.request_api = evt;
2708 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2709 m_parent->signalAPIResult(&result);
2710 }
2711 break;
2712 case QCAMERA_SM_EVT_START_RECORDING:
2713 {
Muhua Licf1cf672013-05-10 09:42:50 -07002714 if (m_parent->isZSLMode()) {
2715 ALOGE("%s: cannot handle evt(%d) in state(%d) in ZSL mode",
2716 __func__, evt, m_state);
2717 rc = INVALID_OPERATION;
Emilian Peeva43000b2013-09-27 14:27:21 -07002718 } else if (m_parent->isLongshotEnabled()) {
2719 ALOGE("%s: cannot handle evt(%d) in state(%d) in Longshot mode",
2720 __func__, evt, m_state);
2721 rc = INVALID_OPERATION;
Muhua Licf1cf672013-05-10 09:42:50 -07002722 } else {
2723 rc = m_parent->startRecording();
2724 if (rc == NO_ERROR) {
2725 m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
2726 }
Muhua Libc9a8082012-11-07 15:51:28 -08002727 }
2728 result.status = rc;
2729 result.request_api = evt;
2730 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2731 m_parent->signalAPIResult(&result);
2732 }
2733 break;
Muhua Li5858c392013-02-04 17:53:34 -08002734 case QCAMERA_SM_EVT_REG_FACE_IMAGE:
2735 {
2736 int32_t faceID = 0;
2737 qcamera_sm_evt_reg_face_payload_t *reg_payload =
2738 (qcamera_sm_evt_reg_face_payload_t *)payload;
2739 rc = m_parent->registerFaceImage(reg_payload->img_ptr,
2740 reg_payload->config,
2741 faceID);
2742 result.status = rc;
2743 result.request_api = evt;
2744 result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
2745 result.handle = faceID;
2746 m_parent->signalAPIResult(&result);
2747 }
2748 break;
Emilian Peeve32d03b2013-08-13 16:15:41 +03002749 case QCAMERA_SM_EVT_TAKE_PICTURE:
2750 {
2751 if ( m_parent->isLongshotEnabled() ) {
2752 rc = m_parent->longShot();
2753 } else {
2754 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2755 rc = INVALID_OPERATION;
2756 }
2757
2758 result.status = rc;
2759 result.request_api = evt;
2760 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2761 m_parent->signalAPIResult(&result);
2762 }
2763 break;
2764 case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
Muhua Libc9a8082012-11-07 15:51:28 -08002765 case QCAMERA_SM_EVT_STOP_RECORDING:
2766 case QCAMERA_SM_EVT_START_PREVIEW:
2767 case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
Muhua Libc9a8082012-11-07 15:51:28 -08002768 case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
2769 case QCAMERA_SM_EVT_RELEASE:
2770 {
2771 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2772 rc = INVALID_OPERATION;
2773 result.status = rc;
2774 result.request_api = evt;
2775 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2776 m_parent->signalAPIResult(&result);
2777 }
2778 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002779 case QCAMERA_SM_EVT_EVT_INTERNAL:
2780 {
2781 qcamera_sm_internal_evt_payload_t *internal_evt =
2782 (qcamera_sm_internal_evt_payload_t *)payload;
2783 switch (internal_evt->evt_type) {
2784 case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
2785 rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
2786 break;
Muhua Li510aab22013-05-28 17:00:38 -07002787 case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
2788 break;
2789 case QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT:
2790 rc = m_parent->processFaceDetectionResult(&internal_evt->faces_data);
2791 break;
2792 case QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS:
2793 rc = m_parent->processHistogramStats(internal_evt->stats_data);
2794 break;
2795 case QCAMERA_INTERNAL_EVT_CROP_INFO:
2796 rc = m_parent->processZoomEvent(internal_evt->crop_data);
2797 break;
Fei Zhangca9f5bc2013-06-28 11:25:21 +08002798 case QCAMERA_INTERNAL_EVT_ASD_UPDATE:
2799 rc = m_parent->processASDUpdate(internal_evt->asd_data);
2800 break;
Yonggui Mao301cc0d2013-12-05 11:18:15 +08002801 case QCAMERA_INTERNAL_EVT_AWB_UPDATE:
2802 rc = m_parent->processAWBUpdate(internal_evt->awb_data);
2803 break;
Muhua Li31eaee02012-12-11 08:56:45 -08002804 default:
2805 break;
2806 }
2807 }
2808 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002809 case QCAMERA_SM_EVT_EVT_NOTIFY:
2810 {
2811 mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
2812 switch (cam_evt->server_event_type) {
Emilian Peev9c53a9e2013-12-12 15:58:13 +02002813 case CAM_EVENT_TYPE_REPROCESS_STAGE_DONE:
2814 {
2815 if ( m_parent->isLongshotEnabled() ) {
2816 if(!m_parent->m_postprocessor.getMultipleStages()) {
2817 m_parent->m_postprocessor.setMultipleStages(true);
2818 }
2819 m_parent->playShutter();
2820 }
2821 }
2822 break;
Emilian Peev15690592013-04-19 09:55:40 +03002823 case CAM_EVENT_TYPE_DAEMON_DIED:
2824 {
Emilian Peev15690592013-04-19 09:55:40 +03002825 m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2826 CAMERA_ERROR_SERVER_DIED,
2827 0);
2828 }
2829 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002830 default:
Emilian Peev15690592013-04-19 09:55:40 +03002831 ALOGE("%s: Invalid internal event %d in state(%d)",
2832 __func__, cam_evt->server_event_type, m_state);
Muhua Libc9a8082012-11-07 15:51:28 -08002833 break;
2834 }
2835 }
2836 break;
2837 case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
2838 {
2839 qcamera_jpeg_evt_payload_t *jpeg_job =
2840 (qcamera_jpeg_evt_payload_t *)payload;
2841 rc = m_parent->processJpegNotify(jpeg_job);
2842 }
2843 break;
2844 case QCAMERA_SM_EVT_SNAPSHOT_DONE:
2845 {
Emilian Peeva43000b2013-09-27 14:27:21 -07002846 if (m_parent->isZSLMode() || m_parent->isLongshotEnabled()) {
Shuzhen Wang93f24112013-02-20 16:01:42 -08002847 rc = m_parent->cancelPicture();
2848 } else {
2849 rc = m_parent->cancelLiveSnapshot();
2850 }
Muhua Libc9a8082012-11-07 15:51:28 -08002851 m_state = QCAMERA_SM_STATE_PREVIEWING;
Emilian Peev6d90c1f2013-04-12 09:33:06 +03002852 result.status = rc;
2853 result.request_api = evt;
2854 result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2855 m_parent->signalEvtResult(&result);
Muhua Libc9a8082012-11-07 15:51:28 -08002856 }
2857 break;
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002858 case QCAMERA_SM_EVT_THERMAL_NOTIFY:
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002859 {
Shuzhen Wangd415beb2013-02-08 10:28:16 -08002860 rc = m_parent->updateThermalLevel(
2861 *(qcamera_thermal_level_enum_t *)&payload);
Emilian Peeve1d5acb2013-02-01 11:29:53 -08002862 }
Shuzhen Wangaa829ce2013-01-09 14:41:49 -08002863 break;
Muhua Libc9a8082012-11-07 15:51:28 -08002864 default:
2865 ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
2866 break;
2867 }
2868
2869 return rc;
2870}
2871
Muhua Lida2c4be2012-11-26 09:14:16 -08002872/*===========================================================================
2873 * FUNCTION : isPreviewRunning
2874 *
2875 * DESCRIPTION: check if preview is in process.
2876 *
2877 * PARAMETERS : None
2878 *
2879 * RETURN : true -- preview running
2880 * false -- preview stopped
2881 *==========================================================================*/
2882bool QCameraStateMachine::isPreviewRunning()
2883{
2884 switch (m_state) {
2885 case QCAMERA_SM_STATE_PREVIEWING:
2886 case QCAMERA_SM_STATE_RECORDING:
2887 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2888 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
Muhua Libf818e52013-04-23 18:05:26 -07002889 case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
chiza8491aa2014-03-21 13:02:39 +08002890 case QCAMERA_SM_STATE_PREVIEW_READY:
Muhua Lida2c4be2012-11-26 09:14:16 -08002891 return true;
2892 default:
2893 return false;
2894 }
2895}
2896
Emilian Peeve32d03b2013-08-13 16:15:41 +03002897/*===========================================================================
Emilian Peev7890d1f2014-04-30 15:13:41 -07002898 * FUNCTION : isPreviewReady
2899 *
2900 * DESCRIPTION: check if preview is in ready state.
2901 *
2902 * PARAMETERS : None
2903 *
2904 * RETURN : true -- preview is in ready state
2905 * false -- preview is stopped
2906 *==========================================================================*/
2907bool QCameraStateMachine::isPreviewReady()
2908{
2909 switch (m_state) {
2910 case QCAMERA_SM_STATE_PREVIEW_READY:
2911 return true;
2912 default:
2913 return false;
2914 }
2915}
2916
2917/*===========================================================================
Emilian Peeve32d03b2013-08-13 16:15:41 +03002918 * FUNCTION : isCaptureRunning
2919 *
2920 * DESCRIPTION: check if image capture is in process.
2921 *
2922 * PARAMETERS : None
2923 *
2924 * RETURN : true -- capture running
2925 * false -- capture stopped
2926 *==========================================================================*/
2927bool QCameraStateMachine::isCaptureRunning()
2928{
2929 switch (m_state) {
2930 case QCAMERA_SM_STATE_PIC_TAKING:
2931 case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2932 case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2933 return true;
2934 default:
2935 return false;
2936 }
2937}
Vijay kumar Tumatifa8d9b32013-09-23 16:09:07 +05302938/*===========================================================================
2939 * FUNCTION : isNonZSLCaptureRunning
2940 *
2941 * DESCRIPTION: check if image capture is in process in non ZSL mode.
2942 *
2943 * PARAMETERS : None
2944 *
2945 * RETURN : true -- capture running in non ZSL mode
2946 * false -- Either in not capture mode or captur is not in non ZSL mode
2947 *==========================================================================*/
2948bool QCameraStateMachine::isNonZSLCaptureRunning()
2949{
2950 switch (m_state) {
2951 case QCAMERA_SM_STATE_PIC_TAKING:
2952 return true;
2953 default:
2954 return false;
2955 }
2956}
2957
Emilian Peeve32d03b2013-08-13 16:15:41 +03002958
Shuzhen Wang89635cf2012-12-20 13:47:22 -08002959}; // namespace qcamera