Handle switch input
The `input` enum is extended with `click` and `hold` values and all dependencies are adapted to that. In order to handle the `click` input an interrupt is used. Further, for handling held button input with the switch the Timer/Counter1 compare match interrupt with OCR1A is used.
This commit is contained in:
parent
e099b0f94a
commit
6746d34b2f
1 changed files with 48 additions and 2 deletions
|
@ -58,7 +58,7 @@ static const struct symbol sym_9 = { 5, { 0xF8, 0xFC, 0x8C, 0xFC, 0xF8,
|
||||||
static const struct symbol sym_setup = { 19, { 0xF8, 0x98, 0xB8, 0x00, 0xF8, 0x98, 0x18, 0x00, 0x18, 0xF8, 0x18, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x98, 0xF8,
|
static const struct symbol sym_setup = { 19, { 0xF8, 0x98, 0xB8, 0x00, 0xF8, 0x98, 0x18, 0x00, 0x18, 0xF8, 0x18, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x98, 0xF8,
|
||||||
0x1D, 0x19, 0x1F, 0x00, 0x1F, 0x19, 0x18, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x00, 0x1F, 0x01, 0x01 } };
|
0x1D, 0x19, 0x1F, 0x00, 0x1F, 0x19, 0x18, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x00, 0x1F, 0x01, 0x01 } };
|
||||||
|
|
||||||
enum input {cw, ccw};
|
enum input {cw, ccw, click, hold};
|
||||||
|
|
||||||
static enum state {home} current_state = home;
|
static enum state {home} current_state = home;
|
||||||
static enum home_state {ch1, ch2, ch3, setup} current_home_state = ch1;
|
static enum home_state {ch1, ch2, ch3, setup} current_home_state = ch1;
|
||||||
|
@ -253,6 +253,10 @@ static void update_home(enum input event) {
|
||||||
current_home_state = setup;
|
current_home_state = setup;
|
||||||
lcd_home();
|
lcd_home();
|
||||||
break;
|
break;
|
||||||
|
case click:
|
||||||
|
break;
|
||||||
|
case hold:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,12 +314,45 @@ ISR(PCINT0_vect) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: proper debounce and dechattering
|
// TODO: proper dechattering
|
||||||
_delay_us(100);
|
_delay_us(100);
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// encoder button interrupt
|
||||||
|
ISR(PCINT1_vect) {
|
||||||
|
cli();
|
||||||
|
|
||||||
|
if (PINC & (1 << PC0)) { // release
|
||||||
|
TCCR1B &= (0 << CS11) & (0 << CS10); // Disable Timer/Counter1
|
||||||
|
if (TCNT1 != 0) {
|
||||||
|
update_state(click); // Switch to selected state
|
||||||
|
TCNT1 = 0;
|
||||||
|
}
|
||||||
|
} else { // press
|
||||||
|
if (!(TCCR1B & (1 << CS10))) {
|
||||||
|
TCCR1B |= (1 << CS11) | (1 << CS10); // Enable Timer/Counter1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: proper debouncing
|
||||||
|
_delay_us(70);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timer/Counter1 compare match A
|
||||||
|
ISR(TIMER1_COMPA_vect) {
|
||||||
|
cli();
|
||||||
|
|
||||||
|
TCCR1B &= (0 << CS11) & (0 << CS10); // Disable Timer/Counter1
|
||||||
|
TCNT1 = 0;
|
||||||
|
update_state(hold);
|
||||||
|
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
// FastPWM: 1.25kHz
|
// FastPWM: 1.25kHz
|
||||||
// TODO: Try to get the backlit even more dim
|
// TODO: Try to get the backlit even more dim
|
||||||
|
@ -334,6 +371,15 @@ int main(void) {
|
||||||
PCICR |= (1 << PCIE0);
|
PCICR |= (1 << PCIE0);
|
||||||
PCMSK0 |= (1 << PCINT6) | (1 << PCINT7);
|
PCMSK0 |= (1 << PCINT6) | (1 << PCINT7);
|
||||||
|
|
||||||
|
// Encoder switch setup
|
||||||
|
PORTC |= (1 << PC0);
|
||||||
|
PCICR |= (1 << PCIE1);
|
||||||
|
PCMSK1 |= (1 << PCINT8);
|
||||||
|
|
||||||
|
// Timer1 setup to recognize held button
|
||||||
|
OCR1A = 8192;
|
||||||
|
TIMSK1 |= (1 << OCIE1A); // Enable match compare A
|
||||||
|
|
||||||
// Show splash screen and load the menu
|
// Show splash screen and load the menu
|
||||||
lcd_splash();
|
lcd_splash();
|
||||||
_delay_ms(250);
|
_delay_ms(250);
|
||||||
|
|
Loading…
Reference in a new issue