diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-01-09 12:17:41 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-01-09 12:17:41 +0300 |
commit | 6bb2ddc8936d1352e5a5146f20c86fa388076f68 (patch) | |
tree | 9a5388c2210aae6d24f88ae3fd92eba005cfdfec /src/GCodes/GCodeBuffer | |
parent | 1bcfdbd5364a1fdfde135b0873b1ff5e536a76ba (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.cpp | 46 |
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; |