Skip to content

Commit

Permalink
refactor to handle serial input better
Browse files Browse the repository at this point in the history
  • Loading branch information
esmil committed Aug 6, 2010
1 parent d9eb8c2 commit 39dd22d
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 51 deletions.
106 changes: 62 additions & 44 deletions doorduino.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,66 @@ timer1_interrupt_a()
events |= EV_TIME;
}

static void
handle_serial_input()
{
while (1) {
switch (serial_getchar()) {
case '\0':
cli();
if (!serial_available())
events &= ~EV_SERIAL;
sei();
return;

case 'O': /* open */
pin_low(PIN_GREEN_LED);
pin_low(PIN_OPEN_LOCK);
_delay_ms(500);
pin_high(PIN_OPEN_LOCK);
serial_print("OPENAKCK\n");
pin_high(PIN_GREEN_LED);
break;

case 'D': /* day */
pin_low(PIN_GREEN_LED);
pin_low(PIN_DAYMODE); /* day mode */
pin_high(PIN_STATUS_LED); /* status on */
break;

case 'N': /* night */
pin_high(PIN_GREEN_LED);
pin_high(PIN_DAYMODE); /* nightmode */
pin_low(PIN_STATUS_LED); /* status off */
break;

case 'R': /* rejected */
pin_low(PIN_YELLOW_LED);
_delay_ms(200);
pin_high(PIN_YELLOW_LED);
_delay_ms(200);
pin_low(PIN_YELLOW_LED);
_delay_ms(200);
pin_high(PIN_YELLOW_LED);
break;

case 'V': /* validated */
pin_low(PIN_GREEN_LED);
_delay_ms(300);
pin_high(PIN_GREEN_LED);
_delay_ms(200);
pin_low(PIN_GREEN_LED);
_delay_ms(300);
pin_high(PIN_GREEN_LED);
_delay_ms(200);
pin_low(PIN_GREEN_LED);
_delay_ms(300);
pin_high(PIN_GREEN_LED);
break;
}
}
}

int main() __attribute__((noreturn));
int main()
{
Expand Down Expand Up @@ -155,50 +215,8 @@ int main()
}
sei();

switch (serial_getchar()) {
case 'O': /* open */
pin_low(PIN_GREEN_LED);
pin_low(PIN_OPEN_LOCK);
_delay_ms(500);
pin_high(PIN_OPEN_LOCK);
serial_print("OPENAKCK\n");
pin_high(PIN_GREEN_LED);
continue;

case 'D': /* day */
pin_low(PIN_GREEN_LED);
pin_low(PIN_DAYMODE); /* day mode */
pin_high(PIN_STATUS_LED); /* status on */
continue;

case 'N': /* night */
pin_high(PIN_GREEN_LED);
pin_high(PIN_DAYMODE); /* nightmode */
pin_low(PIN_STATUS_LED); /* status off */
continue;

case 'R': /* rejected */
pin_low(PIN_YELLOW_LED);
_delay_ms(200);
pin_high(PIN_YELLOW_LED);
_delay_ms(200);
pin_low(PIN_YELLOW_LED);
_delay_ms(200);
pin_high(PIN_YELLOW_LED);
continue;

case 'V': /* validated */
pin_low(PIN_GREEN_LED);
_delay_ms(300);
pin_high(PIN_GREEN_LED);
_delay_ms(200);
pin_low(PIN_GREEN_LED);
_delay_ms(300);
pin_high(PIN_GREEN_LED);
_delay_ms(200);
pin_low(PIN_GREEN_LED);
_delay_ms(300);
pin_high(PIN_GREEN_LED);
if (events & EV_SERIAL) {
handle_serial_input();
continue;
}

Expand Down
14 changes: 7 additions & 7 deletions serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ serial_interrupt_dre()
}
}

EXPORT uint8_t
serial_available()
{
return serial_input.start != serial_input.end;
}

EXPORT char
serial_getchar()
{
Expand All @@ -73,14 +79,8 @@ serial_getchar()
return '\0';

r = (char)serial_input.buf[start];
start = (start + 1) & (SERIAL_INBUF - 1);

cli();
if (start == serial_input.end)
events &= ~EV_SERIAL;
sei();
serial_input.start = (start + 1) & (SERIAL_INBUF - 1);

serial_input.start = start;
return r;
}

Expand Down
1 change: 1 addition & 0 deletions serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
serial_interrupt_rx_enable()

#ifndef ALLINONE
uint8_t serial_available();
char serial_getchar();
void serial_print(const char *str);
void serial_hexdump(const void *data, size_t len);
Expand Down

0 comments on commit 39dd22d

Please sign in to comment.