/* 
 | 
 *  Copyright (c) 2019 Rockchip Corporation 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 * 
 | 
 */ 
 | 
  
 | 
#ifndef RK_AIQ_USER_API2_SYSCTL_H 
 | 
#define RK_AIQ_USER_API2_SYSCTL_H 
 | 
  
 | 
#include "rk_aiq.h" 
 | 
#include "rk_aiq_algo_des.h" 
 | 
#include "rk_aiq_user_api_sysctl.h" 
 | 
  
 | 
RKAIQ_BEGIN_DECLARE 
 | 
  
 | 
/********************below are verified api********************/ 
 | 
  
 | 
/*! 
 | 
 * \brief pre-settings before init 
 | 
 * 
 | 
 * \param[in] sns_ent_name    active sensor media entity name. This represents the unique camera module 
 | 
 *                            in system. And the whole active pipeline could be retrieved by this. 
 | 
 * \param[in] mode            pipleline working mode, just used by \ref 
 | 
 *                            rk_aiq_uapi_sysctl_init to select iq file 
 | 
 *                            according to hdr mode. Unused if params \ref 
 | 
 *                            iq_file is specified. 
 | 
 * \param[in] force_iq_file   optional, forcely used this iq file. Must be xml. 
 | 
 *                            Such as -> force_iq_file = "ov5695_TongJu_CHT842-MD.xml"; 
 | 
 *                            Meanwhile, there must has "ov5695_TongJu_CHT842-MD.json" in the same path with xml. 
 | 
 * \note Optional API, should be called before\ref rk_aiq_uapi_sysctl_init. This 
 | 
 *       API extends the functionality of \ref rk_aiq_uapi_sysctl_init. And just 
 | 
 *       used to help select the satisfied iq file when multiple iq files 
 | 
 *       exsist. 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_preInit(const char* sns_ent_name, 
 | 
                           rk_aiq_working_mode_t mode, 
 | 
                           const char* force_iq_file); 
 | 
  
 | 
/*! 
 | 
 * \brief initialze aiq control system context 
 | 
 * Should call before any other APIs 
 | 
 * 
 | 
 * \param[in] sns_ent_name    active sensor media entity name. This represents the unique camera module\n 
 | 
 *                            in system. And the whole active pipeline could be retrieved by this. 
 | 
 * \param[in] iq_file_dir     define the search directory of the iq files. 
 | 
 * \param[in] err_cb          not mandatory. it's used to return system errors to user. 
 | 
 * \param[in] metas_cb        not mandatory. it's used to return the metas(sensor exposure settings,\n 
 | 
 *                            isp settings, etc.) for each frame 
 | 
 * \return return system context if success, or NULL if failure. 
 | 
 */ 
 | 
rk_aiq_sys_ctx_t* 
 | 
rk_aiq_uapi2_sysctl_init(const char* sns_ent_name, 
 | 
                        const char* iq_file_dir, 
 | 
                        rk_aiq_error_cb err_cb, 
 | 
                        rk_aiq_metas_cb metas_cb); 
 | 
  
 | 
/*! 
 | 
 * \brief deinitialze aiq context 
 | 
 * Should not be called in started state 
 | 
 * 
 | 
 * \param[in] ctx             the context returned by \ref rk_aiq_uapi2_sysctl_init 
 | 
 */ 
 | 
void 
 | 
rk_aiq_uapi2_sysctl_deinit( rk_aiq_sys_ctx_t* ctx); 
 | 
  
 | 
