1 /*
2 * Copyright (c) 2021 Rockchip Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
18 #include "uAPI2/rk_aiq_user_api2_helper.h"
19 #include "uAPI/rk_aiq_api_private.h"
20 #include "RkAiqCalibDbV2.h"
21 #include "RkAiqUapitypes.h"
22 #include "cJSON.h"
23 #include "cJSON_Utils.h"
24 #include "j2s.h"
25 #include "stdlib.h"
26 #include "string.h"
27 #include "rk_aiq_user_api_sysctl.h"
28 #include "uAPI2/rk_aiq_user_api2_ae.h"
29 #include "uAPI2/rk_aiq_user_api2_imgproc.h"
30 #include "uAPI2/rk_aiq_user_api2_wrapper.h"
31 #include "uAPI2/rk_aiq_user_api2_agic.h"
32 #include "uAPI2/rk_aiq_user_api2_wrapper.h"
33
34 #include "rk_aiq_tool_api.h"
35
36 #if defined(__GNUC__) && !defined(__clang__)
37 #pragma GCC diagnostic push
38 #pragma GCC diagnostic ignored "-Wcast-function-type"
39 #endif
40 // json cmd example {
41 // "op":"replace",
42 // "path":"/uapi/0/system/crop"
43 // "value":"{
44 // "x":0,
45 // "y":0,
46 // "w":1280,
47 // "h":720
48 // }"
49 // }
50 //
51 // json cmd example {
52 // "op":"replace",
53 // "path":"/uapi/0/ae_uapi/opmode"
54 // "value":"{
55 // 1
56 // }"
57 // }
58 //
59
60 /*****************Add UAPI wrapper here if necessary*****************/
61 __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_ae_setExpSwAttr, Uapi_ExpSwAttrV2_t);
62 __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_aie_SetAttrib, aie_attrib_t*);
63 __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_acp_SetAttrib, acp_attrib_t*);
64
65 /********************** Add Attr caller here ************************/
66 __RKAIQUAPI_CALLER(uapi_expsw_attr_t);
67 __RKAIQUAPI_CALLER(uapi_expinfo_t);
68 __RKAIQUAPI_CALLER(aiq_scene_t);
69 __RKAIQUAPI_CALLER(work_mode_t);
70 __RKAIQUAPI_CALLER(uapi_wb_gain_t);
71 __RKAIQUAPI_CALLER(uapi_wb_mode_t);
72 __RKAIQUAPI_CALLER(uapiMergeCurrCtlData_t);
73 #if RKAIQ_HAVE_MERGE_V10
74 __RKAIQUAPI_CALLER(mMergeAttrV10_t);
75 #endif
76 #if RKAIQ_HAVE_MERGE_V11
77 __RKAIQUAPI_CALLER(mMergeAttrV11_t);
78 #endif
79 #if RKAIQ_HAVE_MERGE_V12
80 __RKAIQUAPI_CALLER(mMergeAttrV12_t);
81 #endif
82 #if RKAIQ_HAVE_DRC_V10
83 __RKAIQUAPI_CALLER(DrcInfoV10_t);
84 __RKAIQUAPI_CALLER(mdrcAttr_V10_t);
85 #endif
86 #if RKAIQ_HAVE_DRC_V11
87 __RKAIQUAPI_CALLER(DrcInfoV11_t);
88 __RKAIQUAPI_CALLER(mdrcAttr_V11_t);
89 #endif
90 #if RKAIQ_HAVE_DRC_V12
91 __RKAIQUAPI_CALLER(DrcInfoV12_t);
92 __RKAIQUAPI_CALLER(mdrcAttr_V12_t);
93 #endif
94 #if RKAIQ_HAVE_DRC_V12_LITE
95 __RKAIQUAPI_CALLER(DrcInfoV12Lite_t);
96 __RKAIQUAPI_CALLER(mdrcAttr_v12_lite_t);
97 #endif
98 #if RKAIQ_HAVE_GAMMA_V10
99 __RKAIQUAPI_CALLER(AgammaApiManualV10_t);
100 #endif
101 #if RKAIQ_HAVE_GAMMA_V11
102 __RKAIQUAPI_CALLER(AgammaApiManualV11_t);
103 #endif
104 __RKAIQUAPI_CALLER(mDehazeAttrInfoV11_t);
105 #if RKAIQ_HAVE_DEHAZE_V10
106 #endif
107 #if RKAIQ_HAVE_DEHAZE_V11
108 __RKAIQUAPI_CALLER(mDehazeAttrV11_t);
109 #endif
110 #if RKAIQ_HAVE_DEHAZE_V12
111 __RKAIQUAPI_CALLER(mDehazeAttrV12_t);
112 #endif
113 __RKAIQUAPI_CALLER(uapi_ae_hwstats_t);
114 #if defined(ISP_HW_V21)
115 __RKAIQUAPI_CALLER(rk_aiq_awb_stat_res2_v201_t);
116 #elif defined(ISP_HW_V30)
117 __RKAIQUAPI_CALLER(rk_tool_awb_stat_res2_v30_t);
118 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
119 __RKAIQUAPI_CALLER(rk_tool_isp_awb_stats_v32_t);
120 #endif
121 __RKAIQUAPI_CALLER(rk_tool_awb_stat_res_full_t);
122 __RKAIQUAPI_CALLER(rk_tool_awb_strategy_result_t);
123 __RKAIQUAPI_CALLER(rk_aiq_ccm_querry_info_t);
124 #if defined(ISP_HW_V21) || defined(ISP_HW_V30)
125 __RKAIQUAPI_CALLER(rk_aiq_ccm_mccm_attrib_t);
126 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
127 __RKAIQUAPI_CALLER(rk_aiq_ccm_mccm_attrib_v2_t);
128 #endif
129 __RKAIQUAPI_CALLER(Cgc_Param_t);
130 __RKAIQUAPI_CALLER(Csm_Param_t);
131 __RKAIQUAPI_CALLER(Adpcc_Manual_Attr_t);
132
133 #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE) || defined(ISP_HW_V30)
134 __RKAIQUAPI_CALLER(ablc_uapi_manual_t);
135 __RKAIQUAPI_CALLER(asharp_uapi_manual_t);
136 __RKAIQUAPI_CALLER(abayer2dnr_uapi_manual_t);
137 __RKAIQUAPI_CALLER(abayertnr_uapi_manual_t);
138 __RKAIQUAPI_CALLER(aynr_uapi_manual_t);
139 __RKAIQUAPI_CALLER(acnr_uapi_manual_t);
140 __RKAIQUAPI_CALLER(again_uapi_manual_t);
141 __RKAIQUAPI_CALLER(ablc_uapi_info_t);
142 __RKAIQUAPI_CALLER(abayertnr_uapi_info_t);
143 __RKAIQUAPI_CALLER(abayer2dnr_uapi_info_t);
144 __RKAIQUAPI_CALLER(aynr_uapi_info_t);
145 __RKAIQUAPI_CALLER(acnr_uapi_info_t);
146 __RKAIQUAPI_CALLER(asharp_uapi_info_t);
147 __RKAIQUAPI_CALLER(again_uapi_info_t);
148 #endif
149
150 __RKAIQUAPI_CALLER(rk_aiq_lut3d_mlut3d_attrib_t);
151 __RKAIQUAPI_CALLER(rkaiq_gic_v2_api_attr_t);
152 __RKAIQUAPI_CALLER(aie_attrib_t);
153 __RKAIQUAPI_CALLER(acp_attrib_t);
154 __RKAIQUAPI_CALLER(rk_aiq_lsc_table_t);
155 __RKAIQUAPI_CALLER(camgroup_uapi_t);
156 __RKAIQUAPI_CALLER(adebayer_attrib_t);
157
158 RkAiqUapiDesc_t rkaiq_uapidesc_list[] = {
159 __RKAIQUAPI_DESC_DEF("/uapi/0/ae_uapi/expsw_attr", uapi_expsw_attr_t,
160 __RKAIQUAPI_SET_WRAPPER_NAME(rk_aiq_user_api2_ae_setExpSwAttr),
161 rk_aiq_user_api2_ae_getExpSwAttr),
162 __RKAIQUAPI_DESC_DEF("/uapi/0/ae_uapi/expinfo", uapi_expinfo_t, NULL,
163 rk_aiq_user_api2_ae_queryExpResInfo),
164 __RKAIQUAPI_DESC_DEF("/uapi/0/awb_uapi/wbgain", uapi_wb_gain_t, rk_aiq_uapi2_setMWBGain,
165 rk_aiq_uapi2_getWBGain),
166 __RKAIQUAPI_DESC_DEF("/uapi/0/awb_uapi/mode", uapi_wb_mode_t, rk_aiq_uapi2_setWBMode2,
167 rk_aiq_uapi2_getWBMode2),
168
169 #if RKAIQ_HAVE_MERGE_V10
170 __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/Info", uapiMergeCurrCtlData_t, NULL,
171 rk_aiq_user_api2_amerge_v10_queryinfo),
172 __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV10_t,
173 rk_aiq_set_amerge_v10_manual_attr, rk_aiq_get_amerge_v10_manual_attr),
174 #endif
175 #if RKAIQ_HAVE_MERGE_V11
176 __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/Info", uapiMergeCurrCtlData_t, NULL,
177 rk_aiq_user_api2_amerge_v11_queryinfo),
178 __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV11_t,
179 rk_aiq_set_amerge_v11_manual_attr, rk_aiq_get_amerge_v11_manual_attr),
180 #endif
181 #if RKAIQ_HAVE_MERGE_V12
182 __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/Info", uapiMergeCurrCtlData_t, NULL,
183 rk_aiq_user_api2_amerge_v12_queryinfo),
184 __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV12_t,
185 rk_aiq_set_amerge_v12_manual_attr, rk_aiq_get_amerge_v12_manual_attr),
186 #endif
187 #if RKAIQ_HAVE_DRC_V10
188 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV10_t, NULL,
189 rk_aiq_user_api2_adrc_v10_queryinfo),
190 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_V10_t,
191 rk_aiq_set_adrc_v10_manual_attr, rk_aiq_get_adrc_v10_manual_attr),
192 #endif
193 #if RKAIQ_HAVE_DRC_V11
194 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV11_t, NULL,
195 rk_aiq_user_api2_adrc_v11_queryinfo),
196 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_V11_t,
197 rk_aiq_set_adrc_v11_manual_attr, rk_aiq_get_adrc_v11_manual_attr),
198 #endif
199 #if RKAIQ_HAVE_DRC_V12
200 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV12_t, NULL,
201 rk_aiq_user_api2_adrc_v12_queryinfo),
202 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_V12_t,
203 rk_aiq_set_adrc_v12_manual_attr, rk_aiq_get_adrc_v12_manual_attr),
204 #endif
205 #if RKAIQ_HAVE_DRC_V12_LITE
206 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV12Lite_t, NULL,
207 rk_aiq_user_api2_adrc_v12_lite_queryinfo),
208 __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_v12_lite_t,
209 rk_aiq_set_adrc_v12_lite_manual_attr,
210 rk_aiq_get_adrc_v12_lite_manual_attr),
211 #endif
212 #if RKAIQ_HAVE_GAMMA_V10
213 __RKAIQUAPI_DESC_DEF("/uapi/0/agamma_uapi/stManual", AgammaApiManualV10_t,
214 rk_aiq_set_agamma_v10_manual_attr, rk_aiq_get_agamma_v10_manual_attr),
215 #endif
216 #if RKAIQ_HAVE_GAMMA_V11
217 __RKAIQUAPI_DESC_DEF("/uapi/0/agamma_uapi/stManual", AgammaApiManualV11_t,
218 rk_aiq_set_agamma_v11_manual_attr, rk_aiq_get_agamma_v11_manual_attr),
219 #endif
220 #if RKAIQ_HAVE_DEHAZE_V10
221 #endif
222 #if RKAIQ_HAVE_DEHAZE_V11
223 __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/Info", mDehazeAttrInfoV11_t, NULL,
224 rk_aiq_user_api2_adehaze_v11_queryinfo),
225 __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/stManual", mDehazeAttrV11_t,
226 rk_aiq_set_adehaze_v11_manual_attr, rk_aiq_get_adehaze_v11_manual_attr),
227 #endif
228 #if RKAIQ_HAVE_DEHAZE_V12
229 __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/Info", mDehazeAttrInfoV11_t, NULL,
230 rk_aiq_user_api2_adehaze_v12_queryinfo),
231 __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/stManual", mDehazeAttrV12_t,
232 rk_aiq_set_adehaze_v12_manual_attr, rk_aiq_get_adehaze_v12_manual_attr),
233 #endif
234 __RKAIQUAPI_DESC_DEF("/uapi/0/system/work_mode", work_mode_t,
235 rk_aiq_uapi_sysctl_swWorkingModeDyn2,
236 rk_aiq_uapi_sysctl_getWorkingModeDyn),
237 __RKAIQUAPI_DESC_DEF("/uapi/0/system/scene", aiq_scene_t, rk_aiq_user_api2_set_scene,
238 rk_aiq_user_api2_get_scene),
239 __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/ae_hwstats", uapi_ae_hwstats_t, NULL,
240 rk_aiq_uapi_get_ae_hwstats),
241 #if defined(ISP_HW_V21)
242 __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_aiq_awb_stat_res2_v201_t,
243 NULL, rk_aiq_uapi_get_awbV21_stat),
244 #elif defined(ISP_HW_V30)
245 __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_tool_awb_stat_res2_v30_t,
246 NULL, rk_aiq_uapi_get_awb_stat),
247 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
248 __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_tool_isp_awb_stats_v32_t,
249 NULL, rk_aiq_uapi_get_awbV32_stat),
250 #endif
251 __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat_algo",
252 rk_tool_awb_stat_res_full_t, NULL, rk_aiq_user_api2_awb_getAlgoSta),
253 __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_strategy_result",
254 rk_tool_awb_strategy_result_t, NULL,
255 rk_aiq_user_api2_awb_getStrategyResult),
256 __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/mode", uapi_wb_mode_t, rk_aiq_set_tool_accm_mode,
257 rk_aiq_get_accm_mode),
258 #if defined(ISP_HW_V21) || defined(ISP_HW_V30)
259 __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/Info", rk_aiq_ccm_querry_info_t, NULL,
260 rk_aiq_user_api2_accm_QueryCcmInfo),
261 __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/stManual", rk_aiq_ccm_mccm_attrib_t,
262 rk_aiq_set_accm_v1_manual_attr, rk_aiq_get_accm_v1_manual_attr),
263 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
264 __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/Info", rk_aiq_ccm_querry_info_t, NULL,
265 rk_aiq_user_api2_accm_QueryCcmInfo),
266 __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/stManual", rk_aiq_ccm_mccm_attrib_v2_t,
267 rk_aiq_set_accm_v2_manual_attr, rk_aiq_get_accm_v2_manual_attr),
268 #endif
269 __RKAIQUAPI_DESC_DEF("/uapi/0/acgc_uapi/manual", Cgc_Param_t, rk_aiq_set_acgc_manual_attr,
270 rk_aiq_get_acgc_manual_attr),
271 __RKAIQUAPI_DESC_DEF("/uapi/0/acsm_uapi/manual", Csm_Param_t, rk_aiq_set_acsm_manual_attr,
272 rk_aiq_get_acsm_manual_attr),
273 __RKAIQUAPI_DESC_DEF("/uapi/0/a3dlut_uapi/mode", uapi_wb_mode_t, rk_aiq_set_tool_3dlut_mode,
274 rk_aiq_get_a3dlut_mode),
275 __RKAIQUAPI_DESC_DEF("/uapi/0/a3dlut_uapi/manual", rk_aiq_lut3d_mlut3d_attrib_t,
276 rk_aiq_set_a3dlut_manual_attr, rk_aiq_get_a3dlut_manual_attr),
277
278 #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
279 __RKAIQUAPI_DESC_DEF("/uapi/0/ablc_uapi/manual", ablc_uapi_manual_t,
280 rk_aiq_set_ablc_manual_attr, rk_aiq_get_ablc_manual_attr),
281 __RKAIQUAPI_DESC_DEF("/uapi/0/asharp_uapi/manual", asharp_uapi_manual_t,
282 rk_aiq_set_asharp_manual_attr, rk_aiq_get_asharp_manual_attr),
283 __RKAIQUAPI_DESC_DEF("/uapi/0/abayer2dnr_uapi/manual", abayer2dnr_uapi_manual_t,
284 rk_aiq_set_abayer2dnr_manual_attr, rk_aiq_get_abayer2dnr_manual_attr),
285 __RKAIQUAPI_DESC_DEF("/uapi/0/abayertnr_uapi/manual", abayertnr_uapi_manual_t,
286 rk_aiq_set_abayertnr_manual_attr, rk_aiq_get_abayertnr_manual_attr),
287 __RKAIQUAPI_DESC_DEF("/uapi/0/aynr_uapi/manual", aynr_uapi_manual_t,
288 rk_aiq_set_aynr_manual_attr, rk_aiq_get_aynr_manual_attr),
289 __RKAIQUAPI_DESC_DEF("/uapi/0/acnr_uapi/manual", acnr_uapi_manual_t,
290 rk_aiq_set_acnr_manual_attr, rk_aiq_get_acnr_manual_attr),
291 __RKAIQUAPI_DESC_DEF("/uapi/0/again_uapi/manual", again_uapi_manual_t,
292 rk_aiq_set_again_manual_attr, rk_aiq_get_again_manual_attr),
293
294 __RKAIQUAPI_DESC_DEF("/uapi/0/ablc_uapi/info", ablc_uapi_info_t, NULL, rk_aiq_get_ablc_info),
295
296 __RKAIQUAPI_DESC_DEF("/uapi/0/abayertnr_uapi/info", abayertnr_uapi_info_t, NULL,
297 rk_aiq_get_abayertnr_info),
298
299 __RKAIQUAPI_DESC_DEF("/uapi/0/abayer2dnr_uapi/info", abayer2dnr_uapi_info_t, NULL,
300 rk_aiq_get_abayer2dnr_info),
301
302 __RKAIQUAPI_DESC_DEF("/uapi/0/aynr_uapi/info", aynr_uapi_info_t, NULL, rk_aiq_get_aynr_info),
303
304 __RKAIQUAPI_DESC_DEF("/uapi/0/acnr_uapi/info", acnr_uapi_info_t, NULL, rk_aiq_get_acnr_info),
305
306 __RKAIQUAPI_DESC_DEF("/uapi/0/asharp_uapi/info", asharp_uapi_info_t, NULL,
307 rk_aiq_get_asharp_info),
308
309 __RKAIQUAPI_DESC_DEF("/uapi/0/again_uapi/info", again_uapi_info_t, NULL, rk_aiq_get_again_info),
310
311 #endif
312
313 };
314 /***********************END OF CUSTOM AREA**************************/
315
rkaiq_uapi_rpc_response(const char * cmd_path,cJSON * root_js,const char * sub_node)316 char *rkaiq_uapi_rpc_response(const char *cmd_path, cJSON *root_js,
317 const char *sub_node) {
318 char *ret_str = NULL;
319 cJSON *ret_json = NULL;
320 cJSON *node_json = NULL;
321 cJSON *node_json_clone = NULL;
322 ret_json = cJSON_CreateArray();
323
324 if (!root_js || !sub_node) {
325 XCAM_LOG_ERROR("invalid json argument for sysctl!");
326 return NULL;
327 }
328
329 if (0 == strcmp(sub_node, "/")) {
330 node_json = root_js;
331 } else {
332 node_json = cJSONUtils_GetPointer(root_js, sub_node);
333 }
334
335 node_json_clone = cJSON_Duplicate(node_json, 1);
336
337 if (root_js) {
338 cJSON *ret_item = cJSON_CreateObject();
339 cJSON_AddStringToObject(ret_item, JSON_PATCH_PATH, cmd_path);
340 cJSON_AddItemToObject(ret_item, JSON_PATCH_VALUE, node_json_clone);
341 cJSON_AddItemToArray(ret_json, ret_item);
342 }
343
344 ret_str = cJSON_Print(ret_json);
345
346 if (ret_json)
347 cJSON_Delete(ret_json);
348
349 return ret_str;
350 }
351
rkaiq_uapi_best_match(const char * cmd_path_str)352 int rkaiq_uapi_best_match(const char *cmd_path_str) {
353 int i = 0;
354 int list_len = -1;
355 int beset_match = -1;
356 int max_length = -1;
357
358 list_len = sizeof(rkaiq_uapidesc_list) / sizeof(RkAiqUapiDesc_t);
359 if (list_len <= 0) {
360 return -1;
361 }
362
363 // Find most match uapi
364 for (i = 0; i < list_len; i++) {
365 RkAiqUapiDesc_t *temp_uapi_desc = &rkaiq_uapidesc_list[i];
366 if (strstr(cmd_path_str, temp_uapi_desc->arg_path)) {
367 int path_length = std::string(temp_uapi_desc->arg_path).length();
368 if (path_length < max_length) {
369 continue;
370 }
371 max_length = path_length;
372 beset_match = i;
373 }
374 }
375
376 return beset_match;
377 }
378
rkaiq_uapi_unified_ctl(rk_aiq_sys_ctx_t * sys_ctx,const char * js_str,char ** ret_str,int op_mode)379 int rkaiq_uapi_unified_ctl(rk_aiq_sys_ctx_t *sys_ctx, const char *js_str,
380 char **ret_str, int op_mode) {
381 RkAiqUapiDesc_t *uapi_desc = NULL;
382 std::string cmd_path_str;
383 std::string final_path = "/";
384 cJSON *cmd_js = NULL;
385 cJSON *ret_js = NULL;
386 cJSON *arr_item = NULL;
387 int list_len = -1;
388 int change_sum = -1;
389 int max_length = -1;
390 int i = 0;
391 rk_aiq_sys_ctx_t* msys_ctx = NULL;
392 *ret_str = NULL;
393
394 list_len = sizeof(rkaiq_uapidesc_list) / sizeof(RkAiqUapiDesc_t);
395 if (list_len <= 0) {
396 return -1;
397 }
398
399 cmd_js = cJSON_Parse(js_str);
400 change_sum = cJSON_GetArraySize(cmd_js);
401
402 if (change_sum <= 0) {
403 XCAM_LOG_ERROR("can't find json patch operation\n");
404 return -1;
405 }
406
407 arr_item = cmd_js->child;
408
409 for (int i = 0; i <= (change_sum - 1); ++i) {
410 if (arr_item) {
411 if (cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring) {
412 cmd_path_str = std::string(
413 cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring);
414 int desc_i = rkaiq_uapi_best_match(cmd_path_str.c_str());
415 if (desc_i >= 0) {
416 uapi_desc = &rkaiq_uapidesc_list[desc_i];
417 if (0 == std::string(uapi_desc->arg_path).compare(cmd_path_str)) {
418 final_path = "/";
419 } else {
420 final_path = cmd_path_str.substr(
421 std::string(uapi_desc->arg_path).length());
422 }
423 cJSON_ReplaceItemInObject(arr_item, JSON_PATCH_PATH,
424 cJSON_CreateString(final_path.c_str()));
425 }
426 }
427 }
428 arr_item = arr_item->next;
429 }
430
431 if (!uapi_desc) {
432 XCAM_LOG_ERROR("can't find uapi for %s\n", cmd_path_str.c_str());
433 return -1;
434 }
435
436 #if RKAIQ_ENABLE_CAMGROUP
437 msys_ctx = rk_aiq_get_last_sysctx(sys_ctx);
438 if (!msys_ctx) {
439 XCAM_LOG_ERROR("can't find valid ctx\n");
440 return -1;
441 }
442 #else
443 msys_ctx = sys_ctx;
444 #endif
445
446 uapi_desc->uapi_caller(uapi_desc, msys_ctx, cmd_js,
447 (void **)&ret_js, op_mode);
448
449 if (op_mode == RKAIQUAPI_OPMODE_SET) {
450 *ret_str = NULL;
451 } else if (op_mode == RKAIQUAPI_OPMODE_GET) {
452 if (ret_js) {
453 *ret_str = rkaiq_uapi_rpc_response(cmd_path_str.c_str(), ret_js,
454 final_path.c_str());
455 cJSON_Delete(ret_js);
456 }
457 }
458
459 cJSON_Delete(cmd_js);
460
461 return 0;
462 }
463
464 #if defined(__GNUC__) && !defined(__clang__)
465 #pragma GCC diagnostic pop
466 #endif
467