Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/GCodes/GCodeBuffer/StringParser.cpp')
-rw-r--r--src/GCodes/GCodeBuffer/StringParser.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/GCodes/GCodeBuffer/StringParser.cpp b/src/GCodes/GCodeBuffer/StringParser.cpp
index 782bab0e..4036b4be 100644
--- a/src/GCodes/GCodeBuffer/StringParser.cpp
+++ b/src/GCodes/GCodeBuffer/StringParser.cpp
@@ -1646,7 +1646,7 @@ void StringParser::AppendAsString(ExpressionValue val, const StringRef& str)
break;
case TYPE_OF(float):
- str.catf((val.param == 3) ? "%.3f" : (val.param == 2) ? "%.2f" : "%.1f", (double)val.fVal);
+ str.catf(val.GetFloatFormatString(), (double)val.fVal);
break;
case TYPE_OF(uint32_t):
@@ -1667,7 +1667,7 @@ void StringParser::AppendAsString(ExpressionValue val, const StringRef& str)
case TYPE_OF(DateTime):
{
- const time_t time = val.Get40BitValue();
+ const time_t time = val.Get56BitValue();
tm timeInfo;
gmtime_r(&time, &timeInfo);
str.catf("%04u-%02u-%02u %02u:%02u:%02u",
@@ -1918,6 +1918,7 @@ ExpressionValue StringParser::ParseExpression(StringBuffer& stringBuffer, uint8_
if (val.type == TYPE_OF(float))
{
val.fVal += val2.fVal;
+ val.param = max(val.param, val2.param);
}
else
{
@@ -1930,6 +1931,7 @@ ExpressionValue StringParser::ParseExpression(StringBuffer& stringBuffer, uint8_
if (val.type == TYPE_OF(float))
{
val.fVal -= val2.fVal;
+ val.param = max(val.param, val2.param);
}
else
{
@@ -1942,6 +1944,7 @@ ExpressionValue StringParser::ParseExpression(StringBuffer& stringBuffer, uint8_
if (val.type == TYPE_OF(float))
{
val.fVal *= val2.fVal;
+ val.param = max(val.param, val2.param);
}
else
{
@@ -1953,6 +1956,7 @@ ExpressionValue StringParser::ParseExpression(StringBuffer& stringBuffer, uint8_
ConvertToFloat(val, evaluate);
ConvertToFloat(val2, evaluate);
val.fVal /= val2.fVal;
+ val.param = 0;
break;
case '>':
@@ -2128,6 +2132,7 @@ void StringParser::ConvertToFloat(ExpressionValue& val, bool evaluate)
case TYPE_OF(int32_t):
val.fVal = (float)val.iVal;
val.type = TYPE_OF(float);
+ val.param = 1;
break;
case TYPE_OF(float):
@@ -2263,6 +2268,7 @@ ExpressionValue StringParser::ParseNumber()
if (isFloat)
{
retvalue.type = TYPE_OF(float);
+ retvalue.param = constrain<long>(digitsAfterPoint, 1, MaxFloatDigitsDisplayedAfterPoint);
if (valueAfterPoint != 0)
{
if (valueBeforePoint == 0)
@@ -2385,6 +2391,7 @@ ExpressionValue StringParser::ParseIdentifierExpression(StringBuffer& stringBuff
if (gb.buffer[readPointer] == '(')
{
// It's a function call
+ ++readPointer;
ExpressionValue rslt = ParseExpression(stringBuffer, 0, evaluate);
if (id.Equals("abs"))
{
@@ -2410,31 +2417,37 @@ ExpressionValue StringParser::ParseIdentifierExpression(StringBuffer& stringBuff
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = sinf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("cos"))
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = cosf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("tan"))
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = tanf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("asin"))
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = asinf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("acos"))
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = acosf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("atan"))
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = atanf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("atan2"))
{
@@ -2449,11 +2462,13 @@ ExpressionValue StringParser::ParseIdentifierExpression(StringBuffer& stringBuff
ExpressionValue nextOperand = ParseExpression(stringBuffer, 0, evaluate);
ConvertToFloat(nextOperand, evaluate);
rslt.fVal = atan2f(rslt.fVal, nextOperand.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("sqrt"))
{
ConvertToFloat(rslt, evaluate);
rslt.fVal = sqrtf(rslt.fVal);
+ rslt.param = MaxFloatDigitsDisplayedAfterPoint;
}
else if (id.Equals("isnan"))
{
@@ -2477,6 +2492,7 @@ ExpressionValue StringParser::ParseIdentifierExpression(StringBuffer& stringBuff
if (rslt.type == TYPE_OF(float))
{
rslt.fVal = max<float>(rslt.fVal, nextOperand.fVal);
+ rslt.param = max(rslt.param, nextOperand.param);
}
else
{
@@ -2500,6 +2516,7 @@ ExpressionValue StringParser::ParseIdentifierExpression(StringBuffer& stringBuff
if (rslt.type == TYPE_OF(float))
{
rslt.fVal = min<float>(rslt.fVal, nextOperand.fVal);
+ rslt.param = max(rslt.param, nextOperand.param);
}
else
{
@@ -2516,6 +2533,7 @@ ExpressionValue StringParser::ParseIdentifierExpression(StringBuffer& stringBuff
{
throw ConstructParseException("expected ')'");
}
+ ++readPointer;
return rslt;
}