/*! 
 | 
 * \brief prepare aiq control system before runninig 
 | 
 * prepare AIQ running enviroment, should be called before \ref rk_aiq_uapi2_sysctl_start.\n 
 | 
 * And if re-prepared is required after \ref rk_aiq_uapi2_sysctl_start is called,\n 
 | 
 * should call \ref rk_aiq_uapi2_sysctl_stop firstly. 
 | 
 * 
 | 
 * \param[in] ctx             the context returned by \ref rk_aiq_uapi2_sysctl_init 
 | 
 * \param[in] width           sensor active output width, just used to check internally 
 | 
 * \param[in] height          sensor active output height, just used to check internally 
 | 
 * \param[in] mode            pipleline working mode 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_prepare(const rk_aiq_sys_ctx_t* ctx, 
 | 
                           uint32_t  width, uint32_t  height, 
 | 
                           rk_aiq_working_mode_t mode); 
 | 
  
 | 
/*! 
 | 
 * \brief start aiq control system 
 | 
 * should be called after \ref rk_aiq_uapi2_sysctl_prepare. After this call, 
 | 
 * the aiq system repeats getting 3A statistics from ISP driver, running 
 | 
 * aiq algorimths(AE, AWB, AF, etc.), setting new parameters to drivers. 
 | 
 * 
 | 
 * \param[in] ctx             the context returned by \ref rk_aiq_uapi2_sysctl_init 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_start(const rk_aiq_sys_ctx_t* ctx); 
 | 
  
 | 
/*! 
 | 
 * \brief stop aiq control system 
 | 
 * 
 | 
 * \param[in] ctx             the context returned by \ref rk_aiq_uapi2_sysctl_init 
 | 
 * \param[in] keep_ext_hw_st  do not change external devices status, like ircut/cpsl 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_stop(const rk_aiq_sys_ctx_t* ctx, bool keep_ext_hw_st); 
 | 
  
 | 
/*! 
 | 
 * \brief get aiq version infos 
 | 
 * 
 | 
 * \param[in,out] vers         version infos 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
void rk_aiq_uapi2_get_version_info(rk_aiq_ver_info_t* vers); 
 | 
  
 | 
/*! 
 | 
 * \brief apply an new iq file when stream on 
 | 
 * 
 | 
 * \param[in] iqfile       iqfile which will be applied 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_updateIq(rk_aiq_sys_ctx_t* sys_ctx, char* iqfile); 
 | 
  
 | 
  
 | 
int32_t 
 | 
rk_aiq_uapi2_sysctl_getModuleCtl(const rk_aiq_sys_ctx_t* ctx, 
 | 
                                rk_aiq_module_id_t mId, bool *mod_en); 
 | 
  
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_setModuleCtl(const rk_aiq_sys_ctx_t* ctx, rk_aiq_module_id_t mId, bool mod_en); 
 | 
  
 | 
  
 | 
/*! 
 | 
 * \brief get algo lib enabled status 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[in] algo_type       algo type defined by RkAiqAlgoDesComm.type 
 | 
 * \param[in] lib_id          0 for system integrated algos;\n 
 | 
 *                            returned by call \ref rk_aiq_uapi2_sysctl_regLib for customer algos 
 | 
 * \return                    return true if enabled , false if disabled or unregistered 
 | 
 */ 
 | 
bool 
 | 
rk_aiq_uapi2_sysctl_getAxlibStatus(const rk_aiq_sys_ctx_t* ctx, 
 | 
                                  const int algo_type, 
 | 
                                  const int lib_id); 
 | 
  
 | 
