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(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"); } }