diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index f6ff6eb75..78d852357 100755 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -28,6 +28,7 @@ #include "temperature.h" #include "stepper.h" #include "configuration_store.h" +#include "utility.h" #if ENABLED(PRINTCOUNTER) #include "printcounter.h" @@ -1878,6 +1879,7 @@ void kill_screen(const char* lcd_msg) { * */ #if ENABLED(FWRETRACT) + static void lcd_control_retract_menu() { START_MENU(); MENU_ITEM(back, MSG_CONTROL); @@ -1895,6 +1897,7 @@ void kill_screen(const char* lcd_msg) { MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &retract_recover_feedrate_mm_s, 1, 999); END_MENU(); } + #endif // FWRETRACT #if ENABLED(SDSUPPORT) @@ -2936,252 +2939,4 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; } #endif // ULTIPANEL -/*********************************/ -/** Number to string conversion **/ -/*********************************/ - -#define DIGIT(n) ('0' + (n)) -#define DIGIMOD(n) DIGIT((n) % 10) - -char conv[8]; - -// Convert float to rj string with 123 or -12 format -char *ftostr3(const float& x) { return itostr3((int)x); } - -// Convert float to rj string with _123, -123, _-12, or __-1 format -char *ftostr4sign(const float& x) { return itostr4sign((int)x); } - -// Convert unsigned int to string with 12 format -char* itostr2(const uint8_t& x) { - int xx = x; - conv[0] = DIGIMOD(xx / 10); - conv[1] = DIGIMOD(xx); - conv[2] = '\0'; - return conv; -} - -// Convert float to string with +123.4 / -123.4 format -char* ftostr41sign(const float& x) { - int xx = int(abs(x * 10)) % 10000; - conv[0] = x >= 0 ? '+' : '-'; - conv[1] = DIGIMOD(xx / 1000); - conv[2] = DIGIMOD(xx / 100); - conv[3] = DIGIMOD(xx / 10); - conv[4] = '.'; - conv[5] = DIGIMOD(xx); - conv[6] = '\0'; - return conv; -} - -// Convert signed float to string with 023.45 / -23.45 format -char *ftostr32(const float& x) { - long xx = abs(x * 100); - conv[0] = x >= 0 ? DIGIMOD(xx / 10000) : '-'; - conv[1] = DIGIMOD(xx / 1000); - conv[2] = DIGIMOD(xx / 100); - conv[3] = '.'; - conv[4] = DIGIMOD(xx / 10); - conv[5] = DIGIMOD(xx); - conv[6] = '\0'; - return conv; -} - -// Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -char* ftostr43sign(const float& x, char plus/*=' '*/) { - long xx = x * 1000; - if (xx == 0) - conv[0] = ' '; - else if (xx > 0) - conv[0] = plus; - else { - xx = -xx; - conv[0] = '-'; - } - conv[1] = DIGIMOD(xx / 1000); - conv[2] = '.'; - conv[3] = DIGIMOD(xx / 100); - conv[4] = DIGIMOD(xx / 10); - conv[5] = DIGIMOD(xx); - conv[6] = '\0'; - return conv; -} - -// Convert unsigned float to string with 1.23 format -char* ftostr12ns(const float& x) { - long xx = x * 100; - xx = abs(xx); - conv[0] = DIGIMOD(xx / 100); - conv[1] = '.'; - conv[2] = DIGIMOD(xx / 10); - conv[3] = DIGIMOD(xx); - conv[4] = '\0'; - return conv; -} - -// Convert signed int to lj string with +012 / -012 format -char* itostr3sign(const int& x) { - int xx; - if (x >= 0) { - conv[0] = '+'; - xx = x; - } - else { - conv[0] = '-'; - xx = -x; - } - conv[1] = DIGIMOD(xx / 100); - conv[2] = DIGIMOD(xx / 10); - conv[3] = DIGIMOD(xx); - conv[4] = '.'; - conv[5] = '0'; - conv[6] = '\0'; - return conv; -} - -// Convert signed int to rj string with 123 or -12 format -char* itostr3(const int& x) { - int xx = x; - if (xx < 0) { - conv[0] = '-'; - xx = -xx; - } - else - conv[0] = xx >= 100 ? DIGIMOD(xx / 100) : ' '; - - conv[1] = xx >= 10 ? DIGIMOD(xx / 10) : ' '; - conv[2] = DIGIMOD(xx); - conv[3] = '\0'; - return conv; -} - -// Convert unsigned int to lj string with 123 format -char* itostr3left(const int& xx) { - if (xx >= 100) { - conv[0] = DIGIMOD(xx / 100); - conv[1] = DIGIMOD(xx / 10); - conv[2] = DIGIMOD(xx); - conv[3] = '\0'; - } - else if (xx >= 10) { - conv[0] = DIGIMOD(xx / 10); - conv[1] = DIGIMOD(xx); - conv[2] = '\0'; - } - else { - conv[0] = DIGIMOD(xx); - conv[1] = '\0'; - } - return conv; -} - -// Convert signed int to rj string with _123, -123, _-12, or __-1 format -char *itostr4sign(const int& x) { - int xx = abs(x); - int sign = 0; - if (xx >= 100) { - conv[1] = DIGIMOD(xx / 100); - conv[2] = DIGIMOD(xx / 10); - } - else if (xx >= 10) { - conv[0] = ' '; - sign = 1; - conv[2] = DIGIMOD(xx / 10); - } - else { - conv[0] = ' '; - conv[1] = ' '; - sign = 2; - } - conv[sign] = x < 0 ? '-' : ' '; - conv[3] = DIGIMOD(xx); - conv[4] = '\0'; - return conv; -} - -// Convert unsigned float to rj string with 12345 format -char* ftostr5rj(const float& x) { - long xx = abs(x); - conv[0] = xx >= 10000 ? DIGIMOD(xx / 10000) : ' '; - conv[1] = xx >= 1000 ? DIGIMOD(xx / 1000) : ' '; - conv[2] = xx >= 100 ? DIGIMOD(xx / 100) : ' '; - conv[3] = xx >= 10 ? DIGIMOD(xx / 10) : ' '; - conv[4] = DIGIMOD(xx); - conv[5] = '\0'; - return conv; -} - -// Convert signed float to string with +1234.5 format -char* ftostr51sign(const float& x) { - long xx = abs(x * 10); - conv[0] = (x >= 0) ? '+' : '-'; - conv[1] = DIGIMOD(xx / 10000); - conv[2] = DIGIMOD(xx / 1000); - conv[3] = DIGIMOD(xx / 100); - conv[4] = DIGIMOD(xx / 10); - conv[5] = '.'; - conv[6] = DIGIMOD(xx); - conv[7] = '\0'; - return conv; -} - -// Convert signed float to string with +123.45 format -char* ftostr52sign(const float& x) { - long xx = abs(x * 100); - conv[0] = (x >= 0) ? '+' : '-'; - conv[1] = DIGIMOD(xx / 10000); - conv[2] = DIGIMOD(xx / 1000); - conv[3] = DIGIMOD(xx / 100); - conv[4] = '.'; - conv[5] = DIGIMOD(xx / 10); - conv[6] = DIGIMOD(xx); - conv[7] = '\0'; - return conv; -} - -// Convert signed float to space-padded string with -_23.4_ format -char* ftostr52sp(const float& x) { - long xx = x * 100; - uint8_t dig; - if (xx < 0) { // negative val = -_0 - xx = -xx; - conv[0] = '-'; - dig = (xx / 1000) % 10; - conv[1] = dig ? DIGIT(dig) : ' '; - } - else { // positive val = __0 - dig = (xx / 10000) % 10; - if (dig) { - conv[0] = DIGIT(dig); - conv[1] = DIGIMOD(xx / 1000); - } - else { - conv[0] = ' '; - dig = (xx / 1000) % 10; - conv[1] = dig ? DIGIT(dig) : ' '; - } - } - - conv[2] = DIGIMOD(xx / 100); // lsd always - - dig = xx % 10; - if (dig) { // 2 decimal places - conv[5] = DIGIT(dig); - conv[4] = DIGIMOD(xx / 10); - conv[3] = '.'; - } - else { // 1 or 0 decimal place - dig = (xx / 10) % 10; - if (dig) { - conv[4] = DIGIT(dig); - conv[3] = '.'; - } - else { - conv[3] = conv[4] = ' '; - } - conv[5] = ' '; - } - conv[6] = '\0'; - return conv; -} - #endif // ULTRA_LCD diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h index 4cc8334ec..3652da005 100644 --- a/Marlin/ultralcd.h +++ b/Marlin/ultralcd.h @@ -167,21 +167,4 @@ #endif //ULTRA_LCD -char* itostr2(const uint8_t& x); -char* itostr3sign(const int& x); -char* itostr3(const int& x); -char* itostr3left(const int& x); -char* itostr4sign(const int& x); - -char* ftostr3(const float& x); -char* ftostr4sign(const float& x); -char* ftostr41sign(const float& x); -char* ftostr32(const float& x); -char* ftostr43sign(const float& x, char plus=' '); -char* ftostr12ns(const float& x); -char* ftostr5rj(const float& x); -char* ftostr51sign(const float& x); -char* ftostr52sign(const float& x); -char* ftostr52sp(const float& x); // remove zero-padding from ftostr32 - #endif //ULTRALCD_H diff --git a/Marlin/ultralcd_impl_DOGM.h b/Marlin/ultralcd_impl_DOGM.h index c5353a605..6ea60b416 100644 --- a/Marlin/ultralcd_impl_DOGM.h +++ b/Marlin/ultralcd_impl_DOGM.h @@ -45,6 +45,7 @@ #include "ultralcd.h" #include "ultralcd_st7920_u8glib_rrd.h" #include "dogm_bitmaps.h" +#include "utility.h" #include "duration_t.h" #include diff --git a/Marlin/ultralcd_impl_HD44780.h b/Marlin/ultralcd_impl_HD44780.h index 05a892be7..142fe6861 100644 --- a/Marlin/ultralcd_impl_HD44780.h +++ b/Marlin/ultralcd_impl_HD44780.h @@ -24,9 +24,11 @@ #define ULTRALCD_IMPL_HD44780_H /** -* Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays. -**/ + * Implementation of the LCD display routines for a Hitachi HD44780 display. + * These are the most common LCD character displays. + */ +#include "utility.h" #include "duration_t.h" extern volatile uint8_t buttons; //an extended version of the last checked buttons in a bit array. diff --git a/Marlin/utility.cpp b/Marlin/utility.cpp index 0285219c4..b2d09004c 100644 --- a/Marlin/utility.cpp +++ b/Marlin/utility.cpp @@ -32,3 +32,186 @@ void safe_delay(millis_t ms) { } delay(ms); } + +#if ENABLED(ULTRA_LCD) + + char conv[8]; + + #define DIGIT(n) ('0' + (n)) + #define DIGIMOD(n, f) DIGIT((n)/(f) % 10) + #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') + #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) + + // Convert unsigned int to string with 12 format + char* itostr2(const uint8_t& x) { + int xx = x; + conv[0] = DIGIMOD(xx, 10); + conv[1] = DIGIMOD(xx, 1); + conv[2] = '\0'; + return conv; + } + + // Convert signed int to rj string with 123 or -12 format + char* itostr3(const int& x) { + int xx = x; + conv[0] = MINUSOR(xx, RJDIGIT(xx, 100)); + conv[1] = RJDIGIT(xx, 10); + conv[2] = DIGIMOD(xx, 1); + conv[3] = '\0'; + return conv; + } + + // Convert unsigned int to lj string with 123 format + char* itostr3left(const int& xx) { + char *str = &conv[3]; + *str = '\0'; + *(--str) = DIGIMOD(xx, 1); + if (xx >= 10) { + *(--str) = DIGIMOD(xx, 10); + if (xx >= 100) + *(--str) = DIGIMOD(xx, 100); + } + return str; + } + + // Convert signed int to rj string with _123, -123, _-12, or __-1 format + char *itostr4sign(const int& x) { + int xx = abs(x), sign = 0; + if (xx >= 100) { + conv[1] = DIGIMOD(xx, 100); + conv[2] = DIGIMOD(xx, 10); + } + else { + conv[0] = ' '; + if (xx >= 10) { + sign = 1; + conv[2] = DIGIMOD(xx, 10); + } + else { + conv[1] = ' '; + sign = 2; + } + } + conv[sign] = x < 0 ? '-' : ' '; + conv[3] = DIGIMOD(xx, 1); + conv[4] = '\0'; + return conv; + } + + // Convert unsigned float to string with 1.23 format + char* ftostr12ns(const float& x) { + long xx = abs(x * 100); + conv[0] = DIGIMOD(xx, 100); + conv[1] = '.'; + conv[2] = DIGIMOD(xx, 10); + conv[3] = DIGIMOD(xx, 1); + conv[4] = '\0'; + return conv; + } + + // Convert signed float to fixed-length string with 023.45 / -23.45 format + char *ftostr32(const float& x) { + long xx = x * 100; + conv[0] = MINUSOR(xx, DIGIMOD(xx, 10000)); + conv[1] = DIGIMOD(xx, 1000); + conv[2] = DIGIMOD(xx, 100); + conv[3] = '.'; + conv[4] = DIGIMOD(xx, 10); + conv[5] = DIGIMOD(xx, 1); + conv[6] = '\0'; + return conv; + } + + // Convert float to fixed-length string with +123.4 / -123.4 format + char* ftostr41sign(const float& x) { + int xx = x * 10; + conv[0] = MINUSOR(xx, '+'); + conv[1] = DIGIMOD(xx, 1000); + conv[2] = DIGIMOD(xx, 100); + conv[3] = DIGIMOD(xx, 10); + conv[4] = '.'; + conv[5] = DIGIMOD(xx, 1); + conv[6] = '\0'; + return conv; + } + + // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format + char* ftostr43sign(const float& x, char plus/*=' '*/) { + long xx = x * 1000; + conv[0] = xx ? MINUSOR(xx, plus) : ' '; + conv[1] = DIGIMOD(xx, 1000); + conv[2] = '.'; + conv[3] = DIGIMOD(xx, 100); + conv[4] = DIGIMOD(xx, 10); + conv[5] = DIGIMOD(xx, 1); + conv[6] = '\0'; + return conv; + } + + // Convert unsigned float to rj string with 12345 format + char* ftostr5rj(const float& x) { + long xx = abs(x); + conv[0] = RJDIGIT(xx, 10000); + conv[1] = RJDIGIT(xx, 1000); + conv[2] = RJDIGIT(xx, 100); + conv[3] = RJDIGIT(xx, 10); + conv[4] = DIGIMOD(xx, 1); + conv[5] = '\0'; + return conv; + } + + // Convert signed float to string with +1234.5 format + char* ftostr51sign(const float& x) { + long xx = x * 10; + conv[0] = MINUSOR(xx, '+'); + conv[1] = DIGIMOD(xx, 10000); + conv[2] = DIGIMOD(xx, 1000); + conv[3] = DIGIMOD(xx, 100); + conv[4] = DIGIMOD(xx, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(xx, 1); + conv[7] = '\0'; + return conv; + } + + // Convert signed float to string with +123.45 format + char* ftostr52sign(const float& x) { + long xx = x * 100; + conv[0] = MINUSOR(xx, '+'); + conv[1] = DIGIMOD(xx, 10000); + conv[2] = DIGIMOD(xx, 1000); + conv[3] = DIGIMOD(xx, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(xx, 10); + conv[6] = DIGIMOD(xx, 1); + conv[7] = '\0'; + return conv; + } + + // Convert signed float to space-padded string with -_23.4_ format + char* ftostr52sp(const float& x) { + long xx = x * 100; + uint8_t dig; + conv[0] = MINUSOR(xx, RJDIGIT(xx, 10000)); + conv[1] = RJDIGIT(xx, 1000); + conv[2] = DIGIMOD(xx, 100); + + if ((dig = xx % 10)) { // second digit after decimal point? + conv[3] = '.'; + conv[4] = DIGIMOD(xx, 10); + conv[5] = DIGIT(dig); + } + else { + if ((dig = (xx / 10) % 10)) { // first digit after decimal point? + conv[3] = '.'; + conv[4] = DIGIT(dig); + } + else // nothing after decimal point + conv[3] = conv[4] = ' '; + conv[5] = ' '; + } + conv[6] = '\0'; + return conv; + } + +#endif // ULTRA_LCD diff --git a/Marlin/utility.h b/Marlin/utility.h index 8ca70dbf8..8b107e7fd 100644 --- a/Marlin/utility.h +++ b/Marlin/utility.h @@ -25,4 +25,50 @@ void safe_delay(millis_t ms); -#endif +#if ENABLED(ULTRA_LCD) + + // Convert unsigned int to string with 12 format + char* itostr2(const uint8_t& x); + + // Convert signed int to rj string with 123 or -12 format + char* itostr3(const int& x); + + // Convert unsigned int to lj string with 123 format + char* itostr3left(const int& xx); + + // Convert signed int to rj string with _123, -123, _-12, or __-1 format + char *itostr4sign(const int& x); + + // Convert unsigned float to string with 1.23 format + char* ftostr12ns(const float& x); + + // Convert signed float to fixed-length string with 023.45 / -23.45 format + char *ftostr32(const float& x); + + // Convert float to fixed-length string with +123.4 / -123.4 format + char* ftostr41sign(const float& x); + + // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format + char* ftostr43sign(const float& x, char plus=' '); + + // Convert unsigned float to rj string with 12345 format + char* ftostr5rj(const float& x); + + // Convert signed float to string with +1234.5 format + char* ftostr51sign(const float& x); + + // Convert signed float to space-padded string with -_23.4_ format + char* ftostr52sp(const float& x); + + // Convert signed float to string with +123.45 format + char* ftostr52sign(const float& x); + + // Convert float to rj string with 123 or -12 format + FORCE_INLINE char *ftostr3(const float& x) { return itostr3((int)x); } + + // Convert float to rj string with _123, -123, _-12, or __-1 format + FORCE_INLINE char *ftostr4sign(const float& x) { return itostr4sign((int)x); } + +#endif // ULTRA_LCD + +#endif // __UTILITY_H__