From f4a7c85c1ab8e8489610c3ffc31cc2db1ed709c3 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 2 Jun 2014 14:37:14 +0000 Subject: added LP filter for GPIO Input diff --git a/software/rhmixxx/gpio.c b/software/rhmixxx/gpio.c index bd4906a..dcba880 100644 --- a/software/rhmixxx/gpio.c +++ b/software/rhmixxx/gpio.c @@ -27,7 +27,12 @@ #define GPIO_PORT PORTE #define GPIO_DDR DDRE -uint8_t input_last_sent[GPIO_NUM_INPUTS]; +#define GPIO_INPUT_LP_CNT_MAX 200 +static struct { + uint8_t last_sent; + int16_t lp_cnt; +} gpio_input_state[GPIO_NUM_INPUTS]; + void gpio_init(void) { @@ -35,8 +40,10 @@ void gpio_init(void) GPIO_PORT = 0xF0; uint8_t i; - for(i = 0; i < GPIO_NUM_INPUTS; ++i) - input_last_sent[i] = 0; + for(i = 0; i < GPIO_NUM_INPUTS; ++i) { + gpio_input_state[i].last_sent = 0; + gpio_input_state[i].lp_cnt = 0; + } } void gpio_out_on(uint8_t num) @@ -68,9 +75,16 @@ void gpio_task(void) uint8_t i; for(i = 0; i < GPIO_NUM_INPUTS; ++i) { uint8_t current_state = GPIO_PIN & (1<<(i+4)); - if(current_state != input_last_sent[i]) { - input_last_sent[i] = current_state; - eventqueue_push(i + GPIO_MIDI_NOTE_OFFSET, ((current_state) ? 0 : 1)); + + gpio_input_state[i].lp_cnt += current_state ? -1 : +1; + if(gpio_input_state[i].lp_cnt <= 0 || + gpio_input_state[i].lp_cnt >= GPIO_INPUT_LP_CNT_MAX) { + + gpio_input_state[i].lp_cnt = gpio_input_state[i].lp_cnt <= 0 ? 0 : GPIO_INPUT_LP_CNT_MAX; + if(current_state != gpio_input_state[i].last_sent) { + gpio_input_state[i].last_sent = current_state; + eventqueue_push(GPIO_MIDI_NOTE_OFFSET + i, ((current_state) ? 0 : 1)); + } } } } -- cgit v0.10.2