8f34c2760d
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp: Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem. sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately. sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades. sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for fastboot. Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
727 lines
30 KiB
C++
727 lines
30 KiB
C++
// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "image_api.h"
|
|
#include "common.h"
|
|
|
|
#ifdef USE_RKIPC
|
|
#include "socket_client/client.h"
|
|
#endif
|
|
|
|
namespace rockchip {
|
|
namespace cgi {
|
|
|
|
#ifdef USE_RKIPC
|
|
|
|
nlohmann::json image_specific_resource_get(std::string string, int cam_id) {
|
|
nlohmann::json specific_resource =
|
|
nlohmann::json::object(); /* one of all the same resources */
|
|
minilog_debug("%s: string is %s\n", __func__, string.c_str());
|
|
int value_int;
|
|
char *tmp = new char[256];
|
|
|
|
if (!string.compare(PATH_IMAGE_ADJUSTMENT)) {
|
|
rk_isp_get_brightness(cam_id, &value_int);
|
|
specific_resource.emplace("iBrightness", value_int);
|
|
rk_isp_get_contrast(cam_id, &value_int);
|
|
specific_resource.emplace("iContrast", value_int);
|
|
rk_isp_get_saturation(cam_id, &value_int);
|
|
specific_resource.emplace("iSaturation", value_int);
|
|
rk_isp_get_sharpness(cam_id, &value_int);
|
|
specific_resource.emplace("iSharpness", value_int);
|
|
rk_isp_get_hue(cam_id, &value_int);
|
|
specific_resource.emplace("iHue", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_EXPOSURE)) {
|
|
rk_isp_get_exposure_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sExposureMode", tmp);
|
|
rk_isp_get_gain_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sGainMode", tmp);
|
|
rk_isp_get_exposure_time(cam_id, &tmp);
|
|
specific_resource.emplace("sExposureTime", tmp);
|
|
rk_isp_get_exposure_gain(cam_id, &value_int);
|
|
specific_resource.emplace("iExposureGain", value_int);
|
|
rk_isp_get_frame_rate(cam_id, &value_int);
|
|
specific_resource.emplace("iFPS", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_NIGHT_TO_DAY)) {
|
|
rk_isp_get_night_to_day(cam_id, &tmp);
|
|
specific_resource.emplace("sNightToDay", tmp);
|
|
rk_isp_get_fill_light_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sFillLightMode", tmp);
|
|
rk_isp_get_light_brightness(cam_id, &value_int);
|
|
specific_resource.emplace("iLightBrightness", value_int);
|
|
rk_isp_get_night_to_day_filter_level(cam_id, &value_int);
|
|
specific_resource.emplace("iNightToDayFilterLevel", value_int);
|
|
rk_isp_get_night_to_day_filter_time(cam_id, &value_int);
|
|
specific_resource.emplace("iNightToDayFilterTime", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_BLC)) {
|
|
rk_isp_get_hdr(cam_id, &tmp);
|
|
specific_resource.emplace("sHDR", tmp);
|
|
rk_isp_get_blc_region(cam_id, &tmp);
|
|
specific_resource.emplace("sBLCRegion", tmp);
|
|
rk_isp_get_hlc(cam_id, &tmp);
|
|
specific_resource.emplace("sHLC", tmp);
|
|
rk_isp_get_hdr_level(cam_id, &value_int);
|
|
specific_resource.emplace("iHDRLevel", value_int);
|
|
rk_isp_get_blc_strength(cam_id, &value_int);
|
|
specific_resource.emplace("iBLCStrength", value_int);
|
|
rk_isp_get_hlc_level(cam_id, &value_int);
|
|
specific_resource.emplace("iHLCLevel", value_int);
|
|
rk_isp_get_dark_boost_level(cam_id, &value_int);
|
|
specific_resource.emplace("iDarkBoostLevel", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_WHITE_BLANCE)) {
|
|
rk_isp_get_white_blance_style(cam_id, &tmp);
|
|
specific_resource.emplace("sWhiteBlanceStyle", tmp);
|
|
rk_isp_get_white_blance_red(cam_id, &value_int);
|
|
specific_resource.emplace("iWhiteBalanceRed", value_int);
|
|
rk_isp_get_white_blance_green(cam_id, &value_int);
|
|
specific_resource.emplace("iWhiteBalanceGreen", value_int);
|
|
rk_isp_get_white_blance_blue(cam_id, &value_int);
|
|
specific_resource.emplace("iWhiteBalanceBlue", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_ENHANCEMENT)) {
|
|
rk_isp_get_noise_reduce_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sNoiseReduceMode", tmp);
|
|
rk_isp_get_dehaze(cam_id, &tmp);
|
|
specific_resource.emplace("sDehaze", tmp);
|
|
rk_isp_get_gray_scale_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sGrayScaleMode", tmp);
|
|
rk_isp_get_distortion_correction(cam_id, &tmp);
|
|
specific_resource.emplace("sDistortionCorrection", tmp);
|
|
rk_isp_get_spatial_denoise_level(cam_id, &value_int);
|
|
specific_resource.emplace("iSpatialDenoiseLevel", value_int);
|
|
rk_isp_get_temporal_denoise_level(cam_id, &value_int);
|
|
specific_resource.emplace("iTemporalDenoiseLevel", value_int);
|
|
rk_isp_get_dehaze_level(cam_id, &value_int);
|
|
specific_resource.emplace("iDehazeLevel", value_int);
|
|
rk_isp_get_fec_level(cam_id, &value_int);
|
|
specific_resource.emplace("iFecLevel", value_int);
|
|
rk_isp_get_ldch_level(cam_id, &value_int);
|
|
specific_resource.emplace("iLdchLevel", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_VIDEO_ADJUSTMEN)) {
|
|
rk_isp_get_power_line_frequency_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sPowerLineFrequencyMode", tmp);
|
|
rk_isp_get_image_flip(cam_id, &tmp);
|
|
specific_resource.emplace("sImageFlip", tmp);
|
|
rk_video_get_rotation(&value_int);
|
|
specific_resource.emplace("iImageRotation", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_AF)) {
|
|
rk_isp_get_af_mode(cam_id, &tmp);
|
|
specific_resource.emplace("sAFMode", tmp);
|
|
rk_isp_get_zoom_level(cam_id, &value_int);
|
|
specific_resource.emplace("iZoomLevel", value_int);
|
|
rk_isp_get_focus_level(cam_id, &value_int);
|
|
specific_resource.emplace("iFocusLevel", value_int);
|
|
} else if (!string.compare(PATH_IMAGE_SCENARIO)) {
|
|
rk_isp_get_scenario(cam_id, &tmp);
|
|
specific_resource.emplace("sScenario", tmp);
|
|
}
|
|
delete[] tmp;
|
|
|
|
return specific_resource;
|
|
}
|
|
|
|
nlohmann::json image_channel_resource_get(int cam_id) {
|
|
nlohmann::json resource = nlohmann::json::object();
|
|
|
|
resource.emplace("id", cam_id);
|
|
resource.emplace(KEY_IMAGE_ADJUSTMENT,
|
|
image_specific_resource_get(PATH_IMAGE_ADJUSTMENT, cam_id));
|
|
resource.emplace(KEY_IMAGE_EXPOSURE,
|
|
image_specific_resource_get(PATH_IMAGE_EXPOSURE, cam_id));
|
|
resource.emplace(
|
|
KEY_IMAGE_NIGHT_TO_DAY,
|
|
image_specific_resource_get(PATH_IMAGE_NIGHT_TO_DAY, cam_id));
|
|
resource.emplace(KEY_IMAGE_BLC,
|
|
image_specific_resource_get(PATH_IMAGE_BLC, cam_id));
|
|
resource.emplace(
|
|
KEY_IMAGE_WHITE_BLANCE,
|
|
image_specific_resource_get(PATH_IMAGE_WHITE_BLANCE, cam_id));
|
|
resource.emplace(KEY_IMAGE_ENHANCEMENT,
|
|
image_specific_resource_get(PATH_IMAGE_ENHANCEMENT, cam_id));
|
|
resource.emplace(
|
|
KEY_IMAGE_VIDEO_ADJUSTMEN,
|
|
image_specific_resource_get(PATH_IMAGE_VIDEO_ADJUSTMEN, cam_id));
|
|
|
|
return resource;
|
|
}
|
|
|
|
void image_specific_resource_set(std::string string, nlohmann::json data,
|
|
int cam_id) {
|
|
char *table;
|
|
int value_int;
|
|
std::string value;
|
|
|
|
minilog_debug("%s: string is %s\n", __func__, string.c_str());
|
|
minilog_debug("data is %s\n", data.dump().c_str());
|
|
if (!string.compare(PATH_IMAGE_ADJUSTMENT)) {
|
|
if (data.dump().find("iBrightness") != data.dump().npos) {
|
|
value_int = atoi(data.at("iBrightness").dump().c_str());
|
|
rk_isp_set_brightness(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iContrast") != data.dump().npos) {
|
|
value_int = atoi(data.at("iContrast").dump().c_str());
|
|
rk_isp_set_contrast(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iSaturation") != data.dump().npos) {
|
|
value_int = atoi(data.at("iSaturation").dump().c_str());
|
|
rk_isp_set_saturation(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iSharpness") != data.dump().npos) {
|
|
value_int = atoi(data.at("iSharpness").dump().c_str());
|
|
rk_isp_set_sharpness(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iHue") != data.dump().npos) {
|
|
value_int = atoi(data.at("iHue").dump().c_str());
|
|
rk_isp_set_hue(cam_id, value_int);
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_EXPOSURE)) {
|
|
if (data.dump().find("iExposureGain") != data.dump().npos) {
|
|
value_int = atoi(data.at("iExposureGain").dump().c_str());
|
|
rk_isp_set_exposure_gain(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("sExposureMode") != data.dump().npos) {
|
|
value = data.at("sExposureMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_exposure_mode(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sExposureTime") != data.dump().npos) {
|
|
value = data.at("sExposureTime").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_exposure_time(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sGainMode") != data.dump().npos) {
|
|
value = data.at("sGainMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_gain_mode(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("iFPS") != data.dump().npos) {
|
|
value_int = atoi(data.at("iFPS").dump().c_str());
|
|
rk_isp_set_frame_rate(cam_id, value_int);
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_NIGHT_TO_DAY)) {
|
|
if (data.dump().find("sNightToDay") != data.dump().npos) {
|
|
value = data.at("sNightToDay").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_night_to_day(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sFillLightMode") != data.dump().npos) {
|
|
value = data.at("sFillLightMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_fill_light_mode(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("iLightBrightness") != data.dump().npos) {
|
|
value_int = atoi(data.at("iLightBrightness").dump().c_str());
|
|
rk_isp_set_light_brightness(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iNightToDayFilterLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iNightToDayFilterLevel").dump().c_str());
|
|
rk_isp_set_night_to_day_filter_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iNightToDayFilterTime") != data.dump().npos) {
|
|
value_int = atoi(data.at("iNightToDayFilterTime").dump().c_str());
|
|
rk_isp_set_night_to_day_filter_time(cam_id, value_int);
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_BLC)) {
|
|
if (data.dump().find("sBLCRegion") != data.dump().npos) {
|
|
value = data.at("sBLCRegion").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_blc_region(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sHLC") != data.dump().npos) {
|
|
value = data.at("sHLC").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_hlc(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("iHDRLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iHDRLevel").dump().c_str());
|
|
rk_isp_set_hdr_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iBLCStrength") != data.dump().npos) {
|
|
value_int = atoi(data.at("iBLCStrength").dump().c_str());
|
|
rk_isp_set_blc_strength(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iHLCLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iHLCLevel").dump().c_str());
|
|
rk_isp_set_hlc_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iDarkBoostLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iDarkBoostLevel").dump().c_str());
|
|
rk_isp_set_dark_boost_level(cam_id, value_int);
|
|
}
|
|
// it will restart app, must be the last call
|
|
if (data.dump().find("sHDR") != data.dump().npos) {
|
|
value = data.at("sHDR").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_hdr(cam_id, value.c_str());
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_WHITE_BLANCE)) {
|
|
if (data.dump().find("sWhiteBlanceStyle") != data.dump().npos) {
|
|
value = data.at("sWhiteBlanceStyle").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_white_blance_style(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("iWhiteBalanceRed") != data.dump().npos) {
|
|
value_int = atoi(data.at("iWhiteBalanceRed").dump().c_str());
|
|
rk_isp_set_white_blance_red(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iWhiteBalanceGreen") != data.dump().npos) {
|
|
value_int = atoi(data.at("iWhiteBalanceGreen").dump().c_str());
|
|
rk_isp_set_white_blance_green(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iWhiteBalanceBlue") != data.dump().npos) {
|
|
value_int = atoi(data.at("iWhiteBalanceBlue").dump().c_str());
|
|
rk_isp_set_white_blance_blue(cam_id, value_int);
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_ENHANCEMENT)) {
|
|
if (data.dump().find("sNoiseReduceMode") != data.dump().npos) {
|
|
value = data.at("sNoiseReduceMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_noise_reduce_mode(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sDehaze") != data.dump().npos) {
|
|
value = data.at("sDehaze").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_dehaze(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sGrayScaleMode") != data.dump().npos) {
|
|
value = data.at("sGrayScaleMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_gray_scale_mode(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sDistortionCorrection") != data.dump().npos) {
|
|
value = data.at("sDistortionCorrection").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_distortion_correction(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("iSpatialDenoiseLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iSpatialDenoiseLevel").dump().c_str());
|
|
rk_isp_set_spatial_denoise_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iTemporalDenoiseLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iTemporalDenoiseLevel").dump().c_str());
|
|
rk_isp_set_temporal_denoise_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iDehazeLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iDehazeLevel").dump().c_str());
|
|
rk_isp_set_dehaze_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iFecLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iFecLevel").dump().c_str());
|
|
rk_isp_set_fec_level(cam_id, value_int);
|
|
}
|
|
if (data.dump().find("iLdchLevel") != data.dump().npos) {
|
|
value_int = atoi(data.at("iLdchLevel").dump().c_str());
|
|
rk_isp_set_ldch_level(cam_id, value_int);
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_VIDEO_ADJUSTMEN)) {
|
|
if (data.dump().find("sPowerLineFrequencyMode") != data.dump().npos) {
|
|
value = data.at("sPowerLineFrequencyMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_power_line_frequency_mode(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("sImageFlip") != data.dump().npos) {
|
|
value = data.at("sImageFlip").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_image_flip(cam_id, value.c_str());
|
|
}
|
|
if (data.dump().find("iImageRotation") != data.dump().npos) {
|
|
value_int = atoi(data.at("iImageRotation").dump().c_str());
|
|
rk_video_set_rotation(value_int);
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_AF)) {
|
|
if (data.dump().find("sAFMode") != data.dump().npos) {
|
|
value = data.at("sAFMode").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_af_mode(cam_id, value.c_str());
|
|
}
|
|
} else if (!string.compare(PATH_IMAGE_SCENARIO)) {
|
|
if (data.dump().find("sScenario") != data.dump().npos) {
|
|
value = data.at("sScenario").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_isp_set_scenario(cam_id, value.c_str());
|
|
}
|
|
}
|
|
}
|
|
|
|
void ImageApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
|
|
int cam_id = 0;
|
|
nlohmann::json content;
|
|
std::string path_api_resource = "";
|
|
std::string path_channel_resource = "";
|
|
std::string path_specific_resource = "";
|
|
#ifdef ENABLE_JWT
|
|
int user_level = Req.UserLevel;
|
|
#endif
|
|
|
|
/* Get Path Information */
|
|
int pos_first = Req.PathInfo.find_first_of("/");
|
|
path_api_resource = Req.PathInfo.substr(pos_first + 1, Req.PathInfo.size());
|
|
pos_first = path_api_resource.find_first_of("/");
|
|
if (pos_first != -1) {
|
|
path_channel_resource =
|
|
path_api_resource.substr(pos_first + 1, path_api_resource.size());
|
|
pos_first = path_channel_resource.find_first_of("/");
|
|
if (pos_first != -1)
|
|
path_specific_resource = path_channel_resource.substr(
|
|
pos_first + 1, path_channel_resource.size());
|
|
}
|
|
if (!path_channel_resource.empty())
|
|
cam_id = atoi(
|
|
path_channel_resource.substr(0, path_channel_resource.size()).c_str());
|
|
|
|
if (Req.Method == "GET") {
|
|
/* Get based on path information */
|
|
if (path_channel_resource.empty()) { /* path info is /image */
|
|
content = nlohmann::json::array();
|
|
// content.push_back(image_channel_resource_get(1, id));
|
|
} else {
|
|
if (path_specific_resource.empty()) { /* path info is /image/0 */
|
|
content = image_channel_resource_get(cam_id);
|
|
} else { /* path example is /image/0/blc */
|
|
content = image_specific_resource_get(path_specific_resource, cam_id);
|
|
}
|
|
}
|
|
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
|
|
nlohmann::json diff;
|
|
nlohmann::json cfg_old;
|
|
nlohmann::json image_config = Req.PostObject; /* must be json::object */
|
|
|
|
if (path_specific_resource
|
|
.empty()) { /* path info is /image/0 or /image/1 */
|
|
#ifdef ENABLE_JWT
|
|
if (user_level > 1) {
|
|
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
|
|
return;
|
|
}
|
|
#endif
|
|
// cfg_old = image_channel_resource_get(channel_id, id);
|
|
// /* Erase unexist data */
|
|
// for (auto &x : nlohmann::json::iterator_wrapper(image_config)) {
|
|
// if (cfg_old.dump().find(x.key()) == cfg_old.dump().npos)
|
|
// image_config.erase(x.key());
|
|
// }
|
|
// /* Erase unchanged data */
|
|
// diff = nlohmann::json::diff(cfg_old, image_config);
|
|
// for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
|
|
// if (diff.dump().find(x.key()) == diff.dump().npos)
|
|
// image_config.erase(x.key());
|
|
// }
|
|
// /* Set */
|
|
// if (!image_config.empty())
|
|
// image_channel_resource_set(image_config, id);
|
|
// /* Get new info */
|
|
// content = image_channel_resource_get(channel_id, id);
|
|
} else { /* path example is /image/0/blc */
|
|
if (!path_specific_resource.compare(PATH_IMAGE_AF_CMD)) {
|
|
if (image_config.dump().find("cmd") != std::string::npos) {
|
|
std::string af_cmd = image_config.at("cmd");
|
|
int ret = 0;
|
|
if (af_cmd == "ZoomIn")
|
|
ret = rk_isp_af_zoom_in(0);
|
|
else if (af_cmd == "ZoomOut")
|
|
ret = rk_isp_af_zoom_out(0);
|
|
else if (af_cmd == "FocusIn")
|
|
ret = rk_isp_af_focus_in(0);
|
|
else if (af_cmd == "FocusOut")
|
|
ret = rk_isp_af_focus_out(0);
|
|
else if (af_cmd == "FocusOnce")
|
|
ret = rk_isp_af_focus_once(0);
|
|
else
|
|
minilog_debug("unsupport, af_cmd is %s\n", af_cmd.c_str());
|
|
// TODO: overRange, onlyManualSupport, NotAutoSupport
|
|
if (ret)
|
|
content.emplace("rst", "fail");
|
|
else
|
|
content.emplace("rst", "success");
|
|
} else {
|
|
content.emplace("rst", "illegalCmd");
|
|
}
|
|
} else {
|
|
// TODO: only set diff
|
|
/* Set */
|
|
image_specific_resource_set(path_specific_resource, image_config,
|
|
cam_id);
|
|
/* Get new info */
|
|
content = image_specific_resource_get(path_specific_resource, cam_id);
|
|
}
|
|
}
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else {
|
|
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
|
|
}
|
|
}
|
|
|
|
#else // USE_RKIPC
|
|
|
|
nlohmann::json image_specific_config_get(std::string string) {
|
|
nlohmann::json specific_config = nlohmann::json::array();
|
|
char *table;
|
|
|
|
if (!string.compare(PATH_IMAGE_SCENARIO))
|
|
table = TABLE_IMAGE_SCENARIO;
|
|
if (!string.compare(PATH_IMAGE_ADJUSTMENT))
|
|
table = TABLE_IMAGE_ADJUSTMENT;
|
|
if (!string.compare(PATH_IMAGE_EXPOSURE))
|
|
table = TABLE_IMAGE_EXPOSURE;
|
|
if (!string.compare(PATH_IMAGE_NIGHT_TO_DAY))
|
|
table = TABLE_IMAGE_NIGHT_TO_DAY;
|
|
if (!string.compare(PATH_IMAGE_BLC))
|
|
table = TABLE_IMAGE_BLC;
|
|
if (!string.compare(PATH_IMAGE_WHITE_BLANCE))
|
|
table = TABLE_IMAGE_WHITE_BLANCE;
|
|
if (!string.compare(PATH_IMAGE_ENHANCEMENT))
|
|
table = TABLE_IMAGE_ENHANCEMENT;
|
|
if (!string.compare(PATH_IMAGE_VIDEO_ADJUSTMEN))
|
|
table = TABLE_IMAGE_VIDEO_ADJUSTMEN;
|
|
specific_config =
|
|
nlohmann::json::parse(dbserver_media_get(table)).at("jData");
|
|
|
|
return specific_config;
|
|
}
|
|
|
|
nlohmann::json image_specific_resource_get(std::string string, int id) {
|
|
nlohmann::json specific_config =
|
|
nlohmann::json::array(); /* array of all the same resources */
|
|
nlohmann::json specific_resource =
|
|
nlohmann::json::object(); /* one of all the same resources */
|
|
|
|
specific_config = image_specific_config_get(string);
|
|
specific_config.at(id).erase("id");
|
|
specific_resource = specific_config.at(id);
|
|
|
|
return specific_resource;
|
|
}
|
|
|
|
nlohmann::json image_channel_resource_get(int channel_id, int id) {
|
|
nlohmann::json resource = nlohmann::json::object();
|
|
nlohmann::json image_adjustment =
|
|
image_specific_config_get(PATH_IMAGE_ADJUSTMENT);
|
|
nlohmann::json image_exposure =
|
|
image_specific_config_get(PATH_IMAGE_EXPOSURE);
|
|
nlohmann::json image_night_to_day =
|
|
image_specific_config_get(PATH_IMAGE_NIGHT_TO_DAY);
|
|
nlohmann::json image_BLC = image_specific_config_get(PATH_IMAGE_BLC);
|
|
nlohmann::json image_white_blance =
|
|
image_specific_config_get(PATH_IMAGE_WHITE_BLANCE);
|
|
nlohmann::json image_enhancement =
|
|
image_specific_config_get(PATH_IMAGE_ENHANCEMENT);
|
|
nlohmann::json image_video_adjustment =
|
|
image_specific_config_get(PATH_IMAGE_VIDEO_ADJUSTMEN);
|
|
|
|
image_adjustment.at(id).erase("id");
|
|
image_exposure.at(id).erase("id");
|
|
image_night_to_day.at(id).erase("id");
|
|
image_BLC.at(id).erase("id");
|
|
image_white_blance.at(id).erase("id");
|
|
image_enhancement.at(id).erase("id");
|
|
image_video_adjustment.at(id).erase("id");
|
|
|
|
resource.emplace("id", channel_id);
|
|
resource.emplace(KEY_IMAGE_ADJUSTMENT, image_adjustment.at(id));
|
|
resource.emplace(KEY_IMAGE_EXPOSURE, image_exposure.at(id));
|
|
resource.emplace(KEY_IMAGE_NIGHT_TO_DAY, image_night_to_day.at(id));
|
|
resource.emplace(KEY_IMAGE_BLC, image_BLC.at(id));
|
|
resource.emplace(KEY_IMAGE_WHITE_BLANCE, image_white_blance.at(id));
|
|
resource.emplace(KEY_IMAGE_ENHANCEMENT, image_enhancement.at(id));
|
|
resource.emplace(KEY_IMAGE_VIDEO_ADJUSTMEN, image_video_adjustment.at(id));
|
|
|
|
return resource;
|
|
}
|
|
|
|
void image_specific_resource_set(std::string current, nlohmann::json data,
|
|
int id) {
|
|
char *table;
|
|
|
|
if (!current.compare(PATH_IMAGE_SCENARIO))
|
|
table = TABLE_IMAGE_SCENARIO;
|
|
if (!current.compare(PATH_IMAGE_ADJUSTMENT))
|
|
table = TABLE_IMAGE_ADJUSTMENT;
|
|
if (!current.compare(PATH_IMAGE_EXPOSURE))
|
|
table = TABLE_IMAGE_EXPOSURE;
|
|
if (!current.compare(PATH_IMAGE_NIGHT_TO_DAY))
|
|
table = TABLE_IMAGE_NIGHT_TO_DAY;
|
|
if (!current.compare(PATH_IMAGE_BLC))
|
|
table = TABLE_IMAGE_BLC;
|
|
if (!current.compare(PATH_IMAGE_WHITE_BLANCE))
|
|
table = TABLE_IMAGE_WHITE_BLANCE;
|
|
if (!current.compare(PATH_IMAGE_ENHANCEMENT))
|
|
table = TABLE_IMAGE_ENHANCEMENT;
|
|
if (!current.compare(PATH_IMAGE_VIDEO_ADJUSTMEN))
|
|
table = TABLE_IMAGE_VIDEO_ADJUSTMEN;
|
|
|
|
dbserver_media_set(table, (char *)data.dump().c_str(), id);
|
|
mediaserver_set((char *)TABLE_VIDEO, 0, (char *)data.dump().c_str());
|
|
}
|
|
|
|
void image_channel_resource_set(nlohmann::json json_config, int id) {
|
|
for (auto &x : nlohmann::json::iterator_wrapper(json_config)) {
|
|
auto val = x.value(); /* string or int */
|
|
std::string resource;
|
|
if (x.key() == KEY_IMAGE_ADJUSTMENT)
|
|
resource = PATH_IMAGE_ADJUSTMENT;
|
|
else if (x.key() == KEY_IMAGE_EXPOSURE)
|
|
resource = PATH_IMAGE_EXPOSURE;
|
|
else if (x.key() == KEY_IMAGE_NIGHT_TO_DAY)
|
|
resource = PATH_IMAGE_NIGHT_TO_DAY;
|
|
else if (x.key() == KEY_IMAGE_BLC)
|
|
resource = PATH_IMAGE_BLC;
|
|
else if (x.key() == KEY_IMAGE_WHITE_BLANCE)
|
|
resource = PATH_IMAGE_WHITE_BLANCE;
|
|
else if (x.key() == KEY_IMAGE_ENHANCEMENT)
|
|
resource = PATH_IMAGE_ENHANCEMENT;
|
|
else if (x.key() == KEY_IMAGE_VIDEO_ADJUSTMEN)
|
|
resource = PATH_IMAGE_VIDEO_ADJUSTMEN;
|
|
else
|
|
continue;
|
|
|
|
/* Erase unchanged data */
|
|
nlohmann::json resource_old = image_specific_resource_get(resource, id);
|
|
nlohmann::json resource_diff = nlohmann::json::diff(resource_old, val);
|
|
for (auto &y : nlohmann::json::iterator_wrapper(resource_old)) {
|
|
if (resource_diff.dump().find(y.key()) == resource_diff.dump().npos)
|
|
val.erase(y.key());
|
|
}
|
|
image_specific_resource_set(resource, val, id);
|
|
}
|
|
}
|
|
|
|
void ImageApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
|
|
int id;
|
|
int channel_id = 0;
|
|
nlohmann::json content;
|
|
nlohmann::json scenario;
|
|
std::string scenario_str = "";
|
|
std::string path_api_resource = "";
|
|
std::string path_channel_resource = "";
|
|
std::string path_specific_resource = "";
|
|
#ifdef ENABLE_JWT
|
|
int user_level = Req.UserLevel;
|
|
#endif
|
|
|
|
/* Get the current scene and the corresponding table id */
|
|
scenario = image_specific_resource_get(PATH_IMAGE_SCENARIO, 0);
|
|
scenario_str = scenario.at("sScenario").dump();
|
|
scenario_str.erase(0, 1); /* erase " */
|
|
scenario_str.erase(scenario_str.end() - 1, scenario_str.end());
|
|
if (!scenario_str.compare(IMAGE_SCENARIO_NORMAL))
|
|
id = 0;
|
|
if (!scenario_str.compare(IMAGE_SCENARIO_BACKLIGHT))
|
|
id = 1;
|
|
if (!scenario_str.compare(IMAGE_SCENARIO_FRONTLIGHT))
|
|
id = 2;
|
|
if (!scenario_str.compare(IMAGE_SCENARIO_LOW_ILLUMINATION))
|
|
id = 3;
|
|
if (!scenario_str.compare(IMAGE_SCENARIO_CUSTOM1))
|
|
id = 4;
|
|
if (!scenario_str.compare(IMAGE_SCENARIO_CUSTOM2))
|
|
id = 5;
|
|
|
|
/* Get Path Information */
|
|
int pos_first = Req.PathInfo.find_first_of("/");
|
|
path_api_resource = Req.PathInfo.substr(pos_first + 1, Req.PathInfo.size());
|
|
pos_first = path_api_resource.find_first_of("/");
|
|
if (pos_first != -1) {
|
|
path_channel_resource =
|
|
path_api_resource.substr(pos_first + 1, path_api_resource.size());
|
|
pos_first = path_channel_resource.find_first_of("/");
|
|
if (pos_first != -1)
|
|
path_specific_resource = path_channel_resource.substr(
|
|
pos_first + 1, path_channel_resource.size());
|
|
}
|
|
if (!path_channel_resource.empty())
|
|
channel_id = atoi(
|
|
path_channel_resource.substr(0, path_channel_resource.size()).c_str());
|
|
id = id + 6 * channel_id; /* 6 scenarios for each channel */
|
|
|
|
if (Req.Method == "GET") {
|
|
/* Get based on path information */
|
|
if (path_channel_resource.empty()) { /* path info is /image */
|
|
content = nlohmann::json::array();
|
|
/* TODO: channel 1 need dbserver to create 6 more tables and test */
|
|
if (channel_id == 0) {
|
|
content.push_back(image_channel_resource_get(0, id));
|
|
// content.push_back(image_channel_resource_get(1, id + 6));
|
|
} else if (channel_id == 1) {
|
|
content.push_back(image_channel_resource_get(0, id - 6));
|
|
// content.push_back(image_channel_resource_get(1, id));
|
|
}
|
|
// content.push_back(image_channel_resource_get(1, id));
|
|
} else {
|
|
if (path_specific_resource.empty()) { /* path info is /image/0 */
|
|
content = image_channel_resource_get(channel_id, id);
|
|
} else { /* path example is /image/0/blc */
|
|
if (!path_specific_resource.compare(PATH_IMAGE_SCENARIO))
|
|
id = 0;
|
|
content = image_specific_resource_get(path_specific_resource, id);
|
|
}
|
|
}
|
|
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
|
|
nlohmann::json diff;
|
|
nlohmann::json cfg_old;
|
|
nlohmann::json image_config = Req.PostObject; /* must be json::object */
|
|
if (path_specific_resource
|
|
.empty()) { /* path info is /image/0 or /image/1 */
|
|
#ifdef ENABLE_JWT
|
|
if (user_level > 1) {
|
|
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
cfg_old = image_channel_resource_get(channel_id, id);
|
|
/* Erase unexist data */
|
|
for (auto &x : nlohmann::json::iterator_wrapper(image_config)) {
|
|
if (cfg_old.dump().find(x.key()) == cfg_old.dump().npos)
|
|
image_config.erase(x.key());
|
|
}
|
|
/* Erase unchanged data */
|
|
diff = nlohmann::json::diff(cfg_old, image_config);
|
|
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
|
|
if (diff.dump().find(x.key()) == diff.dump().npos)
|
|
image_config.erase(x.key());
|
|
}
|
|
/* Set */
|
|
if (!image_config.empty())
|
|
image_channel_resource_set(image_config, id);
|
|
/* Get new info */
|
|
content = image_channel_resource_get(channel_id, id);
|
|
} else { /* path example is /image/0/blc */
|
|
if (!path_specific_resource.compare(PATH_IMAGE_SCENARIO))
|
|
id = 0;
|
|
cfg_old = image_specific_resource_get(path_specific_resource, id);
|
|
/* Erase unexist data */
|
|
for (auto &x : nlohmann::json::iterator_wrapper(image_config)) {
|
|
if (cfg_old.dump().find(x.key()) == cfg_old.dump().npos)
|
|
image_config.erase(x.key());
|
|
}
|
|
/* Erase unchanged data */
|
|
diff = nlohmann::json::diff(cfg_old, image_config);
|
|
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
|
|
if (diff.dump().find(x.key()) == diff.dump().npos)
|
|
image_config.erase(x.key());
|
|
}
|
|
/* Set */
|
|
if (!image_config.empty())
|
|
image_specific_resource_set(path_specific_resource, image_config, id);
|
|
/* Get new info */
|
|
content = image_specific_resource_get(path_specific_resource, id);
|
|
}
|
|
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else {
|
|
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
|
|
}
|
|
}
|
|
#endif
|
|
|
|
} // namespace cgi
|
|
} // namespace rockchip
|