1. 概述:
Hal_Key检测模块
2. 测试:
3. 源码:
/*
From : https://github.com/paiminlin/PM
From : https://blog.csdn.net/lpaim/article/details/126498161
Author : Paimin.lin
Date : 2022.8.23
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C"{
#endif
#ifndef HAL_KEY_H_
#define HAL_KEY_H_
#define HAL_KEYTASK_MAxnuM 100 /* 支持最多Task数量 */
typedef enum
{
HAL_KEY_PRESS_STATUS = 0, /* 按键按下或松开的状态 */
HAL_KEY_RELEASE_STATUS = 1,
HAL_KEY_INVALID_STATUS = 2,
}Hal_Key_Status;
typedef enum
{
HAL_KEY_SHORTPRESS_STATUS = 0, /* 按键短按或长按或抬起的状态 */
HAL_KEY_LONGPRESS_STATUS = 1,
HAL_KEY_RELEASEPRESS_STATUS = 2,
HAL_KEY_INVALIDPRESS_STATUS = 3,
}Hal_Key_Pressstatus;
typedef Hal_Key_Status (*Hal_KeyGetStatus_Fun)(void);
typedef int (*Hal_KeyHandle_Fun)(Hal_Key_Pressstatus enHalKeyPressstatus);
typedef struct Hal_Key_Attribute
{
int ShortPresstimes; /* 短按维持时间 * Hal_Key_Run */
int LongPresstimes; /* 长按维持时间 * Hal_Key_Run */
} Hal_Key_Attribute;
typedef struct Hal_KeyTask_Info
{
Hal_Key_Attribute stHalKeyAttribute; /* 按键短按和长按的属性 */
Hal_KeyGetStatus_Fun HalKeyGetStatusFun;/* 获取按键按下或松开的状态 */
Hal_KeyHandle_Fun HalKeyHandleFun; /* 触发按键短按或长按或抬起的行为 */
} Hal_KeyTask_Info;
int Hal_Key_Run(void);
int Hal_Key_Init(void);
int Hal_Key_DeInit(void);
int Hal_Key_CreatTask(Hal_KeyTask_Info * pstHalKeyTaskInfo);
int Hal_Key_DestroyTask(int TaskNum, Hal_KeyTask_Info * pstHalKeyTaskInfo);
#endif /* HAL_KEY_H_ */
#ifdef __cplusplus
}
#endif
/*
From : https://github.com/paiminlin/PM
From : https://blog.csdn.net/lpaim/article/details/126498161
Author : Paimin.lin
Date : 2022.8.23
*/
#include "Hal_Key.h"
#ifdef __cplusplus
extern "C"{
#endif
typedef struct Hal_Key_Info
{
bool bKeyInit;
bool bKeyTaskCreat[HAL_KEYTASK_MAxnuM];
int KeyPressDownTimes[HAL_KEYTASK_MAxnuM];
} Hal_Key_Info;
static Hal_Key_Info s_stHalKeyInfo = {0};
static Hal_KeyTask_Info s_stHalKeyTaskInfo[HAL_KEYTASK_MAxnuM] = {0};
int Hal_Key_Run(void)
{
if(s_stHalKeyInfo.bKeyInit == false)
return 0;
int TaskNum = 0;
Hal_Key_Status enKeyStatus = HAL_KEY_INVALID_STATUS;
for(TaskNum = 0; TaskNum < HAL_KEYTASK_MAxnuM; TaskNum ++)
{
if(s_stHalKeyInfo.bKeyTaskCreat[TaskNum] == true)
{
if(s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun != NULL)
{
enKeyStatus = s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun();
if(enKeyStatus == HAL_KEY_PRESS_STATUS)
{
s_stHalKeyInfo.KeyPressDownTimes[TaskNum] ++;
}
if(s_stHalKeyInfo.KeyPressDownTimes[TaskNum] == s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes)
{
if(s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun != NULL)
{
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun(HAL_KEY_SHORTPRESS_STATUS);
}
}
else if(s_stHalKeyInfo.KeyPressDownTimes[TaskNum] >= s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes
&& s_stHalKeyInfo.KeyPressDownTimes[TaskNum]%s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes == 0)
{
if(s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun != NULL)
{
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun(HAL_KEY_LONGPRESS_STATUS);
}
}
if(enKeyStatus == HAL_KEY_RELEASE_STATUS)
{
if(s_stHalKeyInfo.KeyPressDownTimes[TaskNum] >= s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes)
{
if(s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun != NULL)
{
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun(HAL_KEY_RELEASEPRESS_STATUS);
}
}
s_stHalKeyInfo.KeyPressDownTimes[TaskNum] = 0;
}
}
}
}
return 0;
}
int Hal_Key_Init(void)
{
if(s_stHalKeyInfo.bKeyInit == true)
return 0;
s_stHalKeyInfo.bKeyInit = true;
int TaskNum = 0;
for(TaskNum = 0; TaskNum < HAL_KEYTASK_MAxnuM; TaskNum ++)
{
s_stHalKeyInfo.bKeyTaskCreat[TaskNum] = false;
s_stHalKeyInfo.KeyPressDownTimes[TaskNum] = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes = 0;
s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun = NULL;
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun = NULL;
}
return 0;
}
int Hal_Key_DeInit(void)
{
if(s_stHalKeyInfo.bKeyInit == false)
return 0;
s_stHalKeyInfo.bKeyInit = false;
int TaskNum = 0;
for(TaskNum = 0; TaskNum < HAL_KEYTASK_MAxnuM; TaskNum ++)
{
s_stHalKeyInfo.bKeyTaskCreat[TaskNum] = false;
s_stHalKeyInfo.KeyPressDownTimes[TaskNum] = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes = 0;
s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun = NULL;
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun = NULL;
}
return 0;
}
int Hal_Key_CreatTask(Hal_KeyTask_Info * pstHalKeyTaskInfo)
{
if(s_stHalKeyInfo.bKeyInit == false)
return -1;
if(pstHalKeyTaskInfo == NULL)
return -1;
int TaskNum = 0;
for(TaskNum = 0; TaskNum < HAL_KEYTASK_MAxnuM; TaskNum ++)
{
if(s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun == NULL
&& s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun == NULL)
{
s_stHalKeyInfo.bKeyTaskCreat[TaskNum] = true;
s_stHalKeyInfo.KeyPressDownTimes[TaskNum] = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes = pstHalKeyTaskInfo->stHalKeyAttribute.ShortPresstimes;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes = pstHalKeyTaskInfo->stHalKeyAttribute.LongPresstimes;
s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun = pstHalKeyTaskInfo->HalKeyGetStatusFun;
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun = pstHalKeyTaskInfo->HalKeyHandleFun;
return TaskNum;
}
}
return -1;
}
int Hal_Key_DestroyTask(int TaskNum, Hal_KeyTask_Info * pstHalKeyTaskInfo)
{
if(s_stHalKeyInfo.bKeyInit == false)
return -1;
if(TaskNum < 0 || TaskNum >= HAL_KEYTASK_MAxnuM
|| pstHalKeyTaskInfo == NULL)
return -1;
if(s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes == pstHalKeyTaskInfo->stHalKeyAttribute.ShortPresstimes
&& s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes == pstHalKeyTaskInfo->stHalKeyAttribute.LongPresstimes
&& s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun == pstHalKeyTaskInfo->HalKeyGetStatusFun
&& s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun == pstHalKeyTaskInfo->HalKeyHandleFun)
{
s_stHalKeyInfo.bKeyTaskCreat[TaskNum] = false;
s_stHalKeyInfo.KeyPressDownTimes[TaskNum] = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.ShortPresstimes = 0;
s_stHalKeyTaskInfo[TaskNum].stHalKeyAttribute.LongPresstimes = 0;
s_stHalKeyTaskInfo[TaskNum].HalKeyGetStatusFun = NULL;
s_stHalKeyTaskInfo[TaskNum].HalKeyHandleFun = NULL;
return 0;
}
return -1;
}
#ifdef __cplusplus
}
#endif