Files
esp-idf/examples/system/ulp/ulp_riscv/touch/main/ulp/main.c
T
Sudeep Mohanty ba2daf3c9e ulp-riscv-touch: Added support for the touch sensor on ULP RISC-V
This commit adds a driver for reading the touch sensor from the ULP
RISC-V core during sleep. The commit also adds an example to demonstrate
this feature.

Closes https://github.com/espressif/esp-idf/issues/10480
2023-06-09 08:41:34 +02:00

77 lines
1.9 KiB
C

/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
/*
* ULP-RISC-V touch sensor example
* This code runs on ULP-RISC-V coprocessor
*/
#include <stdint.h>
#include "ulp_riscv.h"
#include "ulp_riscv_utils.h"
#include "ulp_riscv_touch_ulp_core.h"
/* This variable will be exported as a public symbol, visible from main CPU: */
uint32_t touch_data = 0;
/* Touch pad threshold */
#define TOUCH_PAD_THRESHOLD 1000U
#define TOUCH_BUTTON_NUM 14U
static const touch_pad_t button[TOUCH_BUTTON_NUM] = {
TOUCH_PAD_NUM1,
TOUCH_PAD_NUM2,
TOUCH_PAD_NUM3,
TOUCH_PAD_NUM4,
TOUCH_PAD_NUM5,
TOUCH_PAD_NUM6,
TOUCH_PAD_NUM7,
TOUCH_PAD_NUM8,
TOUCH_PAD_NUM9,
TOUCH_PAD_NUM10,
TOUCH_PAD_NUM11,
TOUCH_PAD_NUM12,
TOUCH_PAD_NUM13,
TOUCH_PAD_NUM14
};
int main (void)
{
esp_err_t err = ESP_OK;
uint32_t benchmark = 0;
uint32_t smooth = 0;
uint32_t touch_value = 0;
for (int i = 0; i < TOUCH_BUTTON_NUM; i++) {
/* Read the benchmark and the filtered (smooth) touch data */
err = ulp_riscv_touch_pad_read_benchmark(button[i], &benchmark);
err = ulp_riscv_touch_pad_filter_read_smooth(button[i], &smooth);
if (err != ESP_OK) {
/* Skip channel this time */
continue;
}
/* The difference between the benchmark and the smooth touch data
* is used to determine an active touch pad.
* Check if the touch value breaches the wakeup threshold.
*/
if (smooth > benchmark) {
if ((smooth - benchmark) > TOUCH_PAD_THRESHOLD) {
touch_value |= (1 << button[i]);
}
}
}
if (touch_value) {
touch_data = touch_value;
ulp_riscv_wakeup_main_processor();
touch_value = 0;
}
/* ulp_riscv_halt() is called automatically when main exits */
return 0;
}