From c63871ac816955469c7178eed3467de52d4c05e7 Mon Sep 17 00:00:00 2001 From: henryk Date: Sun, 18 Nov 2007 00:04:42 +0000 Subject: Add (ring-)buffered print functions to enable debug output from IRQ handlers or similar situations git-svn-id: https://svn.openpcd.org:2342/trunk@330 6dc7ffe9-61d6-0310-9af1-9938baff3ed1 --- openpicc/application/usb_print.c | 105 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 openpicc/application/usb_print.c (limited to 'openpicc/application/usb_print.c') diff --git a/openpicc/application/usb_print.c b/openpicc/application/usb_print.c new file mode 100644 index 0000000..74ffc3c --- /dev/null +++ b/openpicc/application/usb_print.c @@ -0,0 +1,105 @@ +/* Buffered USB debug output + * (C) 2007 Henryk Plötz + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include + +#include "usb_print.h" + +#define BUFLEN 1024 + +static char ringbuffer[BUFLEN]; +static int ringstart, ringstop; +static int default_flush = 1; + +void usb_print_buffer(const char* buffer, int start, int stop) { + usb_print_buffer_f(buffer,start,stop,default_flush); +} +int usb_print_buffer_f(const char* buffer, int start, int stop, int flush) +{ + int pos=start, endpos=stop; + while(posavailable) endpos=pos+available; + + while(pos < endpos) { + ringbuffer[ringstop] = buffer[pos]; + pos++; + available--; + ringstop = (ringstop+1) % BUFLEN; + } + + if(flush) usb_print_flush(); + else if(available==0) + return 0; + endpos=stop; + if(pos>=stop) + return (available > 0); + } + return 0; +} + +void usb_print_string(const char *string) { + usb_print_string_f(string, default_flush); +} +int usb_print_string_f(const char* string, int flush) +{ + int start = 0, stop = strlen(string); + return usb_print_buffer_f(string, start, stop, flush); +} + +void usb_print_char(const char c) { + usb_print_char_f(c, default_flush); +} +int usb_print_char_f(const char c, int flush) +{ + return usb_print_buffer_f(&c, 0, 1, flush); +} + +int usb_print_get_default_flush(void) +{ + return default_flush; +} + +int usb_print_set_default_flush(int flush) +{ + int old_flush = default_flush; + default_flush = flush; + return old_flush; +} + + +void usb_print_flush(void) +{ + while(ringstart != ringstop) { + vUSBSendByte(ringbuffer[ringstart]); + ringstart = (ringstart+1) % BUFLEN; + } +} + +void usb_print_init(void) +{ + memset(ringbuffer, 0, BUFLEN); + ringstart = ringstop = 0; +} -- cgit v1.2.3