/*! 
 | 
 * \brief enable or disable algo lib 
 | 
 * If the \ref lib_id is the same as the current running algo, this interface 
 | 
 * could be called in any state except for the context uninitialized. Otherwise, 
 | 
 * it could only be called in prepared or initialized state followed by 
 | 
 * call \ref rk_aiq_uapi2_sysctl_prepare , and in this case, the old algo which type 
 | 
 * is \ref algo_type will be replaced by the new algo \ref lib_id. 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[in] algo_type       algo type defined by RkAiqAlgoDesComm.type 
 | 
 * \param[in] lib_id          0 for system integrated algos;\n 
 | 
 *                            returned by call \ref rk_aiq_uapi2_sysctl_regLib for customer algos 
 | 
 * \param[in] enable          enable or disable algos. enable means running the algo's processes\n 
 | 
 *                            defined in \ref RkAiqAlgoDesComm; disable means\n 
 | 
 *                            bypass the algo's prcosses. 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_enableAxlib(const rk_aiq_sys_ctx_t* ctx, 
 | 
                               const int algo_type, 
 | 
                               const int lib_id, 
 | 
                               bool enable); 
 | 
  
 | 
/*! 
 | 
 * \brief get enabled algo lib context 
 | 
 * The returned algo context will be used as the first param of algo private APIs. 
 | 
 * For those customer's algo lib, this interface should be called after 
 | 
 * \ref rk_aiq_uapi_sysctl_enableAxlib, or will return NULL. 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[in] algo_type       algo type defined by RkAiqAlgoDesComm.type 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
const RkAiqAlgoContext* 
 | 
rk_aiq_uapi2_sysctl_getEnabledAxlibCtx(const rk_aiq_sys_ctx_t* ctx, const int algo_type); 
 | 
  
 | 
/********************below api continue to use api of CamHwIsp20********************/ 
 | 
  
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_getStaticMetas(const char* sns_ent_name, rk_aiq_static_info_t* static_info); 
 | 
  
 | 
/*! 
 | 
 * \brief enum static camera infos 
 | 
 * 
 | 
 * \param[in] index           which camera info will be enum 
 | 
 * \param[out] static_info    returned camera infos 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_enumStaticMetas(int index, rk_aiq_static_info_t* static_info); 
 | 
  
 | 
/*! 
 | 
 * \brief get sensor entity name from video node 
 | 
 * \param[in] vd             pp stream video node full path 
 | 
 * \return return the binded sensor name 
 | 
 */ 
 | 
const char* 
 | 
rk_aiq_uapi2_sysctl_getBindedSnsEntNmByVd(const char* vd); 
 | 
  
 | 
/*! 
 | 
 * \brief get crop window of isp input 
 | 
 * 
 | 
 * \param[in] rect       get cams crop prop 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_getCrop(const rk_aiq_sys_ctx_t* sys_ctx, rk_aiq_rect_t *rect); 
 | 
  
 | 
  
 | 
/*! 
 | 
 * \brief set compensation light config 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[out] cfg            cpsl configs 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_setCpsLtCfg(const rk_aiq_sys_ctx_t* ctx, 
 | 
                               rk_aiq_cpsl_cfg_t* cfg); 
 | 
/*! 
 | 
 * \brief get compensation light info 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[out] info           current cpsl settings 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_getCpsLtInfo(const rk_aiq_sys_ctx_t* ctx, 
 | 
                                rk_aiq_cpsl_info_t* info); 
 | 
/*! 
 | 
 * \brief query compensation light capability 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[out] cap            cpsl cap info 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_queryCpsLtCap(const rk_aiq_sys_ctx_t* ctx, 
 | 
                                 rk_aiq_cpsl_cap_t* cap); 
 | 
  
 | 
/*! 
 | 
 * \brief set the bypass stream rotation 
 | 
 * 
 | 
 * \param[in] ctx             context 
 | 
 * \param[in] rot             rotation val 
 | 
 * \return return 0 if success 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_setSharpFbcRotation(const rk_aiq_sys_ctx_t* ctx, rk_aiq_rotation_t rot); 
 | 
  
 | 
/*! 
 | 
 * \brief set multiple cameras working concurrently 
 | 
 * Notify this AIQ ctx will run with other sensor's AIQ ctx. 
 | 
  
 | 
 * \param[in] cc        set cams concurrently used or not 
 | 
 * \note should be called before rk_aiq_uapi_sysctl_start 
 | 
 */ 
 | 
void 
 | 
rk_aiq_uapi2_sysctl_setMulCamConc(const rk_aiq_sys_ctx_t* ctx, bool cc); 
 | 
  
 | 
