diff options
Diffstat (limited to 'mig_test/software/libhal/common.c')
-rw-r--r-- | mig_test/software/libhal/common.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/mig_test/software/libhal/common.c b/mig_test/software/libhal/common.c new file mode 100644 index 0000000..941c7e4 --- /dev/null +++ b/mig_test/software/libhal/common.c @@ -0,0 +1,203 @@ +/* + * $HeadURL: https://svn.fzd.de/repo/concast/FWF_Projects/FWF_Internals/FPGA/hw_sp605/bsp_zpuahb/software/libhal/common.c $ + * $Date$ + * $Author$ + * $Revision$ + */ + + +#include <peripherie.h> +#include <stdlib.h> // utoa, dtostrf (actually not implemented) + +//////////////////////////////////////// +// common stuff + + +// libgloss/zpu/syscalls.c work with inbyte and outbyte +char putchar( char c) +{ + return stdout( c); +} + + + +void putstr(const char *s) +{ + while (*s) + putchar( *s++); +} + + +/* + print data in binary format + prepend 0b + parameter: dataType - number of bits +*/ +void putbin( unsigned char dataType, unsigned long data) +{ + unsigned char i, temp; + char dataString[] = "0b "; + + for(i=dataType; i>0; i--) + { + temp = data % 2; + dataString [i+1] = temp + 0x30; + data = data/2; + } + putstr( dataString); +} + + +// http://asalt-vehicle.googlecode.com/svn› trunk› src› uart.c +unsigned char puthex( unsigned char dataType, unsigned long data) +{ + unsigned char count = 8; // number of chars + unsigned char i; + unsigned char temp; + char dataString[] = " "; + + // dataType = bit width + if (dataType == 4) count = 1; + if (dataType == 8) count = 2; + if (dataType == 16) count = 4; + + for(i=count; i>0; i--) + { + temp = data % 16; + if (temp<10) dataString [i-1] = temp + 0x30; + else dataString [i-1] = (temp - 10) + 0x41; + + data = data/16; + } + dataString[count] = '\0'; + putstr( dataString); + + return count; // return length +} + + + +// http://www.mikrocontroller.net/articles/FAQ#itoa.28.29 +unsigned char itoa( long z, char* Buffer ) +{ + int i = 0; + int j; + char tmp; + unsigned u; // In u bearbeiten wir den Absolutbetrag von z. + + // ist die Zahl negativ? + // gleich mal ein - hinterlassen und die Zahl positiv machen + if( z < 0 ) { + Buffer[0] = '-'; + Buffer++; + // -INT_MIN ist idR. größer als INT_MAX und nicht mehr + // als int darstellbar! Man muss daher bei der Bildung + // des Absolutbetrages aufpassen. + u = ( (unsigned)-(z+1) ) + 1; + } + else { + u = (unsigned)z; + } + // die einzelnen Stellen der Zahl berechnen + do { + Buffer[i++] = '0' + u % 10; + u /= 10; + } while( u > 0 ); + + // den String in sich spiegeln + for( j = 0; j < i / 2; ++j ) { + tmp = Buffer[j]; + Buffer[j] = Buffer[i-j-1]; + Buffer[i-j-1] = tmp; + } + Buffer[i] = '\0'; + // Laengenkorrektur wg. Vorzeichen + if (z < 0) + i++; + return i; // BLa: Laenge des Buffers zurueckgeben +} + +unsigned char utoa( unsigned long i, char *p) +{ + unsigned char length; + + length = 0; + do { + *--p = '0' + i % 10; + i /= 10; + length++; + } while (i > 0); + return length; +} + + +unsigned char putuint( unsigned long data) +{ + char str[20]; + unsigned char length; + + length = utoa( data, str); + putstr( str); + return length; +} + + +unsigned char putint( long data) +{ + char str[20]; + unsigned char length; + + length = itoa( data, str); + putstr( str); + return length; +} +/* + putint( 1000); putchar('\n'); // ok + putint( 10000); putchar('\n'); // ok + putint( 100000); putchar('\n'); // ok + putint( 1000000); putchar('\n'); // ok + putint( 10000000); putchar('\n'); // ok + putint( 100000000); putchar('\n'); // ok + putint( 200000000); putchar('\n'); // ok + putint( 400000000); putchar('\n'); // ok + putint( 800000000); putchar('\n'); // ok + putint( 1000000000); putchar('\n'); // ok + putint( 2000000000); putchar('\n'); // ok + putint( 4000000000); putchar('\n'); // -294967296 warning: this decimal constant is unsigned only in ISO C90 + putint( 8000000000); putchar('\n'); // -589934592 warning: integer constant is too large for "long" type +*/ + +unsigned char putfloat( float data) +{ + char str[20]; + unsigned char length; + + length = dtostrf( data, 2, 1, str); + putstr( str); + return length; +} + + +// p means pseudo float +// (an integer with 3 significant digits after the point) +void putpfloat( unsigned long data) +{ + putint( data/1000); + putchar( '.'); + putint( data%1000 ); +} + + +unsigned char putbool( int data) +{ + if (data) + { + putstr( "yes"); + } + else + { + putstr( "no"); + } + return 0; +} + |