D-Pad,Touch -Pad , button的中文解析

本文详细介绍了游戏控制器中D-pad的设置选项,包括轴数选择如双轴和四轴的区别,以及Touch-Pad的特性如DPI自适应和swipein滑动触发功能。同时,文中也提到了Button按钮的使用,尽管其设置较为简单。

D-Pad

因为D-pad很多设置与虚拟摇杆的相同,所以本博客只介绍与虚拟摇杆不一样的设置

轴数设置,tow是双轴,four是四轴双轴,四轴

 

Touch-Pad(类似于是一个鼠标触控板)

DPI是自动适应不同分辨率的设备,

swipe in是从外面滑进来也是能触发的,

 

Button(按钮)

非常简单,不写了

 

 

 

/* * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ #include <stdio.h> #include <inttypes.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "esp_log.h" #include "driver/touch_pad.h" static const char *TAG = "Touch pad"; static QueueHandle_t que_touch = NULL; typedef struct touch_msg { touch_pad_intr_mask_t intr_mask; uint32_t pad_num; uint32_t pad_status; uint32_t pad_val; } touch_event_t; #define TOUCH_BUTTON_NUM 4 #define TOUCH_BUTTON_WATERPROOF_ENABLE 1 #define TOUCH_BUTTON_DENOISE_ENABLE 1 #define TOUCH_CHANGE_CONFIG 0 static const touch_pad_t button[TOUCH_BUTTON_NUM] = { TOUCH_PAD_NUM7, // 'SELECT' button. TOUCH_PAD_NUM9, // 'MENU' button. TOUCH_PAD_NUM11, // 'BACK' button. TOUCH_PAD_NUM13, // Guard ring for waterproof design. // If this pad be touched, other pads no response. }; /* * Touch threshold. The threshold determines the sensitivity of the touch. * This threshold is derived by testing changes in readings from different touch channels. * If (raw_data - benchmark) > benchmark * threshold, the pad be activated. * If (raw_data - benchmark) < benchmark * threshold, the pad be inactivated. */ static const float button_threshold[TOUCH_BUTTON_NUM] = { 0.2, // 20%. 0.2, // 20%. 0.2, // 20%. 0.1, // 10%. }; /* Handle an interrupt triggered when a pad is touched. Recognize what pad has been touched and save it in a table. */ static void touchsensor_interrupt_cb(void *arg) { int task_awoken = pdFALSE; touch_event_t evt; evt.intr_mask = touch_pad_read_intr_status_mask(); evt.pad_status = touch_pad_get_status(); evt.pad_num = touch_pad_get_current_meas_channel(); xQueueSendFromISR(que_touch, &evt, &task_awoken); if (task_awoken == pdTRUE) { portYIELD_FROM_ISR(); } } static void tp_example_set_thresholds(void) { uint32_t touch_value; for (int i = 0; i < TOUCH_BUTTON_NUM; i++) { //read benchmark value touch_pad_read_benchmark(button[i], &touch_value); //set interrupt threshold. touch_pad_set_thresh(button[i], touch_value * button_threshold[i]); ESP_LOGI(TAG, "touch pad [%d] base %"PRIu32", thresh %"PRIu32, \ button[i], touch_value, (uint32_t)(touch_value * button_threshold[i])); } } static void touchsensor_filter_set(touch_filter_mode_t mode) { /* Filter function */ touch_filter_config_t filter_info = { .mode = mode, // Test jitter and filter 1/4. .debounce_cnt = 1, // 1 time count. .noise_thr = 0, // 50% .jitter_step = 4, // use for jitter mode. .smh_lvl = TOUCH_PAD_SMOOTH_IIR_2, }; touch_pad_filter_set_config(&filter_info); touch_pad_filter_enable(); ESP_LOGI(TAG, "touch pad filter init"); } static void tp_example_read_task(void *pvParameter) { touch_event_t evt = {0}; static uint8_t guard_mode_flag = 0; /* Wait touch sensor init done */ vTaskDelay(50 / portTICK_PERIOD_MS); tp_example_set_thresholds(); while (1) { int ret = xQueueReceive(que_touch, &evt, (TickType_t)portMAX_DELAY); if (ret != pdTRUE) { continue; } if (evt.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) { /* if guard pad be touched, other pads no response. */ if (evt.pad_num == button[3]) { guard_mode_flag = 1; ESP_LOGW(TAG, "TouchSensor [%"PRIu32"] be activated, enter guard mode", evt.pad_num); } else { if (guard_mode_flag == 0) { ESP_LOGI(TAG, "TouchSensor [%"PRIu32"] be activated, status mask 0x%"PRIu32"", evt.pad_num, evt.pad_status); } else { ESP_LOGW(TAG, "In guard mode. No response"); } } } if (evt.intr_mask & TOUCH_PAD_INTR_MASK_INACTIVE) { /* if guard pad be touched, other pads no response. */ if (evt.pad_num == button[3]) { guard_mode_flag = 0; ESP_LOGW(TAG, "TouchSensor [%"PRIu32"] be inactivated, exit guard mode", evt.pad_num); } else { if (guard_mode_flag == 0) { ESP_LOGI(TAG, "TouchSensor [%"PRIu32"] be inactivated, status mask 0x%"PRIu32, evt.pad_num, evt.pad_status); } } } if (evt.intr_mask & TOUCH_PAD_INTR_MASK_SCAN_DONE) { ESP_LOGI(TAG, "The touch sensor group measurement is done [%"PRIu32"].", evt.pad_num); } if (evt.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) { /* Add your exception handling in here. */ ESP_LOGI(TAG, "Touch sensor channel %"PRIu32" measure timeout. Skip this exception channel!!", evt.pad_num); touch_pad_timeout_resume(); // Point on the next channel to measure. } } } void app_main(void) { if (que_touch == NULL) { que_touch = xQueueCreate(TOUCH_BUTTON_NUM, sizeof(touch_event_t)); } // Initialize touch pad peripheral, it will start a timer to run a filter ESP_LOGI(TAG, "Initializing touch pad"); /* Initialize touch pad peripheral. */ touch_pad_init(); for (int i = 0; i < TOUCH_BUTTON_NUM; i++) { touch_pad_config(button[i]); } #if TOUCH_CHANGE_CONFIG /* If you want change the touch sensor default setting, please write here(after initialize). There are examples: */ touch_pad_set_measurement_interval(TOUCH_PAD_SLEEP_CYCLE_DEFAULT); touch_pad_set_charge_discharge_times(TOUCH_PAD_MEASURE_CYCLE_DEFAULT); touch_pad_set_voltage(TOUCH_PAD_HIGH_VOLTAGE_THRESHOLD, TOUCH_PAD_LOW_VOLTAGE_THRESHOLD, TOUCH_PAD_ATTEN_VOLTAGE_THRESHOLD); touch_pad_set_idle_channel_connect(TOUCH_PAD_IDLE_CH_CONNECT_DEFAULT); for (int i = 0; i < TOUCH_BUTTON_NUM; i++) { touch_pad_set_cnt_mode(button[i], TOUCH_PAD_SLOPE_DEFAULT, TOUCH_PAD_TIE_OPT_DEFAULT); } #endif #if TOUCH_BUTTON_DENOISE_ENABLE /* Denoise setting at TouchSensor 0. */ touch_pad_denoise_t denoise = { /* The bits to be cancelled are determined according to the noise level. */ .grade = TOUCH_PAD_DENOISE_BIT4, /* By adjusting the parameters, the reading of T0 should be approximated to the reading of the measured channel. */ .cap_level = TOUCH_PAD_DENOISE_CAP_L4, }; touch_pad_denoise_set_config(&denoise); touch_pad_denoise_enable(); ESP_LOGI(TAG, "Denoise function init"); #endif #if TOUCH_BUTTON_WATERPROOF_ENABLE /* Waterproof function */ touch_pad_waterproof_t waterproof = { .guard_ring_pad = button[3], // If no ring pad, set 0; /* It depends on the number of the parasitic capacitance of the shield pad. Based on the touch readings of T14 and T0, estimate the size of the parasitic capacitance on T14 and set the parameters of the appropriate hardware. */ .shield_driver = TOUCH_PAD_SHIELD_DRV_L2, }; touch_pad_waterproof_set_config(&waterproof); touch_pad_waterproof_enable(); ESP_LOGI(TAG, "touch pad waterproof init"); #endif /* Filter setting */ touchsensor_filter_set(TOUCH_PAD_FILTER_IIR_16); touch_pad_timeout_set(true, TOUCH_PAD_THRESHOLD_MAX); /* Register touch interrupt ISR, enable intr type. */ touch_pad_isr_register(touchsensor_interrupt_cb, NULL, TOUCH_PAD_INTR_MASK_ALL); /* If you have other touch algorithm, you can get the measured value after the `TOUCH_PAD_INTR_MASK_SCAN_DONE` interrupt is generated. */ touch_pad_intr_enable(TOUCH_PAD_INTR_MASK_ACTIVE | TOUCH_PAD_INTR_MASK_INACTIVE | TOUCH_PAD_INTR_MASK_TIMEOUT); /* Enable touch sensor clock. Work mode is "timer trigger". */ touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER); touch_pad_fsm_start(); // Start a task to show what pads have been touched xTaskCreate(&tp_example_read_task, "touch_pad_read_task", 4096, NULL, 5, NULL); esp_sleep_enable_touchpad_wakeup(); // 启用触摸唤醒 esp_deep_sleep_start(); } 如何真正实现触摸唤醒
07-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一丁目赠我

谢谢你的打赏,感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值