记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

LiSun

记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用例子:

任意地点初始化:app_led_init();

app_led_indicate(灯号,灯光类型,周期时间,重装载值);

注:需要先实现对应PWM函数

文件代码如下
app_led.c

/********************************************************************************
* @file    app_led.c
* @author  jianqiang.xue
* @Version V1.0.0
* @Date    2021-04-20
* @brief   LED灯光效果
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#include "os_api.h"
#include "app_led.h"
#include "log.h"
/* Private includes ----------------------------------------------------------*/
#include "business_gpio.h"
#include "business_function.h"
#if BS_APP_LED_DRIVEN_MODE == 0
#include "bsp_pwm.h"
#elif BS_APP_LED_DRIVEN_MODE == 1
#include "bsp_led.h"
#endif
/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/
void app_led(void const *argument);

/* Private typedef -----------------------------------------------------------*/
#if BS_APP_LED_DRIVEN_MODE == 0
extern void led_pwm_init(void);
extern bool app_set_pwm_parameter(app_led_id_t led_id, uint8_t level_logic, uint16_t period_max);
extern bool app_led_ioctl(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#elif BS_APP_LED_DRIVEN_MODE == 1
extern void led_gpio_init(void);
extern bool app_led_ioctl(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#elif BS_APP_LED_DRIVEN_MODE == 2
extern void led_ws2812_init(void);
extern bool app_led_ioctl(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#endif

// 定义线程,用于接收邮件消息
os_thread_id task_led_id;
os_thread_def(app_led, OS_PRIORITY_NORMAL, 1, 136);

// 定义邮箱,用于发送灯光命令
typedef struct
{
    app_led_id_t   led_id;
    app_led_type_t type;
    uint16_t       cycle_time;
    uint16_t       period;
} led_msgqueue_t;

static os_pool_id pool_led_id = NULL;
os_pool_def(pool_led, 5, led_msgqueue_t);

static os_message_qid msg_led_id = NULL;
os_message_qdef(msg_led, 5, led_msgqueue_t);
/************************************[灯光操作]对外接口函数************************************/

bool app_led_indicate(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period)
{
    if (pool_led_id == NULL || msg_led_id == NULL)
    {
        return false;
    }
    led_msgqueue_t *pmsg = NULL;
    pmsg = os_pool_calloc(pool_led_id);
    if (pmsg)
    {
        pmsg->led_id     = led_id;
        pmsg->type       = type;
        pmsg->cycle_time = cycle_time;
        pmsg->period     = period;
        if (os_message_put(msg_led_id, (uint32_t)pmsg, 0) != OS_OK)
        {
            os_pool_free(pool_led_id, pmsg);
            return false;
        }
    }
    return true;
}

/**
  * @brief  线程任务:LED操作
  */
void app_led(void const *argument)
{
    os_event evt;
    led_msgqueue_t *pmsg = NULL;
    while (1)
    {
        evt = os_message_get(msg_led_id, OS_WAIT_FOREVER);
        if (evt.status == OS_EVENT_MESSAGE)
        {
            pmsg = evt.value.p;
            if (pmsg)
            {
                app_led_ioctl(pmsg->led_id, pmsg->type, pmsg->cycle_time, pmsg->period);
                os_pool_free(pool_led_id, pmsg);
            }
        }
    }
}

/**
  * @brief  灯光功能初始化
  */
bool app_led_init(void)
{
#if BS_APP_LED_DRIVEN_MODE == 0
    // 外设tim初始化
    bsp_pwm_init();
    // [app] 软定时器创建和参数填充
    led_pwm_init();
    // 初始化pwm
    app_set_pwm_parameter(BS_LIGHT_LAMP_CHANNEL, BS_TIM1_LEVEL_LOGIC, BS_TIM1_PERIOD);
    app_set_pwm_parameter(BS_BATTERY_LAMP_CHANNEL, BS_TIM1_LEVEL_LOGIC, BS_TIM1_PERIOD);
#elif BS_APP_LED_DRIVEN_MODE == 1
    // gpio初始化
    bsp_led_init();
    // [app] 软定时器创建和参数填充
    led_gpio_init();
#elif BS_APP_LED_DRIVEN_MODE == 2
#endif

    pool_led_id = os_pool_create(os_pool(pool_led));
    if (!pool_led_id)
        return false;
    msg_led_id = os_message_create(os_messageq(msg_led), NULL);
    if (!msg_led_id)
        return false;
    task_led_id = os_thread_create(os_thread(app_led), "led");
    if (!task_led_id)
        return false;
    return true;
}

app_led.h

/********************************************************************************
* @file    app_led.h
* @author  jianqiang.xue
* @Version V1.0.0
* @Date    2021-04-20
* @brief   LED灯光效果
********************************************************************************/

#ifndef __APP_LED_H
#define __APP_LED_H

#include <stdint.h>
#include <stdbool.h>

typedef enum
{
    LED_TYPE_OFF = 0,
    LED_TYPE_LIGHT,
    LED_TYPE_BREATH,
    LED_TYPE_BREATH_LAMP,
    LED_TYPE_TWINKLE,
    LED_TYPE_SOS,
    LED_TYPE_RISE_SLOWLY,
    LED_TYPE_FALL_SLOWLY,
    LED_TYPE_MAX,
} app_led_type_t;

typedef enum
{
    APP_LED_ID_0 = 0,
    APP_LED_ID_1,
    APP_LED_ID_2,
    APP_LED_ID_3
} app_led_id_t;

bool app_led_init(void);
uint16_t app_led_get_current_period(app_led_id_t led_id);
bool app_led_indicate(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#endif

posted on 2022-08-13 11:00  嵌入式单片机实验室  阅读(76)  评论(0)    收藏  举报
记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。