mirror of
https://github.com/sipeed/MaixCDK.git
synced 2026-09-10 21:59:54 -05:00
* [maixcam2] update camera
This commit is contained in:
@@ -27,6 +27,7 @@ extern "C" {
|
||||
#include "ax_ao_api.h"
|
||||
#include "ax_aenc_api.h"
|
||||
#include "ax_adec_api.h"
|
||||
#include "ax_isp_3a_api.h"
|
||||
#include "ax_acodec_api.h"
|
||||
#include "common_sys.h"
|
||||
#include "common_venc.h"
|
||||
|
||||
@@ -613,13 +613,8 @@ namespace maix::camera
|
||||
|
||||
err::Err Camera::set_fps(double fps) {
|
||||
err::Err ret = err::ERR_NONE;
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
ret = vi->del_channel(priv->chn.id);
|
||||
err::check_raise(ret, "del channel failed");
|
||||
ret = vi->add_channel(priv->chn.id, priv->chn.w, priv->chn.h, get_ax_fmt_from_maix(priv->chn.fmt),
|
||||
fps ,priv->chn.depth, false, false, priv->chn.fit);
|
||||
err::check_raise(ret, "del channel failed");
|
||||
this->exposure(1000 / fps * 1000);
|
||||
_fps = fps;
|
||||
return err::ERR_NONE;
|
||||
}
|
||||
|
||||
@@ -628,10 +623,35 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res = AX_SUCCESS;
|
||||
AX_ISP_IQ_AE_PARAM_T tAeParam;
|
||||
int current_exposure_time = 0;
|
||||
|
||||
return vi->set_and_get_exposure(value);
|
||||
ax_res = AX_ISP_IQ_GetAeParam(_ch, &tAeParam);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::info("get ae param failed");
|
||||
return err::ERR_RUNTIME;
|
||||
}
|
||||
|
||||
if (value > 0) {
|
||||
tAeParam.nEnable = false;
|
||||
tAeParam.tExpManual.nShutter = value;
|
||||
tAeParam.tExpManual.nShortShutter = value / 16;
|
||||
tAeParam.tExpManual.nVsShutter = value;
|
||||
ax_res = AX_ISP_IQ_SetAeParam(_ch, &tAeParam);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::info("set ae param failed");
|
||||
return err::ERR_RUNTIME;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetAeParam(_ch, &tAeParam);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::info("get ae param failed");
|
||||
return err::ERR_RUNTIME;
|
||||
}
|
||||
current_exposure_time = tAeParam.tExpManual.nShutter;
|
||||
return current_exposure_time;
|
||||
}
|
||||
|
||||
int Camera::gain(int value) {
|
||||
@@ -639,10 +659,35 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res = AX_SUCCESS;
|
||||
AX_ISP_IQ_AE_PARAM_T tAeParam;
|
||||
int current_gain = 0;
|
||||
|
||||
return vi->set_and_get_gain(value);
|
||||
ax_res = AX_ISP_IQ_GetAeParam(_ch, &tAeParam);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::info("get ae param failed");
|
||||
return err::ERR_RUNTIME;
|
||||
}
|
||||
|
||||
if (value > 0) {
|
||||
tAeParam.nEnable = false;
|
||||
// tAeParam.tExpManual.nSysTotalGain = value;
|
||||
// tAeParam.tExpManual.nIspGain = value;
|
||||
tAeParam.tExpManual.nAGain = value;
|
||||
ax_res = AX_ISP_IQ_SetAeParam(_ch, &tAeParam);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::info("set ae param failed");
|
||||
return err::ERR_RUNTIME;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetAeParam(_ch, &tAeParam);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::info("get ae param failed");
|
||||
return err::ERR_RUNTIME;
|
||||
}
|
||||
current_gain = tAeParam.tExpManual.nSysTotalGain;
|
||||
return current_gain;
|
||||
}
|
||||
|
||||
int Camera::hmirror(int value) {
|
||||
@@ -679,6 +724,31 @@ namespace maix::camera
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x36:
|
||||
{
|
||||
uint8_t reg_val = 0;
|
||||
uint16_t reg_addr = 0x3820;
|
||||
auto data = i2c_obj.readfrom_mem(priv->i2c_addr, reg_addr, 1, 16);
|
||||
if (!data) {
|
||||
return -1;
|
||||
}
|
||||
#define OS04A10_MIRROR_MASK (0x02)
|
||||
reg_val = data->data[0];
|
||||
mirror = (reg_val & OS04A10_MIRROR_MASK) ? true : false;
|
||||
if (value >= 0) {
|
||||
mirror = value > 0 ? true : false;
|
||||
if (mirror) {
|
||||
reg_val = (reg_val & ~OS04A10_MIRROR_MASK) | OS04A10_MIRROR_MASK;
|
||||
} else {
|
||||
reg_val = (reg_val & ~OS04A10_MIRROR_MASK);
|
||||
}
|
||||
uint8_t temp[1] = {reg_val};
|
||||
i2c_obj.writeto_mem(priv->i2c_addr, reg_addr, temp, sizeof(temp), 16);
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -721,6 +791,31 @@ namespace maix::camera
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x36:
|
||||
{
|
||||
uint8_t reg_val = 0;
|
||||
uint16_t reg_addr = 0x3820;
|
||||
auto data = i2c_obj.readfrom_mem(priv->i2c_addr, reg_addr, 1, 16);
|
||||
if (!data) {
|
||||
return -1;
|
||||
}
|
||||
#define OS04A10_FLIP_MASK (0x04)
|
||||
reg_val = data->data[0];
|
||||
flip = (reg_val & OS04A10_FLIP_MASK) ? true : false;
|
||||
if (value >= 0) {
|
||||
flip = value > 0 ? true : false;
|
||||
if (flip) {
|
||||
reg_val = (reg_val & ~OS04A10_FLIP_MASK) | OS04A10_FLIP_MASK;
|
||||
} else {
|
||||
reg_val = (reg_val & ~OS04A10_FLIP_MASK);
|
||||
}
|
||||
uint8_t temp[1] = {reg_val};
|
||||
i2c_obj.writeto_mem(priv->i2c_addr, reg_addr, temp, sizeof(temp), 16);
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -734,10 +829,34 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res = AX_SUCCESS;
|
||||
AX_ISP_IQ_YCPROC_PARAM_T param;
|
||||
int current_value = 0;
|
||||
if (value >= 0) {
|
||||
ax_res = AX_ISP_IQ_GetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_GetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
|
||||
return vi->set_and_get_luma(value);
|
||||
param.nBrightness = ((double)value / 100) * 4096;
|
||||
param.nBrightness = param.nBrightness < 0 ? 0 : param.nBrightness;
|
||||
param.nBrightness = param.nBrightness > 4095 ? 4095 : param.nBrightness;
|
||||
ax_res = AX_ISP_IQ_SetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_SetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_GetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
|
||||
current_value = (float)param.nBrightness / 4096 * 100;
|
||||
return current_value;
|
||||
}
|
||||
|
||||
int Camera::constrast(int value) {
|
||||
@@ -745,10 +864,34 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res = AX_SUCCESS;
|
||||
AX_ISP_IQ_YCPROC_PARAM_T param;
|
||||
int current_value = 0;
|
||||
if (value >= 0) {
|
||||
ax_res = AX_ISP_IQ_GetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_GetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
|
||||
return vi->set_and_get_constrast(value);
|
||||
param.nContrast = ((double)value / 100) * 8192 - 4096;
|
||||
param.nContrast = param.nContrast < -4096 ? -4096 : param.nContrast;
|
||||
param.nContrast = param.nContrast > 4095 ? 4095 : param.nContrast;
|
||||
ax_res = AX_ISP_IQ_SetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_SetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_GetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
|
||||
current_value = (float)(param.nContrast + 4096) / 8196 * 100;
|
||||
return current_value;
|
||||
}
|
||||
|
||||
int Camera::saturation(int value) {
|
||||
@@ -756,10 +899,34 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res = AX_SUCCESS;
|
||||
AX_ISP_IQ_YCPROC_PARAM_T param;
|
||||
int current_value = 0;
|
||||
if (value >= 0) {
|
||||
ax_res = AX_ISP_IQ_GetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_GetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
|
||||
return vi->set_and_get_saturation(value);
|
||||
param.nSaturation = ((double)value / 100) * 65535;
|
||||
param.nSaturation = param.nSaturation < 0 ? 0 : param.nSaturation;
|
||||
param.nSaturation = param.nSaturation > 65535 ? 65535 : param.nSaturation;
|
||||
ax_res = AX_ISP_IQ_SetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_SetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetYcprocParam(_ch, ¶m);
|
||||
if (ax_res != AX_SUCCESS) {
|
||||
log::error("AX_ISP_IQ_GetYcprocParam failed: %d", ax_res);
|
||||
current_value;
|
||||
}
|
||||
|
||||
current_value = (float)param.nSaturation / 65536 * 100;log::info("2param.nSaturation: %d", param.nSaturation);
|
||||
return current_value;
|
||||
}
|
||||
|
||||
int Camera::awb_mode(int value) {
|
||||
@@ -767,10 +934,34 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res;
|
||||
AX_ISP_IQ_AWB_PARAM_T param;
|
||||
int current_mode = 0;
|
||||
|
||||
return vi->set_and_get_awb_mode(value);
|
||||
if (value >= 0) {
|
||||
ax_res = AX_ISP_IQ_GetAwbParam(_ch, ¶m);
|
||||
if (ax_res != 0) {
|
||||
log::error("AX_ISP_IQ_GetAwbParam failed: %d", ax_res);
|
||||
return current_mode;
|
||||
}
|
||||
|
||||
current_mode = value ? 0 : 1; // 0,auto; 1,manual
|
||||
param.nEnable = current_mode;
|
||||
ax_res = AX_ISP_IQ_SetAwbParam(_ch, ¶m);
|
||||
if (ax_res != 0) {
|
||||
log::error("AX_ISP_IQ_SetAwbParam failed: %d", ax_res);
|
||||
return current_mode;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetAwbParam(_ch, ¶m);
|
||||
if (ax_res != 0) {
|
||||
log::error("AX_ISP_IQ_GetAwbParam failed: %d", ax_res);
|
||||
return current_mode;
|
||||
}
|
||||
|
||||
current_mode = param.nEnable ? 0 : 1;
|
||||
return current_mode;
|
||||
}
|
||||
|
||||
int Camera::set_awb(int value) {
|
||||
@@ -786,10 +977,34 @@ namespace maix::camera
|
||||
return err::ERR_NOT_OPEN;
|
||||
}
|
||||
|
||||
auto *priv = (camera_priv_t *)_param;
|
||||
auto vi = priv->ax_vi;
|
||||
AX_S32 ax_res;
|
||||
AX_ISP_IQ_AE_PARAM_T param;
|
||||
int current_mode = 0;
|
||||
|
||||
return vi->set_and_get_exp_mode(value);
|
||||
if (value >= 0) {
|
||||
ax_res = AX_ISP_IQ_GetAeParam(_ch, ¶m);
|
||||
if (ax_res != 0) {
|
||||
log::error("AX_ISP_IQ_GetAeParam failed: %d", ax_res);
|
||||
return current_mode;
|
||||
}
|
||||
|
||||
current_mode = value ? 0 : 1; // 0,auto; 1,manual
|
||||
param.nEnable = current_mode;
|
||||
ax_res = AX_ISP_IQ_SetAeParam(_ch, ¶m);
|
||||
if (ax_res != 0) {
|
||||
log::error("AX_ISP_IQ_GetAeParam failed: %d", ax_res);
|
||||
return current_mode;
|
||||
}
|
||||
}
|
||||
|
||||
ax_res = AX_ISP_IQ_GetAeParam(_ch, ¶m);
|
||||
if (ax_res != 0) {
|
||||
log::error("AX_ISP_IQ_GetAeParam failed: %d", ax_res);
|
||||
return current_mode;
|
||||
}
|
||||
|
||||
current_mode = param.nEnable ? 0 : 1;
|
||||
return current_mode;
|
||||
}
|
||||
|
||||
err::Err Camera::set_windowing(std::vector<int> roi) {
|
||||
|
||||
@@ -281,7 +281,6 @@ static int cmd_loop(camera::Camera *cam, display::Display *disp)
|
||||
{
|
||||
uint32_t out = 0;
|
||||
out = cam->luma(value);
|
||||
err::check_bool_raise(out == value, "set error");
|
||||
log::info("set luma: %ld\r\n", value);
|
||||
out = cam->luma();
|
||||
log::info("get luma: %d\r\n", out);
|
||||
@@ -291,7 +290,6 @@ static int cmd_loop(camera::Camera *cam, display::Display *disp)
|
||||
{
|
||||
uint32_t out = 0;
|
||||
out = cam->constrast(value);
|
||||
err::check_bool_raise(out == value, "set error");
|
||||
log::info("set constrast: %ld\r\n", value);
|
||||
out = cam->constrast();
|
||||
log::info("get constrast: %d\r\n", out);
|
||||
@@ -301,7 +299,6 @@ static int cmd_loop(camera::Camera *cam, display::Display *disp)
|
||||
{
|
||||
uint32_t out = 0;
|
||||
out = cam->saturation(value);
|
||||
err::check_bool_raise(out == value, "set error");
|
||||
log::info("set saturation: %ld\r\n", value);
|
||||
out = cam->saturation();
|
||||
log::info("get saturation: %d\r\n", out);
|
||||
@@ -310,10 +307,9 @@ static int cmd_loop(camera::Camera *cam, display::Display *disp)
|
||||
case 5:
|
||||
{
|
||||
uint32_t out = 0;
|
||||
out = cam->set_awb(value);
|
||||
err::check_bool_raise(out == value, "set error");
|
||||
out = cam->awb_mode(value);
|
||||
log::info("set white balance mode: %ld\r\n", value);
|
||||
out = cam->set_awb();
|
||||
out = cam->awb_mode();
|
||||
log::info("get white balance mode: %d\r\n", out);
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user