THB2/bthome_phy6222/SDK/components/driver/led_light/led_light.c

260 lines
5.7 KiB
C

/*************
led_light.h
SDK_LICENSE
***************/
#include "led_light.h"
#include "pwm.h"
#include "OSAL.h"
#include "gpio.h"
#include "error.h"
static uint16_t s_light[3];
static light_blink_cfg_t s_lightBlink;
static pwm_ch_t pwm_ch[3];
static gpio_pin_e* led_pin_ptr = NULL;
static uint16_t led_pin_num = 0;
static void light_start_timer(void)
{
//osal_start_timerEx(AppWrist_TaskID, TIMER_LIGHT_EVT, 30*1000);
}
static void light_stop_timer(void)
{
//osal_stop_timerEx(AppWrist_TaskID, TIMER_LIGHT_EVT);
}
void light_reflash(void)
{
pwm_ch[0].cmpVal = s_light[0];
pwm_ch[1].cmpVal = s_light[1];
pwm_ch[2].cmpVal = s_light[2];
hal_pwm_ch_start(pwm_ch[0]);
hal_pwm_ch_start(pwm_ch[1]);
hal_pwm_ch_start(pwm_ch[2]);
if(s_light[LIGHT_RED] + s_light[LIGHT_GREEN] + s_light[LIGHT_BLUE])
{
light_stop_timer();
light_start_timer();
}
else
{
light_stop_timer();
}
}
void light_timeout_handle(void)
{
// s_light[0] = 0;
// s_light[1] = 0;
// s_light[2] = 0;
// hal_pwm_close_channel(PWM_CH0);
// hal_pwm_destroy(PWM_CH0);
// hal_pwm_close_channel(PWM_CH1);
// hal_pwm_destroy(PWM_CH1);
// hal_pwm_close_channel(PWM_CH2);
// hal_pwm_destroy(PWM_CH2);
// hal_pwm_stop();
// hal_gpio_pin_init(GPIO_GREEN, IE);
// hal_gpio_pin_init(GPIO_RED, IE);
// hal_gpio_pin_init(GPIO_BLUE, IE);
// hal_gpio_pull_set(GPIO_GREEN, WEAK_PULL_UP);
// hal_gpio_pull_set(GPIO_RED, WEAK_PULL_UP);
// hal_gpio_pull_set(GPIO_BLUE, WEAK_PULL_UP);
}
int light_config(uint8_t ch, uint16_t value)
{
if(ch >2 || (value > LIGHT_TOP_VALUE))
{
return PPlus_ERR_INVALID_PARAM;
}
s_light[ch] = (uint16_t)value;
return PPlus_SUCCESS;
}
int light_ctrl(uint8_t ch, uint16_t value)
{
if(ch >2 || (value > LIGHT_TOP_VALUE))
{
return PPlus_ERR_INVALID_PARAM;
}
s_light[ch] = (uint16_t)value;
light_reflash();
return PPlus_SUCCESS;
}
static void led_init(gpio_pin_e* pin_ptr,uint16_t pin_num)
{
gpio_pin_e pin;
for(int i = 0; i < pin_num; i++)
{
pin = *(pin_ptr + i);
hal_gpio_pin_init(pin,IE);
hal_gpio_pull_set(pin,WEAK_PULL_UP);
}
}
int light_init(gpio_pin_e* pin_ptr,uint16_t pin_num)
{
if((pin_ptr == NULL) || (pin_num == 0))
{
return PPlus_ERR_INVALID_PARAM;
}
else
{
led_pin_ptr = pin_ptr;
led_pin_num = pin_num;
}
led_init(led_pin_ptr,led_pin_num);
s_light[LIGHT_GREEN] = 0;
s_light[LIGHT_BLUE] = 0;
s_light[LIGHT_RED] = 0;
osal_memset(&s_lightBlink, 0, sizeof(s_lightBlink));
s_lightBlink.val0 = LIGHT_TURN_OFF;
s_lightBlink.val1 = LIGHT_TURN_ON;
light_pwm_init();
return PPlus_SUCCESS;
}
void light_pwm_init(void)
{
hal_pwm_module_init();
for(unsigned int i = 0; i < sizeof(pwm_ch)/sizeof(pwm_ch[0]); i++)
{
pwm_ch[i].pwmN = (PWMN_e)(PWM_CH0 + (PWMN_e)i);
pwm_ch[i].pwmPin = GPIO_DUMMY;
pwm_ch[i].pwmDiv = PWM_CLK_NO_DIV;
pwm_ch[i].pwmMode = PWM_CNT_UP;
pwm_ch[i].pwmPolarity = PWM_POLARITY_RISING;
pwm_ch[i].cmpVal = 0;
pwm_ch[i].cntTopVal = LIGHT_TOP_VALUE;
}
pwm_ch[0].pwmPin = *(led_pin_ptr + 0);
pwm_ch[1].pwmPin = *(led_pin_ptr + 1);
pwm_ch[2].pwmPin = *(led_pin_ptr + 2);
}
void light_pwm_deinit(void)
{
hal_pwm_ch_stop(pwm_ch[0]);
hal_pwm_ch_stop(pwm_ch[1]);
hal_pwm_ch_stop(pwm_ch[2]);
hal_pwm_module_deinit();
}
int light_blink_evt_cfg(uint8_t task_id,uint16_t event_id)
{
if(s_lightBlink.status == 0)
{
s_lightBlink.task_id = task_id;
s_lightBlink.event_id = event_id;
return PPlus_SUCCESS;
}
else
{
return PPlus_ERR_BUSY;
}
}
int light_blink_set(uint8_t light,uint8 blinkIntv,uint8 blinkCnt)
{
if(s_lightBlink.status == 0)
{
s_lightBlink.light = light;
s_lightBlink.tagCnt = blinkCnt;
s_lightBlink.intv = blinkIntv;
s_lightBlink.status = 1;
if(s_lightBlink.task_id > 0 && s_lightBlink.event_id > 0)
{
light_ctrl(LIGHT_RED,0);
light_ctrl(LIGHT_GREEN,0);
light_ctrl(LIGHT_BLUE,0);
s_lightBlink.curCnt = 0;
osal_set_event(s_lightBlink.task_id, s_lightBlink.event_id);
}
else
{
return PPlus_ERR_NOT_FOUND;
}
return PPlus_SUCCESS;
}
else
{
return PPlus_ERR_BUSY;
}
}
void light_blink_porcess_evt(void)
{
if(s_lightBlink.curCnt == (s_lightBlink.tagCnt*2) )
{
light_ctrl(LIGHT_RED,0);
light_ctrl(LIGHT_GREEN,0);
light_ctrl(LIGHT_BLUE,0);
osal_stop_timerEx( s_lightBlink.task_id, s_lightBlink.event_id);
s_lightBlink.status = 0;
}
else
{
if(s_lightBlink.curCnt&0x01)
{
light_ctrl(s_lightBlink.light,s_lightBlink.val1);
}
else
{
light_ctrl(s_lightBlink.light,s_lightBlink.val0);
}
s_lightBlink.curCnt++;
osal_start_timerEx(s_lightBlink.task_id, s_lightBlink.event_id,s_lightBlink.intv*100);
}
}
void light_color_quickSet(light_color_t color)
{
switch ( color )
{
case LIGHT_COLOR_OFF:
LIGHT_ON_OFF(0,0,0);
break;
case LIGHT_COLOR_RED:
LIGHT_ONLY_RED_ON;
break;
case LIGHT_COLOR_GREEN:
LIGHT_ONLY_GREEN_ON;
break;
case LIGHT_COLOR_BLUE:
LIGHT_ONLY_BLUE_ON;
break;
case LIGHT_COLOR_CYAN:
LIGHT_ON_CYAN;
break;
case LIGHT_COLOR_YELLOW:
LIGHT_ON_YELLOW;
break;
case LIGHT_COLOR_MEGENTA:
LIGHT_ON_MEGENTA;
break;
case LIGHT_COLOR_WHITE:
LIGHT_ON_WHITE;
break;
default:
break;
}
}