Better responsive touch, also use averaging for touch X/Y read

Define and use ADC channels name (for easy use on another boards)
pull/4/head
DiSlord 6 years ago
parent fbd0d90d27
commit 6501c3dd74

@ -829,6 +829,8 @@ void enter_dfu(void);
/* /*
* adc.c * adc.c
*/ */
#define ADC_TOUCH_X ADC_CHSELR_CHSEL6
#define ADC_TOUCH_Y ADC_CHSELR_CHSEL7
void adc_init(void); void adc_init(void);
uint16_t adc_single_read(uint32_t chsel); uint16_t adc_single_read(uint32_t chsel);

75
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 static int
touch_measure_y(void) touch_measure_y(void)
{ {
int v; int v = 0, i = TOUCH_MEASURE_COUNT;
// open Y line // open Y line
palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLDOWN ); palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLDOWN ); palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_INPUT_PULLDOWN);
// drive low to high on X line // drive low to high on X line
palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL ); palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_OUTPUT_PUSHPULL);
palClearPad(GPIOB, 0); palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL ); // drive low to high on X line (coordinates from left to right)
palSetPad(GPIOA, 6); palClearPad(GPIOB, GPIOB_XN);
palSetPad(GPIOA, GPIOA_XP);
chThdSleepMilliseconds(2); do{
v = adc_single_read(ADC_CHSELR_CHSEL7); v+= adc_single_read(ADC_TOUCH_Y);
//chThdSleepMilliseconds(2); }while(--i);
//v += adc_single_read(ADC1, ADC_CHSELR_CHSEL7); return v/TOUCH_MEASURE_COUNT;
return v;
} }
static int static int
touch_measure_x(void) touch_measure_x(void)
{ {
int v; int v = 0, i = TOUCH_MEASURE_COUNT;
// open X line // Set X line as input
palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_PULLDOWN ); palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_PULLDOWN ); palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_INPUT_PULLDOWN);
// drive low to high on Y line // Set Y line as output
palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL ); palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOB, 1); palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, 7, PAL_MODE_OUTPUT_PUSHPULL ); // drive high to low on Y line (coordinates from bottom to top)
palClearPad(GPIOA, 7); palSetPad(GPIOB, GPIOB_YN);
palClearPad(GPIOA, GPIOA_YP);
chThdSleepMilliseconds(2); do{
v = adc_single_read(ADC_CHSELR_CHSEL6); v+= adc_single_read(ADC_TOUCH_X);
//chThdSleepMilliseconds(2); }while(--i);
//v += adc_single_read(ADC1, ADC_CHSELR_CHSEL6); return v/TOUCH_MEASURE_COUNT;
return v;
} }
void void
touch_prepare_sense(void) touch_prepare_sense(void)
{ {
// open Y line // Set Y line as input
palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLDOWN ); palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_INPUT_PULLDOWN);
palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLDOWN ); palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_INPUT_PULLDOWN);
// force high X line // force high X line
palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL ); palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOB, 0); palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOA, 6, PAL_MODE_OUTPUT_PUSHPULL ); // drive high on X line (for touch sense on Y)
palSetPad(GPIOA, 6); palSetPad(GPIOB, GPIOB_XN);
palSetPad(GPIOA, GPIOA_XP);
} }
void void
touch_start_watchdog(void) touch_start_watchdog(void)
{ {
touch_prepare_sense(); touch_prepare_sense();
adc_start_analog_watchdogd(ADC_CHSELR_CHSEL7); adc_start_analog_watchdogd(ADC_TOUCH_Y);
} }
static int static int
touch_status(void) touch_status(void)
{ {
touch_prepare_sense(); touch_prepare_sense();
return adc_single_read(ADC_CHSELR_CHSEL7) > TOUCH_THRESHOLD; return adc_single_read(ADC_TOUCH_Y) > TOUCH_THRESHOLD;
} }
static int static int
@ -267,7 +270,7 @@ touch_check(void)
{ {
int stat = touch_status(); int stat = touch_status();
if (stat) { if (stat) {
chThdSleepMilliseconds(10); // chThdSleepMilliseconds(10);
int x = touch_measure_x(); int x = touch_measure_x();
int y = touch_measure_y(); int y = touch_measure_y();
if (touch_status()) { if (touch_status()) {

Loading…
Cancel
Save

Powered by TurnKey Linux.