fix debouncing
This commit is contained in:
parent
f7952dcacb
commit
dd00a86a85
60
input.c
60
input.c
@ -24,13 +24,35 @@
|
|||||||
|
|
||||||
/* *********************************************************************** */
|
/* *********************************************************************** */
|
||||||
|
|
||||||
|
#define INPUT_DEBOUNCE_TIMER 60
|
||||||
|
|
||||||
|
/* *********************************************************************** */
|
||||||
|
|
||||||
static uint8_t pcint_old;
|
static uint8_t pcint_old;
|
||||||
static uint8_t quad_state;
|
static uint8_t quad_state;
|
||||||
static uint8_t quad_state_old;
|
static uint8_t quad_state_old;
|
||||||
static uint8_t debounce_timer[2];
|
static uint8_t debounce_timer[2];
|
||||||
|
static uint8_t input_old_state[2];
|
||||||
|
|
||||||
/* *********************************************************************** */
|
/* *********************************************************************** */
|
||||||
|
|
||||||
|
static void input_send_event(uint8_t channel, uint8_t state)
|
||||||
|
{
|
||||||
|
if ((channel != EVENT_NUM_INPUT_BUTTON) && (channel != EVENT_NUM_INPUT_DOOR))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((debounce_timer[channel -2] == 0) && (state != input_old_state[channel -2]))
|
||||||
|
{
|
||||||
|
event_queue(EVENT_TYPE_INPUT, channel, state);
|
||||||
|
|
||||||
|
debounce_timer[channel -2] = INPUT_DEBOUNCE_TIMER;
|
||||||
|
input_old_state[channel -2] = state;
|
||||||
|
}
|
||||||
|
} /* input_send_event */
|
||||||
|
|
||||||
|
|
||||||
ISR(PCINT1_vect)
|
ISR(PCINT1_vect)
|
||||||
{
|
{
|
||||||
uint8_t pcint_new = PINC & PCMSK1;
|
uint8_t pcint_new = PINC & PCMSK1;
|
||||||
@ -80,28 +102,12 @@ ISR(PCINT1_vect)
|
|||||||
/* quadruple decoder switch changed */
|
/* quadruple decoder switch changed */
|
||||||
else if (pcint & (1<<PINC2))
|
else if (pcint & (1<<PINC2))
|
||||||
{
|
{
|
||||||
if (debounce_timer[0] == 0)
|
input_send_event(EVENT_NUM_INPUT_BUTTON, !!(pcint_new & (1<<PINC2)));
|
||||||
{
|
|
||||||
debounce_timer[0] = 60; /* ~60ms */
|
|
||||||
|
|
||||||
event_queue(EVENT_TYPE_INPUT,
|
|
||||||
EVENT_NUM_INPUT_BUTTON,
|
|
||||||
!!(pcint_new & (1<<PINC2))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* door switch changed */
|
/* door switch changed */
|
||||||
else if (pcint & (1<<PINC3))
|
else if (pcint & (1<<PINC3))
|
||||||
{
|
{
|
||||||
if (debounce_timer[1] == 0)
|
input_send_event(EVENT_NUM_INPUT_DOOR, !!(pcint_new & (1<<PINC3)));
|
||||||
{
|
|
||||||
debounce_timer[1] = 60; /* ~60ms */
|
|
||||||
|
|
||||||
event_queue(EVENT_TYPE_INPUT,
|
|
||||||
EVENT_NUM_INPUT_DOOR,
|
|
||||||
!!(pcint_new & (1<<PINC3))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* one revolution completed? */
|
/* one revolution completed? */
|
||||||
@ -142,11 +148,19 @@ void input_tick(void)
|
|||||||
if (debounce_timer[0] > 0)
|
if (debounce_timer[0] > 0)
|
||||||
{
|
{
|
||||||
debounce_timer[0]--;
|
debounce_timer[0]--;
|
||||||
|
if (debounce_timer[0] == 0)
|
||||||
|
{
|
||||||
|
input_send_event(EVENT_NUM_INPUT_BUTTON, !!(PINC & (1<<PINC2)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debounce_timer[1] > 0)
|
if (debounce_timer[1] > 0)
|
||||||
{
|
{
|
||||||
debounce_timer[1]--;
|
debounce_timer[1]--;
|
||||||
|
if (debounce_timer[1] == 0)
|
||||||
|
{
|
||||||
|
input_send_event(EVENT_NUM_INPUT_DOOR, !!(PINC & (1<<PINC3)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} /* input_tick */
|
} /* input_tick */
|
||||||
|
|
||||||
@ -168,14 +182,8 @@ void input_init(void)
|
|||||||
quad_state = PINC & ((1<<PINC0) | (1<<PINC1));
|
quad_state = PINC & ((1<<PINC0) | (1<<PINC1));
|
||||||
|
|
||||||
/* send button state */
|
/* send button state */
|
||||||
event_queue(EVENT_TYPE_INPUT,
|
input_send_event(EVENT_NUM_INPUT_BUTTON, !!(PINC & (1<<PINC2)));
|
||||||
EVENT_NUM_INPUT_BUTTON,
|
|
||||||
!!(pcint_old & (1<<PINC2))
|
|
||||||
);
|
|
||||||
|
|
||||||
/* send door state */
|
/* send door state */
|
||||||
event_queue(EVENT_TYPE_INPUT,
|
input_send_event(EVENT_NUM_INPUT_DOOR, !!(PINC & (1<<PINC3)));
|
||||||
EVENT_NUM_INPUT_DOOR,
|
|
||||||
!!(pcint_old & (1<<PINC3))
|
|
||||||
);
|
|
||||||
} /* input_init */
|
} /* input_init */
|
||||||
|
Loading…
Reference in New Issue
Block a user