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