/*
|
* 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 "stdlib.h"
|
#include "string.h"
|
#include "uAPI/rk_aiq_user_api_sysctl.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 "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_adrc_SetAttrib, drcAttr_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(drcAttr_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_api_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,
|
rk_aiq_tool_api_amerge_SetAttrib2,
|
rk_aiq_user_api2_amerge_GetAttrib2),
|
__RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/drc", drcAttr_t,
|
rk_aiq_tool_api_adrc_SetAttrib,
|
rk_aiq_user_api2_adrc_GetAttrib),
|
__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),
|
};
|
/***********************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_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 = "/";
|
char *cmd_path = NULL;
|
cJSON *cmd_js = NULL;
|
cJSON *ret_js = NULL;
|
cJSON *arr_item = NULL;
|
int list_len = -1;
|
int change_sum = -1;
|
int i = 0;
|
*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 (strdup(cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring)) {
|
cmd_path_str = std::string(
|
cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring);
|
auto pos = cmd_path_str.find_first_not_of("/");
|
pos = cmd_path_str.find_first_of("/", pos);
|
pos = cmd_path_str.find_first_not_of("/", pos);
|
pos = cmd_path_str.find_first_of("/", pos);
|
pos = cmd_path_str.find_first_not_of("/", pos);
|
pos = cmd_path_str.find_first_of("/", pos);
|
pos = cmd_path_str.find_first_not_of("/", pos);
|
pos = cmd_path_str.find_first_of("/", pos);
|
auto final_cmd_path_str = cmd_path_str.substr(0, pos);
|
|
printf("[UAPI RPC]final cmd path str:\n%s\n",
|
final_cmd_path_str.c_str());
|
|
cmd_path = strdup(final_cmd_path_str.c_str());
|
|
auto path_str = std::string(
|
cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring);
|
final_path = "/";
|
// remove /uapi/xxx/
|
if (pos < cmd_path_str.size()) {
|
final_path = cmd_path_str.substr(pos);
|
}
|
cJSON_ReplaceItemInObject(arr_item, JSON_PATCH_PATH,
|
cJSON_CreateString(final_path.c_str()));
|
}
|
}
|
arr_item = arr_item->next;
|
}
|
|
for (i = 0; i < list_len; i++) {
|
RkAiqUapiDesc_t *temp_uapi_desc = &rkaiq_uapidesc_list[i];
|
if (strstr(temp_uapi_desc->arg_path, cmd_path)) {
|
uapi_desc = temp_uapi_desc;
|
break;
|
}
|
}
|
|
if (!uapi_desc) {
|
XCAM_LOG_ERROR("can't find uapi for %s\n", cmd_path);
|
return -1;
|
}
|
|
printf("[UAPI RPC] final json cmd:\n%s\n", cJSON_Print(cmd_js));
|
|
uapi_desc->uapi_caller(uapi_desc, sys_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;
|
}
|