Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FastAnalogIn MODSERIAL PID QEI RPCInterface Servo mbed-rtos mbed telemetry
Fork of Sequential_Timing by
printbuf.c@10:716484b1ddb5, 2016-04-05 (annotated)
- Committer:
- vsutardja
- Date:
- Tue Apr 05 18:30:41 2016 +0000
- Revision:
- 10:716484b1ddb5
latest
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| vsutardja | 10:716484b1ddb5 | 1 | /***********************************************************************/ |
| vsutardja | 10:716484b1ddb5 | 2 | /* */ |
| vsutardja | 10:716484b1ddb5 | 3 | /* printbuf.c: Low Level print ring buffer Routines */ |
| vsutardja | 10:716484b1ddb5 | 4 | /* */ |
| vsutardja | 10:716484b1ddb5 | 5 | /***********************************************************************/ |
| vsutardja | 10:716484b1ddb5 | 6 | #include <stdio.h> |
| vsutardja | 10:716484b1ddb5 | 7 | #include <stdarg.h> |
| vsutardja | 10:716484b1ddb5 | 8 | |
| vsutardja | 10:716484b1ddb5 | 9 | #define CR 0x0D |
| vsutardja | 10:716484b1ddb5 | 10 | #define TEMT 0x40 /* serial COMTX empty */ |
| vsutardja | 10:716484b1ddb5 | 11 | extern int write (int file, char * ptr, int len); |
| vsutardja | 10:716484b1ddb5 | 12 | int putchar_buf(int); |
| vsutardja | 10:716484b1ddb5 | 13 | int putcharNB(int); |
| vsutardja | 10:716484b1ddb5 | 14 | |
| vsutardja | 10:716484b1ddb5 | 15 | |
| vsutardja | 10:716484b1ddb5 | 16 | /* Background non-blocking print using ring buffer */ |
| vsutardja | 10:716484b1ddb5 | 17 | #define PRNBUFSZ 0x100 |
| vsutardja | 10:716484b1ddb5 | 18 | char printbuffer[PRNBUFSZ]; |
| vsutardja | 10:716484b1ddb5 | 19 | int prnbuf_count = 0; /* number of characters in buffer */ |
| vsutardja | 10:716484b1ddb5 | 20 | int prnbuf_pos = 0; /* location to store characters */ |
| vsutardja | 10:716484b1ddb5 | 21 | |
| vsutardja | 10:716484b1ddb5 | 22 | |
| vsutardja | 10:716484b1ddb5 | 23 | int printfNB(const char *format, ...) |
| vsutardja | 10:716484b1ddb5 | 24 | { char buffer[128]; int i; |
| vsutardja | 10:716484b1ddb5 | 25 | char c; |
| vsutardja | 10:716484b1ddb5 | 26 | int val; |
| vsutardja | 10:716484b1ddb5 | 27 | va_list args; |
| vsutardja | 10:716484b1ddb5 | 28 | va_start( args, format ); |
| vsutardja | 10:716484b1ddb5 | 29 | val = vsprintf(buffer, format, args ); // print to string using variable arguments |
| vsutardja | 10:716484b1ddb5 | 30 | for(i = 0; i < 128 && buffer[i]!= '\0'; i++) // copy string to print buffer |
| vsutardja | 10:716484b1ddb5 | 31 | { putcharNB((int)buffer[i]); } |
| vsutardja | 10:716484b1ddb5 | 32 | return(val); |
| vsutardja | 10:716484b1ddb5 | 33 | } |
| vsutardja | 10:716484b1ddb5 | 34 | |
| vsutardja | 10:716484b1ddb5 | 35 | |
| vsutardja | 10:716484b1ddb5 | 36 | // overload putchar to use non-blocking print to ring buffer instead |
| vsutardja | 10:716484b1ddb5 | 37 | int putcharNB(int c) { |
| vsutardja | 10:716484b1ddb5 | 38 | if (c == '\n') putchar_buf(CR); |
| vsutardja | 10:716484b1ddb5 | 39 | putchar_buf(c); |
| vsutardja | 10:716484b1ddb5 | 40 | return(c); } |
| vsutardja | 10:716484b1ddb5 | 41 | |
| vsutardja | 10:716484b1ddb5 | 42 | |
| vsutardja | 10:716484b1ddb5 | 43 | /* routine to print using print ring buffer */ |
| vsutardja | 10:716484b1ddb5 | 44 | /* does not block - allows over runs */ |
| vsutardja | 10:716484b1ddb5 | 45 | int putchar_buf(int c) |
| vsutardja | 10:716484b1ddb5 | 46 | { |
| vsutardja | 10:716484b1ddb5 | 47 | if(prnbuf_count >= PRNBUFSZ) return(0); /* no room - drop character */ |
| vsutardja | 10:716484b1ddb5 | 48 | printbuffer[prnbuf_pos] = c; |
| vsutardja | 10:716484b1ddb5 | 49 | prnbuf_pos++; |
| vsutardja | 10:716484b1ddb5 | 50 | prnbuf_count++; /* need to make uninterruptable? */ |
| vsutardja | 10:716484b1ddb5 | 51 | if(prnbuf_pos > (PRNBUFSZ-1)) prnbuf_pos = 0; /* wrap index to beginning of |
| vsutardja | 10:716484b1ddb5 | 52 | buffer */ |
| vsutardja | 10:716484b1ddb5 | 53 | return(c); |
| vsutardja | 10:716484b1ddb5 | 54 | } |
| vsutardja | 10:716484b1ddb5 | 55 | |
| vsutardja | 10:716484b1ddb5 | 56 | |
| vsutardja | 10:716484b1ddb5 | 57 | |
| vsutardja | 10:716484b1ddb5 | 58 | |
| vsutardja | 10:716484b1ddb5 | 59 | int write (int file, char * ptr, int len) { |
| vsutardja | 10:716484b1ddb5 | 60 | int i; |
| vsutardja | 10:716484b1ddb5 | 61 | |
| vsutardja | 10:716484b1ddb5 | 62 | for (i = 0; i < len; i++) putcharNB(*ptr++); |
| vsutardja | 10:716484b1ddb5 | 63 | return len; |
| vsutardja | 10:716484b1ddb5 | 64 | } |
| vsutardja | 10:716484b1ddb5 | 65 |
