parent
17e9a5cc26
commit
3ce7042421
@ -0,0 +1,110 @@ |
||||
#include <uart.h> |
||||
#include <console.h> |
||||
#include <stdio.h> |
||||
#include <stdarg.h> |
||||
|
||||
FILE *stdin, *stdout, *stderr; |
||||
|
||||
static console_write_hook write_hook; |
||||
static console_read_hook read_hook; |
||||
static console_read_nonblock_hook read_nonblock_hook; |
||||
|
||||
void console_set_write_hook(console_write_hook h) |
||||
{ |
||||
write_hook = h; |
||||
} |
||||
|
||||
void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn) |
||||
{ |
||||
read_hook = r; |
||||
read_nonblock_hook = rn; |
||||
} |
||||
|
||||
// Non-blocking output permissible
|
||||
#define CONSOLE_NON_BLOCKING 1 |
||||
#ifdef CONSOLE_NON_BLOCKING |
||||
#define MAX_WO_RESET 80 |
||||
static int output_count = 0; |
||||
static int console_non_blocking = 0; |
||||
|
||||
void set_console(int non_blocking) |
||||
{
|
||||
console_non_blocking = non_blocking; |
||||
} |
||||
#endif |
||||
|
||||
int putchar(int c) |
||||
{ |
||||
uart_write(c); |
||||
if(write_hook != NULL) |
||||
write_hook(c); |
||||
if (c == '\n') |
||||
putchar('\r'); |
||||
#ifdef CONSOLE_NON_BLOCKING |
||||
if(console_non_blocking != 0) { |
||||
if(++output_count > MAX_WO_RESET) { |
||||
extern void busy_wait(int); |
||||
busy_wait(100); // Make sure, output has been sent (115200/8 -> 14400Byte -> 55ms/80Byte)
|
||||
uart_init(); // 'Unblock' ;-)
|
||||
output_count = 0; |
||||
} |
||||
} |
||||
#endif |
||||
return c; |
||||
} |
||||
|
||||
char readchar(void) |
||||
{ |
||||
while(1) { |
||||
if(uart_read_nonblock()) |
||||
return uart_read(); |
||||
if((read_nonblock_hook != NULL) && read_nonblock_hook()) |
||||
return read_hook(); |
||||
} |
||||
} |
||||
|
||||
int readchar_nonblock(void) |
||||
{ |
||||
return (uart_read_nonblock() |
||||
|| ((read_nonblock_hook != NULL) && read_nonblock_hook())); |
||||
} |
||||
|
||||
int puts(const char *s) |
||||
{ |
||||
while(*s) { |
||||
putchar(*s); |
||||
s++; |
||||
} |
||||
putchar('\n'); |
||||
return 1; |
||||
} |
||||
|
||||
void putsnonl(const char *s) |
||||
{ |
||||
while(*s) { |
||||
putchar(*s); |
||||
s++; |
||||
} |
||||
} |
||||
|
||||
#define PRINTF_BUFFER_SIZE 256 |
||||
|
||||
int vprintf(const char *fmt, va_list args) |
||||
{ |
||||
int len; |
||||
char outbuf[PRINTF_BUFFER_SIZE]; |
||||
len = vscnprintf(outbuf, sizeof(outbuf), fmt, args); |
||||
outbuf[len] = 0; |
||||
putsnonl(outbuf); |
||||
return len; |
||||
} |
||||
|
||||
int printf(const char *fmt, ...) |
||||
{ |
||||
int len; |
||||
va_list args; |
||||
va_start(args, fmt); |
||||
len = vprintf(fmt, args); |
||||
va_end(args); |
||||
return len; |
||||
} |
@ -0,0 +1,87 @@ |
||||
#include <uart.h> |
||||
#include <console.h> |
||||
#include <stdio.h> |
||||
#include <stdarg.h> |
||||
|
||||
FILE *stdin, *stdout, *stderr; |
||||
|
||||
static console_write_hook write_hook; |
||||
static console_read_hook read_hook; |
||||
static console_read_nonblock_hook read_nonblock_hook; |
||||
|
||||
void console_set_write_hook(console_write_hook h) |
||||
{ |
||||
write_hook = h; |
||||
} |
||||
|
||||
void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn) |
||||
{ |
||||
read_hook = r; |
||||
read_nonblock_hook = rn; |
||||
} |
||||
|
||||
int putchar(int c) |
||||
{ |
||||
uart_write(c); |
||||
if(write_hook != NULL) |
||||
write_hook(c); |
||||
if (c == '\n') |
||||
putchar('\r'); |
||||
return c; |
||||
} |
||||
|
||||
char readchar(void) |
||||
{ |
||||
while(1) { |
||||
if(uart_read_nonblock()) |
||||
return uart_read(); |
||||
if((read_nonblock_hook != NULL) && read_nonblock_hook()) |
||||
return read_hook(); |
||||
} |
||||
} |
||||
|
||||
int readchar_nonblock(void) |
||||
{ |
||||
return (uart_read_nonblock() |
||||
|| ((read_nonblock_hook != NULL) && read_nonblock_hook())); |
||||
} |
||||
|
||||
int puts(const char *s) |
||||
{ |
||||
while(*s) { |
||||
putchar(*s); |
||||
s++; |
||||
} |
||||
putchar('\n'); |
||||
return 1; |
||||
} |
||||
|
||||
void putsnonl(const char *s) |
||||
{ |
||||
while(*s) { |
||||
putchar(*s); |
||||
s++; |
||||
} |
||||
} |
||||
|
||||
#define PRINTF_BUFFER_SIZE 256 |
||||
|
||||
int vprintf(const char *fmt, va_list args) |
||||
{ |
||||
int len; |
||||
char outbuf[PRINTF_BUFFER_SIZE]; |
||||
len = vscnprintf(outbuf, sizeof(outbuf), fmt, args); |
||||
outbuf[len] = 0; |
||||
putsnonl(outbuf); |
||||
return len; |
||||
} |
||||
|
||||
int printf(const char *fmt, ...) |
||||
{ |
||||
int len; |
||||
va_list args; |
||||
va_start(args, fmt); |
||||
len = vprintf(fmt, args); |
||||
va_end(args); |
||||
return len; |
||||
} |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue