순 C 언어 로 작 성 된 버튼 구동, 버튼 논리 와 버튼 처리 이 벤트 를 분리 합 니 다 ~

9680 단어
button drive
제 걸 이 가 직접 쓴 버튼 구동 은 한 번 의 더 블 클릭, 연속 누 르 기, 긴 누 르 기 를 지원 합 니 다.리 셋 처리 버튼 이벤트 (사용자 정의 떨 림 시간) 를 사용 하여 3 단계 만 사용 하고 버튼 을 만 듭 니 다. 버튼 이벤트 와 리 셋 처리 함수 링크 맵 을 만 들 고 주기 적 으로 버튼 을 검사 합 니 다.원본 주소:https://github.com/jiejieTop/ButtonDrive。저자: 제 걸
머리말
며칠 전에 버튼 구동 을 썼 는데 MulitButton 의 데이터 구조의 용법 을 참고 하여 논리 적 실현 이 다르다.여기 서 모든 오픈 소스 개발 자 에 게 감 사 드 립 니 다. 저 는 많은 것 을 배 웠 고 인터넷 도 좋 은 플랫폼 입 니 다. 또한 모든 개발 자 들 이 선 순환 을 이 루 고 인터넷 에서 지식 을 배 워 인터넷 으로 돌아 가 기 를 바 랍 니 다.MulitButton 의 작가 0x1abin 에 게 감 사 드 립 니 다. 두 rtt 의 큰 남자: 큰 마법사, 빛 에 감 사 드 립 니 다.
Button_드라이브 안내
Button_drive 는 작은 버튼 구동 으로 클릭, 더 블 클릭, 긴 버튼, 연속 트리거 등 을 지원 합 니 다 (후속 으로 버튼 제어 블록 에 트리거 이 벤트 를 추가 할 수 있 습 니 다). 이론 적 으로 버튼, 버튼 을 무한 확장 할 수 있 습 니 다.drive 는 버튼 터치 이벤트 리 셋 방식 으로 업무 논 리 를 처리 하고 RTOS 에서 사용 할 수 있 습 니 다. 저 는 현재 RT - Thread 에서 만 테스트 한 적 이 있 습 니 다.버튼 구동 을 쓰 는 목적 은 사용자 버튼 논리 와 버튼 처리 이 벤트 를 분리 하려 는 것 입 니 다. 사용 자 는 복잡 하고 번 거 로 운 논리 이 벤트 를 처리 할 필요 가 없습니다.
Button_drive 사용 효과
  • 클릭 과 길 게 누 르 기
  • [사진 업로드 실패... (image - a99772 - 1541216874707)]
  • 더 블 클릭
  • [사진 업로드 실패... (image - 35e8e4 - 1541216874707)]
  • 연속 누 르 기
  • [이미지 업로드 실패... (image - 5c05ed - 1541216874707)]
  • 연속 석방
  • [이미지 업로드 실패... (image - 3026c2 - 1541216874707)]
    사용 방법
  • 버튼 핸들 만 들 기
  • 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);       //  
                    
                    .......
    
  • 주기 적 으로 리 셋 버튼 처리 함 수 를 호출 하면 됩 니 다. 주기 20 - 50ms 를 호출 하 는 것 을 권장 합 니 다.
  • 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 - dbd 81 - 1541216874707)]
  • 패키지 속성 을 외부 장치 와 관련 된 것 으로 선택
  • [사진 업로드 실패... (image - e18cb3 - 1541216874707)]
  • button 선택drive

  • [사진 업로드 실패... (image - 4a4909 - 1541216874707)]
  • 드라이브 에 들 어 가 는 옵션 설정 (기본 속성 자체)
  • [사진 업로드 실패... (image - c90a6c - 1541216874707)]
  • 버튼 설정 이 무슨 뜻 인지 모 르 면 'shift +?' 를 누 르 면 설명 이 가능 합 니 다
  • [이미지 업로드 실패... (image - 8478b4 - 1541216874707)]
  • mdk / iar 프로젝트 컴 파일 생 성
  • [사진 업로드 실패... (image - 9b290a - 1541216874707)]
    [사진 업로드 실패... (image - 3eeacb - 1541216874707)]
    rtkpgs 에 대하 여
    프로필 (영어)
    buildpkg 은 RT - Thread package 를 만 드 는 빠 른 구축 도구 입 니 다.
    우수한 패 키 지 는 이렇게 해 야 한다.
  • 코드 가 우아 하고 규범화 되 었 다.
  • examples 루틴 은 알 기 쉬 운 사용 루틴 을 제공 합 니 다.
  • SConscript 파일 은 RT - Thread 환경 과 함께 컴 파일 할 수 있 습 니 다.
  • README. md 문 서 는 사용자 에 게 필요 한 기능 설명 을 제공한다.
  • docs 폴 더 는 README 를 제외 한 다른 세부 문 서 를 배치 합 니 다.
  • license 허가 파일, 저작권 설명.

  • 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 스 크 립 트 호 환 여 부 를 모 르 겠 습 니 다. 테스트 조건 이 없 으 면 나중에 유지 합 니 다.
    연락처
  • 메 일 박스:[email protected]
  • 홈 페이지: liu2guang
  • 창고: Github, Gitee
  • 좋은 웹페이지 즐겨찾기