• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2012-2015, The Linux Foundataion. All rights reserved.
2  *
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 #ifndef __QCAMERA_STATEMACHINE_H__
31 #define __QCAMERA_STATEMACHINE_H__
32 
33 #include <pthread.h>
34 
35 #include <cam_semaphore.h>
36 extern "C" {
37 #include <mm_camera_interface.h>
38 }
39 
40 #include "QCameraQueue.h"
41 #include "QCameraChannel.h"
42 
43 namespace qcamera {
44 
45 class QCamera2HardwareInterface;
46 
47 typedef enum {
48     /*******BEGIN OF: API EVT*********/
49     QCAMERA_SM_EVT_SET_PREVIEW_WINDOW = 1,   // set preview window
50     QCAMERA_SM_EVT_SET_CALLBACKS,            // set callbacks
51     QCAMERA_SM_EVT_ENABLE_MSG_TYPE,          // enable msg type
52     QCAMERA_SM_EVT_DISABLE_MSG_TYPE,         // disable msg type
53     QCAMERA_SM_EVT_MSG_TYPE_ENABLED,         // query certain msg type is enabled
54 
55     QCAMERA_SM_EVT_SET_PARAMS,               // set parameters
56     QCAMERA_SM_EVT_GET_PARAMS,               // get parameters
57     QCAMERA_SM_EVT_PUT_PARAMS,               // put parameters, release param buf
58 
59     QCAMERA_SM_EVT_START_PREVIEW,            // start preview (zsl, camera mode, camcorder mode)
60     QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW,  // start no display preview (zsl, camera mode, camcorder mode)
61     QCAMERA_SM_EVT_STOP_PREVIEW,             // stop preview (zsl, camera mode, camcorder mode)
62     QCAMERA_SM_EVT_PREVIEW_ENABLED,          // query if preview is running
63 
64     QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS,   // request to store meta data in video buffers
65     QCAMERA_SM_EVT_START_RECORDING,          // start recording
66     QCAMERA_SM_EVT_STOP_RECORDING,           // stop recording
67     QCAMERA_SM_EVT_RECORDING_ENABLED,        // query if recording is running
68     QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME,  // release recording frame
69 
70     QCAMERA_SM_EVT_PREPARE_SNAPSHOT,         // prepare snapshot in case LED needs to be flashed
71     QCAMERA_SM_EVT_TAKE_PICTURE,             // take picutre (zsl, regualr capture, live snapshot
72     QCAMERA_SM_EVT_CANCEL_PICTURE,           // cancel picture
73 
74     QCAMERA_SM_EVT_START_AUTO_FOCUS,         // start auto focus
75     QCAMERA_SM_EVT_STOP_AUTO_FOCUS,          // stop auto focus
76     QCAMERA_SM_EVT_SEND_COMMAND,             // send command
77 
78     QCAMERA_SM_EVT_RELEASE,                  // release camera resource
79     QCAMERA_SM_EVT_DUMP,                     // dump
80     QCAMERA_SM_EVT_REG_FACE_IMAGE,           // register a face image in imaging lib
81     /*******END OF: API EVT*********/
82 
83     QCAMERA_SM_EVT_EVT_INTERNAL,             // internal evt notify
84     QCAMERA_SM_EVT_EVT_NOTIFY,               // evt notify from server
85     QCAMERA_SM_EVT_JPEG_EVT_NOTIFY,          // evt notify from jpeg
86     QCAMERA_SM_EVT_SNAPSHOT_DONE,            // internal evt that snapshot is done
87     QCAMERA_SM_EVT_THERMAL_NOTIFY,           // evt notify from thermal daemon
88     QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL,     // stop capture channel
89     QCAMERA_SM_EVT_RESTART_PERVIEW,          // internal preview restart
90     QCAMERA_SM_EVT_MAX
91 } qcamera_sm_evt_enum_t;
92 
93 typedef enum {
94     QCAMERA_API_RESULT_TYPE_DEF,             // default type, no additional info
95     QCAMERA_API_RESULT_TYPE_ENABLE_FLAG,     // msg_enabled, preview_enabled, recording_enabled
96     QCAMERA_API_RESULT_TYPE_PARAMS,          // returned parameters in string
97     QCAMERA_API_RESULT_TYPE_HANDLE,          // returned handle in int
98     QCAMERA_API_RESULT_TYPE_MAX
99 } qcamera_api_result_type_t;
100 
101 typedef struct {
102     int32_t status;                          // api call status
103     qcamera_sm_evt_enum_t request_api;       // api evt requested
104     qcamera_api_result_type_t result_type;   // result type
105     union {
106         int enabled;                          // result_type == QCAMERA_API_RESULT_TYPE_ENABLE_FLAG
107         char *params;                         // result_type == QCAMERA_API_RESULT_TYPE_PARAMS
108         int handle;                           // result_type ==QCAMERA_API_RESULT_TYPE_HANDLE
109     };
110 } qcamera_api_result_t;
111 
112 typedef struct api_result_list {
113    qcamera_api_result_t result;
114    struct api_result_list *next;
115 }api_result_list;
116 
117 // definition for payload type of setting callback
118 typedef struct {
119     camera_notify_callback notify_cb;
120     camera_data_callback data_cb;
121     camera_data_timestamp_callback data_cb_timestamp;
122     camera_request_memory get_memory;
123     void *user;
124 } qcamera_sm_evt_setcb_payload_t;
125 
126 // definition for payload type of sending command
127 typedef struct {
128     int32_t cmd;
129     int32_t arg1;
130     int32_t arg2;
131 } qcamera_sm_evt_command_payload_t;
132 
133 // definition for payload type of sending command
134 typedef struct {
135     void *img_ptr;
136     cam_pp_offline_src_config_t *config;
137 } qcamera_sm_evt_reg_face_payload_t;
138 
139 typedef enum {
140     QCAMERA_INTERNAL_EVT_FOCUS_UPDATE,       // focus updating result
141     QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE, // prepare snapshot done
142     QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT, // face detection result
143     QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS,    // histogram
144     QCAMERA_INTERNAL_EVT_CROP_INFO,          // crop info
145     QCAMERA_INTERNAL_EVT_ASD_UPDATE,         // asd update result
146     QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT, // Ready for Prepare Snapshot
147     QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE, // Led mode override
148     QCAMERA_INTERNAL_EVT_AWB_UPDATE,         // awb update result
149     QCAMERA_INTERNAL_EVT_AE_UPDATE,          // ae update result
150     QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE,   // focus position update result
151     QCAMERA_INTERNAL_EVT_HDR_UPDATE,         // HDR scene update
152     QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK,   // retro burst AEC unlock event
153     QCAMERA_INTERNAL_EVT_ZSL_CAPTURE_DONE,   // ZSL capture done event
154     QCAMERA_INTERNAL_EVT_MAX
155 } qcamera_internal_evt_type_t;
156 
157 typedef struct {
158     qcamera_internal_evt_type_t evt_type;
159     union {
160         cam_auto_focus_data_t focus_data;
161         cam_prep_snapshot_state_t prep_snapshot_state;
162         cam_face_detection_data_t faces_data;
163         cam_hist_stats_t stats_data;
164         cam_crop_data_t crop_data;
165         cam_auto_scene_t asd_data;
166         cam_flash_mode_t led_data;
167         cam_awb_params_t awb_data;
168         cam_3a_params_t ae_data;
169         cam_focus_pos_info_t focus_pos;
170         cam_asd_hdr_scene_data_t hdr_data;
171     };
172 } qcamera_sm_internal_evt_payload_t;
173 
174 class QCameraStateMachine
175 {
176 public:
177     QCameraStateMachine(QCamera2HardwareInterface *ctrl);
178     virtual ~QCameraStateMachine();
179     int32_t procAPI(qcamera_sm_evt_enum_t evt, void *api_payload);
180     int32_t procEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
181 
182     bool isPreviewRunning(); // check if preview is running
183     bool isPreviewReady(); // check if preview is ready
184     bool isCaptureRunning(); // check if image capture is running
185     bool isNonZSLCaptureRunning(); // check if image capture is running in non ZSL mode
186     String8 dump(); //returns the state information in a string
187     bool isPrepSnapStateRunning();
188     bool isRecording();
189     void releaseThread();
190 
191 private:
192     typedef enum {
193         QCAMERA_SM_STATE_PREVIEW_STOPPED,          // preview is stopped
194         QCAMERA_SM_STATE_PREVIEW_READY,            // preview started but preview window is not set yet
195         QCAMERA_SM_STATE_PREVIEWING,               // previewing
196         QCAMERA_SM_STATE_PREPARE_SNAPSHOT,         // prepare snapshot in case aec estimation is
197                                                    // needed for LED flash
198         QCAMERA_SM_STATE_PIC_TAKING,               // taking picture (preview stopped)
199         QCAMERA_SM_STATE_RECORDING,                // recording (preview running)
200         QCAMERA_SM_STATE_VIDEO_PIC_TAKING,         // taking live snapshot during recording (preview running)
201         QCAMERA_SM_STATE_PREVIEW_PIC_TAKING        // taking ZSL/live snapshot (recording stopped but preview running)
202     } qcamera_state_enum_t;
203 
204     typedef enum
205     {
206         QCAMERA_SM_CMD_TYPE_API,                   // cmd from API
207         QCAMERA_SM_CMD_TYPE_EVT,                   // cmd from mm-camera-interface/mm-jpeg-interface event
208         QCAMERA_SM_CMD_TYPE_EXIT,                  // cmd for exiting statemachine cmdThread
209         QCAMERA_SM_CMD_TYPE_MAX
210     } qcamera_sm_cmd_type_t;
211 
212     typedef struct {
213         qcamera_sm_cmd_type_t cmd;                  // cmd type (where it comes from)
214         qcamera_sm_evt_enum_t evt;                  // event type
215         void *evt_payload;                          // ptr to payload
216     } qcamera_sm_cmd_t;
217 
218     int32_t stateMachine(qcamera_sm_evt_enum_t evt, void *payload);
219     int32_t procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt, void *payload);
220     int32_t procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt, void *payload);
221     int32_t procEvtPreviewingState(qcamera_sm_evt_enum_t evt, void *payload);
222     int32_t procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt, void *payload);
223     int32_t procEvtPicTakingState(qcamera_sm_evt_enum_t evt, void *payload);
224     int32_t procEvtRecordingState(qcamera_sm_evt_enum_t evt, void *payload);
225     int32_t procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt, void *payload);
226     int32_t procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt, void *payload);
227 
228     // main statemachine process routine
229     static void *smEvtProcRoutine(void *data);
230 
231     int32_t applyDelayedMsgs();
232 
233     QCamera2HardwareInterface *m_parent;  // ptr to HWI
234     qcamera_state_enum_t m_state;         // statemachine state
235     QCameraQueue api_queue;               // cmd queue for APIs
236     QCameraQueue evt_queue;               // cmd queue for evt from mm-camera-intf/mm-jpeg-intf
237     pthread_t cmd_pid;                    // cmd thread ID
238     cam_semaphore_t cmd_sem;              // semaphore for cmd thread
239     bool m_bDelayPreviewMsgs;             // Delay preview callback enable during ZSL snapshot
240     int32_t m_DelayedMsgs;
241 };
242 
243 }; // namespace qcamera
244 
245 #endif /* __QCAMERA_STATEMACHINE_H__ */
246