Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.

Dependencies:   mbed

Committer:
AjK
Date:
Mon Oct 11 10:34:55 2010 +0000
Revision:
0:0a841b89d614
Totally Alpha quality as this project isn\t completed. Just publishing it as it answers many questions asked in the forums

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 0:0a841b89d614 1 /****************************************************************************
AjK 0:0a841b89d614 2 * Copyright 2010 Andy Kirkham, Stellar Technologies Ltd
AjK 0:0a841b89d614 3 *
AjK 0:0a841b89d614 4 * This file is part of the Satellite Observers Workbench (SOWB).
AjK 0:0a841b89d614 5 *
AjK 0:0a841b89d614 6 * SOWB is free software: you can redistribute it and/or modify
AjK 0:0a841b89d614 7 * it under the terms of the GNU General Public License as published by
AjK 0:0a841b89d614 8 * the Free Software Foundation, either version 3 of the License, or
AjK 0:0a841b89d614 9 * (at your option) any later version.
AjK 0:0a841b89d614 10 *
AjK 0:0a841b89d614 11 * SOWB is distributed in the hope that it will be useful,
AjK 0:0a841b89d614 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
AjK 0:0a841b89d614 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
AjK 0:0a841b89d614 14 * GNU General Public License for more details.
AjK 0:0a841b89d614 15 *
AjK 0:0a841b89d614 16 * You should have received a copy of the GNU General Public License
AjK 0:0a841b89d614 17 * along with SOWB. If not, see <http://www.gnu.org/licenses/>.
AjK 0:0a841b89d614 18 *
AjK 0:0a841b89d614 19 * $Id: main.cpp 5 2010-07-12 20:51:11Z ajk $
AjK 0:0a841b89d614 20 *
AjK 0:0a841b89d614 21 ***************************************************************************/
AjK 0:0a841b89d614 22
AjK 0:0a841b89d614 23 /* The following is from (with only minor edits to fit onto Mbed):-
AjK 0:0a841b89d614 24 Copyright 2001, 2002 Georges Menie (www.menie.org)
AjK 0:0a841b89d614 25 stdarg version contributed by Christian Ettinger
AjK 0:0a841b89d614 26 See...
AjK 0:0a841b89d614 27 http://www.menie.org/georges/embedded/
AjK 0:0a841b89d614 28 http://www.menie.org/georges/embedded/printf-stdarg.c
AjK 0:0a841b89d614 29
AjK 0:0a841b89d614 30 This printf function will accept integer formats (%d, %x, %X, %u), string format (%s)
AjK 0:0a841b89d614 31 and character format (%c); left and right alignement, padding with space or 'O'. */
AjK 0:0a841b89d614 32
AjK 0:0a841b89d614 33 #include "sowb.h"
AjK 0:0a841b89d614 34 #include "debug.h"
AjK 0:0a841b89d614 35 #include <stdarg.h>
AjK 0:0a841b89d614 36
AjK 0:0a841b89d614 37 #ifdef DEBUG_ON
AjK 0:0a841b89d614 38
AjK 0:0a841b89d614 39 static void printchar(char **str, int c)
AjK 0:0a841b89d614 40 {
AjK 0:0a841b89d614 41 if (str) {
AjK 0:0a841b89d614 42 **str = c;
AjK 0:0a841b89d614 43 ++(*str);
AjK 0:0a841b89d614 44 }
AjK 0:0a841b89d614 45 else (void)Uart0_putc(c);
AjK 0:0a841b89d614 46 }
AjK 0:0a841b89d614 47
AjK 0:0a841b89d614 48 #define PAD_RIGHT 1
AjK 0:0a841b89d614 49 #define PAD_ZERO 2
AjK 0:0a841b89d614 50
AjK 0:0a841b89d614 51 static int prints(char **out, const char *string, int width, int pad)
AjK 0:0a841b89d614 52 {
AjK 0:0a841b89d614 53 register int pc = 0, padchar = ' ';
AjK 0:0a841b89d614 54
AjK 0:0a841b89d614 55 if (width > 0) {
AjK 0:0a841b89d614 56 register int len = 0;
AjK 0:0a841b89d614 57 register const char *ptr;
AjK 0:0a841b89d614 58 for (ptr = string; *ptr; ++ptr) ++len;
AjK 0:0a841b89d614 59 if (len >= width) width = 0;
AjK 0:0a841b89d614 60 else width -= len;
AjK 0:0a841b89d614 61 if (pad & PAD_ZERO) padchar = '0';
AjK 0:0a841b89d614 62 }
AjK 0:0a841b89d614 63 if (!(pad & PAD_RIGHT)) {
AjK 0:0a841b89d614 64 for ( ; width > 0; --width) {
AjK 0:0a841b89d614 65 printchar (out, padchar);
AjK 0:0a841b89d614 66 ++pc;
AjK 0:0a841b89d614 67 }
AjK 0:0a841b89d614 68 }
AjK 0:0a841b89d614 69 for ( ; *string ; ++string) {
AjK 0:0a841b89d614 70 printchar (out, *string);
AjK 0:0a841b89d614 71 ++pc;
AjK 0:0a841b89d614 72 }
AjK 0:0a841b89d614 73 for ( ; width > 0; --width) {
AjK 0:0a841b89d614 74 printchar (out, padchar);
AjK 0:0a841b89d614 75 ++pc;
AjK 0:0a841b89d614 76 }
AjK 0:0a841b89d614 77
AjK 0:0a841b89d614 78 return pc;
AjK 0:0a841b89d614 79 }
AjK 0:0a841b89d614 80
AjK 0:0a841b89d614 81 /* the following should be enough for 32 bit int */
AjK 0:0a841b89d614 82 #define PRINT_BUF_LEN 12
AjK 0:0a841b89d614 83
AjK 0:0a841b89d614 84 static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
AjK 0:0a841b89d614 85 {
AjK 0:0a841b89d614 86 char print_buf[PRINT_BUF_LEN];
AjK 0:0a841b89d614 87 register char *s;
AjK 0:0a841b89d614 88 register int t, neg = 0, pc = 0;
AjK 0:0a841b89d614 89 register unsigned int u = i;
AjK 0:0a841b89d614 90
AjK 0:0a841b89d614 91 if (i == 0) {
AjK 0:0a841b89d614 92 print_buf[0] = '0';
AjK 0:0a841b89d614 93 print_buf[1] = '\0';
AjK 0:0a841b89d614 94 return prints (out, print_buf, width, pad);
AjK 0:0a841b89d614 95 }
AjK 0:0a841b89d614 96
AjK 0:0a841b89d614 97 if (sg && b == 10 && i < 0) {
AjK 0:0a841b89d614 98 neg = 1;
AjK 0:0a841b89d614 99 u = -i;
AjK 0:0a841b89d614 100 }
AjK 0:0a841b89d614 101
AjK 0:0a841b89d614 102 s = print_buf + PRINT_BUF_LEN-1;
AjK 0:0a841b89d614 103 *s = '\0';
AjK 0:0a841b89d614 104
AjK 0:0a841b89d614 105 while (u) {
AjK 0:0a841b89d614 106 t = u % b;
AjK 0:0a841b89d614 107 if( t >= 10 )
AjK 0:0a841b89d614 108 t += letbase - '0' - 10;
AjK 0:0a841b89d614 109 *--s = t + '0';
AjK 0:0a841b89d614 110 u /= b;
AjK 0:0a841b89d614 111 }
AjK 0:0a841b89d614 112
AjK 0:0a841b89d614 113 if (neg) {
AjK 0:0a841b89d614 114 if( width && (pad & PAD_ZERO) ) {
AjK 0:0a841b89d614 115 printchar (out, '-');
AjK 0:0a841b89d614 116 ++pc;
AjK 0:0a841b89d614 117 --width;
AjK 0:0a841b89d614 118 }
AjK 0:0a841b89d614 119 else {
AjK 0:0a841b89d614 120 *--s = '-';
AjK 0:0a841b89d614 121 }
AjK 0:0a841b89d614 122 }
AjK 0:0a841b89d614 123
AjK 0:0a841b89d614 124 return pc + prints (out, s, width, pad);
AjK 0:0a841b89d614 125 }
AjK 0:0a841b89d614 126
AjK 0:0a841b89d614 127 static int print(char **out, const char *format, va_list args )
AjK 0:0a841b89d614 128 {
AjK 0:0a841b89d614 129 register int width, pad;
AjK 0:0a841b89d614 130 register int pc = 0;
AjK 0:0a841b89d614 131 char scr[2];
AjK 0:0a841b89d614 132
AjK 0:0a841b89d614 133 for (; *format != 0; ++format) {
AjK 0:0a841b89d614 134 if (*format == '%') {
AjK 0:0a841b89d614 135 ++format;
AjK 0:0a841b89d614 136 width = pad = 0;
AjK 0:0a841b89d614 137 if (*format == '\0') break;
AjK 0:0a841b89d614 138 if (*format == '%') goto out;
AjK 0:0a841b89d614 139 if (*format == '-') {
AjK 0:0a841b89d614 140 ++format;
AjK 0:0a841b89d614 141 pad = PAD_RIGHT;
AjK 0:0a841b89d614 142 }
AjK 0:0a841b89d614 143 while (*format == '0') {
AjK 0:0a841b89d614 144 ++format;
AjK 0:0a841b89d614 145 pad |= PAD_ZERO;
AjK 0:0a841b89d614 146 }
AjK 0:0a841b89d614 147 for ( ; *format >= '0' && *format <= '9'; ++format) {
AjK 0:0a841b89d614 148 width *= 10;
AjK 0:0a841b89d614 149 width += *format - '0';
AjK 0:0a841b89d614 150 }
AjK 0:0a841b89d614 151 if( *format == 's' ) {
AjK 0:0a841b89d614 152 register char *s = (char *)va_arg( args, int );
AjK 0:0a841b89d614 153 pc += prints (out, s?s:"(null)", width, pad);
AjK 0:0a841b89d614 154 continue;
AjK 0:0a841b89d614 155 }
AjK 0:0a841b89d614 156 if( *format == 'd' ) {
AjK 0:0a841b89d614 157 pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
AjK 0:0a841b89d614 158 continue;
AjK 0:0a841b89d614 159 }
AjK 0:0a841b89d614 160 if( *format == 'x' ) {
AjK 0:0a841b89d614 161 pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
AjK 0:0a841b89d614 162 continue;
AjK 0:0a841b89d614 163 }
AjK 0:0a841b89d614 164 if( *format == 'X' ) {
AjK 0:0a841b89d614 165 pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
AjK 0:0a841b89d614 166 continue;
AjK 0:0a841b89d614 167 }
AjK 0:0a841b89d614 168 if( *format == 'u' ) {
AjK 0:0a841b89d614 169 pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
AjK 0:0a841b89d614 170 continue;
AjK 0:0a841b89d614 171 }
AjK 0:0a841b89d614 172 if( *format == 'c' ) {
AjK 0:0a841b89d614 173 /* char are converted to int then pushed on the stack */
AjK 0:0a841b89d614 174 scr[0] = (char)va_arg( args, int );
AjK 0:0a841b89d614 175 scr[1] = '\0';
AjK 0:0a841b89d614 176 pc += prints (out, scr, width, pad);
AjK 0:0a841b89d614 177 continue;
AjK 0:0a841b89d614 178 }
AjK 0:0a841b89d614 179 }
AjK 0:0a841b89d614 180 else {
AjK 0:0a841b89d614 181 out:
AjK 0:0a841b89d614 182 printchar (out, *format);
AjK 0:0a841b89d614 183 ++pc;
AjK 0:0a841b89d614 184 }
AjK 0:0a841b89d614 185 }
AjK 0:0a841b89d614 186 if (out) **out = '\0';
AjK 0:0a841b89d614 187 va_end( args );
AjK 0:0a841b89d614 188 return pc;
AjK 0:0a841b89d614 189 }
AjK 0:0a841b89d614 190
AjK 0:0a841b89d614 191
AjK 0:0a841b89d614 192 int debug_printf(const char *format, ...) {
AjK 0:0a841b89d614 193 #ifdef DEBUG_ON
AjK 0:0a841b89d614 194 va_list args;
AjK 0:0a841b89d614 195 va_start( args, format );
AjK 0:0a841b89d614 196 return print( 0, format, args );
AjK 0:0a841b89d614 197 #else
AjK 0:0a841b89d614 198 return 0;
AjK 0:0a841b89d614 199 #endif
AjK 0:0a841b89d614 200 }
AjK 0:0a841b89d614 201
AjK 0:0a841b89d614 202 int debug_sprintf(char *out, const char *format, ...) {
AjK 0:0a841b89d614 203 #ifdef DEBUG_ON
AjK 0:0a841b89d614 204 va_list args;
AjK 0:0a841b89d614 205 va_start( args, format );
AjK 0:0a841b89d614 206 return print( &out, format, args );
AjK 0:0a841b89d614 207 #else
AjK 0:0a841b89d614 208 return 0;
AjK 0:0a841b89d614 209 #endif
AjK 0:0a841b89d614 210 }
AjK 0:0a841b89d614 211
AjK 0:0a841b89d614 212 /* end of #ifdef DEBUG_ON */
AjK 0:0a841b89d614 213 #endif
AjK 0:0a841b89d614 214