/* * Copyright (c) 2021 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. * */ #include "uAPI2/rk_aiq_user_api2_helper.h" #include "RkAiqCalibDbV2.h" #include "RkAiqUapitypes.h" #include "cJSON.h" #include "cJSON_Utils.h" #include "j2s.h" #include "rk_aiq_user_api_sysctl.h" #include "stdlib.h" #include "string.h" #include "uAPI2/rk_aiq_user_api2_ae.h" #include "uAPI2/rk_aiq_user_api2_imgproc.h" #include "uAPI2/rk_aiq_user_api2_wrapper.h" #include "uAPI2/rk_aiq_user_api2_agic.h" #include "rk_aiq_tool_api.h" // json cmd example { // "op":"replace", // "path":"/uapi/0/system/crop" // "value":"{ // "x":0, // "y":0, // "w":1280, // "h":720 // }" // } // // json cmd example { // "op":"replace", // "path":"/uapi/0/ae_uapi/opmode" // "value":"{ // 1 // }" // } // /*****************Add UAPI wrapper here if necessary*****************/ __RKAIQUAPI_SET_WRAPPER(rk_aiq_tool_api_ae_setExpSwAttr, Uapi_ExpSwAttrV2_t); __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_aie_SetAttrib, aie_attrib_t); __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_acp_SetAttrib, acp_attrib_t); /********************** Add Attr caller here ************************/ __RKAIQUAPI_CALLER(uapi_expsw_attr_t); __RKAIQUAPI_CALLER(uapi_expinfo_t); __RKAIQUAPI_CALLER(aiq_scene_t); __RKAIQUAPI_CALLER(work_mode_t); __RKAIQUAPI_CALLER(uapi_wb_gain_t); __RKAIQUAPI_CALLER(uapi_wb_mode_t); __RKAIQUAPI_CALLER(uapiMergeCurrCtlData_t); __RKAIQUAPI_CALLER(mMergeAttrV30_t); __RKAIQUAPI_CALLER(DrcInfo_t); __RKAIQUAPI_CALLER(mdrcAttr_V30_t); __RKAIQUAPI_CALLER(mDehazeAttr_t); __RKAIQUAPI_CALLER(uapi_ae_hwstats_t); __RKAIQUAPI_CALLER(rk_tool_awb_stat_res2_v30_t); __RKAIQUAPI_CALLER(rk_tool_awb_stat_res_full_t); __RKAIQUAPI_CALLER(rk_tool_awb_strategy_result_t); __RKAIQUAPI_CALLER(Adpcc_Manual_Attr_t); __RKAIQUAPI_CALLER(Agamma_api_manualV30_t); __RKAIQUAPI_CALLER(RK_SHARP_Params_V4_Select_t); __RKAIQUAPI_CALLER(RK_Bayer2dnr_Params_V2_Select_t); __RKAIQUAPI_CALLER(RK_Bayertnr_Params_V2_Select_t); __RKAIQUAPI_CALLER(RK_YNR_Params_V3_Select_t); __RKAIQUAPI_CALLER(RK_CNR_Params_V2_Select_t); __RKAIQUAPI_CALLER(RK_GAIN_Select_V2_t); __RKAIQUAPI_CALLER(AblcSelect_t); __RKAIQUAPI_CALLER(rk_aiq_ccm_mccm_attrib_t); __RKAIQUAPI_CALLER(rk_aiq_lut3d_attrib_t); __RKAIQUAPI_CALLER(Csm_Param_t); __RKAIQUAPI_CALLER(rkaiq_gic_v2_api_attr_t); __RKAIQUAPI_CALLER(aie_attrib_t); __RKAIQUAPI_CALLER(acp_attrib_t); __RKAIQUAPI_CALLER(rk_aiq_lsc_table_t); __RKAIQUAPI_CALLER(camgroup_uapi_t); __RKAIQUAPI_CALLER(adebayer_attrib_t); RkAiqUapiDesc_t rkaiq_uapidesc_list[] = { __RKAIQUAPI_DESC_DEF("/uapi/0/ae_uapi/expsw_attr", uapi_expsw_attr_t, __RKAIQUAPI_SET_WRAPPER_NAME(rk_aiq_tool_api_ae_setExpSwAttr), rk_aiq_user_api2_ae_getExpSwAttr), __RKAIQUAPI_DESC_DEF("/uapi/0/ae_uapi/expinfo", uapi_expinfo_t, NULL, rk_aiq_user_api2_ae_queryExpResInfo), __RKAIQUAPI_DESC_DEF("/uapi/0/awb_uapi/wbgain", uapi_wb_gain_t, rk_aiq_tool_api_setMWBGain, rk_aiq_uapi2_getWBGain), __RKAIQUAPI_DESC_DEF("/uapi/0/awb_uapi/mode", uapi_wb_mode_t, rk_aiq_tool_api_setWBMode, rk_aiq_uapi2_getWBMode2), __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/ctldata", uapiMergeCurrCtlData_t, NULL, rk_aiq_user_api2_amerge_GetCtldata), __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV30_t, rk_aiq_set_amerge_manual_attr, rk_aiq_get_amerge_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManualV30", mdrcAttr_V30_t, rk_aiq_set_adrc_manual_attr, rk_aiq_get_adrc_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/info", DrcInfo_t, NULL, rk_aiq_user_api2_adrc_queryinfo), __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/stManual", mDehazeAttr_t, rk_aiq_set_adehaze_manual_attr, rk_aiq_get_adehaze_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/system/work_mode", work_mode_t, rk_aiq_tool_api_sysctl_swWorkingModeDyn, rk_aiq_uapi_sysctl_getWorkingModeDyn), __RKAIQUAPI_DESC_DEF("/uapi/0/system/scene", aiq_scene_t, rk_aiq_tool_api_set_scene, rk_aiq_user_api2_get_scene), __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/ae_hwstats", uapi_ae_hwstats_t, NULL, rk_aiq_uapi_get_ae_hwstats), __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_tool_awb_stat_res2_v30_t, NULL, rk_aiq_uapi_get_awb_stat), __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat_algo", rk_tool_awb_stat_res_full_t, NULL, rk_aiq_user_api2_awbV30_getAlgoSta), __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_strategy_result", rk_tool_awb_strategy_result_t, NULL, rk_aiq_user_api2_awbV30_getStrategyResult), __RKAIQUAPI_DESC_DEF("/uapi/0/adpcc_manual", Adpcc_Manual_Attr_t, rk_aiq_set_adpcc_manual_attr, rk_aiq_get_adpcc_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/agamma_uapi/stManual", Agamma_api_manualV30_t, rk_aiq_set_agamma_manual_attr, rk_aiq_get_agamma_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/asharp_v4_uapi/manual", RK_SHARP_Params_V4_Select_t, rk_aiq_set_asharp_manual_attr, rk_aiq_get_asharp_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/abayer2dnr_v2_uapi/manual", RK_Bayer2dnr_Params_V2_Select_t, rk_aiq_set_abayer2dnr_manual_attr, rk_aiq_get_abayer2dnr_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/abayertnr_v2_uapi/manual", RK_Bayertnr_Params_V2_Select_t, rk_aiq_set_abayertnr_manual_attr, rk_aiq_get_abayertnr_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/aynr_v3_uapi/manual", RK_YNR_Params_V3_Select_t, rk_aiq_set_aynr_manual_attr, rk_aiq_get_aynr_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/acnr_v2_uapi/manual", RK_CNR_Params_V2_Select_t, rk_aiq_set_acnr_manual_attr, rk_aiq_get_acnr_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/again_v2_uapi/manual", RK_GAIN_Select_V2_t, rk_aiq_set_again_manual_attr, rk_aiq_get_again_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/ablc_v30_uapi/bls0", AblcSelect_t, rk_aiq_set_ablc0_manual_attr, rk_aiq_get_ablc0_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/ablc_v30_uapi/bls1", AblcSelect_t, rk_aiq_set_ablc1_manual_attr, rk_aiq_get_ablc1_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/manual", rk_aiq_ccm_mccm_attrib_t, rk_aiq_set_accm_manual_attr, rk_aiq_get_accm_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/a3dlut_uapi/manual", rk_aiq_lut3d_attrib_t, rk_aiq_set_a3dlut_manual_attr, rk_aiq_get_a3dlut_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/csm_uapi/param", Csm_Param_t, rk_aiq_set_acsm_manual_attr, rk_aiq_get_acsm_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/agicv2_uapi/attr", rkaiq_gic_v2_api_attr_t, rk_aiq_user_api2_agic_v2_SetAttrib, rk_aiq_user_api2_agic_v2_GetAttrib), __RKAIQUAPI_DESC_DEF("/uapi/0/aie_uapi/attr", aie_attrib_t, __RKAIQUAPI_SET_WRAPPER_NAME( rk_aiq_user_api2_aie_SetAttrib), rk_aiq_user_api2_aie_GetAttrib), __RKAIQUAPI_DESC_DEF("/uapi/0/acp_uapi/attr", acp_attrib_t, __RKAIQUAPI_SET_WRAPPER_NAME( rk_aiq_user_api2_acp_SetAttrib), rk_aiq_user_api2_acp_GetAttrib), __RKAIQUAPI_DESC_DEF("/uapi/0/alsc_uapi/manual", rk_aiq_lsc_table_t, rk_aiq_set_alsc_manual_attr, rk_aiq_get_alsc_manual_attr), __RKAIQUAPI_DESC_DEF("/uapi/0/camgroup_uapi", camgroup_uapi_t, rk_aiq_set_current_camindex, rk_aiq_get_current_camindex), __RKAIQUAPI_DESC_DEF("/uapi/0/adebayer_uapi/adebayer_attr", adebayer_attrib_t, rk_aiq_set_adebayer_attr, rk_aiq_get_adebayer_attr), }; /***********************END OF CUSTOM AREA**************************/ char *rkaiq_uapi_rpc_response(const char *cmd_path, cJSON *root_js, const char *sub_node) { char *ret_str = NULL; cJSON *ret_json = NULL; cJSON *node_json = NULL; ret_json = cJSON_CreateArray(); if (!root_js || !sub_node) { XCAM_LOG_ERROR("invalid json argument for sysctl!"); return NULL; } if (0 == strcmp(sub_node, "/")) { node_json = root_js; } else { node_json = cJSONUtils_GetPointer(root_js, sub_node); if (node_json) cJSON_DetachItemViaPointer(root_js, node_json); } if (root_js) { cJSON *ret_item = cJSON_CreateObject(); cJSON_AddStringToObject(ret_item, JSON_PATCH_PATH, cmd_path); cJSON_AddItemToObject(ret_item, JSON_PATCH_VALUE, node_json); cJSON_AddItemToArray(ret_json, ret_item); } ret_str = cJSON_PrintUnformatted(ret_json); if (ret_json) cJSON_free(ret_json); if (node_json && node_json != root_js) cJSON_free(node_json); return ret_str; } int rkaiq_uapi_best_match(const char *cmd_path_str) { int i = 0; int list_len = -1; int beset_match = -1; int max_length = -1; list_len = sizeof(rkaiq_uapidesc_list) / sizeof(RkAiqUapiDesc_t); if (list_len <= 0) { return -1; } // Find most match uapi for (i = 0; i < list_len; i++) { RkAiqUapiDesc_t *temp_uapi_desc = &rkaiq_uapidesc_list[i]; if (strstr(cmd_path_str, temp_uapi_desc->arg_path)) { int path_length = std::string(temp_uapi_desc->arg_path).length(); if (path_length < max_length) { continue; } max_length = path_length; beset_match = i; } } return beset_match; } int rkaiq_uapi_unified_ctl(rk_aiq_sys_ctx_t *sys_ctx, const char *js_str, char **ret_str, int op_mode) { RkAiqUapiDesc_t *uapi_desc = NULL; std::string cmd_path_str; std::string final_path = "/"; cJSON *cmd_js = NULL; cJSON *ret_js = NULL; cJSON *arr_item = NULL; int list_len = -1; int change_sum = -1; int max_length = -1; int i = 0; rk_aiq_sys_ctx_t* msys_ctx = NULL; *ret_str = NULL; list_len = sizeof(rkaiq_uapidesc_list) / sizeof(RkAiqUapiDesc_t); if (list_len <= 0) { return -1; } cmd_js = cJSON_Parse(js_str); change_sum = cJSON_GetArraySize(cmd_js); if (change_sum <= 0) { XCAM_LOG_ERROR("can't find json patch operation\n"); return -1; } arr_item = cmd_js->child; for (int i = 0; i <= (change_sum - 1); ++i) { if (arr_item) { if (cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring) { cmd_path_str = std::string( cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring); int desc_i = rkaiq_uapi_best_match(cmd_path_str.c_str()); if (desc_i >= 0) { uapi_desc = &rkaiq_uapidesc_list[desc_i]; if (0 == std::string(uapi_desc->arg_path).compare(cmd_path_str)) { final_path = "/"; } else { final_path = cmd_path_str.substr(std::string(uapi_desc->arg_path).length()); } cJSON_ReplaceItemInObject(arr_item, JSON_PATCH_PATH, cJSON_CreateString(final_path.c_str())); } } } arr_item = arr_item->next; } if (!uapi_desc) { XCAM_LOG_ERROR("can't find uapi for %s\n", cmd_path_str.c_str()); return -1; } msys_ctx = rk_aiq_get_last_sysctx(sys_ctx); if (!msys_ctx) { XCAM_LOG_ERROR("can't find valid ctx\n"); return -1; } uapi_desc->uapi_caller(uapi_desc, msys_ctx, cmd_js, (void **)&ret_js, op_mode); if (op_mode == RKAIQUAPI_OPMODE_SET) { *ret_str = NULL; } else if (op_mode == RKAIQUAPI_OPMODE_GET) { if (ret_js) { *ret_str = rkaiq_uapi_rpc_response(cmd_path_str.c_str(), ret_js, final_path.c_str()); cJSON_free(ret_js); } } return 0; }