You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
2.9 KiB
C
176 lines
2.9 KiB
C
#include "multi_button.h"
|
|
|
|
typedef enum {
|
|
BUTTON_ID_0,
|
|
BUTTON_ID_2,
|
|
|
|
BUTTON_ID_MAX
|
|
|
|
} 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])
|
|
{
|
|
switch (i)
|
|
{
|
|
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:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return code;
|
|
}
|
|
|
|
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)
|
|
{
|
|
case PRESS_DOWN:
|
|
switch (i)
|
|
{
|
|
case BUTTON_ID_0:
|
|
// do something
|
|
break;
|
|
case BUTTON_ID_2:
|
|
// do something
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case PRESS_UP:
|
|
switch (i)
|
|
{
|
|
case BUTTON_ID_0:
|
|
// do something
|
|
break;
|
|
case BUTTON_ID_2:
|
|
// do something
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case PRESS_REPEAT:
|
|
switch (i)
|
|
{
|
|
case BUTTON_ID_0:
|
|
// do something
|
|
break;
|
|
case BUTTON_ID_2:
|
|
// do something
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case SINGLE_CLICK:
|
|
switch (i)
|
|
{
|
|
case BUTTON_ID_0:
|
|
// do something
|
|
break;
|
|
case BUTTON_ID_2:
|
|
// do something
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case DOUBLE_CLICK:
|
|
switch (i)
|
|
{
|
|
case BUTTON_ID_0:
|
|
// do something
|
|
break;
|
|
case BUTTON_ID_2:
|
|
// do something
|
|
break;
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
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]);
|
|
}
|
|
|
|
// make the timer invoking the button_ticks() interval 5ms.
|
|
// This function is implemented by yourself.
|
|
__timer_start(button_ticks, 0, 5);
|
|
|
|
while (1)
|
|
{
|
|
}
|
|
} |