Skip to content

Commit

Permalink
πŸ§‘β€πŸ’» More num-to-string digits / precisions (MarlinFirmware#26343)
Browse files Browse the repository at this point in the history
Co-authored-by: Scott Lahteine <[email protected]>
  • Loading branch information
2 people authored and classicrocker883 committed Dec 26, 2023
1 parent 72cbc3c commit 752c664
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 112 deletions.
8 changes: 4 additions & 4 deletions Marlin/src/lcd/menu/menu_advanced.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,8 @@ void menu_backlash();

#define _MPC_EDIT_ITEMS(N) \
MPC_t &mpc = thermalManager.temp_hotend[MenuItemBase::itemIndex].mpc; \
EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &mpc.heater_power, 1, 200); \
EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &mpc.block_heat_capacity, 0, 40); \
EDIT_ITEM_FAST_N(float41, N, MSG_MPC_POWER_E, &mpc.heater_power, 1, 200); \
EDIT_ITEM_FAST_N(float31, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &mpc.block_heat_capacity, 0, 40); \
EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &mpc.sensor_responsiveness, 0, 1); \
EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &mpc.ambient_xfer_coeff_fan0, 0, 1)

Expand Down Expand Up @@ -563,7 +563,7 @@ void menu_backlash();
editable.decimal = stepper.get_shaping_frequency(X_AXIS);
if (editable.decimal) {
ACTION_ITEM_N(X_AXIS, MSG_SHAPING_DISABLE, []{ stepper.set_shaping_frequency(X_AXIS, 0.0f); });
EDIT_ITEM_FAST_N(float61, X_AXIS, MSG_SHAPING_FREQ, &editable.decimal, min_frequency, 200.0f, []{ stepper.set_shaping_frequency(X_AXIS, editable.decimal); });
EDIT_ITEM_FAST_N(float41, X_AXIS, MSG_SHAPING_FREQ, &editable.decimal, min_frequency, 200.0f, []{ stepper.set_shaping_frequency(X_AXIS, editable.decimal); });
editable.decimal = stepper.get_shaping_damping_ratio(X_AXIS);
EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_SHAPING_ZETA, &editable.decimal, 0.0f, 1.0f, []{ stepper.set_shaping_damping_ratio(X_AXIS, editable.decimal); });
}
Expand All @@ -574,7 +574,7 @@ void menu_backlash();
editable.decimal = stepper.get_shaping_frequency(Y_AXIS);
if (editable.decimal) {
ACTION_ITEM_N(Y_AXIS, MSG_SHAPING_DISABLE, []{ stepper.set_shaping_frequency(Y_AXIS, 0.0f); });
EDIT_ITEM_FAST_N(float61, Y_AXIS, MSG_SHAPING_FREQ, &editable.decimal, min_frequency, 200.0f, []{ stepper.set_shaping_frequency(Y_AXIS, editable.decimal); });
EDIT_ITEM_FAST_N(float41, Y_AXIS, MSG_SHAPING_FREQ, &editable.decimal, min_frequency, 200.0f, []{ stepper.set_shaping_frequency(Y_AXIS, editable.decimal); });
editable.decimal = stepper.get_shaping_damping_ratio(Y_AXIS);
EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_SHAPING_ZETA, &editable.decimal, 0.0f, 1.0f, []{ stepper.set_shaping_damping_ratio(Y_AXIS, editable.decimal); });
}
Expand Down
9 changes: 9 additions & 0 deletions Marlin/src/lcd/menu/menu_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,19 @@ DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f
DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3rj , 1 ); // 123 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 , + 0.001f ); // _2.34, 12.34, -2.34 or 123.45, -23.45
DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 , + 0.0001f); // -1.234, _1.234, +1.234
DEFINE_MENU_EDIT_ITEM_TYPE(float53 ,float ,ftostr53sign ,1000 , + 0.0001f); // -12.345, _2.345, +2.345
DEFINE_MENU_EDIT_ITEM_TYPE(float54 ,float ,ftostr54sign ,10000 , + 0.00001f); // -1.2345, _1.2345, +1.2345
DEFINE_MENU_EDIT_ITEM_TYPE(float4 ,float ,ftostr4sign , 1 ); // 1234 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment)
DEFINE_MENU_EDIT_ITEM_TYPE(float31 ,float ,ftostr31rj , 10 , + 0.01f ); // 45.6 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float41 ,float ,ftostr41rj , 10 , + 0.01f ); // 345.6 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 , + 0.01f ); // 1234.5 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float61 ,float ,ftostr61rj , 10 , + 0.01f ); // 12345.6 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float32 ,float ,ftostr32rj , 100 , + 0.001f ); // 1.23
DEFINE_MENU_EDIT_ITEM_TYPE(float42 ,float ,ftostr42rj , 100 , + 0.001f ); // 12.34 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float52 ,float ,ftostr52rj , 100 , + 0.001f ); // 123.45 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float62 ,float ,ftostr62rj , 100 , + 0.001f ); // 1234.56 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float72 ,float ,ftostr72rj , 100 , + 0.001f ); // 12345.67 right-justified
DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 , + 0.01f ); // +12.3
DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 , + 0.01f ); // +123.4
Expand Down
210 changes: 113 additions & 97 deletions Marlin/src/libs/numtostr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ constexpr long UINTFLOAT(const float V, const int N) {

char conv[9] = { 0 };

// Format uint8_t (0-100) as rj string with 123% / _12% / __1% format
// Format uint8_t (0-100) as rj string with __3% / _23% / 123% format
const char* pcttostrpctrj(const uint8_t i) {
conv[4] = RJDIGIT(i, 100);
conv[5] = RJDIGIT(i, 10);
Expand All @@ -59,7 +59,7 @@ const char* ui8tostr4pctrj(const uint8_t i) {
return pcttostrpctrj(ui8_to_percent(i));
}

// Convert unsigned 8bit int to string 123 format
// Convert unsigned 8bit int to string with __3 / _23 / 123 format
const char* ui8tostr3rj(const uint8_t i) {
conv[5] = RJDIGIT(i, 100);
conv[6] = RJDIGIT(i, 10);
Expand All @@ -74,7 +74,7 @@ const char* ui8tostr2(const uint8_t i) {
return &conv[6];
}

// Convert signed 8bit int to rj string with 123 or -12 format
// Convert signed 8bit int to rj string with __3 / _23 / 123 / -_3 / -23 format
const char* i8tostr3rj(const int8_t x) {
int xx = x;
conv[5] = MINUSOR(xx, RJDIGIT(xx, 100));
Expand Down Expand Up @@ -105,32 +105,26 @@ const char* i8tostr3rj(const int8_t x) {
}
#endif

// Convert unsigned 16bit int to string 12345 format
const char* ui16tostr5rj(const uint16_t xx) {
conv[3] = RJDIGIT(xx, 10000);
conv[4] = RJDIGIT(xx, 1000);
conv[5] = RJDIGIT(xx, 100);
conv[6] = RJDIGIT(xx, 10);
// Convert unsigned 16bit int to right-justified string
inline const char* ui16tostrXrj(const uint16_t xx, const int index) {
switch (index) {
case 0 ... 3: conv[3] = RJDIGIT(xx, 10000);
case 4: conv[4] = RJDIGIT(xx, 1000);
case 5: conv[5] = RJDIGIT(xx, 100);
case 6: conv[6] = RJDIGIT(xx, 10);
}
conv[7] = DIGIMOD(xx, 1);
return &conv[3];
return &conv[index];
}

// Convert unsigned 16bit int to string 1234 format
const char* ui16tostr4rj(const uint16_t xx) {
conv[4] = RJDIGIT(xx, 1000);
conv[5] = RJDIGIT(xx, 100);
conv[6] = RJDIGIT(xx, 10);
conv[7] = DIGIMOD(xx, 1);
return &conv[4];
}
// Convert unsigned 16bit int to string with 12345 format
const char* ui16tostr5rj(const uint16_t xx) { return ui16tostrXrj(xx, 8 - 5); }

// Convert unsigned 16bit int to string 123 format
const char* ui16tostr3rj(const uint16_t xx) {
conv[5] = RJDIGIT(xx, 100);
conv[6] = RJDIGIT(xx, 10);
conv[7] = DIGIMOD(xx, 1);
return &conv[5];
}
// Convert unsigned 16bit int to string with 1234 format
const char* ui16tostr4rj(const uint16_t xx) { return ui16tostrXrj(xx, 8 - 4); }

// Convert unsigned 16bit int to string with 123 format
const char* ui16tostr3rj(const uint16_t xx) { return ui16tostrXrj(xx, 8 - 3); }

// Convert signed 16bit int to rj string with 123 or -12 format
const char* i16tostr3rj(const int16_t x) {
Expand Down Expand Up @@ -222,7 +216,7 @@ const char* ftostr41ns(const_float_t f) {
return &conv[3];
}

// Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format
// Convert float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format
const char* ftostr42_52(const_float_t f) {
if (f <= -10 || f >= 100) return ftostr52(f); // -23.45 / 123.45
long i = INTFLOAT(f, 2);
Expand All @@ -234,7 +228,7 @@ const char* ftostr42_52(const_float_t f) {
return &conv[3];
}

// Convert signed float to fixed-length string with 023.45 / -23.45 format
// Convert float to fixed-length string with 023.45 / -23.45 format
const char* ftostr52(const_float_t f) {
long i = INTFLOAT(f, 2);
conv[2] = MINUSOR(i, DIGIMOD(i, 10000));
Expand All @@ -246,7 +240,7 @@ const char* ftostr52(const_float_t f) {
return &conv[2];
}

// Convert signed float to fixed-length string with 12.345 / _2.345 / -2.345 or -23.45 / 123.45 format
// Convert float to fixed-length string with 12.345 / _2.345 / -2.345 or -23.45 / 123.45 format
const char* ftostr53_63(const_float_t f) {
if (f <= -10 || f >= 100) return ftostr63(f); // -23.456 / 123.456
long i = INTFLOAT(f, 3);
Expand All @@ -259,7 +253,7 @@ const char* ftostr53_63(const_float_t f) {
return &conv[2];
}

// Convert signed float to fixed-length string with 023.456 / -23.456 format
// Convert float to fixed-length string with 023.456 / -23.456 format
const char* ftostr63(const_float_t f) {
long i = INTFLOAT(f, 3);
conv[1] = MINUSOR(i, DIGIMOD(i, 100000));
Expand Down Expand Up @@ -289,42 +283,58 @@ const char* ftostr63(const_float_t f) {

#endif

// Convert float to fixed-length string with +12.3 / -12.3 format
const char* ftostr31sign(const_float_t f) {
int i = INTFLOAT(f, 1);
conv[3] = MINUSOR(i, '+');
conv[4] = DIGIMOD(i, 100);
//
// Convert float to fixed-length string with +/- and a single decimal place
//
inline const char* ftostrX1sign(const_float_t f, const int index) {
long i = INTFLOAT(f, 1);
conv[index] = MINUSOR(i, '+');
switch (index + 1) {
case 1: conv[1] = DIGIMOD(i, 100000);
case 2: conv[2] = DIGIMOD(i, 10000);
case 3: conv[3] = DIGIMOD(i, 1000);
case 4: conv[4] = DIGIMOD(i, 100);
}
conv[5] = DIGIMOD(i, 10);
conv[6] = '.';
conv[7] = DIGIMOD(i, 1);
return &conv[3];
return &conv[index];
}

// Convert float to fixed-length string with +12.3 / -12.3 format
const char* ftostr31sign(const_float_t f) { return ftostrX1sign(f, 3); }

// Convert float to fixed-length string with +123.4 / -123.4 format
const char* ftostr41sign(const_float_t f) {
int i = INTFLOAT(f, 1);
conv[2] = MINUSOR(i, '+');
conv[3] = DIGIMOD(i, 1000);
conv[4] = DIGIMOD(i, 100);
conv[5] = DIGIMOD(i, 10);
conv[6] = '.';
conv[7] = DIGIMOD(i, 1);
return &conv[2];
}
const char* ftostr41sign(const_float_t f) { return ftostrX1sign(f, 2); }

// Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format
const char* ftostr43sign(const_float_t f, char plus/*=' '*/) {
long i = INTFLOAT(f, 3);
conv[2] = i ? MINUSOR(i, plus) : ' ';
// Convert float to fixed-length string with +1234.5 / +1234.5 format
const char* ftostr51sign(const_float_t f) { return ftostrX1sign(f, 1); }

//
// Convert float to string with +/ /- and 3 decimal places
//
inline const char* ftostrX3sign(const_float_t f, const int index, char plus/*=' '*/) {
long i = INTFLOAT(f, 1);
conv[index] = i ? MINUSOR(i, plus) : ' ';
switch (index + 1) {
case 1: conv[1] = DIGIMOD(i, 100000);
case 2: conv[2] = DIGIMOD(i, 10000);
}
conv[3] = DIGIMOD(i, 1000);
conv[4] = '.';
conv[5] = DIGIMOD(i, 100);
conv[6] = DIGIMOD(i, 10);
conv[7] = DIGIMOD(i, 1);
return &conv[2];
return &conv[index];
}

// Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format
// Convert float to string (6 chars) with -1.234 / _0.000 / +1.234 format
const char* ftostr43sign(const_float_t f, char plus/*=' '*/) { return ftostrX3sign(f, 2, plus); }

// Convert float to string (7 chars) with -12.345 / _00.000 / +12.345 format
const char* ftostr53sign(const_float_t f, char plus/*=' '*/) { return ftostrX3sign(f, 1, plus); }

// Convert float to string (7 chars) with -1.2345 / _0.0000 / +1.2345 format
const char* ftostr54sign(const_float_t f, char plus/*=' '*/) {
long i = INTFLOAT(f, 4);
conv[1] = i ? MINUSOR(i, plus) : ' ';
Expand All @@ -343,19 +353,6 @@ const char* ftostr5rj(const_float_t f) {
return ui16tostr5rj(i);
}

// Convert signed float to string with +1234.5 format
const char* ftostr51sign(const_float_t f) {
long i = INTFLOAT(f, 1);
conv[1] = MINUSOR(i, '+');
conv[2] = DIGIMOD(i, 10000);
conv[3] = DIGIMOD(i, 1000);
conv[4] = DIGIMOD(i, 100);
conv[5] = DIGIMOD(i, 10);
conv[6] = '.';
conv[7] = DIGIMOD(i, 1);
return &conv[1];
}

// Convert signed float to string with +123.45 format
const char* ftostr52sign(const_float_t f) {
long i = INTFLOAT(f, 2);
Expand All @@ -369,47 +366,66 @@ const char* ftostr52sign(const_float_t f) {
return &conv[1];
}

// Convert signed float to string with +12.345 format
const char* ftostr53sign(const_float_t f) {
long i = INTFLOAT(f, 3);
conv[1] = MINUSOR(i, '+');
conv[2] = DIGIMOD(i, 10000);
conv[3] = DIGIMOD(i, 1000);
conv[4] = '.';
conv[5] = DIGIMOD(i, 100);
conv[6] = DIGIMOD(i, 10);
conv[7] = DIGIMOD(i, 1);
return &conv[1];
}

// Convert unsigned float to string with ____5.6, ___45.6, __345.6, _2345.6, 12345.6 format
const char* ftostr61rj(const_float_t f) {
// Convert unsigned float to string with a single digit precision
inline const char* ftostrX1rj(const_float_t f, const int index=1) {
const long i = UINTFLOAT(f, 1);
conv[1] = RJDIGIT(i, 100000);
conv[2] = RJDIGIT(i, 10000);
conv[3] = RJDIGIT(i, 1000);
conv[4] = RJDIGIT(i, 100);
switch (index) {
case 0: conv[0] = RJDIGIT(i, 1000000);
case 1: conv[1] = RJDIGIT(i, 100000);
case 2: conv[2] = RJDIGIT(i, 10000);
case 3: conv[3] = RJDIGIT(i, 1000);
case 4: conv[4] = RJDIGIT(i, 100);
}
conv[5] = DIGIMOD(i, 10);
conv[6] = '.';
conv[7] = DIGIMOD(i, 1);
return &conv[1];
return &conv[index];
}

// Convert unsigned float to string with ____5.67, ___45.67, __345.67, _2345.67, 12345.67 format
const char* ftostr72rj(const_float_t f) {
// Convert unsigned float to string with _2.3 / 12.3 format
const char* ftostr31rj(const_float_t f) { return ftostrX1rj(f, 7 - 3); }

// Convert unsigned float to string with __3.4 / _23.4 / 123.4 format
const char* ftostr41rj(const_float_t f) { return ftostrX1rj(f, 7 - 4); }

// Convert unsigned float to string with ___4.5 / __34.5 / _234.5 / 1234.5 format
const char* ftostr51rj(const_float_t f) { return ftostrX1rj(f, 7 - 5); }

// Convert unsigned float to string with ____5.6 / ___45.6 / __345.6 / _2345.6 / 12345.6 format
const char* ftostr61rj(const_float_t f) { return ftostrX1rj(f, 7 - 6); }

// Convert unsigned float to string with two digit precision
inline const char* ftostrX2rj(const_float_t f, const int index=1) {
const long i = UINTFLOAT(f, 2);
conv[0] = RJDIGIT(i, 1000000);
conv[1] = RJDIGIT(i, 100000);
conv[2] = RJDIGIT(i, 10000);
conv[3] = RJDIGIT(i, 1000);
conv[4] = DIGIMOD(i, 100);
switch (index) {
case 0: conv[0] = RJDIGIT(i, 1000000);
case 1: conv[1] = RJDIGIT(i, 100000);
case 2: conv[2] = RJDIGIT(i, 10000);
case 3: conv[3] = RJDIGIT(i, 1000);
case 4: conv[4] = RJDIGIT(i, 100);
}
conv[5] = '.';
conv[6] = DIGIMOD(i, 10);
conv[7] = DIGIMOD(i, 1);
return conv;
return &conv[index];
}

// Convert signed float to space-padded string with -_23.4_ format
// Convert unsigned float to string with 1.23 format
const char* ftostr32rj(const_float_t f) { return ftostrX2rj(f, 4); }

// Convert unsigned float to string with _2.34, 12.34 format
const char* ftostr42rj(const_float_t f) { return ftostrX2rj(f, 3); }

// Convert unsigned float to string with __3.45, _23.45, 123.45 format
const char* ftostr52rj(const_float_t f) { return ftostrX2rj(f, 2); }

// Convert unsigned float to string with ___4.56, __34.56, _234.56, 1234.56 format
const char* ftostr62rj(const_float_t f) { return ftostrX2rj(f, 1); }

// Convert unsigned float to string with ____5.67, ___45.67, __345.67, _2345.67, 12345.67 format
const char* ftostr72rj(const_float_t f) { return ftostrX2rj(f, 0); }

// Convert float to space-padded string with -_23.4_ format
const char* ftostr52sp(const_float_t f) {
long i = INTFLOAT(f, 2);
uint8_t dig;
Expand All @@ -418,17 +434,17 @@ const char* ftostr52sp(const_float_t f) {
conv[3] = RJDIGIT(i, 1000);
conv[4] = DIGIMOD(i, 100);

if ((dig = i % 10)) { // second digit after decimal point?
if ((dig = i % 10)) { // Second digit after decimal point?
conv[5] = '.';
conv[6] = DIGIMOD(i, 10);
conv[7] = DIGIT(dig);
}
else {
if ((dig = (i / 10) % 10)) { // first digit after decimal point?
if ((dig = (i / 10) % 10)) { // First digit after decimal point?
conv[5] = '.';
conv[6] = DIGIT(dig);
}
else // nothing after decimal point
else // Nothing after decimal point
conv[5] = conv[6] = ' ';
conv[7] = ' ';
}
Expand All @@ -440,7 +456,7 @@ const char* utostr3(const uint16_t x) {
return i16tostr3left(_MIN(x, 999U));
}

// Convert signed float to space-padded string with 1.23, 12.34, 123.45 format
// Convert float to space-padded string with 1.23, 12.34, 123.45 format
const char* ftostr52sprj(const_float_t f) {
long i = INTFLOAT(f, 2);
LIMIT(i, -99999, 99999); // cap to -999.99 - 999.99 range
Expand Down
Loading

0 comments on commit 752c664

Please sign in to comment.