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-01-09 12:17:41 +0300
committerDavid Crocker <dcrocker@eschertech.com>2021-01-09 12:17:41 +0300
commit6bb2ddc8936d1352e5a5146f20c86fa388076f68 (patch)
tree9a5388c2210aae6d24f88ae3fd92eba005cfdfec /src/GCodes/GCodeBuffer
parent1bcfdbd5364a1fdfde135b0873b1ff5e536a76ba (diff)
In BinaryParser allow a single expression where an array is requested
Diffstat (limited to 'src/GCodes/GCodeBuffer')
-rw-r--r--src/GCodes/GCodeBuffer/BinaryParser.cpp46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/GCodes/GCodeBuffer/BinaryParser.cpp b/src/GCodes/GCodeBuffer/BinaryParser.cpp
index c9f54282..9b6b5387 100644
--- a/src/GCodes/GCodeBuffer/BinaryParser.cpp
+++ b/src/GCodes/GCodeBuffer/BinaryParser.cpp
@@ -573,43 +573,77 @@ template<typename T> void BinaryParser::GetArray(T arr[], size_t& length, bool d
switch (seenParameter->type)
{
case DataType::Int:
- arr[0] = seenParameter->intValue;
+ arr[0] = (T)seenParameter->intValue;
lastIndex = 0;
break;
+
case DataType::UInt:
case DataType::DriverId:
- arr[0] = seenParameter->uintValue;
+ arr[0] = (T)seenParameter->uintValue;
lastIndex = 0;
break;
+
case DataType::Float:
- arr[0] = seenParameter->floatValue;
+ arr[0] = (T)seenParameter->floatValue;
lastIndex = 0;
break;
+
case DataType::IntArray:
CheckArrayLength(length);
for (int i = 0; i < seenParameter->intValue; i++)
{
- arr[i] = reinterpret_cast<const int32_t*>(seenParameterValue)[i];
+ arr[i] = (T)reinterpret_cast<const int32_t*>(seenParameterValue)[i];
}
lastIndex = seenParameter->intValue - 1;
break;
+
case DataType::DriverIdArray:
case DataType::UIntArray:
CheckArrayLength(length);
for (int i = 0; i < seenParameter->intValue; i++)
{
- arr[i] = reinterpret_cast<const uint32_t*>(seenParameterValue)[i];
+ arr[i] = (T)reinterpret_cast<const uint32_t*>(seenParameterValue)[i];
}
lastIndex = seenParameter->intValue - 1;
break;
+
case DataType::FloatArray:
CheckArrayLength(length);
for (int i = 0; i < seenParameter->intValue; i++)
{
- arr[i] = reinterpret_cast<const float*>(seenParameterValue)[i];
+ arr[i] = (T)reinterpret_cast<const float*>(seenParameterValue)[i];
}
lastIndex = seenParameter->intValue - 1;
break;
+
+ case DataType::Expression:
+ {
+ ExpressionParser parser(gb, seenParameterValue, seenParameterValue + seenParameter->intValue, -1);
+ const ExpressionValue val = parser.Parse();
+ switch ((TypeCode)val.type)
+ {
+ case TypeCode::Int32:
+ arr[0] = (T)val.iVal;
+ lastIndex = 0;
+ break;
+
+ case TypeCode::Float:
+ arr[0] = (T)val.fVal;
+ lastIndex = 0;
+ break;
+
+ case TypeCode::Uint32:
+ arr[0] = (T)val.uVal;
+ lastIndex = 0;
+ break;
+
+ default:
+ throw ConstructParseException("invalid expression type");
+ }
+ parser.CheckForExtraCharacters();
+ }
+ break;
+
default:
length = 0;
return;