Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛Adjust display precision in menu_advanced #26343

Merged
merged 11 commits into from
Dec 1, 2023
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
Loading