1. 概述:
Hal_Led控制模块
2. 测试:
3. 源码:
/*
From : https://github.com/paiminlin/PM
From : https://blog.csdn.net/lpaim/article/details/125649860
Author : PaiMin.lin
Date : 2022.8.24
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C"{
#endif
#ifndef HAL_LED_H_
#define HAL_LED_H_
#define HAL_LEDTASK_MAXNUM 100 /* 支持最多控制对象数量 */
typedef enum
{
HAL_LED_BRIGHT_STATUS = 0, /* 亮 */
HAL_LED_DARK_STATUS, /* 暗 */
HAL_LED_INVALID_STATUS, /* 无效 */
} Hal_Led_Status;
typedef int (*Hal_LedControl_Fun)(Hal_Led_Status enHalLedStatus);
typedef struct Hal_LedTask_Info
{
Hal_Led_Status enInitHalLedStatus; /* */
Hal_LedControl_Fun HalLedControlFun; /* */
} Hal_LedTask_Info;
typedef enum
{
HAL_LED_BRIGHT_MODE = 0, /* 常亮 */
HAL_LED_DARK_MODE, /* 常暗 */
HAL_LED_LIMITEDFLASH_MODE, /* 亮暗闪烁(有限) */
HAL_LED_UNLIMITEDFLASH_MODE, /* 亮暗闪烁(无限) */
HAL_LED_INVALID_MODE, /* 无效 */
}Hal_Led_Mode;
typedef struct Hal_LedFlash_Info
{
int RepeatTimes; /* 重复次数 */
int BrightTimes; /* 亮维持时间 * Hal_Led_Run */
int DarkTimes; /* 暗维持时间 * Hal_Led_Run */
} Hal_LedFlash_Info;
int Hal_Led_Run(void);
int Hal_Led_Init(void);
int Hal_Led_DeInit(void);
int Hal_Led_CreatTask(Hal_LedTask_Info * pstHalLedTaskInfo);
int Hal_Led_DestroyTask(int TaskNum, Hal_LedTask_Info * pstHalLedTaskInfo);
int Hal_Led_SetMode(int TaskNum, Hal_Led_Mode enHalLedMode,
Hal_LedFlash_Info stHalLedFlashInfo);
int Hal_Led_GetMode(int TaskNum, Hal_Led_Mode *penHalLedMode,
Hal_LedFlash_Info *pstHalLedFlashInfo);
#endif /* HAL_LED_H_ */
#ifdef __cplusplus
}
#endif
/*
From : https://github.com/paiminlin/PM
From : https://blog.csdn.net/lpaim/article/details/125649860
Author : PaiMin.lin
Date : 2022.8.24
*/
#include "Hal_Led.h"
#ifdef __cplusplus
extern "C"{
#endif
typedef struct Hal_Led_Info
{
bool bLedInit;
bool bLedTaskCreat[HAL_LEDTASK_MAXNUM];
Hal_Led_Mode enLedTaskMode[HAL_LEDTASK_MAXNUM];
Hal_LedFlash_Info stLedTaskFlashInfo[HAL_LEDTASK_MAXNUM];
} Hal_Led_Info;
static bool s_bUpdateLedTaskFlashFlage[HAL_LEDTASK_MAXNUM] = {0};
static Hal_LedFlash_Info s_stUpdateLedTaskFlashInfo[HAL_LEDTASK_MAXNUM] = {0};
static Hal_Led_Info s_stHalLedInfo = {0};
static Hal_LedTask_Info s_stHalLedTaskInfo[HAL_LEDTASK_MAXNUM] = {0};
int Hal_Led_Run(void)
{
if(s_stHalLedInfo.bLedInit == false)
return 0;
int TaskNum = 0;
for(TaskNum = 0; TaskNum < HAL_LEDTASK_MAXNUM; TaskNum ++)
{
if(s_stHalLedInfo.enLedTaskMode[TaskNum] == HAL_LED_BRIGHT_MODE)
{
if(s_stHalLedTaskInfo[TaskNum].HalLedControlFun != NULL)
s_stHalLedTaskInfo[TaskNum].HalLedControlFun(HAL_LED_BRIGHT_STATUS);
}
else if(s_stHalLedInfo.enLedTaskMode[TaskNum] == HAL_LED_DARK_MODE)
{
if(s_stHalLedTaskInfo[TaskNum].HalLedControlFun != NULL)
s_stHalLedTaskInfo[TaskNum].HalLedControlFun(HAL_LED_DARK_STATUS);
}
else if(s_stHalLedInfo.enLedTaskMode[TaskNum] == HAL_LED_LIMITEDFLASH_MODE)
{
if(s_bUpdateLedTaskFlashFlage[TaskNum] == true)
{
s_bUpdateLedTaskFlashFlage[TaskNum] = false;
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes;
}
if(s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes > 0)
{
if(s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes > 0)
{
if(s_stHalLedTaskInfo[TaskNum].HalLedControlFun != NULL)
s_stHalLedTaskInfo[TaskNum].HalLedControlFun(HAL_LED_BRIGHT_STATUS);
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes --;
}
else if(s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes > 0)
{
if(s_stHalLedTaskInfo[TaskNum].HalLedControlFun != NULL)
s_stHalLedTaskInfo[TaskNum].HalLedControlFun(HAL_LED_DARK_STATUS);
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes --;
}
if(s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes == 0
&& s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes == 0)
{
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes --;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes;
}
}
else
{
s_stHalLedInfo.enLedTaskMode[TaskNum] = HAL_LED_DARK_MODE;
}
}
else if(s_stHalLedInfo.enLedTaskMode[TaskNum] == HAL_LED_UNLIMITEDFLASH_MODE)
{
if(s_bUpdateLedTaskFlashFlage[TaskNum] == true)
{
s_bUpdateLedTaskFlashFlage[TaskNum] = false;
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes;
}
if(s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes > 0)
{
if(s_stHalLedTaskInfo[TaskNum].HalLedControlFun != NULL)
s_stHalLedTaskInfo[TaskNum].HalLedControlFun(HAL_LED_BRIGHT_STATUS);
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes --;
}
else if(s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes > 0)
{
if(s_stHalLedTaskInfo[TaskNum].HalLedControlFun != NULL)
s_stHalLedTaskInfo[TaskNum].HalLedControlFun(HAL_LED_DARK_STATUS);
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes --;
}
if(s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes == 0
&& s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes == 0)
{
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes;
}
}
}
return 0;
}
int Hal_Led_Init(void)
{
if(s_stHalLedInfo.bLedInit == true)
return 0;
s_stHalLedInfo.bLedInit = true;
int TaskNum = 0;
for(TaskNum = 0; TaskNum < HAL_LEDTASK_MAXNUM; TaskNum ++)
{
s_bUpdateLedTaskFlashFlage[TaskNum] = false;
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedInfo.bLedTaskCreat[TaskNum] = false;
s_stHalLedInfo.enLedTaskMode[TaskNum] = HAL_LED_INVALID_MODE;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedTaskInfo[TaskNum].enInitHalLedStatus = HAL_LED_INVALID_STATUS;
s_stHalLedTaskInfo[TaskNum].HalLedControlFun = NULL;
}
return 0;
}
int Hal_Led_DeInit(void)
{
if(s_stHalLedInfo.bLedInit == false)
return 0;
s_stHalLedInfo.bLedInit = false;
int TaskNum = 0;
for(TaskNum = 0; TaskNum < HAL_LEDTASK_MAXNUM; TaskNum ++)
{
s_bUpdateLedTaskFlashFlage[TaskNum] = false;
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedInfo.bLedTaskCreat[TaskNum] = false;
s_stHalLedInfo.enLedTaskMode[TaskNum] = HAL_LED_INVALID_MODE;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedTaskInfo[TaskNum].enInitHalLedStatus = HAL_LED_INVALID_STATUS;
s_stHalLedTaskInfo[TaskNum].HalLedControlFun = NULL;
}
return 0;
}
int Hal_Led_CreatTask(Hal_LedTask_Info * pstHalLedTaskInfo)
{
if(s_stHalLedInfo.bLedInit == false)
return -1;
if(pstHalLedTaskInfo == NULL)
return -1;
int TaskNum = 0;
for(TaskNum = 0; TaskNum <HAL_LEDTASK_MAXNUM; TaskNum ++)
{
if(s_stHalLedTaskInfo[TaskNum].enInitHalLedStatus == HAL_LED_INVALID_STATUS
&& s_stHalLedTaskInfo[TaskNum].HalLedControlFun == NULL)
{
s_bUpdateLedTaskFlashFlage[TaskNum] = false;
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedInfo.bLedTaskCreat[TaskNum] = true;
s_stHalLedInfo.enLedTaskMode[TaskNum] = HAL_LED_INVALID_MODE;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedTaskInfo[TaskNum].enInitHalLedStatus = pstHalLedTaskInfo->enInitHalLedStatus;
s_stHalLedTaskInfo[TaskNum].HalLedControlFun = pstHalLedTaskInfo->HalLedControlFun;
if(pstHalLedTaskInfo->HalLedControlFun != NULL)
pstHalLedTaskInfo->HalLedControlFun(pstHalLedTaskInfo->enInitHalLedStatus);
return TaskNum;
}
}
return -1;
}
int Hal_Led_DestroyTask(int TaskNum, Hal_LedTask_Info * pstHalLedTaskInfo)
{
if(s_stHalLedInfo.bLedInit == false)
return -1;
if(TaskNum < 0 || TaskNum >= HAL_LEDTASK_MAXNUM
|| pstHalLedTaskInfo == NULL)
return -1;
if(s_stHalLedTaskInfo[TaskNum].enInitHalLedStatus == pstHalLedTaskInfo->enInitHalLedStatus
&& s_stHalLedTaskInfo[TaskNum].HalLedControlFun == pstHalLedTaskInfo->HalLedControlFun)
{
s_bUpdateLedTaskFlashFlage[TaskNum] = false;
s_stUpdateLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stUpdateLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedInfo.bLedTaskCreat[TaskNum] = false;
s_stHalLedInfo.enLedTaskMode[TaskNum] = HAL_LED_INVALID_MODE;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes = 0;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes = 0;
s_stHalLedTaskInfo[TaskNum].enInitHalLedStatus = HAL_LED_INVALID_STATUS;
s_stHalLedTaskInfo[TaskNum].HalLedControlFun = NULL;
return 0;
}
return -1;
}
int Hal_Led_SetMode(int TaskNum, Hal_Led_Mode enLedTaskMode,
Hal_LedFlash_Info stLedTaskFlashInfo)
{
if(TaskNum < 0 || TaskNum >= HAL_LEDTASK_MAXNUM)
return -1;
if(s_stHalLedInfo.bLedTaskCreat[TaskNum] == false)
return -1;
s_bUpdateLedTaskFlashFlage[TaskNum] = true;
s_stHalLedInfo.enLedTaskMode[TaskNum] = enLedTaskMode;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes = stLedTaskFlashInfo.RepeatTimes;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes = stLedTaskFlashInfo.BrightTimes;
s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes = stLedTaskFlashInfo.DarkTimes;
return 0;
}
int Hal_Led_GetMode(int TaskNum, Hal_Led_Mode *penLedTaskMode,
Hal_LedFlash_Info *pstLedTaskFlashInfo)
{
if(TaskNum < 0 || TaskNum >= HAL_LEDTASK_MAXNUM
|| penLedTaskMode == NULL || pstLedTaskFlashInfo == NULL)
return -1;
*penLedTaskMode = s_stHalLedInfo.enLedTaskMode[TaskNum];
if(*penLedTaskMode == HAL_LED_LIMITEDFLASH_MODE
|| *penLedTaskMode == HAL_LED_UNLIMITEDFLASH_MODE)
{
pstLedTaskFlashInfo->RepeatTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].RepeatTimes;
pstLedTaskFlashInfo->BrightTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].BrightTimes;
pstLedTaskFlashInfo->DarkTimes = s_stHalLedInfo.stLedTaskFlashInfo[TaskNum].DarkTimes;
}
else
{
pstLedTaskFlashInfo->RepeatTimes = 0;
pstLedTaskFlashInfo->BrightTimes = 0;
pstLedTaskFlashInfo->DarkTimes = 0;
}
return 0;
}
#ifdef __cplusplus
}
#endif
版权声明:本文为lpaim原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。