From 6501c3dd74c25ceae29f4d0eedd59ff74e9c1183 Mon Sep 17 00:00:00 2001 From: DiSlord Date: Sat, 4 Jul 2020 14:37:39 +0300 Subject: [PATCH] Better responsive touch, also use averaging for touch X/Y read Define and use ADC channels name (for easy use on another boards) --- nanovna.h | 2 ++ ui.c | 75 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/nanovna.h b/nanovna.h index 4171a9d..635c072 100644 --- a/nanovna.h +++ b/nanovna.h @@ -829,6 +829,8 @@ void enter_dfu(void); /* * adc.c */ +#define ADC_TOUCH_X ADC_CHSELR_CHSEL6 +#define ADC_TOUCH_Y ADC_CHSELR_CHSEL7 void adc_init(void); uint16_t adc_single_read(uint32_t chsel); diff --git a/ui.c b/ui.c index e339e83..f78b0e4 100644 --- a/ui.c +++ b/ui.c @@ -195,71 +195,74 @@ static int btn_wait_release(void) } } +// ADC read count for measure X and Y (better be 2^n) +#define TOUCH_MEASURE_COUNT 8 static int touch_measure_y(void) { - int v; + int v = 0, i = TOUCH_MEASURE_COUNT; // open Y line - palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLDOWN ); - palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLDOWN ); + palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_INPUT_PULLDOWN); // drive low to high on X line - palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL ); - palClearPad(GPIOB, 0); - palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL ); - palSetPad(GPIOA, 6); + palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_OUTPUT_PUSHPULL); + // drive low to high on X line (coordinates from left to right) + palClearPad(GPIOB, GPIOB_XN); + palSetPad(GPIOA, GPIOA_XP); - chThdSleepMilliseconds(2); - v = adc_single_read(ADC_CHSELR_CHSEL7); - //chThdSleepMilliseconds(2); - //v += adc_single_read(ADC1, ADC_CHSELR_CHSEL7); - return v; + do{ + v+= adc_single_read(ADC_TOUCH_Y); + }while(--i); + return v/TOUCH_MEASURE_COUNT; } static int touch_measure_x(void) { - int v; - // open X line - palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_PULLDOWN ); - palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_PULLDOWN ); - // drive low to high on Y line - palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL ); - palSetPad(GPIOB, 1); - palSetPadMode(GPIOA, 7, PAL_MODE_OUTPUT_PUSHPULL ); - palClearPad(GPIOA, 7); + int v = 0, i = TOUCH_MEASURE_COUNT; + // Set X line as input + palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_INPUT_PULLDOWN); + // Set Y line as output + palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_OUTPUT_PUSHPULL); + // drive high to low on Y line (coordinates from bottom to top) + palSetPad(GPIOB, GPIOB_YN); + palClearPad(GPIOA, GPIOA_YP); - chThdSleepMilliseconds(2); - v = adc_single_read(ADC_CHSELR_CHSEL6); - //chThdSleepMilliseconds(2); - //v += adc_single_read(ADC1, ADC_CHSELR_CHSEL6); - return v; + do{ + v+= adc_single_read(ADC_TOUCH_X); + }while(--i); + return v/TOUCH_MEASURE_COUNT; } void touch_prepare_sense(void) { - // open Y line - palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLDOWN ); - palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLDOWN ); + // Set Y line as input + palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_INPUT_PULLDOWN); // force high X line - palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL ); - palSetPad(GPIOB, 0); - palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL ); - palSetPad(GPIOA, 6); + palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_OUTPUT_PUSHPULL); + // drive high on X line (for touch sense on Y) + palSetPad(GPIOB, GPIOB_XN); + palSetPad(GPIOA, GPIOA_XP); } void touch_start_watchdog(void) { touch_prepare_sense(); - adc_start_analog_watchdogd(ADC_CHSELR_CHSEL7); + adc_start_analog_watchdogd(ADC_TOUCH_Y); } static int touch_status(void) { touch_prepare_sense(); - return adc_single_read(ADC_CHSELR_CHSEL7) > TOUCH_THRESHOLD; + return adc_single_read(ADC_TOUCH_Y) > TOUCH_THRESHOLD; } static int @@ -267,7 +270,7 @@ touch_check(void) { int stat = touch_status(); if (stat) { - chThdSleepMilliseconds(10); +// chThdSleepMilliseconds(10); int x = touch_measure_x(); int y = touch_measure_y(); if (touch_status()) {