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:
authorDavid Crocker <dcrocker@eschertech.com>2021-06-07 16:26:31 +0300
committerDavid Crocker <dcrocker@eschertech.com>2021-06-07 16:26:31 +0300
commitb41de852a65359a6361a50fc4700cb6578ae97c1 (patch)
tree5f73399233e2e285f85d5de6618eb75316bc5d35
parent8d12f40337f749450479c9a2079b694441f1dddb (diff)
Fixed issue with doing maths on unsigned values e.g. job.filePosition
-rw-r--r--src/GCodes/GCodeBuffer/ExpressionParser.cpp50
-rw-r--r--src/GCodes/GCodeBuffer/ExpressionParser.h1
2 files changed, 30 insertions, 21 deletions
diff --git a/src/GCodes/GCodeBuffer/ExpressionParser.cpp b/src/GCodes/GCodeBuffer/ExpressionParser.cpp
index 2a536da1..133ed763 100644
--- a/src/GCodes/GCodeBuffer/ExpressionParser.cpp
+++ b/src/GCodes/GCodeBuffer/ExpressionParser.cpp
@@ -562,13 +562,23 @@ uint32_t ExpressionParser::ParseUnsigned() THROWS(GCodeException)
void ExpressionParser::BalanceNumericTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) const THROWS(GCodeException)
{
- if (val1.GetType() == TypeCode::Float)
+ // First convert any Uint64 or Uint32 operands to float
+ if (val1.GetType() == TypeCode::Uint64 || val1.GetType() == TypeCode::Uint32)
+ {
+ ConvertToFloat(val1, evaluate);
+ }
+ if (val2.GetType() == TypeCode::Uint64 || val2.GetType() == TypeCode::Uint32)
{
ConvertToFloat(val2, evaluate);
}
+
+ if (val1.GetType() == TypeCode::Float)
+ {
+ ConvertToFloat(val2, evaluate); // both are now float
+ }
else if (val2.GetType() == TypeCode::Float)
{
- ConvertToFloat(val1, evaluate);
+ ConvertToFloat(val1, evaluate); // both are now float
}
else if (val1.GetType() != TypeCode::Int32 || val2.GetType() != TypeCode::Int32)
{
@@ -589,6 +599,16 @@ void ExpressionParser::BalanceNumericTypes(ExpressionValue& val1, ExpressionValu
// Balance types for a comparison operator
void ExpressionParser::BalanceTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) THROWS(GCodeException)
{
+ // First convert any Uint64 or Uint32 operands to float
+ if (val1.GetType() == TypeCode::Uint64 || val1.GetType() == TypeCode::Uint32)
+ {
+ ConvertToFloat(val1, evaluate);
+ }
+ if (val2.GetType() == TypeCode::Uint64 || val2.GetType() == TypeCode::Uint32)
+ {
+ ConvertToFloat(val2, evaluate);
+ }
+
if ((val1.GetType() == val2.GetType()) || (val1.IsStringType() && val2.IsStringType())) // handle the common case first
{
// nothing to do
@@ -620,32 +640,22 @@ void ExpressionParser::BalanceTypes(ExpressionValue& val1, ExpressionValue& val2
}
}
-void ExpressionParser::EnsureNumeric(ExpressionValue& val, bool evaluate) const THROWS(GCodeException)
+void ExpressionParser::ConvertToFloat(ExpressionValue& val, bool evaluate) const THROWS(GCodeException)
{
switch (val.GetType())
{
case TypeCode::Uint32:
- val.SetType(TypeCode::Int32);
- val.iVal = val.uVal;
+ val.SetType(TypeCode::Float);
+ val.fVal = (float)val.uVal;
+ val.param = 1;
break;
- case TypeCode::Int32:
- case TypeCode::Float:
+ case TypeCode::Uint64:
+ val.SetType(TypeCode::Float);
+ val.fVal = (float)val.Get56BitValue();
+ val.param = 1;
break;
- default:
- if (evaluate)
- {
- ThrowParseException("expected numeric operand");
- }
- val.Set((int32_t)0);
- }
-}
-
-void ExpressionParser::ConvertToFloat(ExpressionValue& val, bool evaluate) const THROWS(GCodeException)
-{
- switch (val.GetType())
- {
case TypeCode::Int32:
val.fVal = (float)val.iVal;
val.SetType(TypeCode::Float);
diff --git a/src/GCodes/GCodeBuffer/ExpressionParser.h b/src/GCodes/GCodeBuffer/ExpressionParser.h
index 778a5b22..fc8dc1b3 100644
--- a/src/GCodes/GCodeBuffer/ExpressionParser.h
+++ b/src/GCodes/GCodeBuffer/ExpressionParser.h
@@ -54,7 +54,6 @@ private:
void BalanceNumericTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) const THROWS(GCodeException);
void BalanceTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) THROWS(GCodeException);
- void EnsureNumeric(ExpressionValue& val, bool evaluate) const THROWS(GCodeException);
static bool TypeHasNoLiterals(TypeCode t) noexcept;
int GetColumn() const noexcept;