순 C 언어 로 작 성 된 버튼 구동, 버튼 논리 와 버튼 처리 이 벤트 를 분리 합 니 다 ~
제 걸 이 가 직접 쓴 버튼 구동 은 한 번 의 더 블 클릭, 연속 누 르 기, 긴 누 르 기 를 지원 합 니 다.리 셋 처리 버튼 이벤트 (사용자 정의 떨 림 시간) 를 사용 하여 3 단계 만 사용 하고 버튼 을 만 듭 니 다. 버튼 이벤트 와 리 셋 처리 함수 링크 맵 을 만 들 고 주기 적 으로 버튼 을 검사 합 니 다.원본 주소:https://github.com/jiejieTop/ButtonDrive。저자: 제 걸
머리말
며칠 전에 버튼 구동 을 썼 는데 MulitButton 의 데이터 구조의 용법 을 참고 하여 논리 적 실현 이 다르다.여기 서 모든 오픈 소스 개발 자 에 게 감 사 드 립 니 다. 저 는 많은 것 을 배 웠 고 인터넷 도 좋 은 플랫폼 입 니 다. 또한 모든 개발 자 들 이 선 순환 을 이 루 고 인터넷 에서 지식 을 배 워 인터넷 으로 돌아 가 기 를 바 랍 니 다.MulitButton 의 작가 0x1abin 에 게 감 사 드 립 니 다. 두 rtt 의 큰 남자: 큰 마법사, 빛 에 감 사 드 립 니 다.
Button_드라이브 안내
Button_drive 는 작은 버튼 구동 으로 클릭, 더 블 클릭, 긴 버튼, 연속 트리거 등 을 지원 합 니 다 (후속 으로 버튼 제어 블록 에 트리거 이 벤트 를 추가 할 수 있 습 니 다). 이론 적 으로 버튼, 버튼 을 무한 확장 할 수 있 습 니 다.drive 는 버튼 터치 이벤트 리 셋 방식 으로 업무 논 리 를 처리 하고 RTOS 에서 사용 할 수 있 습 니 다. 저 는 현재 RT - Thread 에서 만 테스트 한 적 이 있 습 니 다.버튼 구동 을 쓰 는 목적 은 사용자 버튼 논리 와 버튼 처리 이 벤트 를 분리 하려 는 것 입 니 다. 사용 자 는 복잡 하고 번 거 로 운 논리 이 벤트 를 처리 할 필요 가 없습니다.
Button_drive 사용 효과
사용 방법
Button_t Button1;
Button_t Button2;
Button_Create("Button1", //
&Button1, //
Read_Button1_Level, //
BTN_TRIGGER); //
......
Button_Attach(&Button1,BUTTON_DOWM,Btn2_Dowm_CallBack); //
Button_Attach(&Button1,BUTTON_DOUBLE,Btn2_Double_CallBack); //
Button_Attach(&Button1,BUTTON_LONG,Btn2_Long_CallBack); //
.......
Button_Process(); //
사용자 가 구현 해 야 할 2 개의 함수:
uint8_t Read_Button1_Level(void)
{
return GPIO_ReadInputDataBit(BTN1_GPIO_PORT,BTN1_GPIO_PIN);
}
uint8_t Read_Button2_Level(void)
{
return GPIO_ReadInputDataBit(BTN2_GPIO_PORT,BTN2_GPIO_PIN);
}
// stm32 ,
void Btn1_Dowm_CallBack(void *btn)
{
PRINT_INFO("Button1 !");
}
void Btn1_Double_CallBack(void *btn)
{
PRINT_INFO("Button1 !");
}
void Btn1_Long_CallBack(void *btn)
{
PRINT_INFO("Button1 !");
Button_Delete(&Button2);
PRINT_INFO(" Button1");
Search_Button();
}
특징.
Button_drive 오픈 소스 코드, 버튼 제어 블록 은 데이터 구조 방식 을 사용 하고 버튼 이 벤트 는 매 거 진 형식 을 사용 하여 중복 되 지 않도록 확보 하 며 사용자 가 논 리 를 필요 로 하 는 것 을 추가 할 수 있 습 니 다. 매크로 정의 방식 으로 떨 림 시간 을 정의 하고 트리거 시간, 더 블 클릭 시간 간격, 장시간 누 르 기 등 을 사용 하여 수정 하기 쉽 습 니 다.또한 모든 생 성 된 버튼 은 단일 링크 방식 으로 연 결 됩 니 다. 사용 자 는 만 들 기만 하고 버튼 처 리 를 무시 하고 호출
Button_Process()
만 하면 됩 니 다. 함수 에서 생 성 된 모든 버튼 을 자동 으로 옮 겨 다 닙 니 다.버튼 삭제 작업 을 지원 합 니 다. 사용 자 는 코드 에서 해당 하 는 버튼 을 삭제 하지 않 아 도 맵 링크 코드 에 만 들 수 있 고 버튼 에 대한 어떠한 반전 이벤트 처리 함수 도 삭제 하지 않 아 도 됩 니 다. Button_Delete()
함수 만 호출 하면 됩 니 다. 이 경우 삭 제 된 버튼 에 대한 어떠한 상태 도 처리 하지 않 습 니 다.물론 현재 키 메모 리 는 방출 되 지 않 습 니 다. os 를 사용 하면 키 메모 리 를 방출 하 는 것 을 권장 합 니 다.버튼 제어 블록
/*
1 。
*/
typedef struct button
{
/* , */
uint8_t (*Read_Button_Level)(void); /* , */
char Name[BTN_NAME_MAX];
uint8_t Button_State : 4; /* ( ) */
uint8_t Button_Last_State : 4; /* , */
uint8_t Button_Trigger_Level : 2; /* */
uint8_t Button_Last_Level : 2; /* */
uint8_t Button_Trigger_Event; /* , , , */
Button_CallBack CallBack_Function[number_of_event];
uint8_t Button_Cycle; /* */
uint8_t Timer_Count; /* */
uint8_t Debounce_Time; /* */
uint8_t Long_Time; /* */
struct button *Next;
}Button_t;
트리거 이벤트
typedef enum {
BUTTON_DOWM = 0,
BUTTON_UP,
BUTTON_DOUBLE,
BUTTON_LONG,
BUTTON_CONTINUOS,
BUTTON_CONTINUOS_FREE,
BUTTON_ALL_RIGGER,
number_of_event, /* */
NONE_TRIGGER
}Button_Event;
매크로 정의 선택
#define BTN_NAME_MAX 32 // 32
/* 40ms, 20ms
40ms ,
*/
#define CONTINUOS_TRIGGER 0 // ,
/* & , , , ,
, BUTTON_DOUBLE_TIME。
, / , , ,
*/
#define SINGLE_AND_DOUBLE_TRIGGER 1
/* , , ,
, BUTTON_LONG_CYCLE */
#define LONG_FREE_TRIGGER 0
#define BUTTON_DEBOUNCE_TIME 2 // (n-1)*
#define BUTTON_CONTINUOS_CYCLE 1 // (n-1)*
#define BUTTON_LONG_CYCLE 1 // (n-1)*
#define BUTTON_DOUBLE_TIME 15 // (n-1)* 200-600ms
#define BUTTON_LONG_TIME 50 /* n ((n-1)* ms), */
#define TRIGGER_CB(event) \
if(btn->CallBack_Function[event]) \
btn->CallBack_Function[event]((Button_t*)btn)
예시
Button_Create("Button1",
&Button1,
Read_KEY1_Level,
KEY_ON);
Button_Attach(&Button1,BUTTON_DOWM,Btn1_Dowm_CallBack); //
Button_Attach(&Button1,BUTTON_DOUBLE,Btn1_Double_CallBack); //
Button_Attach(&Button1,BUTTON_CONTINUOS,Btn1_Continuos_CallBack); //
Button_Attach(&Button1,BUTTON_CONTINUOS_FREE,Btn1_ContinuosFree_CallBack); //
Button_Attach(&Button1,BUTTON_LONG,Btn1_Long_CallBack); //
Button_Create("Button2",
&Button2,
Read_KEY2_Level,
KEY_ON);
Button_Attach(&Button2,BUTTON_DOWM,Btn2_Dowm_CallBack); //
Button_Attach(&Button2,BUTTON_DOUBLE,Btn2_Double_CallBack); //
Button_Attach(&Button2,BUTTON_CONTINUOS,Btn2_Continuos_CallBack); //
Button_Attach(&Button2,BUTTON_CONTINUOS_FREE,Btn2_ContinuosFree_CallBack); //
Button_Attach(&Button2,BUTTON_LONG,Btn2_Long_CallBack); //
Get_Button_Event(&Button1);
Get_Button_Event(&Button2);
후속
유광 사내 의 요구, RTT 의 rtkpgs 를 타 보 겠 습 니 다. Button 을 사용 하려 고 합 니 다.드라이브 좀 해 봐.
Button Drive 는 env 에서 사용 합 니 다.
현재 나 는 버튼 구동 을 패키지 (packages) 로 만 들 었 습 니 다. RT - Thread 운영 체 제 를 사용 하면 env 에서 직접 설정 해서 사용 할 수 있 습 니 다!
절 차 는 다음 과 같다.
[사진 업로드 실패... (image - 4a4909 - 1541216874707)]
[사진 업로드 실패... (image - 3eeacb - 1541216874707)]
rtkpgs 에 대하 여
프로필 (영어)
buildpkg 은 RT - Thread package 를 만 드 는 빠 른 구축 도구 입 니 다.
우수한 패 키 지 는 이렇게 해 야 한다.
RT - Thread package 규범화 템 플 릿 을 신속하게 생 성하 고 오픈 소스 창고 이전 RT - Thread 의 초기 준비 작업 부담 을 줄 이기 위해 이 를 바탕 으로 buildpkg 이 생 겨 나 Rt - Thread 의 package 개발 자 에 게 보조 개발 도 구 를 제공 합 니 다.
번호
지원 기능
묘사 하 다.
1
패키지 템 플 릿 구축
지정 한 이름 package 를 만 들 고 readme / 버 전 번호 / github ci 스 크 립 트 / demo / 오픈 소스 프로 토 콜 파일 을 자동 으로 추가 합 니 다.
2
창고 이전
지정 한 git 창고 에서 package 를 구축 하고 readme / 버 전 번호 / github ci 스 크 립 트 / demo / 오픈 소스 프로 토 콜 파일 을 자동 으로 추가 하지만 이전 창 고 는 사용자 가 실제 상황 에 따라 수정 해 야 합 니 다.
3
패키지 업데이트
패키지 생 성 후 이전에 설정 한 버 전 번호, 오픈 소스 프로 토 콜 또는 scons 스 크 립 트 등 을 다시 업데이트 할 수 있 습 니 다.
사용 설명
1. 패키지 구축
buildpkg.exe make pkgdemo
2. 개원 창고 이전
buildpkg.exe make cstring https://github.com/liu2guang/cstring.git
3. 패키지 업데이트
buildpkg.exe update pkgname
4. 선택 가능 한 설정
긴 매개 변수
짧 은 매개 변수
묘사 하 다.
--version=v1.0.0
-v v1.0.0
패키지 버 전 설정
--license=MIT
-l MIT
패키지 가 따 르 는 저작권 프로 토 콜 설정
--submodule
-s
git 서브 모듈 삭제
윈도 10 및 리 눅 스 플랫폼 의 데모 그림
[사진 업로드 실패... (image - 65760f - 1541216874707)]
테스트 플랫폼
번호
테스트 플랫폼
테스트 결과
1
win10
exe 테스트 통과, py 테스트 통과
2
win7
exe 테스트 대기, py 테스트 대기
3
mac
py 스 크 립 트 호 환 여 부 를 모 르 겠 습 니 다. 테스트 조건 이 없 으 면 나중에 유지 합 니 다.
4
linux
py 스 크 립 트 호 환 여 부 를 모 르 겠 습 니 다. 테스트 조건 이 없 으 면 나중에 유지 합 니 다.
연락처
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.