You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					204 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					204 lines
				
				3.5 KiB
			| 
								 
											14 years ago
										 
									 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 Print.cpp - Base class that provides print() and println()
							 | 
						||
| 
								 | 
							
								 Copyright (c) 2008 David A. Mellis.  All right reserved.
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 This library is free software; you can redistribute it and/or
							 | 
						||
| 
								 | 
							
								 modify it under the terms of the GNU Lesser General Public
							 | 
						||
| 
								 | 
							
								 License as published by the Free Software Foundation; either
							 | 
						||
| 
								 | 
							
								 version 2.1 of the License, or (at your option) any later version.
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 This library 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
							 | 
						||
| 
								 | 
							
								 Lesser General Public License for more details.
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 You should have received a copy of the GNU Lesser General Public
							 | 
						||
| 
								 | 
							
								 License along with this library; if not, write to the Free Software
							 | 
						||
| 
								 | 
							
								 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 Modified 23 November 2006 by David A. Mellis
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <inttypes.h>
							 | 
						||
| 
								 | 
							
								#include <math.h>
							 | 
						||
| 
								 | 
							
								#include "wiring.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "Print.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Public Methods //////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(uint8_t b)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  this->write(b);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(char c)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print((byte) c);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(const char c[])
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  while (*c)
							 | 
						||
| 
								 | 
							
								    print(*c++);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(int n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print((long) n);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(unsigned int n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print((unsigned long) n);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(long n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (n < 0) {
							 | 
						||
| 
								 | 
							
								    print('-');
							 | 
						||
| 
								 | 
							
								    n = -n;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  printNumber(n, 10);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(unsigned long n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  printNumber(n, 10);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(long n, int base)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if (base == 0)
							 | 
						||
| 
								 | 
							
								    print((char) n);
							 | 
						||
| 
								 | 
							
								  else if (base == 10)
							 | 
						||
| 
								 | 
							
								    print(n);
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    printNumber(n, base);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::print(double n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  printFloat(n, 2);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print('\r');
							 | 
						||
| 
								 | 
							
								  print('\n');  
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(char c)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(c);
							 | 
						||
| 
								 | 
							
								  println();  
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(const char c[])
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(c);
							 | 
						||
| 
								 | 
							
								  println();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(uint8_t b)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(b);
							 | 
						||
| 
								 | 
							
								  println();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(int n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(n);
							 | 
						||
| 
								 | 
							
								  println();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(unsigned int n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(n);
							 | 
						||
| 
								 | 
							
								  println();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(long n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(n);
							 | 
						||
| 
								 | 
							
								  println();  
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(unsigned long n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(n);
							 | 
						||
| 
								 | 
							
								  println();  
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(long n, int base)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(n, base);
							 | 
						||
| 
								 | 
							
								  println();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::println(double n)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print(n);
							 | 
						||
| 
								 | 
							
								  println();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Private Methods /////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::printNumber(unsigned long n, uint8_t base)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. 
							 | 
						||
| 
								 | 
							
								  unsigned long i = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (n == 0) {
							 | 
						||
| 
								 | 
							
								    print('0');
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while (n > 0) {
							 | 
						||
| 
								 | 
							
								    buf[i++] = n % base;
							 | 
						||
| 
								 | 
							
								    n /= base;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (; i > 0; i--)
							 | 
						||
| 
								 | 
							
								    print((char) (buf[i - 1] < 10 ?
							 | 
						||
| 
								 | 
							
								      '0' + buf[i - 1] :
							 | 
						||
| 
								 | 
							
								      'A' + buf[i - 1] - 10));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Print::printFloat(double number, uint8_t digits) 
							 | 
						||
| 
								 | 
							
								{ 
							 | 
						||
| 
								 | 
							
								  // Handle negative numbers
							 | 
						||
| 
								 | 
							
								  if (number < 0.0)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								     print('-');
							 | 
						||
| 
								 | 
							
								     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;
							 | 
						||
| 
								 | 
							
								  print(int_part);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Print the decimal point, but only if there are digits beyond
							 | 
						||
| 
								 | 
							
								  if (digits > 0)
							 | 
						||
| 
								 | 
							
								    print("."); 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Extract digits from the remainder one at a time
							 | 
						||
| 
								 | 
							
								  while (digits-- > 0)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    remainder *= 10.0;
							 | 
						||
| 
								 | 
							
								    int toPrint = int(remainder);
							 | 
						||
| 
								 | 
							
								    print(toPrint);
							 | 
						||
| 
								 | 
							
								    remainder -= toPrint; 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								}
							 |