/*! 
 | 
 * \brief register mems sensor handler interface 
 | 
 * 
 | 
 * \param[in] intf          mems sensor interfaces 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_regMemsSensorIntf(const rk_aiq_sys_ctx_t* sys_ctx, 
 | 
                                     const rk_aiq_mems_sensor_intf_t* intf); 
 | 
  
 | 
/** 
 | 
 * @brief switch calibDB for different scene 
 | 
 * 
 | 
 * @param sys_ctx 
 | 
 * @param main_scene  main scene name 
 | 
 * @param sub_scene   sub scenen name 
 | 
 * 
 | 
 * @return 0 if no error 
 | 
 */ 
 | 
int 
 | 
rk_aiq_uapi2_sysctl_switch_scene(const rk_aiq_sys_ctx_t* sys_ctx, 
 | 
                                    const char* main_scene, 
 | 
                                    const char* sub_scene); 
 | 
  
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_tuning(const rk_aiq_sys_ctx_t* sys_ctx, char* param); 
 | 
  
 | 
char* rk_aiq_uapi2_sysctl_readiq(const rk_aiq_sys_ctx_t* sys_ctx, char* param); 
 | 
  
 | 
/*problem api*/ 
 | 
#if 0 
 | 
//HDR mode may not work; 
 | 
XCamReturn rk_aiq_uapi_sysctl_swWorkingModeDyn(const rk_aiq_sys_ctx_t* ctx, rk_aiq_working_mode_t mode); 
 | 
  
 | 
//rk_aiq_uapi2_sysctl_setCrop() is not ready yet in hdr mode; 
 | 
/*! 
 | 
 * \brief set crop window of isp input 
 | 
 * This API will affect the isp pipeline resolution. 
 | 
 * 
 | 
 * \param[in] rect      set cams crop prop 
 | 
 * \note Optinal API, should be called before rk_aiq_uapi2_sysctl_prepare 
 | 
 */ 
 | 
XCamReturn 
 | 
rk_aiq_uapi2_sysctl_setCrop(const rk_aiq_sys_ctx_t* sys_ctx, rk_aiq_rect_t rect); 
 | 
#endif 
 | 
  
 | 
/*api wait to be verified*/ 
 | 
#if 0 
 | 
XCamReturn rk_aiq_uapi_sysctl_enqueueRkRawFile(const rk_aiq_sys_ctx_t* ctx, const char *path); 
 | 
XCamReturn rk_aiq_uapi_sysctl_prepareRkRaw(const rk_aiq_sys_ctx_t* ctx, rk_aiq_raw_prop_t prop); 
 | 
XCamReturn rk_aiq_uapi_sysctl_enqueueRkRawBuf(const rk_aiq_sys_ctx_t* ctx, void *rawdata, bool sync); 
 | 
XCamReturn rk_aiq_uapi_sysctl_registRkRawCb(const rk_aiq_sys_ctx_t* ctx, void (*callback)(void*)); 
 | 
XCamReturn rk_aiq_uapi_sysctl_regLib(const rk_aiq_sys_ctx_t* ctx, RkAiqAlgoDesComm* algo_lib_des); 
 | 
XCamReturn rk_aiq_uapi_sysctl_unRegLib(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id); 
 | 
#endif 
 | 
  
 | 
  
 | 
#if 0 
 | 
XCamReturn 
 | 
rk_aiq_uapi_sysctl_get3AStats(const rk_aiq_sys_ctx_t* ctx, 
 | 
                              rk_aiq_isp_stats_t *stats); 
 | 
  
 | 
XCamReturn 
 | 
rk_aiq_uapi_sysctl_get3AStatsBlk(const rk_aiq_sys_ctx_t* ctx, 
 | 
                              rk_aiq_isp_stats_t **stats, int timeout_ms); 
 | 
  
 | 
void 
 | 
rk_aiq_uapi_sysctl_release3AStatsRef(const rk_aiq_sys_ctx_t* ctx, 
 | 
                                     rk_aiq_isp_stats_t *stats); 
 | 
  
 | 
#endif 
 | 
  
 | 
RKAIQ_END_DECLARE 
 | 
  
 | 
#endif 
 |