/* 2015, Ralf Ramsauer * ralf@binary-kitchen.de */ #include #include #include #include #include "io.h" #include "uart.h" static volatile enum {LOCKED, UNLOCKED} state = LOCKED; static volatile bool schnapper = false; static inline void reset_timeout(void) { TCNT1 = 0; } void uart_handler(const unsigned char c) { char retval = c; switch ((char)c) { case 'u': state = UNLOCKED; reset_timeout(); break; case 'l': state = LOCKED; break; case 'p': break; case 's': if (state == UNLOCKED) schnapper = true; else retval = '?'; break; case 'i': retval = (state == LOCKED) ? 'l' : 'u'; break; default: retval = '?'; break; } uart_putc(retval); } // Alle 1.137 Sekunden ISR(TIMER1_OVF_vect) { state = LOCKED; } // Notzu ISR(INT0_vect) { cli(); // This code is used to prevent spurious interrupts _delay_ms(50); if (!is_button_lock()) goto out; uart_putc('L'); state = LOCKED; out: sei(); } // Notauf ISR(INT1_vect) { cli(); // This code is used to prevent spurious interrupts _delay_ms(50); if (!is_button_unlock()) goto out; uart_putc('U'); bolzen_off(); schnapper_on(); _delay_ms(3000); schnapper_off(); out: sei(); } int main(void) { cli(); io_init(); // Wait a bit to settle down _delay_ms(1000); uart_init(); uart_set_recv_handler(uart_handler); // Timer config TIMSK |= (1<