void light_dh_pwm_adj_proc(void *Targ) {
	uint8 i;
	for (i = 0; i < PWM_CHANNEL; i++) {
		duty_now[i] = (duty_now[i] * 15 + current_duty[i]) >> 4;
		if ( ABS_MINUS(duty_now[i],current_duty[i]) < 20)
			duty_now[i] = current_duty[i];
		user_light_set_duty(duty_now[i], i);
	}

	//os_printf("duty:%u,%u,%u\r\n", pwm.duty[0],pwm.duty[1],pwm.duty[2] );
	pwm_start();

	if (check_pwm_current_duty_diff()) {
		change_finish = 0;
		os_timer_disarm(&timer_pwm_adj);
		os_timer_setfn(&timer_pwm_adj,
				(os_timer_func_t *) light_dh_pwm_adj_proc, NULL);
		os_timer_arm(&timer_pwm_adj, min_ms, 0);
	} else {
		os_printf("finish\n");
		change_finish = 1;
		//light_save_target_duty();
		os_timer_disarm(&timer_pwm_adj);
		light_pwm_smooth_adj_proc();
	}

}
void light_pwm_dh_adj_proc(void *Targ)
{
    uint8 i;
    for(i=0;i<PWM_CHANNEL;i++){ 
        
        duty_now[i] = (duty_now[i]*7 + current_duty[i])>>3;
        
        if( ABS_MINUS(duty_now[i],current_duty[i])<20 ){
            duty_now[i] = current_duty[i];
        }
        user_light_set_duty(duty_now[i],i);
    }
    //printf("duty:%u,%u,%u\r\n", duty_now[0],duty_now[1],duty_now[2] );
//    pwm_init(light_param.pwm_period, light_param.pwm_duty,PWM_CHANNEL,pwmio_info); //lujian
    
    pwm_start();	
    if(check_pwm_current_duty_diff()){
        change_finish = 0;
        os_timer_disarm(&timer_pwm_adj);
        os_timer_setfn(&timer_pwm_adj, (os_timer_func_t *)light_pwm_dh_adj_proc, NULL);
        os_timer_arm(&timer_pwm_adj, min_ms, 0);
    }
    else{
        //printf("finish\n");
        change_finish = 1;  
        //light_save_target_duty();
        os_timer_disarm(&timer_pwm_adj);
        light_pwm_smooth_adj_proc();
    }

}
void ICACHE_FLASH_ATTR
light_set_aim_ww(uint32 ww) {
	current_duty[LIGHT_WARM_WHITE] = ww;
	light_pwm_smooth_adj_proc();
}
void ICACHE_FLASH_ATTR
light_set_aim_cw(uint32 cw) {
	current_duty[LIGHT_COLD_WHITE] = cw;
	light_pwm_smooth_adj_proc();
}
void ICACHE_FLASH_ATTR
light_set_aim_b(uint32 b) {
	current_duty[LIGHT_BLUE] = b;
	light_pwm_smooth_adj_proc();
}
void ICACHE_FLASH_ATTR
light_set_aim_g(uint32 g) {
	current_duty[LIGHT_GREEN] = g;
	light_pwm_smooth_adj_proc();
}
void ICACHE_FLASH_ATTR
light_set_aim_r(uint32 r) {
	current_duty[LIGHT_RED] = r;
	light_pwm_smooth_adj_proc();
}
void ICACHE_FLASH_ATTR
light_set_aim(uint32 r, uint32 g, uint32 b, uint32 cw, uint32 ww, uint32 period) {
	struct pwm_param *tmp = LightEvtMalloc();
	if (tmp != NULL) {
		tmp->period = (period < 10000 ? period : 10000);
		uint32 duty_max_limit = (period * 1000 / 45);

		tmp->duty[LIGHT_RED] = (r < duty_max_limit ? r : duty_max_limit);
		tmp->duty[LIGHT_GREEN] = (g < duty_max_limit ? g : duty_max_limit);
		tmp->duty[LIGHT_BLUE] = (b < duty_max_limit ? b : duty_max_limit);
		tmp->duty[LIGHT_COLD_WHITE] = (cw < duty_max_limit ? cw : duty_max_limit);
		tmp->duty[LIGHT_WARM_WHITE] = (ww < duty_max_limit ? ww : duty_max_limit); //chg

#if LIGHT_CURRENT_LIMIT
		uint32 cur_r,cur_g,cur_b,cur_rgb;

		//if(cw>0 || ww>0){
		cur_r = light_get_cur(tmp->duty[LIGHT_RED] , LIGHT_RED, tmp->period);

		cur_g = light_get_cur(tmp->duty[LIGHT_GREEN] , LIGHT_GREEN, tmp->period);
		cur_b = light_get_cur(tmp->duty[LIGHT_BLUE] , LIGHT_BLUE, tmp->period);
		cur_rgb = (cur_r+cur_g+cur_b);
		//}
		uint32 cur_cw = light_get_cur( tmp->duty[LIGHT_COLD_WHITE],LIGHT_COLD_WHITE, tmp->period);
		uint32 cur_ww = light_get_cur( tmp->duty[LIGHT_WARM_WHITE],LIGHT_WARM_WHITE, tmp->period);
		uint32 cur_remain,cur_mar;
		cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN);
		cur_mar = LIGHT_CURRENT_MARGIN;

		/*
		 if((cur_cw < 50000) || (cur_ww < 50000)){
		 cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN);
		 cur_mar = LIGHT_CURRENT_MARGIN;
		 }else if((cur_cw < 99000) || (cur_ww < 99000)){
		 cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L2);
		 cur_mar = LIGHT_CURRENT_MARGIN_L2;
		 }else{
		 cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L3);
		 cur_mar = LIGHT_CURRENT_MARGIN_L2;
		 }

		 */

		/*
		 if((LIGHT_TOTAL_CURRENT_MAX-cur_rgb)>120){
		 cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN);
		 cur_mar = LIGHT_CURRENT_MARGIN;
		 }else if((LIGHT_TOTAL_CURRENT_MAX-cur_rgb)>100){
		 cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L2);
		 cur_mar = LIGHT_CURRENT_MARGIN_L2;
		 }else{
		 cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L3);
		 cur_mar = LIGHT_CURRENT_MARGIN_L2;
		 }
		 */

		os_printf("cur_remain: %d \r\n",cur_remain);
		while((cur_cw+cur_ww) > cur_remain) {
			tmp->duty[LIGHT_COLD_WHITE] = tmp->duty[LIGHT_COLD_WHITE] * 9 / 10;
			tmp->duty[LIGHT_WARM_WHITE] = tmp->duty[LIGHT_WARM_WHITE] * 9 / 10;
			cur_cw = light_get_cur( tmp->duty[LIGHT_COLD_WHITE],LIGHT_COLD_WHITE, tmp->period);
			cur_ww = light_get_cur( tmp->duty[LIGHT_WARM_WHITE],LIGHT_WARM_WHITE, tmp->period);
		}
		os_printf("debug : %d %d %d %d %d\r\n",cur_r/1000,cur_g/1000,cur_b/1000,cur_cw/1000,cur_ww/1000);

		os_printf("debug:total current after adj : %d + %d mA \r\n",(cur_cw+cur_ww+cur_r+cur_g+cur_b)/1000,cur_mar/1000);
#endif

		os_printf("prd:%u  r : %u  g: %u  b: %u  cw: %u  ww: %u \r\n", period,
				tmp->duty[0], tmp->duty[1], tmp->duty[2], tmp->duty[3],
				tmp->duty[4]);
		light_pwm_smooth_adj_proc();
	} else {
		os_printf("light para full\n");
	}
}
void  
light_set_aim_b(uint32 b)
{
    current_duty[LIGHT_BLUE]=b;
    light_pwm_smooth_adj_proc();
}
void  
light_set_aim_g(uint32 g)
{
    current_duty[LIGHT_GREEN]=g;
    light_pwm_smooth_adj_proc();
}
void  
light_set_aim_r(uint32 r)
{
    current_duty[LIGHT_RED]=r;
    light_pwm_smooth_adj_proc();
}
void  
light_set_aim(uint32 r,uint32 g,uint32 b,uint32 cw,uint32 ww,uint32 period)
{
    struct pwm_param *tmp = LightEvtMalloc();    
    if(tmp != NULL){
        tmp->period = (period<1000?period:1000);
        tmp->duty[LIGHT_RED] = r*PWM_DEPTH/APP_MAX_PWM;
        tmp->duty[LIGHT_GREEN] = g*PWM_DEPTH/APP_MAX_PWM;
        tmp->duty[LIGHT_BLUE] = b*PWM_DEPTH/APP_MAX_PWM;
        tmp->duty[LIGHT_COLD_WHITE] = cw*PWM_DEPTH/APP_MAX_PWM;
        tmp->duty[LIGHT_WARM_WHITE] = ww*PWM_DEPTH/APP_MAX_PWM;//chg

#if LIGHT_CURRENT_LIMIT
        uint32 cur_r,cur_g,cur_b,cur_rgb;

        //if(cw>0 || ww>0){
        cur_r = light_get_cur(tmp->duty[LIGHT_RED] , LIGHT_RED, tmp->period);

        cur_g =  light_get_cur(tmp->duty[LIGHT_GREEN] , LIGHT_GREEN, tmp->period);
        cur_b =  light_get_cur(tmp->duty[LIGHT_BLUE] , LIGHT_BLUE, tmp->period);
        cur_rgb = (cur_r+cur_g+cur_b);
        //}
        uint32 cur_cw = light_get_cur( tmp->duty[LIGHT_COLD_WHITE],LIGHT_COLD_WHITE, tmp->period);
        uint32 cur_ww = light_get_cur( tmp->duty[LIGHT_WARM_WHITE],LIGHT_WARM_WHITE, tmp->period);
        uint32 cur_remain,cur_mar;
        cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN);
        cur_mar = LIGHT_CURRENT_MARGIN;

 /*
         if((cur_cw < 50000) || (cur_ww < 50000)){
            cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN);
            cur_mar = LIGHT_CURRENT_MARGIN;
        }else if((cur_cw < 99000) || (cur_ww < 99000)){
            cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L2);
            cur_mar = LIGHT_CURRENT_MARGIN_L2;
        }else{
            cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L3);
            cur_mar = LIGHT_CURRENT_MARGIN_L2;
        }
*/
         
/*
        if((LIGHT_TOTAL_CURRENT_MAX-cur_rgb)>120){
            cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN);
            cur_mar = LIGHT_CURRENT_MARGIN;
        }else if((LIGHT_TOTAL_CURRENT_MAX-cur_rgb)>100){
            cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L2);
            cur_mar = LIGHT_CURRENT_MARGIN_L2;
        }else{
            cur_remain = (LIGHT_TOTAL_CURRENT_MAX - cur_rgb -LIGHT_CURRENT_MARGIN_L3);
            cur_mar = LIGHT_CURRENT_MARGIN_L2;
        }
*/

        while((cur_cw+cur_ww) > cur_remain){
            tmp->duty[LIGHT_COLD_WHITE] =  tmp->duty[LIGHT_COLD_WHITE] * 9 / 10;
            tmp->duty[LIGHT_WARM_WHITE] =  tmp->duty[LIGHT_WARM_WHITE] * 9 / 10;
            cur_cw = light_get_cur( tmp->duty[LIGHT_COLD_WHITE],LIGHT_COLD_WHITE, tmp->period);
            cur_ww = light_get_cur( tmp->duty[LIGHT_WARM_WHITE],LIGHT_WARM_WHITE, tmp->period);
        }       
        printf("debug : %d %d %d %d %d\r\n",cur_r/1000,cur_g/1000,cur_b/1000,cur_cw/1000,cur_ww/1000);
        printf("debug:total current after adj : %d + %d mA \r\n",(cur_cw+cur_ww+cur_r+cur_g+cur_b)/1000,cur_mar/1000);
#endif
        printf("LIGHT p:%u  r : %u  g: %u  b: %u  cw: %u  ww: %u \r\n",period,
                     tmp->duty[0],tmp->duty[1],tmp->duty[2],tmp->duty[3],tmp->duty[4]);
        light_pwm_smooth_adj_proc();
    }
    else{
        printf("light para full\n");
    }
}