130 lines
3.5 KiB
C
Executable File
130 lines
3.5 KiB
C
Executable File
#include "vendor_isp.h"
|
|
|
|
//=============================================================================
|
|
// function declaration
|
|
//=============================================================================
|
|
|
|
//=============================================================================
|
|
// global
|
|
//=============================================================================
|
|
#define LA_WIN_X 32
|
|
#define LA_WIN_Y 32
|
|
#define AE_TARGET_Y 40
|
|
#define AE_CONVERGE_RANGE 10
|
|
#define AE_CONVRANGE_L (AE_TARGET_Y - AE_CONVERGE_RANGE)
|
|
#define AE_CONVRANGE_H (AE_TARGET_Y + AE_CONVERGE_RANGE)
|
|
#define AE_EXPTIME_DEFAULT 10000
|
|
#define AE_EXPTIME_L 500
|
|
#define AE_EXPTIME_H 30000
|
|
#define AE_EXPTIME_STEP 100
|
|
#define AE_GAIN_DEFAULT 1000
|
|
#define AE_GAIN_L 1000
|
|
#define AE_GAIN_H 4000
|
|
#define AE_GAIN_STEP 100
|
|
|
|
void sample_ae_init(unsigned int id)
|
|
{
|
|
HD_RESULT result = HD_OK;
|
|
ISPT_SENSOR_EXPT sensor_expt = {0};
|
|
ISPT_SENSOR_GAIN sensor_gain = {0};
|
|
|
|
sensor_expt.id = id;
|
|
sensor_gain.id = id;
|
|
sensor_expt.time[0] = AE_EXPTIME_DEFAULT;
|
|
sensor_gain.ratio[0] = AE_GAIN_DEFAULT;
|
|
|
|
result = vendor_isp_set_common(ISPT_ITEM_SENSOR_EXPT, &sensor_expt);
|
|
if (result != HD_OK) {
|
|
printf("SET ISPT_ITEM_SENSOR_EXPT fail, result = %d \n",result);
|
|
}
|
|
result = vendor_isp_set_common(ISPT_ITEM_SENSOR_GAIN, &sensor_gain);
|
|
if (result != HD_OK) {
|
|
printf("SET ISPT_ITEM_SENSOR_GAIN fail, result = %d \n",result);
|
|
}
|
|
}
|
|
|
|
void sample_ae_trig(unsigned int id)
|
|
{
|
|
// NOTE: Get LA from isp device
|
|
HD_RESULT result = HD_OK;
|
|
ISPT_SENSOR_EXPT sensor_expt = {0};
|
|
ISPT_SENSOR_GAIN sensor_gain = {0};
|
|
UINT32 ix, iy, iyw;
|
|
UINT32 lum, la_sum;
|
|
static UINT32 exptime = AE_EXPTIME_DEFAULT;
|
|
static UINT32 gain = AE_GAIN_DEFAULT;
|
|
ISPT_LA_DATA la_data = {0};
|
|
static UINT32 frame_cnt = 0;
|
|
|
|
la_data.id = id;
|
|
result = vendor_isp_get_common(ISPT_ITEM_LA_DATA, &la_data);
|
|
|
|
if(frame_cnt < 2) {
|
|
frame_cnt ++;
|
|
return;
|
|
} else {
|
|
frame_cnt = 0;
|
|
}
|
|
|
|
la_sum = 0;
|
|
|
|
if (result == HD_OK) {
|
|
//printf("id = %d, no. 528 data = %d, %d \n", la_data.id, la_data.la_rslt.lum_1[528], la_data.la_rslt.lum_2[528]);
|
|
|
|
for (iy = 0; iy < LA_WIN_Y; iy ++) {
|
|
iyw = iy * LA_WIN_X;
|
|
for (ix = 0; ix < LA_WIN_X; ix ++) {
|
|
la_sum += (UINT32)la_data.la_rslt.lum_1[iyw + ix];
|
|
}
|
|
}
|
|
} else {
|
|
la_sum = 0;
|
|
printf("GET ISPT_ITEM_LA_DATA fail, result = %d \r\n",result);
|
|
}
|
|
|
|
lum = la_sum/(LA_WIN_X * LA_WIN_Y);
|
|
lum = (lum >> 4);
|
|
|
|
if((lum <= AE_CONVRANGE_H) && (lum >= AE_CONVRANGE_L)) {
|
|
printf("AE stable.\r\n");
|
|
} else {
|
|
if(lum < AE_CONVRANGE_L) {
|
|
exptime += AE_EXPTIME_STEP;
|
|
if(exptime > AE_EXPTIME_H) {
|
|
exptime = AE_EXPTIME_H;
|
|
gain += AE_GAIN_STEP;
|
|
if(gain > AE_GAIN_H) {
|
|
gain = AE_GAIN_H;
|
|
}
|
|
}
|
|
} else if(lum > AE_CONVRANGE_H){
|
|
if(gain > AE_GAIN_L) {
|
|
gain -= AE_GAIN_STEP;
|
|
} else {
|
|
if(exptime > AE_EXPTIME_L) {
|
|
exptime -= AE_EXPTIME_STEP;
|
|
} else {
|
|
exptime = AE_EXPTIME_L;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sensor_expt.id = id;
|
|
sensor_gain.id = id;
|
|
sensor_expt.time[0] = exptime;
|
|
sensor_gain.ratio[0] = gain;
|
|
|
|
result = vendor_isp_set_common(ISPT_ITEM_SENSOR_EXPT, &sensor_expt);
|
|
if (result != HD_OK) {
|
|
printf("SET ISPT_ITEM_SENSOR_EXPT fail, result = %d \n",result);
|
|
}
|
|
result = vendor_isp_set_common(ISPT_ITEM_SENSOR_GAIN, &sensor_gain);
|
|
if (result != HD_OK) {
|
|
printf("SET ISPT_ITEM_SENSOR_GAIN fail, result = %d \n",result);
|
|
}
|
|
printf("lum = %4d, exptime = %5d, gain = %3d\n", lum, sensor_expt.time[0], sensor_gain.ratio[0]);
|
|
|
|
}
|
|
|