#pragma once#include"cfbd_define.h"#include"gpio.h"#include"input.h"#include"input_device_base.h"#include"input_event.h"#define BUTTON_DEBOUNCE_TIME 20#define BUTTON_LONG_PRESS_TIME 1000#define BUTTON_DOUBLE_CLICK_TIME 300#define MAX_HOLDABLE_BUTTON (3)typedefenum{BUTTON_EVENT_IDLE=CFBDInputDeviceEventType_INVALID_ID,BUTTON_EVENT_PRESS=CFBDInputDeviceEventType_SYSDEF_START,// 按下事件BUTTON_EVENT_RELEASE,// 释放事件BUTTON_EVENT_CLICK,// 单击事件BUTTON_EVENT_DOUBLE_CLICK,// 双击事件BUTTON_EVENT_LONG_PRESS,// 长按事件BUTTON_EVENT_LONG_PRESS_HOLD// 长按保持}CFBD_PlainButtonEventID;typedefenum{BUTTON_MODE_POLLING=0,// 轮询模式BUTTON_MODE_INTERRUPT// 中断模式}CFBD_PlainButtonMode;typedefstruct_CFBD_PlainButton{CFBDInputDeviceBasebase_inputs;CFBD_GPIOHandle*handle;CFBD_PlainButtonModemode;CFBDEventInputHandlerstateChangedCb;CFBD_PlainButtonEventIDcurrent_state_id;uint32_tpress_time;// 按下时刻uint32_trelease_time;// 释放时刻uint32_tlast_click_time;// 上次单击时刻CFBD_Boolis_double_click_pending;uint32_tclick_pending_time;CFBD_Boolis_pressed;// 当前是否按下CFBD_Boollong_press_triggered;// 长按已触发标志CFBD_Boolbutton_press_state;// when button presssed, at what status should be for gpio}CFBD_PlainButton;typedefstruct{CFBD_GPIOHandle*gpio;CFBDEventInputHandlercallbacks;CFBDInputEventContext*input_context;CFBD_Boolbutton_press_state;CFBD_BoolisInterruptMode;void(*enable_intr)(CFBD_PlainButton*button);}CFBD_ButtonCreationPack;voidCFBD_CreatePlainButton(CFBD_PlainButton*button,CFBD_ButtonCreationPack*pack);voidCFBD_PlainButtonEventMaker(CFBD_PlainButton*button,CFBDInputEvent*blank_event);voidCFBD_PlainButtonSyncScan(CFBD_PlainButton*button);typedefvoid(*CFBD_ButtonIntrCallbacks)(void*intr_datas);typedefCFBD_PlainButton**CFBDPlainButtonArray;typedefstruct{CFBDPlainButtonArrayarray;intcnt;}IntrButtonArrayInfo;voidCFBD_SetMonitoringButtons(IntrButtonArrayInfo*buttons);CFBD_ButtonIntrCallbacksCFBD_PlainButtonGetIntrCallbacks();