KT25-0812_82A-UART/apps/common/key/slidekey.c
2025-08-12 18:09:23 +08:00

95 lines
2.3 KiB
C

#include "key_driver.h"
#include "slidekey.h"
#include "gpio.h"
#include "system/event.h"
#include "system/includes.h"
#include "app_config.h"
#include "asm/clock.h"
#include "app_action.h"
#if (TCFG_SLIDE_KEY_ENABLE)
#define MAX_CH 10
static const struct slidekey_platform_data *__this = NULL;
static u32 slide_old_ad[MAX_CH];
struct key_driver_para slidekey_scan_para = {
.scan_time = 300,
.last_key = NO_KEY,
.filter_time = 4,
.long_time = 75,
.hold_time = (75 + 15),
.click_delay_time = 20,
.key_type = KEY_DRIVER_TYPE_SLIDEKEY,
.get_value = slide_get_key_value,
};
u8 slide_get_key_value(void)
{
u8 i = 0;
u32 ad_value_cur = 0;
u32 offset;
u32 level = 0;
if (!__this->enable) {
return NO_KEY;
}
for (i = 0; i < __this->num; i++) {
ad_value_cur = adc_get_value(__this->port[i].ad_channel);
//printf("nl = %d,nd = %d\n",slide_now_level[i],adc_get_value(__this->port[i].ad_channel));
if (ad_value_cur > slide_old_ad[i]) {
offset = ad_value_cur - slide_old_ad[i];
} else {
offset = slide_old_ad[i] - ad_value_cur;
}
level = 1023 / (__this->port[i].level + 1);
if (offset > level / 2) {
slide_old_ad[i] = ad_value_cur;
level = slide_old_ad[i] / level;
if (level > __this->port[i].level) {
level = __this->port[i].level;
}
y_printf("key\n");
app_task_put_key_msg(__this->port[i].msg, level);
}
}
return NO_KEY;
}
int slidekey_init(const struct slidekey_platform_data *slidekey_data)
{
u8 i = 0;
__this = slidekey_data;
if (__this == NULL) {
return -EINVAL;
}
//if(!__this->enable)
//{
//
//}
y_printf("slide key init\n");
for (i = 0; i < __this->num; i++) {
adc_add_sample_ch(__this->port[i].ad_channel);
gpio_set_die(__this->port[i].io, 0);
gpio_set_direction(__this->port[i].io, 1);
gpio_set_pull_down(__this->port[i].io, 0);
if (__this->port[i].io_up_en) {
gpio_set_pull_up(__this->port[i].io, 1);
} else {
gpio_set_pull_up(__this->port[i].io, 0);
}
}
return 0;
}
#endif /* #if TCFG_SLIDE_KEY_ENABLE */