暂存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"> <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"> <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}/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/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}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/common/letter-shell/extensions/log}&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 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.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" 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.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>

View File

@ -1,6 +1,6 @@
#include "bsp_key.h" #include "bsp_key.h"
#include "flexible_button.h" #include "multi_button.h"
#include "bsp_uart.h" #include "bsp_uart.h"
#include "log.h" #include "log.h"
@ -15,37 +15,11 @@
#undef LOG_TAG #undef LOG_TAG
#define LOG_TAG "key" #define LOG_TAG "key"
enum Button_IDs {
typedef enum btn1_id,
{
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),
}; };
static char *enum_btn_id_string[] = { struct Button btn1;
ENUM_TO_STR(USER_BUTTON_0),
ENUM_TO_STR(USER_BUTTON_MAX),
};
#endif
static flex_button_t user_button[USER_BUTTON_MAX];
tmosTaskID key_task_id = INVALID_TASK_ID; 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; // you can share the GPIO read function with multiple Buttons
switch(button_id)
flex_button_t *btn = (flex_button_t *)arg; {
case btn1_id:
switch (btn->id) return (uint8_t)GPIOB_ReadPortPin(KEY_B_PIN);
{ default:
case USER_BUTTON_0: // logAssert(0, while (1));
value = (uint8_t)GPIOB_ReadPortPin(KEY_B_PIN); return 0;
break; }
default:
logAssert(0, while (1));
}
return value;
} }
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", void BTN1_PRESS_UP_Handler(void* btn)
btn->id, enum_btn_id_string[btn->id], {
btn->event, enum_event_string[btn->event], logDebug("BTN1_PRESS_UP_Handler");
btn->click_cnt); tmos_stop_task(key_task_id, KEY_IDLE_TIMEOUT_EVT);
if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_CLICK) tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(1000 * 5));
{ logDebug("tmos_start_task KEY_IDLE_TIMEOUT_EVT");
logDebug("USER_BUTTON_0 PRESS_CLICK"); // BSP_KEY_EnterLowpower();
BSP_KEY_EnterLowpower(); }
}
else if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK) void BTN1_SINGLE_Click_Handler(void* btn)
{ {
logDebug("USER_BUTTON_0 PRESS_LONG_HOLD") logDebug("BTN1_SINGLE_Click_Handler");
BSP_KEY_EnterLowpower(); // BSP_KEY_EnterLowpower();
} }
else if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_LONG_START)
{ void BTN1_DOUBLE_Click_Handler(void* btn)
logDebug("USER_BUTTON_0 FLEX_BTN_PRESS_LONG_START"); {
BSP_KEY_EnterLowpower(); 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) 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 (events & KEY_SCAN_EVT)
{ {
// 按键没抬起来就继续扫描
if (0 == key_timeout_flag) if (0 == key_timeout_flag)
{ {
if (IS_KEY_Vaild()) tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(5));
{
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));
} }
else else
{ {
@ -278,12 +247,14 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
BSP_KEY_EnterLowpower(); BSP_KEY_EnterLowpower();
} }
// logDebug("KEY_SCAN_EVT"); // logDebug("KEY_SCAN_EVT");
flex_button_scan(); button_ticks();
return (events ^ KEY_SCAN_EVT); return (events ^ KEY_SCAN_EVT);
} }
if (events & KEY_IDLE_TIMEOUT_EVT) if (events & KEY_IDLE_TIMEOUT_EVT)
{ {
tmos_stop_task(key_task_id, KEY_SCAN_EVT);
BSP_KEY_EnterLowpower();
logDebug("KEY_IDLE_TIMEOUT_EVT"); logDebug("KEY_IDLE_TIMEOUT_EVT");
key_timeout_flag = 1; key_timeout_flag = 1;
return (events ^ KEY_IDLE_TIMEOUT_EVT); 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; return 0;
} }
void BSP_KEY_Init(void) void BSP_KEY_Init(void)
{ {
/* 初始化按键数据结构 */
tmos_memset(&user_button[0], 0x0, sizeof(user_button));
// 由外部上拉电阻了 // 由外部上拉电阻了
// 设置为浮空输入模式 // 设置为浮空输入模式
GPIOB_SetBits(KEY_B_PIN); GPIOB_SetBits(KEY_B_PIN);
GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU); GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU);
for (uint8_t i = 0; i < USER_BUTTON_MAX; i++) button_init(&btn1, read_button_GPIO, 0, btn1_id);
{
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);
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); GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge);
@ -328,7 +296,7 @@ void BSP_KEY_Init(void)
PFIC_EnableIRQ(GPIO_B_IRQn); PFIC_EnableIRQ(GPIO_B_IRQn);
key_task_id = TMOS_ProcessEventRegister(KEY_Task_ProcessEvent); 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关掉, //开始一个定时事件,不断的执行,除非运行tmos_stop_task关掉,
//tmosTimer具体是 1600 = 1s //tmosTimer具体是 1600 = 1s

View File

@ -105,7 +105,7 @@ uint32_t CH59x_LowPower(uint32_t time)
// LOW POWER-sleep模式 // LOW POWER-sleep模式
if (!RTCTigFlag) if (!RTCTigFlag)
{ {
BSP_KEY_EnterLowpower(); // BSP_KEY_EnterLowpower();
LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN); LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN);
HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流) HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
@ -113,7 +113,6 @@ uint32_t CH59x_LowPower(uint32_t time)
while (i == RTC_GetCycle32k()); while (i == RTC_GetCycle32k());
return 0; return 0;
} }
#endif #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. //According to your need to modify the constants.
#define TICKS_INTERVAL 5 //ms #define TICKS_INTERVAL 5 //ms
#define DEBOUNCE_TICKS 3 //MAX 7 (0 ~ 7) #define DEBOUNCE_TICKS 3 //MAX 7 (0 ~ 7)
#define SHORT_TICKS (300 /TICKS_INTERVAL) #define SHORT_TICKS (400 /TICKS_INTERVAL)
#define LONG_TICKS (1000 /TICKS_INTERVAL) #define LONG_TICKS (1500 /TICKS_INTERVAL)
typedef void (*BtnCallback)(void*); typedef void (*BtnCallback)(void*);