Created
October 30, 2014 23:12
-
-
Save invisiblek/c6453d2fd0552f9dfe0c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are | |
* met: | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* * Redistributions in binary form must reproduce the above | |
* copyright notice, this list of conditions and the following | |
* disclaimer in the documentation and/or other materials provided | |
* with the distribution. | |
* * Neither the name of The Linux Foundation nor the names of its | |
* contributors may be used to endorse or promote products derived | |
* from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED | |
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT | |
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS | |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | |
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | |
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | |
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
*/ | |
#ifndef __QCAMERA_STATEMACHINE_H__ | |
#define __QCAMERA_STATEMACHINE_H__ | |
#include <pthread.h> | |
#include <cam_semaphore.h> | |
extern "C" { | |
#include <mm_camera_interface.h> | |
} | |
#include "QCameraQueue.h" | |
#include "QCameraChannel.h" | |
namespace qcamera { | |
class QCamera2HardwareInterface; | |
typedef enum { | |
/*******BEGIN OF: API EVT*********/ | |
QCAMERA_SM_EVT_SET_PREVIEW_WINDOW = 1, // set preview window | |
QCAMERA_SM_EVT_SET_CALLBACKS, // set callbacks | |
QCAMERA_SM_EVT_ENABLE_MSG_TYPE, // enable msg type | |
QCAMERA_SM_EVT_DISABLE_MSG_TYPE, // disable msg type | |
QCAMERA_SM_EVT_MSG_TYPE_ENABLED, // query certain msg type is enabled | |
QCAMERA_SM_EVT_SET_PARAMS, // set parameters | |
QCAMERA_SM_EVT_GET_PARAMS, // get parameters | |
QCAMERA_SM_EVT_PUT_PARAMS, // put parameters, release param buf | |
QCAMERA_SM_EVT_START_PREVIEW, // start preview (zsl, camera mode, camcorder mode) | |
QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW, // start no display preview (zsl, camera mode, camcorder mode) | |
QCAMERA_SM_EVT_STOP_PREVIEW, // stop preview (zsl, camera mode, camcorder mode) | |
QCAMERA_SM_EVT_PREVIEW_ENABLED, // query if preview is running | |
QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS, // request to store meta data in video buffers | |
QCAMERA_SM_EVT_START_RECORDING, // start recording | |
QCAMERA_SM_EVT_STOP_RECORDING, // stop recording | |
QCAMERA_SM_EVT_RECORDING_ENABLED, // query if recording is running | |
QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME, // release recording frame | |
QCAMERA_SM_EVT_PREPARE_SNAPSHOT, // prepare snapshot in case LED needs to be flashed | |
QCAMERA_SM_EVT_TAKE_PICTURE, // take picutre (zsl, regualr capture, live snapshot | |
QCAMERA_SM_EVT_CANCEL_PICTURE, // cancel picture | |
QCAMERA_SM_EVT_START_AUTO_FOCUS, // start auto focus | |
QCAMERA_SM_EVT_STOP_AUTO_FOCUS, // stop auto focus | |
QCAMERA_SM_EVT_SEND_COMMAND, // send command | |
QCAMERA_SM_EVT_RELEASE, // release camera resource | |
QCAMERA_SM_EVT_DUMP, // dump | |
QCAMERA_SM_EVT_REG_FACE_IMAGE, // register a face image in imaging lib | |
/*******END OF: API EVT*********/ | |
QCAMERA_SM_EVT_EVT_INTERNAL, // internal evt notify | |
QCAMERA_SM_EVT_EVT_NOTIFY, // evt notify from server | |
QCAMERA_SM_EVT_JPEG_EVT_NOTIFY, // evt notify from jpeg | |
QCAMERA_SM_EVT_SNAPSHOT_DONE, // internal evt that snapshot is done | |
QCAMERA_SM_EVT_THERMAL_NOTIFY, // evt notify from thermal daemon | |
QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL, // stop capture channel | |
QCAMERA_SM_EVT_MAX | |
} qcamera_sm_evt_enum_t; | |
typedef enum { | |
QCAMERA_API_RESULT_TYPE_DEF, // default type, no additional info | |
QCAMERA_API_RESULT_TYPE_ENABLE_FLAG, // msg_enabled, preview_enabled, recording_enabled | |
QCAMERA_API_RESULT_TYPE_PARAMS, // returned parameters in string | |
QCAMERA_API_RESULT_TYPE_HANDLE, // returned handle in int | |
QCAMERA_API_RESULT_TYPE_MAX | |
} qcamera_api_result_type_t; | |
typedef struct { | |
int32_t status; // api call status | |
qcamera_sm_evt_enum_t request_api; // api evt requested | |
qcamera_api_result_type_t result_type; // result type | |
union { | |
int enabled; // result_type == QCAMERA_API_RESULT_TYPE_ENABLE_FLAG | |
char *params; // result_type == QCAMERA_API_RESULT_TYPE_PARAMS | |
int handle; // result_type ==QCAMERA_API_RESULT_TYPE_HANDLE | |
}; | |
} qcamera_api_result_t; | |
// definition for payload type of setting callback | |
typedef struct { | |
camera_notify_callback notify_cb; | |
camera_data_callback data_cb; | |
camera_data_timestamp_callback data_cb_timestamp; | |
camera_request_memory get_memory; | |
void *user; | |
} qcamera_sm_evt_setcb_payload_t; | |
// definition for payload type of sending command | |
typedef struct { | |
int32_t cmd; | |
int32_t arg1; | |
int32_t arg2; | |
} qcamera_sm_evt_command_payload_t; | |
// definition for payload type of sending command | |
typedef struct { | |
void *img_ptr; | |
cam_pp_offline_src_config_t *config; | |
} qcamera_sm_evt_reg_face_payload_t; | |
typedef enum { | |
QCAMERA_INTERNAL_EVT_FOCUS_UPDATE, // focus updating result | |
QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE, // prepare snapshot done | |
QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT, // face detection result | |
QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS, // histogram | |
QCAMERA_INTERNAL_EVT_CROP_INFO, // crop info | |
QCAMERA_INTERNAL_EVT_ASD_UPDATE, // asd update result | |
QCAMERA_INTERNAL_EVT_MAX | |
} qcamera_internal_evt_type_t; | |
typedef struct { | |
qcamera_internal_evt_type_t evt_type; | |
union { | |
cam_auto_focus_data_t focus_data; | |
cam_prep_snapshot_state_t prep_snapshot_state; | |
cam_face_detection_data_t faces_data; | |
cam_hist_stats_t stats_data; | |
cam_crop_data_t crop_data; | |
cam_auto_scene_t asd_data; | |
}; | |
} qcamera_sm_internal_evt_payload_t; | |
class QCameraStateMachine | |
{ | |
public: | |
QCameraStateMachine(QCamera2HardwareInterface *ctrl); | |
virtual ~QCameraStateMachine(); | |
int32_t procAPI(qcamera_sm_evt_enum_t evt, void *api_payload); | |
int32_t procEvt(qcamera_sm_evt_enum_t evt, void *evt_payload); | |
bool isPreviewRunning(); // check if preview is running | |
bool isCaptureRunning(); // check if image capture is running | |
bool isNonZSLCaptureRunning(); // check if image capture is running in non ZSL mode | |
private: | |
typedef enum { | |
QCAMERA_SM_STATE_PREVIEW_STOPPED, // preview is stopped | |
QCAMERA_SM_STATE_PREVIEW_READY, // preview started but preview window is not set yet | |
QCAMERA_SM_STATE_PREVIEWING, // previewing | |
QCAMERA_SM_STATE_PREPARE_SNAPSHOT, // prepare snapshot in case aec estimation is | |
// needed for LED flash | |
QCAMERA_SM_STATE_PIC_TAKING, // taking picture (preview stopped) | |
QCAMERA_SM_STATE_RECORDING, // recording (preview running) | |
QCAMERA_SM_STATE_VIDEO_PIC_TAKING, // taking live snapshot during recording (preview running) | |
QCAMERA_SM_STATE_PREVIEW_PIC_TAKING // taking ZSL/live snapshot (recording stopped but preview running) | |
} qcamera_state_enum_t; | |
typedef enum | |
{ | |
QCAMERA_SM_CMD_TYPE_API, // cmd from API | |
QCAMERA_SM_CMD_TYPE_EVT, // cmd from mm-camera-interface/mm-jpeg-interface event | |
QCAMERA_SM_CMD_TYPE_EXIT, // cmd for exiting statemachine cmdThread | |
QCAMERA_SM_CMD_TYPE_MAX | |
} qcamera_sm_cmd_type_t; | |
typedef struct { | |
qcamera_sm_cmd_type_t cmd; // cmd type (where it comes from) | |
qcamera_sm_evt_enum_t evt; // event type | |
void *evt_payload; // ptr to payload | |
} qcamera_sm_cmd_t; | |
int32_t stateMachine(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtPreviewingState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtPicTakingState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtRecordingState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt, void *payload); | |
int32_t procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt, void *payload); | |
// main statemachine process routine | |
static void *smEvtProcRoutine(void *data); | |
QCamera2HardwareInterface *m_parent; // ptr to HWI | |
qcamera_state_enum_t m_state; // statemachine state | |
QCameraQueue api_queue; // cmd queue for APIs | |
QCameraQueue evt_queue; // cmd queue for evt from mm-camera-intf/mm-jpeg-intf | |
pthread_t cmd_pid; // cmd thread ID | |
cam_semaphore_t cmd_sem; // semaphore for cmd thread | |
}; | |
}; // namespace qcamera | |
#endif /* __QCAMERA_STATEMACHINE_H__ */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment