1
0
mirror of https://github.com/binary-kitchen/doorlockd synced 2024-05-29 02:45:07 +02:00

avr: improve logic

Signed-off-by: Ralf Ramsauer <ralf@binary-kitchen.de>
This commit is contained in:
Ralf Ramsauer 2018-09-03 22:13:41 +00:00
parent 25595f18f2
commit 29d722453d

View File

@ -12,6 +12,7 @@
#include "uart.h" #include "uart.h"
#include <ctype.h>
#include <stdbool.h> #include <stdbool.h>
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
@ -28,7 +29,13 @@
port &= ~(1 << pin); port &= ~(1 << pin);
/* can either be red, green, or yellow */ /* can either be red, green, or yellow */
static unsigned char state; static unsigned char state = RED;
enum state_source {
BUTTON,
COMM,
TIMEOUT,
};
static inline void set_schnapper(bool state) static inline void set_schnapper(bool state)
{ {
@ -86,31 +93,37 @@ static void set_leds(void)
} }
} }
static void update_state(unsigned char new_state) static void update_state(unsigned char new_state, enum state_source source)
{ {
char ret;
reset_timeout(); reset_timeout();
if (new_state == state) if (new_state == state)
return; return;
state = new_state; state = new_state;
switch (state) { switch (state) {
case RED: case RED:
set_bolzen(false); set_bolzen(false);
set_schnapper(false); set_schnapper(false);
uart_putc('r'); ret = 'r';
break; break;
case YELLOW: case YELLOW:
set_bolzen(true); set_bolzen(true);
set_schnapper(false); set_schnapper(false);
uart_putc('y'); ret = 'y';
break; break;
case GREEN: case GREEN:
set_bolzen(true); set_bolzen(true);
set_schnapper(true); set_schnapper(true);
uart_putc('g'); ret = 'g';
break; break;
} }
if (source == BUTTON)
ret = toupper(ret);
uart_putc(ret);
} }
ISR(USART_RX_vect) ISR(USART_RX_vect)
@ -120,13 +133,13 @@ ISR(USART_RX_vect)
switch (c) { switch (c) {
case 'r': case 'r':
update_state(RED); update_state(RED, COMM);
break; break;
case 'y': case 'y':
update_state(YELLOW); update_state(YELLOW, COMM);
break; break;
case 'g': case 'g':
update_state(GREEN); update_state(GREEN, COMM);
break; break;
default: default:
respond = false; respond = false;
@ -140,7 +153,7 @@ ISR(USART_RX_vect)
ISR(TIMER1_OVF_vect) ISR(TIMER1_OVF_vect)
{ {
reset_timeout(); reset_timeout();
update_state(RED); update_state(RED, TIMEOUT);
} }
static inline void timer_init(void) static inline void timer_init(void)
@ -189,25 +202,18 @@ int main(void)
timer_init(); timer_init();
uart_init(); uart_init();
update_state(RED);
reset_timeout(); reset_timeout();
sei(); sei();
for (;;) { for (;;) {
i = get_keys(); i = get_keys();
if (i & GREEN) { if (i & GREEN)
uart_putc('G'); update_state(GREEN, BUTTON);
update_state(GREEN); else if (i & YELLOW)
} else if (i & YELLOW) { update_state(YELLOW, BUTTON);
uart_putc('Y'); else if (i & RED)
update_state(YELLOW); update_state(RED, BUTTON);
} else if (i & RED) {
uart_putc('R');
update_state(RED);
}
while (get_keys())
reset_timeout();
set_leds(); set_leds();
} }
} }