X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/d684c21619905153eff68c43927207248925f6c2..2d23b44169ebf0e91e2262bc33a6ed62e62ae137:/avr/con-utils.c diff --git a/avr/con-utils.c b/avr/con-utils.c index 430ba98..4108221 100644 --- a/avr/con-utils.c +++ b/avr/con-utils.c @@ -1,33 +1,70 @@ +/* + * (C) Copyright 2014 Leo C. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include "common.h" #include -#include +#include +#include "config.h" #include "serial.h" +#include "background.h" #include "con-utils.h" - uint_fast8_t tstc(void) { + bg_shed(); return serial_tstc(); } -int my_getchar(void) +int my_getchar(uint_fast8_t waitforchar) { int c; - - while((c = serial_getc()) < 0) - ; + + do { + bg_shed(); + c = serial_getc(); + } while ((c < 0) && waitforchar); + +#ifdef CONFIG_SYS_FBOOTSIG + if (c < 0) + return c; + + static const FLASH unsigned char bootsig[] = {CONFIG_SYS_FBOOTSIG}; + static uint8_t pb; + unsigned char uc = c; + + + if (bootsig[pb] == 0) { + if (uc == 0xff) { + wdt_enable(WDTO_15MS); + for(;;) + ; + } else + pb = 0; + + } else { + if (bootsig[pb] == uc) + pb++; + else + pb = 0; + } +#endif + return c; } /* test if ctrl-c was pressed */ -static uint_fast8_t ctrlc_disabled = 0; /* see disable_ctrl() */ -static uint_fast8_t ctrlc_was_pressed = 0; +static uint_fast8_t ctrlc_disabled; /* see disable_ctrl() */ +static uint_fast8_t ctrlc_was_pressed; uint_fast8_t ctrlc(void) { + bg_shed(); if (!ctrlc_disabled) { switch (serial_getc()) { case 0x03: /* ^C - Control C */ @@ -43,17 +80,33 @@ uint_fast8_t ctrlc(void) /* Reads user's confirmation. Returns 1 if user's input is "y", "Y", "yes" or "YES" */ +uint_fast8_t confirm_yes(void) +{ + uint_fast8_t checkch, ch; + + checkch = ch = my_getchar(1); + putchar(ch); + while (ch != '\r') { + ch = my_getchar(1); + putchar(ch); + } + putchar('\n'); + + return (checkch == 'y'); +} + +#if 0 uint_fast8_t confirm_yesno(void) { unsigned int i; char str_input[5]; /* Flush input */ - while (serial_getc()) + while (serial_getc() < 0) ; i = 0; while (i < sizeof(str_input)) { - str_input[i] = my_getchar(); + str_input[i] = my_getchar(1); putchar(str_input[i]); if (str_input[i] == '\r') break; @@ -67,6 +120,7 @@ uint_fast8_t confirm_yesno(void) return 1; return 0; } +#endif /* pass 1 to disable ctrlc() checking, 0 to enable. * returns previous state @@ -88,4 +142,3 @@ void clear_ctrlc(void) { ctrlc_was_pressed = 0; } -