Merge 32ed8479f6 into 0610f1533a
commit
bc7a3c00ac
@ -1,65 +1,176 @@
|
||||
#include "multi_button.h"
|
||||
|
||||
enum Button_IDs {
|
||||
btn1_id,
|
||||
btn2_id,
|
||||
};
|
||||
typedef enum {
|
||||
BUTTON_ID_0,
|
||||
BUTTON_ID_2,
|
||||
|
||||
struct Button btn1;
|
||||
struct Button btn2;
|
||||
BUTTON_ID_MAX
|
||||
|
||||
uint8_t read_button_GPIO(uint8_t button_id)
|
||||
} BUTTON_ID_INDEX;
|
||||
|
||||
struct Button btnGroup[BUTTON_ID_MAX];
|
||||
uint8_t btnActiveLevel[BUTTON_ID_MAX] = {0, 0};
|
||||
|
||||
uint8_t read_button_level()
|
||||
{
|
||||
uint8_t code = 0x01;
|
||||
for (size_t i = 0; i < BUTTON_ID_MAX; i++)
|
||||
{
|
||||
if (get_button_current() == &btnGroup[i])
|
||||
{
|
||||
// you can share the GPIO read function with multiple Buttons
|
||||
switch(button_id)
|
||||
switch (i)
|
||||
{
|
||||
case btn1_id:
|
||||
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
|
||||
case btn2_id:
|
||||
return HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin);
|
||||
case BUTTON_ID_0:
|
||||
code = HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
code = HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin);
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
int main()
|
||||
void BTN_EVENT_Handler(void *btn)
|
||||
{
|
||||
for (size_t i = 0; i < BUTTON_ID_MAX; i++)
|
||||
{
|
||||
if (((Button *)btn) == &btnGroup[i])
|
||||
{
|
||||
switch (((Button *)btn)->event)
|
||||
{
|
||||
button_init(&btn1, read_button_GPIO, 0, btn1_id);
|
||||
button_init(&btn2, read_button_GPIO, 0, btn2_id);
|
||||
case PRESS_DOWN:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
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);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case PRESS_UP:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
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);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case PRESS_REPEAT:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
button_start(&btn1);
|
||||
button_start(&btn2);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SINGLE_CLICK:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
//make the timer invoking the button_ticks() interval 5ms.
|
||||
//This function is implemented by yourself.
|
||||
__timer_start(button_ticks, 0, 5);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DOUBLE_CLICK:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
while(1)
|
||||
{}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case LONG_PRESS_START:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case LONG_PRESS_HOLD:
|
||||
switch (i)
|
||||
{
|
||||
case BUTTON_ID_0:
|
||||
// do something
|
||||
break;
|
||||
case BUTTON_ID_2:
|
||||
// do something
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BTN1_PRESS_DOWN_Handler(void* btn)
|
||||
int main()
|
||||
{
|
||||
//do something...
|
||||
for (size_t i = 0; i < BUTTON_ID_MAX; i++)
|
||||
{
|
||||
button_init(&btnGroup[i], read_button_level, btnActiveLevel[i]);
|
||||
|
||||
button_attach(&btnGroup[i], PRESS_DOWN, BTN_EVENT_Handler);
|
||||
button_attach(&btnGroup[i], PRESS_UP, BTN_EVENT_Handler);
|
||||
button_attach(&btnGroup[i], PRESS_REPEAT, BTN_EVENT_Handler);
|
||||
button_attach(&btnGroup[i], SINGLE_CLICK, BTN_EVENT_Handler);
|
||||
button_attach(&btnGroup[i], DOUBLE_CLICK, BTN_EVENT_Handler);
|
||||
button_attach(&btnGroup[i], LONG_PRESS_START, BTN_EVENT_Handler);
|
||||
button_attach(&btnGroup[i], LONG_PRESS_HOLD, BTN_EVENT_Handler);
|
||||
|
||||
button_start(&btnGroup[i]);
|
||||
}
|
||||
|
||||
void BTN1_PRESS_UP_Handler(void* btn)
|
||||
// make the timer invoking the button_ticks() interval 5ms.
|
||||
// This function is implemented by yourself.
|
||||
__timer_start(button_ticks, 0, 5);
|
||||
|
||||
while (1)
|
||||
{
|
||||
//do something...
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue