summaryrefslogtreecommitdiff
path: root/software/rhmixxx
diff options
context:
space:
mode:
Diffstat (limited to 'software/rhmixxx')
-rw-r--r--software/rhmixxx/gpio.c26
1 files changed, 20 insertions, 6 deletions
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));
+ }
}
}
}