暂存multi_button不太行?

This commit is contained in:
stark1898y 2024-12-14 16:26:27 +08:00
parent f8cec39611
commit 1dab144866
7 changed files with 65 additions and 206 deletions

View File

@ -56,6 +56,7 @@
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1731377187" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1567947810" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Startup}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/common/MultiButton}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/common/FlexibleButton-2.0.1}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/common/letter-shell}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/common/letter-shell/extensions/log}&quot;"/>

View File

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-782333052934719487" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-675874543788235318" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

View File

@ -1,6 +1,6 @@
#include "bsp_key.h"
#include "flexible_button.h"
#include "multi_button.h"
#include "bsp_uart.h"
#include "log.h"
@ -15,37 +15,11 @@
#undef LOG_TAG
#define LOG_TAG "key"
typedef enum
{
USER_BUTTON_0 = 0,
USER_BUTTON_MAX
} user_button_t;
#if 1
#define ENUM_TO_STR(e) (#e)
static char *enum_event_string[] = {
ENUM_TO_STR(FLEX_BTN_PRESS_DOWN),
ENUM_TO_STR(FLEX_BTN_PRESS_CLICK),
ENUM_TO_STR(FLEX_BTN_PRESS_DOUBLE_CLICK),
ENUM_TO_STR(FLEX_BTN_PRESS_REPEAT_CLICK),
ENUM_TO_STR(FLEX_BTN_PRESS_SHORT_START),
ENUM_TO_STR(FLEX_BTN_PRESS_SHORT_UP),
ENUM_TO_STR(FLEX_BTN_PRESS_LONG_START),
ENUM_TO_STR(FLEX_BTN_PRESS_LONG_UP),
ENUM_TO_STR(FLEX_BTN_PRESS_LONG_HOLD),
ENUM_TO_STR(FLEX_BTN_PRESS_LONG_HOLD_UP),
ENUM_TO_STR(FLEX_BTN_PRESS_MAX),
ENUM_TO_STR(FLEX_BTN_PRESS_NONE),
enum Button_IDs {
btn1_id,
};
static char *enum_btn_id_string[] = {
ENUM_TO_STR(USER_BUTTON_0),
ENUM_TO_STR(USER_BUTTON_MAX),
};
#endif
static flex_button_t user_button[USER_BUTTON_MAX];
struct Button btn1;
tmosTaskID key_task_id = INVALID_TASK_ID;
@ -193,47 +167,50 @@ void KEY_ProcessLoop(void)
}
}
static uint8_t common_btn_read(void *arg)
uint8_t read_button_GPIO(uint8_t button_id)
{
uint8_t value = 0;
flex_button_t *btn = (flex_button_t *)arg;
switch (btn->id)
{
case USER_BUTTON_0:
value = (uint8_t)GPIOB_ReadPortPin(KEY_B_PIN);
break;
default:
logAssert(0, while (1));
}
return value;
// you can share the GPIO read function with multiple Buttons
switch(button_id)
{
case btn1_id:
return (uint8_t)GPIOB_ReadPortPin(KEY_B_PIN);
default:
// logAssert(0, while (1));
return 0;
}
}
static void common_btn_evt_cb(void *arg)
void BTN1_PRESS_DOWN_Handler(void* btn)
{
flex_button_t *btn = (flex_button_t *)arg;
logDebug("BTN1_PRESS_DOWN_Handler");
// BSP_KEY_EnterLowpower();
}
logDebug("id: [%d - %s] event: [%d - %30s] repeat: %d",
btn->id, enum_btn_id_string[btn->id],
btn->event, enum_event_string[btn->event],
btn->click_cnt);
if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_CLICK)
{
logDebug("USER_BUTTON_0 PRESS_CLICK");
BSP_KEY_EnterLowpower();
}
else if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK)
{
logDebug("USER_BUTTON_0 PRESS_LONG_HOLD")
BSP_KEY_EnterLowpower();
}
else if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_LONG_START)
{
logDebug("USER_BUTTON_0 FLEX_BTN_PRESS_LONG_START");
BSP_KEY_EnterLowpower();
}
void BTN1_PRESS_UP_Handler(void* btn)
{
logDebug("BTN1_PRESS_UP_Handler");
tmos_stop_task(key_task_id, KEY_IDLE_TIMEOUT_EVT);
tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(1000 * 5));
logDebug("tmos_start_task KEY_IDLE_TIMEOUT_EVT");
// BSP_KEY_EnterLowpower();
}
void BTN1_SINGLE_Click_Handler(void* btn)
{
logDebug("BTN1_SINGLE_Click_Handler");
// BSP_KEY_EnterLowpower();
}
void BTN1_DOUBLE_Click_Handler(void* btn)
{
logDebug("BTN1_DOUBLE_Click_Handler");
// BSP_KEY_EnterLowpower();
}
void BTN1_LONG_PRESS_START_Handler(void* btn)
{
logDebug("BTN1_LONG_PRESS_START_Handler");
// BSP_KEY_EnterLowpower();
}
static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
@ -259,18 +236,10 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
// }
if (events & KEY_SCAN_EVT)
{
// 按键没抬起来就继续扫描
if (0 == key_timeout_flag)
{
if (IS_KEY_Vaild())
{
tmos_stop_task(key_task_id, KEY_IDLE_TIMEOUT_EVT);
tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(1000 * 5));
}
else
{
logDebug("0");
}
tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(20));
tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(5));
}
else
{
@ -278,12 +247,14 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
BSP_KEY_EnterLowpower();
}
// logDebug("KEY_SCAN_EVT");
flex_button_scan();
button_ticks();
return (events ^ KEY_SCAN_EVT);
}
if (events & KEY_IDLE_TIMEOUT_EVT)
{
tmos_stop_task(key_task_id, KEY_SCAN_EVT);
BSP_KEY_EnterLowpower();
logDebug("KEY_IDLE_TIMEOUT_EVT");
key_timeout_flag = 1;
return (events ^ KEY_IDLE_TIMEOUT_EVT);
@ -294,28 +265,25 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
return 0;
}
void BSP_KEY_Init(void)
{
/* 初始化按键数据结构 */
tmos_memset(&user_button[0], 0x0, sizeof(user_button));
// 由外部上拉电阻了
// 设置为浮空输入模式
GPIOB_SetBits(KEY_B_PIN);
GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU);
for (uint8_t i = 0; i < USER_BUTTON_MAX; i++)
{
user_button[i].id = i;
user_button[i].usr_button_read = common_btn_read;
user_button[i].cb = common_btn_evt_cb;
user_button[i].pressed_logic_level = 0;
user_button[i].short_press_start_tick = FLEX_MS_TO_SCAN_CNT(1500);
user_button[i].long_press_start_tick = FLEX_MS_TO_SCAN_CNT(3000);
// user_button[i].long_hold_start_tick = FLEX_MS_TO_SCAN_CNT(4500);
button_init(&btn1, read_button_GPIO, 0, btn1_id);
flex_button_register(&user_button[i]);
}
// button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler);
button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler);
button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_Click_Handler);
button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_Click_Handler);
button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);
button_start(&btn1);
// 下降沿触发
GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge);
@ -328,7 +296,7 @@ void BSP_KEY_Init(void)
PFIC_EnableIRQ(GPIO_B_IRQn);
key_task_id = TMOS_ProcessEventRegister(KEY_Task_ProcessEvent);
// tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(20));
// tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(5));
//开始一个定时事件,不断的执行,除非运行tmos_stop_task关掉,
//tmosTimer具体是 1600 = 1s

