/* * Copyright (c) 2019 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 "sample_comm.h" static void sample_ae_usage() { printf("Usage : \n"); printf("\t 0) AE: set ae speed.\n"); printf("\t 1) AE: set ae delay.\n\n"); printf("\t 2) AE: set exp manual.\n"); printf("\t 3) AE: set exp auto.\n"); printf("\t 4) AE: set manual time & auto gain.\n"); printf("\t 5) AE: set auto time & manual gain.\n"); printf("\t 6) AE: set time range.\n"); printf("\t 7) AE: get time range.\n"); printf("\t 8) AE: set gain range.\n"); printf("\t 9) AE: get gain range.\n"); printf("\t a) AE: set fix fps.\n"); printf("\t b) AE: set auto fps.\n"); printf("\t c) AE: set anti_flicker frequency 50HZ.\n"); printf("\t d) AE: set anti_flicker frequency 60HZ.\n"); printf("\t e) AE: set anti_flicker disable.\n"); printf("\t f) AE: set grid_weight directly.\n"); printf("\t g) AE: set grid_weight by advanced.\n"); printf("\t h) AE: set ae on(= unlock ae).\n"); printf("\t i) AE: set ae off(= lock ae).\n"); printf("\t j) AE: set exp windows.\n"); printf("\t k) AE: set back_light_ctrl.\n"); printf("\t l) AE: set over_exp_ctrl.\n"); printf("\t m) AE: set hdr exp ratio.\n"); printf("\t n) AE: set linear route.\n"); printf("\t o) AE: set hdr mframe params.\n"); printf("\t W) AE: test default mode.\n"); printf("\t X) AE: test sync mode.\n"); printf("\t Y) AE: test async mode.\n"); printf("\t Z) AE: test async mode, twice set.\n\n"); printf("\t q/Q) AE: return to main sample screen.\n"); printf("\n"); printf("\t please press the key: \n\n"); return; } void sample_print_ae_info(const void *arg) { printf ("enter AE modult test!\n"); } static int sample_set_ae_onoff(const rk_aiq_sys_ctx_t* ctx, bool on) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.Enable = on; ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_exp_manual(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; expSwAttr.AecOpType = RK_AIQ_OP_MODE_MANUAL; //LinearAE expSwAttr.stManual.LinearAE.ManualGainEn = true; expSwAttr.stManual.LinearAE.ManualTimeEn = true; expSwAttr.stManual.LinearAE.GainValue = 1.0f; /*gain = 1x*/ expSwAttr.stManual.LinearAE.TimeValue = 0.02f; /*time = 1/50s*/ //HdrAE (should set all frames) expSwAttr.stManual.HdrAE.ManualGainEn = true; expSwAttr.stManual.HdrAE.ManualTimeEn = true; expSwAttr.stManual.HdrAE.GainValue[0] = 1.0f; /*sframe gain = 1x*/ expSwAttr.stManual.HdrAE.TimeValue[0] = 0.002f; /*sframe time = 1/500s*/ expSwAttr.stManual.HdrAE.GainValue[1] = 2.0f; /*mframe gain = 2x*/ expSwAttr.stManual.HdrAE.TimeValue[1] = 0.01f; /*mframe time = 1/100s*/ expSwAttr.stManual.HdrAE.GainValue[2] = 4.0f; /*lframe gain = 4x*/ expSwAttr.stManual.HdrAE.TimeValue[2] = 0.02f; /*lframe time = 1/50s*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_exp_manual_test(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; expSwAttr.AecOpType = RK_AIQ_OP_MODE_MANUAL; //LinearAE expSwAttr.stManual.LinearAE.ManualGainEn = true; expSwAttr.stManual.LinearAE.ManualTimeEn = true; expSwAttr.stManual.LinearAE.GainValue = 1.3f; /*gain = 1.3x*/ expSwAttr.stManual.LinearAE.TimeValue = 0.03f; /*time =0.030s*/ //HdrAE (should set all frames) expSwAttr.stManual.HdrAE.ManualGainEn = true; expSwAttr.stManual.HdrAE.ManualTimeEn = true; expSwAttr.stManual.HdrAE.GainValue[0] = 1.1f; /*sframe gain = 1x*/ expSwAttr.stManual.HdrAE.TimeValue[0] = 0.003f; /*sframe time = 1/500s*/ expSwAttr.stManual.HdrAE.GainValue[1] = 2.1f; /*mframe gain = 2x*/ expSwAttr.stManual.HdrAE.TimeValue[1] = 0.02f; /*mframe time = 1/100s*/ expSwAttr.stManual.HdrAE.GainValue[2] = 4.1f; /*lframe gain = 4x*/ expSwAttr.stManual.HdrAE.TimeValue[2] = 0.03f; /*lframe time = 1/50s*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_exp_auto(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; expSwAttr.AecOpType = RK_AIQ_OP_MODE_AUTO; ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_time_manual_and_gain_auto(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; expSwAttr.AecOpType = RK_AIQ_OP_MODE_AUTO; //set time range expSwAttr.stAdvanced.SetAeRangeEn = true;/*must enable*/ //LinAE expSwAttr.stAdvanced.SetLinAeRange.stExpTimeRange.Max = 0.03f; /*time_max = 0.03*/ expSwAttr.stAdvanced.SetLinAeRange.stExpTimeRange.Min = 0.03f; /*time_min = 0.03*/ //HdrAE (can only set one frame, stime + mtime + ltime <= timeMax) expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[0].Max = 0.01f; /*sframe time_max = 0.01*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[0].Min = 0.01f; /*sframe time_min = 0.01*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[1].Max = 0.01f; /*mframe time_max = 0.01*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[1].Min = 0.01f; /*mframe time_min = 0.01*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[2].Max = 0.01f; /*lframe time_max = 0.01*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[2].Min = 0.01f; /*lframe time_min = 0.01*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_time_auto_and_gain_manual(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; expSwAttr.AecOpType = RK_AIQ_OP_MODE_MANUAL; //LinearAE expSwAttr.stManual.LinearAE.ManualGainEn = true; expSwAttr.stManual.LinearAE.ManualTimeEn = false; expSwAttr.stManual.LinearAE.ManualIspDgainEn = false; expSwAttr.stManual.LinearAE.GainValue = 2.0f; /*gain = 2x*/ //HdrAE (can only set one frame) expSwAttr.stManual.HdrAE.ManualGainEn = true; expSwAttr.stManual.HdrAE.ManualTimeEn = false; expSwAttr.stManual.HdrAE.ManualIspDgainEn = false; expSwAttr.stManual.HdrAE.GainValue[0] = 1.0f; /*sframe gain = 1x*/ expSwAttr.stManual.HdrAE.GainValue[1] = 2.0f; /*mframe gain = 2x*/ expSwAttr.stManual.HdrAE.GainValue[2] = 4.0f; /*lframe gain = 4x*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_time_range(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; //set time range in struct "stAdvanced" expSwAttr.stAdvanced.SetAeRangeEn = true;/*must enable*/ //LinAE expSwAttr.stAdvanced.SetLinAeRange.stExpTimeRange.Max = 0.04f; /*time_max = 0.04*/ expSwAttr.stAdvanced.SetLinAeRange.stExpTimeRange.Min = 0.001f; /*time_min = 0.001*/ //HdrAE expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[0].Max = 0.002f; /*sframe time_max = 0.02*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[0].Min = 0.001f; /*sframe time_min = 0.01*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[1].Max = 0.003f; /*mframe time_max = 0.03*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[1].Min = 0.002f; /*mframe time_min = 0.02*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[2].Max = 0.04f; /*lframe time_max = 0.03*/ expSwAttr.stAdvanced.SetHdrAeRange.stExpTimeRange[2].Min = 0.03f; /*lframe time_min = 0.02*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_get_time_range(const rk_aiq_sys_ctx_t* ctx) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); //get time range in struct "stAuto" printf("linear time range=[%f,%f]\n", expSwAttr.stAuto.LinAeRange.stExpTimeRange.Min, expSwAttr.stAuto.LinAeRange.stExpTimeRange.Max); printf("hdr stime range=[%f,%f], mtime range=[%f,%f], ltime range=[%f,%f]\n", expSwAttr.stAuto.HdrAeRange.stExpTimeRange[0].Min, expSwAttr.stAuto.HdrAeRange.stExpTimeRange[0].Max, expSwAttr.stAuto.HdrAeRange.stExpTimeRange[1].Min, expSwAttr.stAuto.HdrAeRange.stExpTimeRange[1].Max, expSwAttr.stAuto.HdrAeRange.stExpTimeRange[2].Min, expSwAttr.stAuto.HdrAeRange.stExpTimeRange[2].Max); return 0; } static int sample_set_gain_range(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; //set gain range in struct "stAdvanced" expSwAttr.stAdvanced.SetAeRangeEn = true;/*must enable*/ //LinAE expSwAttr.stAdvanced.SetLinAeRange.stGainRange.Max = 32.0f; /*gain_max = 32x*/ expSwAttr.stAdvanced.SetLinAeRange.stGainRange.Min = 1.0f; /*gain_min = 1x*/ //HdrAE expSwAttr.stAdvanced.SetHdrAeRange.stGainRange[0].Max = 32.0f; /*sframe gain_max = 2x*/ expSwAttr.stAdvanced.SetHdrAeRange.stGainRange[0].Min = 1.0f; /*sframe gain_min = 1x*/ expSwAttr.stAdvanced.SetHdrAeRange.stGainRange[1].Max = 64.0f; /*mframe gain_max = 64x*/ expSwAttr.stAdvanced.SetHdrAeRange.stGainRange[1].Min = 1.0f; /*mframe gian_min = 1x*/ expSwAttr.stAdvanced.SetHdrAeRange.stGainRange[2].Max = 64.0f; /*lframe gain_max = 64x*/ expSwAttr.stAdvanced.SetHdrAeRange.stGainRange[2].Min = 1.0f; /*lframe gain_min = 1x*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_get_gain_range(const rk_aiq_sys_ctx_t* ctx) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); //get gain range in struct "stAuto" printf("linear gain range=[%f,%f]\n", expSwAttr.stAuto.LinAeRange.stGainRange.Min, expSwAttr.stAuto.LinAeRange.stGainRange.Max); printf("hdr sgain range=[%f,%f], mgain range=[%f,%f], lgain range=[%f,%f]\n", expSwAttr.stAuto.HdrAeRange.stGainRange[0].Min, expSwAttr.stAuto.HdrAeRange.stGainRange[0].Max, expSwAttr.stAuto.HdrAeRange.stGainRange[1].Min, expSwAttr.stAuto.HdrAeRange.stGainRange[1].Max, expSwAttr.stAuto.HdrAeRange.stGainRange[2].Min, expSwAttr.stAuto.HdrAeRange.stGainRange[2].Max); return 0; } static int sample_is_fps_fix(const rk_aiq_sys_ctx_t* ctx, bool on, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; expSwAttr.stAuto.stFrmRate.isFpsFix = on; expSwAttr.stAuto.stFrmRate.FpsValue = 25; /*fps = 25*/ ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_anti_flicker(const rk_aiq_sys_ctx_t* ctx, bool on, CalibDb_FlickerFreqV2_t frequency, CalibDb_AntiFlickerModeV2_t mode, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; //set antifilicker mode expSwAttr.stAuto.stAntiFlicker.enable = on; expSwAttr.stAuto.stAntiFlicker.Frequency = frequency; expSwAttr.stAuto.stAntiFlicker.Mode = mode; ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_gridweight(const rk_aiq_sys_ctx_t* ctx, int type, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; uint8_t GridWeights[225] = { 0, 0, 1, 2, 2, 3, 4, 5, 4, 3, 2, 2, 1, 0, 0, 0, 1, 2, 3, 3, 4, 5, 6, 5, 4, 3, 3, 2, 1, 0, 1, 2, 3, 5, 5, 6, 7, 8, 7, 6, 5, 5, 3, 2, 1, 2, 3, 5, 7, 7, 8, 9, 10, 9, 8, 7, 7, 5, 3, 2, 2, 3, 5, 7, 8, 9, 10, 11, 10, 9, 8, 7, 5, 3, 2, 2, 4, 6, 8, 9, 10, 11, 12, 11, 10, 9, 8, 6, 4, 2, 2, 4, 6, 9, 10, 11, 12, 13, 12, 11, 10, 9, 6, 4, 2, 3, 5, 7, 10, 11, 12, 13, 14, 13, 12, 11, 10, 7, 5, 3, 2, 4, 6, 9, 10, 11, 12, 13, 12, 11, 10, 9, 6, 4, 2, 2, 4, 6, 8, 9, 10, 11, 12, 11, 10, 9, 8, 6, 4, 2, 2, 3, 5, 7, 8, 9, 10, 11, 10, 9, 8, 7, 5, 3, 2, 2, 3, 5, 7, 7, 8, 9, 10, 9, 8, 7, 7, 5, 3, 2, 1, 2, 4, 6, 6, 7, 8, 9, 8, 7, 6, 6, 4, 2, 1, 0, 1, 3, 5, 5, 6, 7, 8, 7, 6, 5, 5, 3, 1, 0, 0, 1, 3, 5, 5, 6, 7, 8, 7, 6, 5, 5, 3, 1, 0 }; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; if (type == 0) memcpy(expSwAttr.GridWeights.uCoeff, GridWeights, sizeof(expSwAttr.GridWeights.uCoeff)); else if (type == 1) { expSwAttr.stAdvanced.enable = true; //important! true means preferring to use these parameters memcpy(expSwAttr.stAdvanced.GridWeights, GridWeights, sizeof(expSwAttr.stAdvanced.GridWeights)); } ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_BackLightCtrl(const rk_aiq_sys_ctx_t* ctx, bool on, float bias, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_LinExpAttrV2_t LinExpAttr; memset(&LinExpAttr, 0, sizeof(Uapi_LinExpAttrV2_t)); ret = rk_aiq_user_api2_ae_getLinExpAttr(ctx, &LinExpAttr); LinExpAttr.sync.sync_mode = sync; LinExpAttr.sync.done = false; //set BackLightCtrl LinExpAttr.Params.BackLightCtrl.Enable = on; LinExpAttr.Params.BackLightCtrl.StrBias = bias; ret = rk_aiq_user_api2_ae_setLinExpAttr(ctx, LinExpAttr); return 0; } static int sample_set_OverExpCtrl(const rk_aiq_sys_ctx_t* ctx, bool on, float bias, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_LinExpAttrV2_t LinExpAttr; memset(&LinExpAttr, 0, sizeof(Uapi_LinExpAttrV2_t)); ret = rk_aiq_user_api2_ae_getLinExpAttr(ctx, &LinExpAttr); LinExpAttr.sync.sync_mode = sync; LinExpAttr.sync.done = false; //set OverExpCtrl LinExpAttr.Params.OverExpCtrl.Enable = on; LinExpAttr.Params.OverExpCtrl.StrBias = bias; ret = rk_aiq_user_api2_ae_setLinExpAttr(ctx, LinExpAttr); return 0; } static int sample_set_exp_ratio_type(const rk_aiq_sys_ctx_t* ctx, CalibDb_HdrAeRatioTypeV2_t type, float bias, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_HdrExpAttrV2_t HdrExpAttr; memset(&HdrExpAttr, 0, sizeof(Uapi_HdrExpAttrV2_t)); ret = rk_aiq_user_api2_ae_getHdrExpAttr(ctx, &HdrExpAttr); HdrExpAttr.sync.sync_mode = sync; HdrExpAttr.sync.done = false; //set ExpRatioType (AUTO/FIX) HdrExpAttr.Params.ExpRatioCtrl.ExpRatioType = type; //set Evbias HdrExpAttr.Params.Evbias = bias; ret = rk_aiq_user_api2_ae_setHdrExpAttr(ctx, HdrExpAttr); return 0; } static int sample_set_linear_route(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_LinAeRouteAttr_t LinExpRouteAttr; memset(&LinExpRouteAttr, 0x00, sizeof(Uapi_LinAeRouteAttr_t)); ret = rk_aiq_user_api2_ae_getLinAeRouteAttr(ctx, &LinExpRouteAttr); LinExpRouteAttr.sync.sync_mode = sync; LinExpRouteAttr.sync.done = false; int len = 8; float TimeDot[8] = {0, 0.01, 0.01, 0.02, 0.02, 0.03, 0.03, 0.04}; float GainDot[8] = {1, 1, 4, 4, 8, 8, 16, 32}; float IspGainDot[8] = {1, 1, 1, 1, 1, 1, 1, 1}; int PirisDot[8] = {512, 512, 512, 512, 512, 512, 512, 512}; LinExpRouteAttr.Params.TimeDot_len = len; LinExpRouteAttr.Params.GainDot_len = len; LinExpRouteAttr.Params.IspDGainDot_len = len; LinExpRouteAttr.Params.PIrisDot_len = len; LinExpRouteAttr.Params.GainDot = GainDot; LinExpRouteAttr.Params.IspDGainDot = IspGainDot; LinExpRouteAttr.Params.TimeDot = TimeDot; LinExpRouteAttr.Params.PIrisDot = PirisDot; ret = rk_aiq_user_api2_ae_setLinAeRouteAttr(ctx, LinExpRouteAttr); return 0; } static int sample_set_hdr_mframe_params(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_HdrExpAttrV2_t HdrExpAttr; memset(&HdrExpAttr, 0, sizeof(Uapi_HdrExpAttrV2_t)); ret = rk_aiq_user_api2_ae_getHdrExpAttr(ctx, &HdrExpAttr); HdrExpAttr.sync.sync_mode = sync; HdrExpAttr.sync.done = false; int len = 8; float explevel[8] = {0, 0.096, 0.192, 0.384, 0.96, 1.344, 1.92, 3}; float setpoint[8] = {50, 45, 40, 35, 30, 25, 20, 15}; HdrExpAttr.Params.MframeCtrl.MExpLevel_len = len; HdrExpAttr.Params.MframeCtrl.MSetPoint_len = len; HdrExpAttr.Params.MframeCtrl.MExpLevel = explevel; HdrExpAttr.Params.MframeCtrl.MSetPoint = setpoint; ret = rk_aiq_user_api2_ae_setHdrExpAttr(ctx, HdrExpAttr); return 0; } static int sample_set_ae_speed(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; //set ae speed expSwAttr.stAuto.stAeSpeed.DampOver = 0.8f; expSwAttr.stAuto.stAeSpeed.DampDark2Bright = 0.8f; expSwAttr.stAuto.stAeSpeed.DampUnder = 0.8f; expSwAttr.stAuto.stAeSpeed.DampBright2Dark = 0.8f; ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } static int sample_set_ae_delay(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync) { XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t expSwAttr; ret = rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); expSwAttr.sync.sync_mode = sync; expSwAttr.sync.done = false; //set ae delay expSwAttr.stAuto.BlackDelayFrame = 10; expSwAttr.stAuto.WhiteDelayFrame = 15; ret = rk_aiq_user_api2_ae_setExpSwAttr(ctx, expSwAttr); return 0; } XCamReturn sample_ae_module (const void *arg) { int key = -1; CLEAR(); const demo_context_t *demo_ctx = (demo_context_t *)arg; const rk_aiq_sys_ctx_t* ctx; if (demo_ctx->camGroup) { ctx = (rk_aiq_sys_ctx_t*)(demo_ctx->camgroup_ctx); } else { ctx = (rk_aiq_sys_ctx_t*)(demo_ctx->aiq_ctx); } if (ctx == nullptr) { ERR ("%s, ctx is nullptr\n", __FUNCTION__); return XCAM_RETURN_ERROR_PARAM; } Uapi_ExpWin_t ExpWin; Uapi_ExpSwAttrV2_t expSwAttr; do { sample_ae_usage (); key = getchar (); while (key == '\n' || key == '\r') key = getchar (); printf ("\n"); switch (key) { case '0': sample_set_ae_speed(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set ae speed\n\n"); break; case '1': sample_set_ae_delay(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set ae delay\n\n"); break; case '2': sample_set_exp_manual(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set exp manual\n\n"); break; case '3': sample_set_exp_auto(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set exp auto\n\n"); break; case '4': sample_set_time_manual_and_gain_auto(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set manual time & auto gain\n\n"); break; case '5': sample_set_time_auto_and_gain_manual(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set auto time & manual gain\n\n"); break; case '6': sample_set_time_range(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set time range\n\n"); break; case '7': sample_get_time_range(ctx); printf("get time range\n\n"); break; case '8': sample_set_gain_range(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set gain range\n\n"); break; case '9': sample_get_gain_range(ctx); printf("get gain range\n\n"); break; case 'a': sample_is_fps_fix(ctx, true, RK_AIQ_UAPI_MODE_DEFAULT); printf("set fix fps\n\n"); break; case 'b': sample_is_fps_fix(ctx, false, RK_AIQ_UAPI_MODE_DEFAULT); printf("set auto fps\n\n"); break; case 'c': sample_set_anti_flicker(ctx, true, AECV2_FLICKER_FREQUENCY_50HZ, AECV2_ANTIFLICKER_AUTO_MODE, RK_AIQ_UAPI_MODE_DEFAULT); printf("set anti_flicker frequency 50HZ\n\n"); break; case 'd': sample_set_anti_flicker(ctx, true, AECV2_FLICKER_FREQUENCY_60HZ, AECV2_ANTIFLICKER_NORMAL_MODE, RK_AIQ_UAPI_MODE_DEFAULT); printf("set anti_flicker frequency 60HZ\n\n"); break; case 'e': sample_set_anti_flicker(ctx, false, AECV2_FLICKER_FREQUENCY_50HZ, AECV2_ANTIFLICKER_AUTO_MODE, RK_AIQ_UAPI_MODE_DEFAULT); printf("set anti_flicker disable\n\n"); break; case 'f': sample_set_gridweight(ctx, 0, RK_AIQ_UAPI_MODE_DEFAULT); printf("set grid weight directly\n\n"); break; case 'g': sample_set_gridweight(ctx, 1, RK_AIQ_UAPI_MODE_DEFAULT); printf("set grid weight using stadvanced\n\n"); break; case 'h': sample_set_ae_onoff(ctx, true); printf("set ae on\n\n"); break; case 'i': sample_set_ae_onoff(ctx, false); printf("set ae off\n\n"); break; case 'j': ExpWin.Params.h_offs = 0; ExpWin.Params.v_offs = 0; ExpWin.Params.h_size = 240; ExpWin.Params.v_size = 100; ExpWin.sync.sync_mode = RK_AIQ_UAPI_MODE_DEFAULT; rk_aiq_user_api2_ae_setExpWinAttr(ctx, ExpWin); printf("set exp windows[0,0,240,100]\n\n"); break; case 'k': sample_set_BackLightCtrl(ctx, true, 100.0f, RK_AIQ_UAPI_MODE_DEFAULT); printf("set back_light_ctrl\n\n"); break; case 'l': sample_set_OverExpCtrl(ctx, true, -100.0f, RK_AIQ_UAPI_MODE_DEFAULT); printf("set over_exp_ctrl\n\n"); break; case 'm': sample_set_exp_ratio_type(ctx, AECV2_HDR_RATIOTYPE_MODE_AUTO, 50.0f, RK_AIQ_UAPI_MODE_DEFAULT); printf("set hdr exp ratio\n\n"); break; case 'n': sample_set_linear_route(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set linear route\n\n"); break; case 'o': sample_set_hdr_mframe_params(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set hdr mframe params\n\n"); break; // TEST SYNC MODE case 'W': sample_set_exp_manual(ctx, RK_AIQ_UAPI_MODE_DEFAULT); printf("set exp manual, sync mode.\n\n"); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); usleep(40 * 1000); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); break; case 'X': sample_set_exp_manual(ctx, RK_AIQ_UAPI_MODE_SYNC); printf("set exp manual, sync mode.\n\n"); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); usleep(40 * 1000); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); break; case 'Y': sample_set_exp_manual(ctx, RK_AIQ_UAPI_MODE_ASYNC); printf("set exp manual, async mode.\n\n"); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); usleep(40 * 1000); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); break; case 'Z': sample_set_exp_manual(ctx, RK_AIQ_UAPI_MODE_ASYNC); printf("set exp manual, async mode(two groups).\n\n"); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); printf("\t get time = %f gain = %f\n", expSwAttr.stManual.LinearAE.TimeValue, expSwAttr.stManual.LinearAE.GainValue); sample_set_exp_manual_test(ctx, RK_AIQ_UAPI_MODE_ASYNC); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); printf("\t get time = %f gain = %f\n", expSwAttr.stManual.LinearAE.TimeValue, expSwAttr.stManual.LinearAE.GainValue); usleep(40 * 1000); memset(&expSwAttr, 0, sizeof(Uapi_ExpSwAttrV2_t)); rk_aiq_user_api2_ae_getExpSwAttr(ctx, &expSwAttr); printf("\t sync = %d, done = %d\n", expSwAttr.sync.sync_mode, expSwAttr.sync.done); printf("\t get time = %f gain = %f\n", expSwAttr.stManual.LinearAE.TimeValue, expSwAttr.stManual.LinearAE.GainValue); break; default: break; } } while (key != 'q' && key != 'Q'); return XCAM_RETURN_NO_ERROR; }