|
|
@ -1,3 +1,12 @@ |
|
|
|
#include <stdio.h> |
|
|
|
#include "freertos/FreeRTOS.h" |
|
|
|
#include "freertos/task.h" |
|
|
|
#include "esp_log.h" |
|
|
|
|
|
|
|
#include "driver/touch_pad.h" |
|
|
|
#include "soc/rtc_cntl_reg.h" |
|
|
|
#include "soc/sens_reg.h" |
|
|
|
|
|
|
|
#include "Arduino.h" |
|
|
|
#include "keyboard.h" |
|
|
|
|
|
|
@ -6,64 +15,56 @@ using namespace std; |
|
|
|
Keyboard::Keyboard() { |
|
|
|
} |
|
|
|
|
|
|
|
void gotTouch0() { |
|
|
|
touchDetected[0] = true; |
|
|
|
} |
|
|
|
void gotTouch1() { |
|
|
|
touchDetected[1] = true; |
|
|
|
} |
|
|
|
void gotTouch2() { |
|
|
|
touchDetected[2] = true; |
|
|
|
} |
|
|
|
void gotTouch3() { |
|
|
|
touchDetected[3] = true; |
|
|
|
} |
|
|
|
void gotTouch4() { |
|
|
|
touchDetected[4] = true; |
|
|
|
} |
|
|
|
void gotTouch5() { |
|
|
|
touchDetected[5] = true; |
|
|
|
} |
|
|
|
void gotTouch6() { |
|
|
|
touchDetected[6] = true; |
|
|
|
} |
|
|
|
void gotTouch7() { |
|
|
|
touchDetected[7] = true; |
|
|
|
} |
|
|
|
void gotTouch8() { |
|
|
|
touchDetected[8] = true; |
|
|
|
} |
|
|
|
void gotTouch9() { |
|
|
|
touchDetected[9] = true; |
|
|
|
/*
|
|
|
|
Handle an interrupt triggered when a pad is touched. |
|
|
|
Recognize what pad has been touched and save it in a table. |
|
|
|
https://github.com/espressif/esp-idf/blob/master/examples/peripherals/touch_pad_interrupt/main/tp_interrupt_main.c
|
|
|
|
*/ |
|
|
|
static void tp_example_rtc_intr(void *arg) { |
|
|
|
uint32_t pad_intr = READ_PERI_REG(SENS_SAR_TOUCH_CTRL2_REG) & 0x3ff; |
|
|
|
uint32_t rtc_intr = READ_PERI_REG(RTC_CNTL_INT_ST_REG); |
|
|
|
//clear interrupt
|
|
|
|
WRITE_PERI_REG(RTC_CNTL_INT_CLR_REG, rtc_intr); |
|
|
|
SET_PERI_REG_MASK(SENS_SAR_TOUCH_CTRL2_REG, SENS_TOUCH_MEAS_EN_CLR); |
|
|
|
|
|
|
|
if (rtc_intr & RTC_CNTL_TOUCH_INT_ST) { |
|
|
|
for (int i = 0; i < TOUCH_PAD_NUM; i++) { |
|
|
|
if ((pad_intr >> i) & 0x01) { |
|
|
|
s_pad_activated[i] = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool Keyboard::getTouchDetected(uint8_t pad) { |
|
|
|
bool res = touchDetected[pad]; |
|
|
|
touchDetected[pad] = false; |
|
|
|
bool res = s_pad_activated[pad]; |
|
|
|
s_pad_activated[pad] = false; |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
void Keyboard::init() { |
|
|
|
threshold[0] = 40; |
|
|
|
touch_pad_init(); |
|
|
|
|
|
|
|
Serial.println("touchpad values:"); |
|
|
|
for (int i=0; i<TOUCH_PAD_NUM; i++) { |
|
|
|
uint16_t touch_value; |
|
|
|
touch_pad_read((touch_pad_t)i, &touch_value); |
|
|
|
Serial.println(touch_value, DEC); |
|
|
|
} |
|
|
|
// set thresholds // ToDo: don't hardcode thresholds
|
|
|
|
threshold[0] = 500; |
|
|
|
threshold[1] = 0; |
|
|
|
threshold[2] = 0; |
|
|
|
threshold[3] = 40; |
|
|
|
threshold[4] = 40; |
|
|
|
threshold[5] = 40; |
|
|
|
threshold[6] = 40; |
|
|
|
threshold[7] = 40; |
|
|
|
threshold[8] = 20; |
|
|
|
threshold[9] = 20; |
|
|
|
for (int i=0; i<=9; i++) touchDetected[i] = false; |
|
|
|
touchAttachInterrupt(T0, gotTouch0, threshold[0]); |
|
|
|
// touchAttachInterrupt(T1, gotTouch1, threshold[1]); // GPIO_00 not usable on dev board
|
|
|
|
// touchAttachInterrupt(T2, gotTouch2, threshold[2]); // GPIO_02 not usable on dev board
|
|
|
|
touchAttachInterrupt(T3, gotTouch3, threshold[3]); |
|
|
|
touchAttachInterrupt(T4, gotTouch4, threshold[4]); |
|
|
|
touchAttachInterrupt(T5, gotTouch5, threshold[5]); |
|
|
|
touchAttachInterrupt(T6, gotTouch6, threshold[6]); |
|
|
|
touchAttachInterrupt(T7, gotTouch7, threshold[7]); |
|
|
|
touchAttachInterrupt(T8, gotTouch8, threshold[8]); |
|
|
|
touchAttachInterrupt(T9, gotTouch9, threshold[9]); |
|
|
|
threshold[3] = 666; |
|
|
|
threshold[4] = 700; |
|
|
|
threshold[5] = 700; |
|
|
|
threshold[6] = 800; |
|
|
|
threshold[7] = 800; |
|
|
|
threshold[8] = 170; |
|
|
|
threshold[9] = 350; |
|
|
|
for (int i=0; i<TOUCH_PAD_NUM; i++) touch_pad_config((touch_pad_t)i, threshold[i]); |
|
|
|
|
|
|
|
// interrupt handler
|
|
|
|
touch_pad_isr_handler_register(tp_example_rtc_intr, NULL, 0, NULL); |
|
|
|
} |
|
|
|
|
|
|
|