View File

@ -105,7 +105,7 @@ uint32_t CH59x_LowPower(uint32_t time)
// LOW POWER-sleep模式
if (!RTCTigFlag)
{
BSP_KEY_EnterLowpower();
// BSP_KEY_EnterLowpower();
LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN);
HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
@ -113,7 +113,6 @@ uint32_t CH59x_LowPower(uint32_t time)
while (i == RTC_GetCycle32k());
return 0;
}
#endif

View File

@ -1,65 +0,0 @@
#include "multi_button.h"
enum Button_IDs {
btn1_id,
btn2_id,
};
struct Button btn1;
struct Button btn2;
uint8_t read_button_GPIO(uint8_t button_id)
{
// you can share the GPIO read function with multiple Buttons
switch(button_id)
{
case btn1_id:
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
case btn2_id:
return HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin);
default:
return 0;
}
}
int main()
{
button_init(&btn1, read_button_GPIO, 0, btn1_id);
button_init(&btn2, read_button_GPIO, 0, btn2_id);
button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler);
button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler);
button_attach(&btn1, PRESS_REPEAT, BTN1_PRESS_REPEAT_Handler);
button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_Click_Handler);
button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_Click_Handler);
button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);
button_attach(&btn1, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler);
button_attach(&btn2, PRESS_DOWN, BTN2_PRESS_DOWN_Handler);
button_attach(&btn2, PRESS_UP, BTN2_PRESS_UP_Handler);
button_attach(&btn2, PRESS_REPEAT, BTN2_PRESS_REPEAT_Handler);
button_attach(&btn2, SINGLE_CLICK, BTN2_SINGLE_Click_Handler);
button_attach(&btn2, DOUBLE_CLICK, BTN2_DOUBLE_Click_Handler);
button_attach(&btn2, LONG_PRESS_START, BTN2_LONG_PRESS_START_Handler);
button_attach(&btn2, LONG_PRESS_HOLD, BTN2_LONG_PRESS_HOLD_Handler);
button_start(&btn1);
button_start(&btn2);
//make the timer invoking the button_ticks() interval 5ms.
//This function is implemented by yourself.
__timer_start(button_ticks, 0, 5);
while(1)
{}
}
void BTN1_PRESS_DOWN_Handler(void* btn)
{
//do something...
}
void BTN1_PRESS_UP_Handler(void* btn)
{
//do something...
}

View File

@ -1,44 +0,0 @@
#include "multi_button.h"
unit8_t btn1_id = 0;
struct Button btn1;
uint8_t read_button_GPIO(uint8_t button_id)
{
// you can share the GPIO read function with multiple Buttons
switch(button_id)
{
case btn1_id:
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
default:
return 0;
}
}
int main()
{
static PressEvent btn1_event_val;
button_init(&btn1, read_button_GPIO, 0, btn1_id);
button_start(&btn1);
//make the timer invoking the button_ticks() interval 5ms.
//This function is implemented by yourself.
__timer_start(button_ticks, 0, 5);
while(1)
{
if(btn1_event_val != get_button_event(&btn1)) {
btn1_event_val = get_button_event(&btn1);
if(btn1_event_val == PRESS_DOWN) {
//do something
} else if(btn1_event_val == PRESS_UP) {
//do something
} else if(btn1_event_val == LONG_PRESS_HOLD) {
//do something
}
}
}
}

View File

@ -12,8 +12,8 @@
//According to your need to modify the constants.
#define TICKS_INTERVAL 5 //ms
#define DEBOUNCE_TICKS 3 //MAX 7 (0 ~ 7)
#define SHORT_TICKS (300 /TICKS_INTERVAL)
#define LONG_TICKS (1000 /TICKS_INTERVAL)
#define SHORT_TICKS (400 /TICKS_INTERVAL)
#define LONG_TICKS (1500 /TICKS_INTERVAL)
typedef void (*BtnCallback)(void*);