109 lines
3.0 KiB
C
109 lines
3.0 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 SLIDEKEY_FLIT_CNT_MAX 3
|
||
|
#define SLIDEKEY_MAX_CH 10
|
||
|
#define SLIDEKEY_SCAN_TIME 50
|
||
|
|
||
|
struct slide_key {
|
||
|
u16 old_ad[SLIDEKEY_MAX_CH];
|
||
|
u16 flit_cnt[SLIDEKEY_MAX_CH];
|
||
|
const struct slidekey_platform_data *parm;
|
||
|
};
|
||
|
|
||
|
static struct slide_key key;
|
||
|
#define __this (&key)
|
||
|
|
||
|
static void slide_key_scan(void *p)
|
||
|
{
|
||
|
u8 i = 0;
|
||
|
u16 ad_value_cur = 0;
|
||
|
u16 offset;
|
||
|
u16 distance = 0;
|
||
|
|
||
|
if (!__this->parm->enable) {
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < __this->parm->num; i++) {
|
||
|
ad_value_cur = (u16)adc_get_value(__this->parm->port[i].ad_channel);
|
||
|
|
||
|
//printf("nl = %d,nd = %d\n",slide_now_level[i],adc_get_value(__this->parm->port[i].ad_channel));
|
||
|
if (ad_value_cur > __this->old_ad[i]) {
|
||
|
offset = ad_value_cur - __this->old_ad[i];
|
||
|
} else {
|
||
|
offset = __this->old_ad[i] - ad_value_cur;
|
||
|
}
|
||
|
u16 level = (u16)(__this->parm->port[i].level);
|
||
|
distance = 1023 / (level + 1);
|
||
|
if (offset > distance / 2) {
|
||
|
__this->flit_cnt[i]++;
|
||
|
if (__this->flit_cnt[i] >= SLIDEKEY_FLIT_CNT_MAX) {
|
||
|
__this->flit_cnt[i] = 0;
|
||
|
__this->old_ad[i] = ad_value_cur;
|
||
|
u16 cur_level = ad_value_cur / distance;
|
||
|
if (cur_level > level) {
|
||
|
cur_level = level;
|
||
|
}
|
||
|
//y_printf("key\n");
|
||
|
app_task_put_key_msg(__this->parm->port[i].msg, cur_level);
|
||
|
}
|
||
|
} else {
|
||
|
__this->flit_cnt[i] = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void slidekey_update(void)
|
||
|
{
|
||
|
local_irq_disable();
|
||
|
for (int i = 0; i < SLIDEKEY_MAX_CH; i++) {
|
||
|
__this->old_ad[i] = (u16) - 1; //设置重置,可实现手动更新一次, 更新通过消息通知
|
||
|
__this->flit_cnt[i] = 0;
|
||
|
}
|
||
|
local_irq_enable();
|
||
|
}
|
||
|
|
||
|
|
||
|
int slidekey_init(const struct slidekey_platform_data *slidekey_data)
|
||
|
{
|
||
|
u8 i = 0;
|
||
|
//memset(__this, 0x0, sizeof(struct slide_key));
|
||
|
for (i = 0; i < SLIDEKEY_MAX_CH; i++) {
|
||
|
__this->old_ad[i] = (u16) - 1; //设置初值, 防止第一次没有变化, 没有发出单位变化
|
||
|
__this->flit_cnt[i] = 0;
|
||
|
}
|
||
|
__this->parm = slidekey_data;
|
||
|
if (__this->parm == NULL) {
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
for (i = 0; i < __this->parm->num; i++) {
|
||
|
adc_add_sample_ch(__this->parm->port[i].ad_channel);
|
||
|
|
||
|
gpio_set_die(__this->parm->port[i].io, 0);
|
||
|
gpio_set_direction(__this->parm->port[i].io, 1);
|
||
|
gpio_set_pull_down(__this->parm->port[i].io, 0);
|
||
|
if (__this->parm->port[i].io_up_en) {
|
||
|
gpio_set_pull_up(__this->parm->port[i].io, 1);
|
||
|
} else {
|
||
|
gpio_set_pull_up(__this->parm->port[i].io, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sys_s_hi_timer_add(NULL, slide_key_scan, SLIDEKEY_SCAN_TIME); //注册按键扫描定时器
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif /* #if TCFG_SLIDE_KEY_ENABLE */
|
||
|
|