| #include "Print.h" | #include "Print.h" | ||||
| #if ARDUINO >= 100 | |||||
| #else | |||||
| void Print::write(const char *str) | |||||
| { | |||||
| write((const uint8_t *)str, strlen(str)); | |||||
| } | |||||
| #endif | |||||
| #if ARDUINO >= 100 | |||||
| size_t Print::write(const uint8_t *buffer, size_t size) | size_t Print::write(const uint8_t *buffer, size_t size) | ||||
| { | { | ||||
| size_t count = 0; | size_t count = 0; | ||||
| while (size--) count += write(*buffer++); | while (size--) count += write(*buffer++); | ||||
| return count; | return count; | ||||
| } | } | ||||
| #else | |||||
| void Print::write(const uint8_t *buffer, size_t size) | |||||
| { | |||||
| while (size--) write(*buffer++); | |||||
| } | |||||
| #endif | |||||
| #if ARDUINO >= 100 | |||||
| size_t Print::print(const String &s) | size_t Print::print(const String &s) | ||||
| { | { | ||||
| uint8_t buffer[33]; | uint8_t buffer[33]; | ||||
| } | } | ||||
| return count; | return count; | ||||
| } | } | ||||
| #else | |||||
| void Print::print(const String &s) | |||||
| { | |||||
| unsigned int len = s.length(); | |||||
| for (unsigned int i=0; i < len; i++) { | |||||
| write(s[i]); | |||||
| } | |||||
| } | |||||
| #endif | |||||
| #if ARDUINO >= 100 | |||||
| size_t Print::print(const __FlashStringHelper *ifsh) | size_t Print::print(const __FlashStringHelper *ifsh) | ||||
| { | { | ||||
| uint8_t buffer[32]; | uint8_t buffer[32]; | ||||
| } | } | ||||
| return count; | return count; | ||||
| } | } | ||||
| #else | |||||
| void Print::print(const __FlashStringHelper *ifsh) | |||||
| { | |||||
| const char PROGMEM *p = (const char PROGMEM *)ifsh; | |||||
| while (1) { | |||||
| unsigned char c = pgm_read_byte(p++); | |||||
| if (c == 0) return; | |||||
| write(c); | |||||
| } | |||||
| } | |||||
| #endif | |||||
| #if ARDUINO >= 100 | |||||
| size_t Print::print(long n) | size_t Print::print(long n) | ||||
| { | { | ||||
| uint8_t sign=0; | uint8_t sign=0; | ||||
| } | } | ||||
| return printNumber(n, sign, 10); | return printNumber(n, sign, 10); | ||||
| } | } | ||||
| #else | |||||
| void Print::print(long n) | |||||
| { | |||||
| uint8_t sign=0; | |||||
| if (n < 0) { | |||||
| sign = 1; | |||||
| n = -n; | |||||
| } | |||||
| printNumber(n, sign, 10); | |||||
| } | |||||
| #endif | |||||
| #if ARDUINO >= 100 | |||||
| size_t Print::println(void) | size_t Print::println(void) | ||||
| { | { | ||||
| uint8_t buf[2]={'\r', '\n'}; | uint8_t buf[2]={'\r', '\n'}; | ||||
| return write(buf, 2); | return write(buf, 2); | ||||
| } | } | ||||
| #else | |||||
| void Print::println(void) | |||||
| { | |||||
| uint8_t buf[2]={'\r', '\n'}; | |||||
| write(buf, 2); | |||||
| } | |||||
| #endif | |||||
| #if ARDUINO >= 100 | |||||
| static int printf_putchar(char c, FILE *fp) | static int printf_putchar(char c, FILE *fp) | ||||
| { | { | ||||
| ((class Print *)(fdev_get_udata(fp)))->write((uint8_t)c); | ((class Print *)(fdev_get_udata(fp)))->write((uint8_t)c); | ||||
| va_start(ap, format); | va_start(ap, format); | ||||
| return vfprintf_P(&f, (const char *)format, ap); | return vfprintf_P(&f, (const char *)format, ap); | ||||
| } | } | ||||
| #endif | |||||
| //#define USE_HACKER_DELIGHT_OPTIMIZATION | //#define USE_HACKER_DELIGHT_OPTIMIZATION | ||||
| #endif | #endif | ||||
| #if ARDUINO >= 100 | |||||
| size_t Print::printNumberDec(unsigned long n, uint8_t sign) | size_t Print::printNumberDec(unsigned long n, uint8_t sign) | ||||
| #else | |||||
| void Print::printNumberDec(unsigned long n, uint8_t sign) | |||||
| #endif | |||||
| { | { | ||||
| uint8_t digit, buf[11], *p; | uint8_t digit, buf[11], *p; | ||||
| #if defined(USE_HACKER_DELIGHT_OPTIMIZATION) | #if defined(USE_HACKER_DELIGHT_OPTIMIZATION) | ||||
| #ifdef USE_BENCHMARK_CODE | #ifdef USE_BENCHMARK_CODE | ||||
| uint32_t usec = micros(); | uint32_t usec = micros(); | ||||
| #endif | #endif | ||||
| p = buf + (sizeof(buf)-1); | |||||
| p = buf + (sizeof(buf)); | |||||
| do { | do { | ||||
| #if defined(USE_HACKER_DELIGHT_OPTIMIZATION) | #if defined(USE_HACKER_DELIGHT_OPTIMIZATION) | ||||
| divmod10_asm(n, tmp32, digit); | divmod10_asm(n, tmp32, digit); | ||||
| #ifdef USE_BENCHMARK_CODE | #ifdef USE_BENCHMARK_CODE | ||||
| usec_print += micros() - usec; | usec_print += micros() - usec; | ||||
| #endif | #endif | ||||
| #if ARDUINO >= 100 | |||||
| return write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #else | |||||
| write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #endif | |||||
| return write(p, sizeof(buf) - (p - buf)); | |||||
| } | } | ||||
| #if ARDUINO >= 100 | |||||
| size_t Print::printNumberHex(unsigned long n) | size_t Print::printNumberHex(unsigned long n) | ||||
| #else | |||||
| void Print::printNumberHex(unsigned long n) | |||||
| #endif | |||||
| { | { | ||||
| uint8_t digit, buf[8], *p; | uint8_t digit, buf[8], *p; | ||||
| p = buf + (sizeof(buf)-1); | |||||
| p = buf + (sizeof(buf)); | |||||
| do { | do { | ||||
| digit = n & 15; | digit = n & 15; | ||||
| *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; | *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; | ||||
| n >>= 4; | n >>= 4; | ||||
| } while (n); | } while (n); | ||||
| #if ARDUINO >= 100 | |||||
| return write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #else | |||||
| write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #endif | |||||
| return write(p, sizeof(buf) - (p - buf)); | |||||
| } | } | ||||
| #if ARDUINO >= 100 | |||||
| size_t Print::printNumberBin(unsigned long n) | size_t Print::printNumberBin(unsigned long n) | ||||
| #else | |||||
| void Print::printNumberBin(unsigned long n) | |||||
| #endif | |||||
| { | { | ||||
| uint8_t buf[32], *p; | uint8_t buf[32], *p; | ||||
| p = buf + (sizeof(buf)-1); | |||||
| p = buf + (sizeof(buf)); | |||||
| do { | do { | ||||
| *--p = '0' + ((uint8_t)n & 1); | *--p = '0' + ((uint8_t)n & 1); | ||||
| n >>= 1; | n >>= 1; | ||||
| } while (n); | } while (n); | ||||
| #if ARDUINO >= 100 | |||||
| return write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #else | |||||
| write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #endif | |||||
| return write(p, sizeof(buf) - (p - buf)); | |||||
| } | } | ||||
| #if ARDUINO >= 100 | |||||
| size_t Print::printNumberAny(unsigned long n, uint8_t base) | size_t Print::printNumberAny(unsigned long n, uint8_t base) | ||||
| #else | |||||
| void Print::printNumberAny(unsigned long n, uint8_t base) | |||||
| #endif | |||||
| { | { | ||||
| uint8_t digit, buf[21], *p; | uint8_t digit, buf[21], *p; | ||||
| uint32_t tmp; | uint32_t tmp; | ||||
| //uint32_t usec; | //uint32_t usec; | ||||
| //usec = micros(); | //usec = micros(); | ||||
| p = buf + (sizeof(buf)-1); | |||||
| p = buf + sizeof(buf); | |||||
| do { | do { | ||||
| tmp = n; | tmp = n; | ||||
| n = n / base; | n = n / base; | ||||
| *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; | *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; | ||||
| } while (n); | } while (n); | ||||
| //usec_print += micros() - usec; | //usec_print += micros() - usec; | ||||
| #if ARDUINO >= 100 | |||||
| return write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #else | |||||
| write(p, sizeof(buf)-1 - (p - buf)); | |||||
| #endif | |||||
| return write(p, sizeof(buf) - (p - buf)); | |||||
| } | } | ||||
| #if ARDUINO >= 100 | |||||
| size_t Print::printFloat(double number, uint8_t digits) | size_t Print::printFloat(double number, uint8_t digits) | ||||
| #else | |||||
| void Print::printFloat(double number, uint8_t digits) | |||||
| #endif | |||||
| { | { | ||||
| uint8_t sign=0; | uint8_t sign=0; | ||||
| #if ARDUINO >= 100 | |||||
| size_t count=0; | size_t count=0; | ||||
| #endif | |||||
| // Handle negative numbers | // Handle negative numbers | ||||
| if (number < 0.0) { | if (number < 0.0) { | ||||
| // Extract the integer part of the number and print it | // Extract the integer part of the number and print it | ||||
| unsigned long int_part = (unsigned long)number; | unsigned long int_part = (unsigned long)number; | ||||
| double remainder = number - (double)int_part; | double remainder = number - (double)int_part; | ||||
| #if ARDUINO >= 100 | |||||
| count += printNumber(int_part, sign, 10); | count += printNumber(int_part, sign, 10); | ||||
| #else | |||||
| printNumber(int_part, sign, 10); | |||||
| #endif | |||||
| // Print the decimal point, but only if there are digits beyond | // Print the decimal point, but only if there are digits beyond | ||||
| if (digits > 0) { | if (digits > 0) { | ||||
| buf[count++] = '0' + n; | buf[count++] = '0' + n; | ||||
| remainder -= n; | remainder -= n; | ||||
| } | } | ||||
| #if ARDUINO >= 100 | |||||
| count += write(buf, count); | count += write(buf, count); | ||||
| #else | |||||
| write(buf, count); | |||||
| #endif | |||||
| } | } | ||||
| #if ARDUINO >= 100 | |||||
| return count; | return count; | ||||
| #endif | |||||
| } | } | ||||