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");
	}
}
Esempio n. 2
0
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");
    }
}