From 8f60184447dec94e54ef90a4b4a4ca316dfba970 Mon Sep 17 00:00:00 2001 From: David Crocker Date: Wed, 8 Jan 2020 19:29:11 +0000 Subject: Added Move.Axes to object model --- src/GCodes/GCodeBuffer/StringParser.cpp | 4 +++ src/Movement/Move.cpp | 52 +++++++++++++++++++-------------- src/ObjectModel/ObjectModel.cpp | 20 ++++++------- src/ObjectModel/ObjectModel.h | 22 ++++++++------ src/OutputMemory.h | 3 +- src/Version.h | 2 +- 6 files changed, 59 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/GCodes/GCodeBuffer/StringParser.cpp b/src/GCodes/GCodeBuffer/StringParser.cpp index 662419b3..db99746f 100644 --- a/src/GCodes/GCodeBuffer/StringParser.cpp +++ b/src/GCodes/GCodeBuffer/StringParser.cpp @@ -1589,6 +1589,10 @@ void StringParser::AppendAsString(ExpressionValue val, const StringRef& str) { switch (val.type) { + case TYPE_OF(char): + str.cat(val.cVal); + break; + case TYPE_OF(const char*): str.cat(val.sVal); break; diff --git a/src/Movement/Move.cpp b/src/Movement/Move.cpp index 969bf2f9..c656b29b 100644 --- a/src/Movement/Move.cpp +++ b/src/Movement/Move.cpp @@ -54,34 +54,42 @@ // Macro to build a standard lambda function that includes the necessary type conversions #define OBJECT_MODEL_FUNC(...) OBJECT_MODEL_FUNC_BODY(Move, __VA_ARGS__) -//static const ObjectModelArrayDescriptor axesArrayDescriptor = -//{ -// [] (ObjectModel *self) noexcept -> size_t { return reprap.GetGCodes().GetVisibleAxes(); }, -// [] (ObjectModel *self, size_t n) noexcept -> void* { return (void *)(((Move*)self)->GetAxis(n)); } -//}; +static const ObjectModelArrayDescriptor axesArrayDescriptor = +{ + [] (const ObjectModel *self, const ObjectExplorationContext&) noexcept -> size_t { return reprap.GetGCodes().GetVisibleAxes(); }, + [] (const ObjectModel *self, ObjectExplorationContext& context) noexcept -> ExpressionValue { return ExpressionValue(self, 3); } +}; constexpr ObjectModelTableEntry Move::objectModelTable[] = { // Within each group, these entries must be in alphabetical order - // Move members -// { "Axes", OBJECT_MODEL_FUNC_NOSELF(&axesArrayDescriptor), ObjectModelEntryFlags::none }, - { "Daa", OBJECT_MODEL_FUNC(self, 1), ObjectModelEntryFlags::none }, - { "Idle", OBJECT_MODEL_FUNC(self, 2), ObjectModelEntryFlags::none }, - { "PrintingAcceleration", OBJECT_MODEL_FUNC(self->maxPrintingAcceleration), ObjectModelEntryFlags::none }, - { "TravelAcceleration", OBJECT_MODEL_FUNC(self->maxTravelAcceleration), ObjectModelEntryFlags::none }, - { "SpeedFactor", OBJECT_MODEL_FUNC_NOSELF(reprap.GetGCodes().GetSpeedFactor()), ObjectModelEntryFlags::none }, - - // Move.Daa members - { "Enabled", OBJECT_MODEL_FUNC(self->drcEnabled), ObjectModelEntryFlags::none }, - { "MinimumAcceleration", OBJECT_MODEL_FUNC(self->drcMinimumAcceleration), ObjectModelEntryFlags::none }, - { "Period", OBJECT_MODEL_FUNC(self->drcPeriod), ObjectModelEntryFlags::none }, - - // Move.Idle members - { "Factor", OBJECT_MODEL_FUNC_NOSELF(reprap.GetPlatform().GetIdleCurrentFactor()), ObjectModelEntryFlags::none }, - { "Timeout", OBJECT_MODEL_FUNC((int32_t)self->idleTimeout), ObjectModelEntryFlags::none }, + // 0. Move members + { "Axes", OBJECT_MODEL_FUNC_NOSELF(&axesArrayDescriptor), ObjectModelEntryFlags::none }, + { "Daa", OBJECT_MODEL_FUNC(self, 1), ObjectModelEntryFlags::none }, + { "Idle", OBJECT_MODEL_FUNC(self, 2), ObjectModelEntryFlags::none }, + { "PrintingAcceleration", OBJECT_MODEL_FUNC(self->maxPrintingAcceleration), ObjectModelEntryFlags::none }, + { "TravelAcceleration", OBJECT_MODEL_FUNC(self->maxTravelAcceleration), ObjectModelEntryFlags::none }, + { "SpeedFactor", OBJECT_MODEL_FUNC_NOSELF(reprap.GetGCodes().GetSpeedFactor()), ObjectModelEntryFlags::none }, + + // 1. Move.Daa members + { "Enabled", OBJECT_MODEL_FUNC(self->drcEnabled), ObjectModelEntryFlags::none }, + { "MinimumAcceleration", OBJECT_MODEL_FUNC(self->drcMinimumAcceleration), ObjectModelEntryFlags::none }, + { "Period", OBJECT_MODEL_FUNC(self->drcPeriod), ObjectModelEntryFlags::none }, + + // 2. Move.Idle members + { "Factor", OBJECT_MODEL_FUNC_NOSELF(reprap.GetPlatform().GetIdleCurrentFactor()), ObjectModelEntryFlags::none }, + { "Timeout", OBJECT_MODEL_FUNC((int32_t)self->idleTimeout), ObjectModelEntryFlags::none }, + + // 3. Move.Axis[] members + { "Homed", OBJECT_MODEL_FUNC_NOSELF(reprap.GetGCodes().IsAxisHomed(context.GetIndex(0))), ObjectModelEntryFlags::none }, + { "Letter", OBJECT_MODEL_FUNC_NOSELF(reprap.GetGCodes().GetAxisLetters()[context.GetIndex(0)]), ObjectModelEntryFlags::none }, + { "Max", OBJECT_MODEL_FUNC_NOSELF(reprap.GetPlatform().AxisMaximum(context.GetIndex(0))), ObjectModelEntryFlags::none }, + { "Min", OBJECT_MODEL_FUNC_NOSELF(reprap.GetPlatform().AxisMinimum(context.GetIndex(0))), ObjectModelEntryFlags::none }, + { "UserPosition", OBJECT_MODEL_FUNC_NOSELF(reprap.GetGCodes().GetUserCoordinate(context.GetIndex(0))), ObjectModelEntryFlags::none }, + { "Visible", OBJECT_MODEL_FUNC_NOSELF(context.GetIndex(0) < reprap.GetGCodes().GetVisibleAxes()), ObjectModelEntryFlags::none }, }; -constexpr uint8_t Move::objectModelTableDescriptor[] = { 3, 5, 3, 2 }; +constexpr uint8_t Move::objectModelTableDescriptor[] = { 4, 6, 3, 2, 6 }; DEFINE_GET_OBJECT_MODEL_TABLE(Move) diff --git a/src/ObjectModel/ObjectModel.cpp b/src/ObjectModel/ObjectModel.cpp index 2ff93878..36375ec5 100644 --- a/src/ObjectModel/ObjectModel.cpp +++ b/src/ObjectModel/ObjectModel.cpp @@ -9,17 +9,18 @@ #if SUPPORT_OBJECT_MODEL -#include "OutputMemory.h" +#include #include #include #include void ObjectExplorationContext::AddIndex(unsigned int index) { - if (numIndices == MaxIndices) // should always be true + if (numIndices == MaxIndices) { THROW_INTERNAL_ERROR; } + indices[numIndices] = index; ++numIndices; } @@ -179,14 +180,13 @@ bool ObjectModel::ReportItemAsJson(OutputBuffer *buf, ObjectExplorationContext& break; case TYPE_OF(bool): - if (context.ShortFormReport()) - { - buf->cat((val.bVal) ? '1' : '0'); - } - else - { - buf->cat((val.bVal) ? "\"yes\"" : "\"no\""); - } + buf->cat((val.bVal) ? "true" : "false"); + break; + + case TYPE_OF(char): + buf->cat('"'); + buf->EncodeChar(val.cVal); + buf->cat('"'); break; case TYPE_OF(IPAddress): diff --git a/src/ObjectModel/ObjectModel.h b/src/ObjectModel/ObjectModel.h index 9ffb5f57..bde3eabd 100644 --- a/src/ObjectModel/ObjectModel.h +++ b/src/ObjectModel/ObjectModel.h @@ -30,15 +30,16 @@ class ObjectModelArrayDescriptor; // forward declaration template constexpr TypeCode TypeOf() noexcept; template<> constexpr TypeCode TypeOf() noexcept { return 1; } -template<> constexpr TypeCode TypeOf() noexcept { return 2; } -template<> constexpr TypeCode TypeOf() noexcept { return 3; } -template<> constexpr TypeCode TypeOf() noexcept { return 4; } -template<> constexpr TypeCode TypeOf() noexcept { return 5; } -template<> constexpr TypeCode TypeOf() noexcept { return 6; } -template<> constexpr TypeCode TypeOf() noexcept { return 7; } -template<> constexpr TypeCode TypeOf() noexcept { return 8; } -template<> constexpr TypeCode TypeOf() noexcept { return 9; } -template<> constexpr TypeCode TypeOf() noexcept { return 10; } +template<> constexpr TypeCode TypeOf() noexcept { return 2; } +template<> constexpr TypeCode TypeOf() noexcept { return 3; } +template<> constexpr TypeCode TypeOf() noexcept { return 4; } +template<> constexpr TypeCode TypeOf() noexcept { return 5; } +template<> constexpr TypeCode TypeOf() noexcept { return 6; } +template<> constexpr TypeCode TypeOf() noexcept { return 7; } +template<> constexpr TypeCode TypeOf() noexcept { return 8; } +template<> constexpr TypeCode TypeOf() noexcept { return 9; } +template<> constexpr TypeCode TypeOf() noexcept { return 10; } +template<> constexpr TypeCode TypeOf() noexcept { return 11; } #define TYPE_OF(_t) (TypeOf<_t>()) @@ -61,6 +62,7 @@ struct ExpressionValue union { bool bVal; + char cVal; float fVal; int32_t iVal; uint32_t uVal; // used for enumerations, bitmaps and IP addresses (not for integers, we always use int32_t for those) @@ -71,6 +73,7 @@ struct ExpressionValue ExpressionValue() noexcept : type(NoType) { } explicit constexpr ExpressionValue(bool b) noexcept : type(TYPE_OF(bool)), param(0), bVal(b) { } + explicit constexpr ExpressionValue(char c) noexcept : type(TYPE_OF(char)), param(0), cVal(c) { } explicit constexpr ExpressionValue(float f) noexcept : type(TYPE_OF(float)), param(1), fVal(f) { } constexpr ExpressionValue(float f, uint8_t numDecimalPlaces) noexcept : type(TYPE_OF(float)), param(numDecimalPlaces), fVal(f) { } explicit constexpr ExpressionValue(int32_t i) noexcept : type(TYPE_OF(int32_t)), param(0), iVal(i) { } @@ -82,6 +85,7 @@ struct ExpressionValue explicit constexpr ExpressionValue(nullptr_t dummy) noexcept : type(NoType), param(0), uVal(0) { } void Set(bool b) noexcept { type = TYPE_OF(bool); bVal = b; } + void Set(char c) noexcept { type = TYPE_OF(char); cVal = c; } void Set(int32_t i) noexcept { type = TYPE_OF(int32_t); iVal = i; } void Set(int i) noexcept { type = TYPE_OF(int32_t); iVal = i; } void Set(float f) noexcept { type = TYPE_OF(float); fVal = f; param = 1; } diff --git a/src/OutputMemory.h b/src/OutputMemory.h index 4c832ba3..9006f371 100644 --- a/src/OutputMemory.h +++ b/src/OutputMemory.h @@ -59,6 +59,7 @@ class OutputBuffer size_t cat(StringRef &str) noexcept; size_t EncodeString(const char *src, bool allowControlChars, bool prependAsterisk = false) noexcept; + size_t EncodeChar(char c) noexcept; template size_t EncodeString(const String& str, bool allowControlChars, bool prependAsterisk = false) noexcept { @@ -97,8 +98,6 @@ class OutputBuffer static unsigned int GetFreeBuffers() { return OUTPUT_BUFFER_COUNT - usedOutputBuffers; } private: - size_t EncodeChar(char c) noexcept; - OutputBuffer *next; OutputBuffer *last; diff --git a/src/Version.h b/src/Version.h index 0982d50b..a156cd0b 100644 --- a/src/Version.h +++ b/src/Version.h @@ -20,7 +20,7 @@ #endif #ifndef DATE -# define DATE "2020-01-07b2" +# define DATE "2020-01-07b3" #endif #define AUTHORS "reprappro, dc42, chrishamm, t3p3, dnewman, printm3d" -- cgit v1.2.3