Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.

Dependencies:   mbed Watchdog SDFileSystem DigoleSerialDisp

print.c

Committer:
shimniok
Date:
2018-11-29
Revision:
13:14f56b76aa23

File content as of revision 13:14f56b76aa23:

/*
 * print.c
 *
 *  Created on: Jan 6, 2014
 *      Author: mes
 */

#include <stdio.h>
#include <stdint.h>
#include <math.h>

// from Arduino source
size_t printNumber(FILE *f, unsigned long n)
{
    char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
    char *str = &buf[sizeof(buf) - 1];

    *str = '\0';

    do {
        unsigned long m = n;
        n /= 10;
        char c = m - 10 * n;
        *--str = c + '0';
    } while(n);

    return fputs(str, f);
}

// from Arduino source
size_t printInt(FILE *f, long n)
{
    int t = 0;
    if (n < 0) {
        t = fputc('-', f);
        n = -n;
    }
    return printNumber(f, n) + t;
}

// from Arduino source
size_t printFloat(FILE *f, double number, uint8_t digits)
{
    size_t n=0;

    if (isnan(number)) return fputs("nan", f);
    if (isinf(number)) return fputs("inf", f);
    if (number > 4294967040.0) return fputs("ovf", f);  // constant determined empirically
    if (number <-4294967040.0) return fputs("ovf", f);  // constant determined empirically

    // Handle negative numbers
    if (number < 0.0) {
        n += fputc('-', f);
        number = -number;
    }

    // Round correctly so that print(1.999, 2) prints as "2.00"
    double rounding = 0.5;
    for (uint8_t i=0; i < digits; ++i)
        rounding /= 10.0;

    number += rounding;

    // Extract the integer part of the number and print it
    unsigned long int_part = (unsigned long)number;
    double remainder = number - (double)int_part;
    n += printInt(f, int_part);

    // Print the decimal point, but only if there are digits beyond
    if (digits > 0) {
        n += fputc('.', f);
    }

    // Extract digits from the remainder one at a time
    while (digits-- > 0) {
        remainder *= 10.0;
        int toPrint = (int) remainder;
        n += fputc(toPrint+'0', f);
        remainder -= toPrint;
    }

    return n;
}

size_t printHex(FILE *f, long n, uint8_t digits) {
    unsigned char c;
    long mask = 0xf0000000;

    while (mask) {
        c = (n & mask);
        // TODO 3: finish this
        switch (c) {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
            fputc('0'-c, f);
            break;
        case 10:
        case 11:
        case 12:
        case 13:
        case 14:
        case 15:
            fputc('a'-c, f);
            break;
        }
        mask >>= 4;
    }
    return 1;
}