diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-11-04 16:43:49 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-11-04 16:43:49 +0300 |
commit | bcc31b9df1d6a5748b78c2249e55d75c9a7e0fed (patch) | |
tree | 493e17729242b17f4f8adfa363a100ddff4f4ead /src/Movement | |
parent | 2ec23cf3b7c3f0ba4422bbd07b5589fddfcfd934 (diff) |
M669 and object model now report segmentation
Diffstat (limited to 'src/Movement')
-rw-r--r-- | src/Movement/Kinematics/CoreKinematics.cpp | 3 | ||||
-rw-r--r-- | src/Movement/Kinematics/FiveBarScaraKinematics.cpp | 3 | ||||
-rw-r--r-- | src/Movement/Kinematics/HangprinterKinematics.cpp | 12 | ||||
-rw-r--r-- | src/Movement/Kinematics/Kinematics.cpp | 37 | ||||
-rw-r--r-- | src/Movement/Kinematics/Kinematics.h | 2 | ||||
-rw-r--r-- | src/Movement/Kinematics/PolarKinematics.cpp | 6 | ||||
-rw-r--r-- | src/Movement/Kinematics/RotaryDeltaKinematics.cpp | 3 | ||||
-rw-r--r-- | src/Movement/Kinematics/ScaraKinematics.cpp | 8 | ||||
-rw-r--r-- | src/Movement/Kinematics/ZLeadscrewKinematics.cpp | 2 |
9 files changed, 56 insertions, 20 deletions
diff --git a/src/Movement/Kinematics/CoreKinematics.cpp b/src/Movement/Kinematics/CoreKinematics.cpp index f7ddb669..fe451930 100644 --- a/src/Movement/Kinematics/CoreKinematics.cpp +++ b/src/Movement/Kinematics/CoreKinematics.cpp @@ -310,7 +310,8 @@ bool CoreKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const String } else if (!seenSeg) { - reply.printf("Kinematics is %s%s, matrix:", ((modified) ? "modified " : ""), GetName(false)); + Kinematics::Configure(mCode, gb, reply, error); + reply.catf(", %smatrix:", ((modified) ? "modified " : "")); const size_t numVisibleAxes = reprap.GetGCodes().GetVisibleAxes(); const size_t numTotalAxes = reprap.GetGCodes().GetTotalAxes(); for (size_t axis = 0; axis < numVisibleAxes; ++axis) diff --git a/src/Movement/Kinematics/FiveBarScaraKinematics.cpp b/src/Movement/Kinematics/FiveBarScaraKinematics.cpp index a60498a0..3e1ff1e1 100644 --- a/src/Movement/Kinematics/FiveBarScaraKinematics.cpp +++ b/src/Movement/Kinematics/FiveBarScaraKinematics.cpp @@ -709,7 +709,8 @@ bool FiveBarScaraKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, cons else if (!seenNonGeometry && !gb.Seen('K')) { //TODO print all the parameters here - reply.printf("Kinematics is FiveBarScara, documented in https://duet3d.dozuki.com/Guide/Five+Bar+Parallel+SCARA/24?lang=en"); + Kinematics::Configure(mCode, gb, reply, error); + reply.catf(", documented in https://duet3d.dozuki.com/Guide/Five+Bar+Parallel+SCARA/24?lang=en"); } return seen; diff --git a/src/Movement/Kinematics/HangprinterKinematics.cpp b/src/Movement/Kinematics/HangprinterKinematics.cpp index 1c05fc27..41fe3464 100644 --- a/src/Movement/Kinematics/HangprinterKinematics.cpp +++ b/src/Movement/Kinematics/HangprinterKinematics.cpp @@ -56,7 +56,7 @@ constexpr ObjectModelTableEntry HangprinterKinematics::objectModelTable[] = constexpr uint8_t HangprinterKinematics::objectModelTableDescriptor[] = { 1, 3 }; -DEFINE_GET_OBJECT_MODEL_TABLE(HangprinterKinematics) +DEFINE_GET_OBJECT_MODEL_TABLE_WITH_PARENT(HangprinterKinematics, Kinematics) #endif @@ -182,20 +182,18 @@ bool HangprinterKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const } else if (!seenNonGeometry && !gb.Seen('K')) { - reply.printf("Hangprinter\n" + Kinematics::Configure(mCode, gb, reply, error); + reply.lcatf( "A:%.2f, %.2f, %.2f\n" "B:%.2f, %.2f, %.2f\n" "C:%.2f, %.2f, %.2f\n" "D:%.2f, %.2f, %.2f\n" - "P:Print radius: %.1f\n" - "S:Segments/s: %d\n" - "T:Min segment length: %.2f\n", + "P:Print radius: %.1f", (double)anchors[A_AXIS][X_AXIS], (double)anchors[A_AXIS][Y_AXIS], (double)anchors[A_AXIS][Z_AXIS], (double)anchors[B_AXIS][X_AXIS], (double)anchors[B_AXIS][Y_AXIS], (double)anchors[B_AXIS][Z_AXIS], (double)anchors[C_AXIS][X_AXIS], (double)anchors[C_AXIS][Y_AXIS], (double)anchors[C_AXIS][Z_AXIS], (double)anchors[D_AXIS][X_AXIS], (double)anchors[D_AXIS][Y_AXIS], (double)anchors[D_AXIS][Z_AXIS], - (double)printRadius, - (int)GetSegmentsPerSecond(), (double)GetMinSegmentLength() + (double)printRadius ); } } diff --git a/src/Movement/Kinematics/Kinematics.cpp b/src/Movement/Kinematics/Kinematics.cpp index f75a5fd2..f6478693 100644 --- a/src/Movement/Kinematics/Kinematics.cpp +++ b/src/Movement/Kinematics/Kinematics.cpp @@ -22,6 +22,33 @@ const char * const Kinematics::HomeAllFileName = "homeall.g"; +#if SUPPORT_OBJECT_MODEL + +// Object model table and functions +// Note: if using GCC version 7.3.1 20180622 and lambda functions are used in this table, you must compile this file with option -std=gnu++17. +// Otherwise the table will be allocated in RAM instead of flash, which wastes too much RAM. + +// Macro to build a standard lambda function that includes the necessary type conversions +#define OBJECT_MODEL_FUNC(...) OBJECT_MODEL_FUNC_BODY(Kinematics, __VA_ARGS__) +#define OBJECT_MODEL_FUNC_IF(...) OBJECT_MODEL_FUNC_IF_BODY(Kinematics, __VA_ARGS__) + +constexpr ObjectModelTableEntry Kinematics::objectModelTable[] = +{ + // Within each group, these entries must be in alphabetical order + // 0. kinematics members + { "segmentation", OBJECT_MODEL_FUNC_IF(self->segmentationType.useSegmentation, self, 1), ObjectModelEntryFlags::none }, + + // 1. segmentation members + { "minSegLength", OBJECT_MODEL_FUNC(self->minSegmentLength, 2), ObjectModelEntryFlags::none }, + { "segmentsPerSec", OBJECT_MODEL_FUNC(self->segmentsPerSecond, 1), ObjectModelEntryFlags::none }, +}; + +constexpr uint8_t Kinematics::objectModelTableDescriptor[] = { 2, 1, 2 }; + +DEFINE_GET_OBJECT_MODEL_TABLE(Kinematics) + +#endif + // Constructor. Pass segsPerSecond <= 0.0 to get non-segmented kinematics. Kinematics::Kinematics(KinematicsType t, SegmentationType segType) noexcept : segmentsPerSecond(DefaultSegmentsPerSecond), minSegmentLength(DefaultMinSegmentLength), reciprocalMinSegmentLength(1.0/DefaultMinSegmentLength), @@ -37,7 +64,15 @@ bool Kinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const StringRef& { if (!gb.Seen('K')) { - reply.printf("Kinematics is %s", GetName()); + reply.printf("Kinematics is %s, ", GetName()); + if (segmentationType.useSegmentation) + { + reply.catf("%d segments/sec, min. segment length %.2fmm", (int)segmentsPerSecond, (double)minSegmentLength); + } + else + { + reply.cat("no segmentation"); + } } } else diff --git a/src/Movement/Kinematics/Kinematics.h b/src/Movement/Kinematics/Kinematics.h index 7f587662..34fa474a 100644 --- a/src/Movement/Kinematics/Kinematics.h +++ b/src/Movement/Kinematics/Kinematics.h @@ -223,7 +223,7 @@ public: float GetReciprocalMinSegmentLength() const noexcept pre(UseSegmentation()) { return reciprocalMinSegmentLength; } protected: - DECLARE_OBJECT_MODEL_VIRTUAL + DECLARE_OBJECT_MODEL Kinematics(KinematicsType t, SegmentationType segType) noexcept; diff --git a/src/Movement/Kinematics/PolarKinematics.cpp b/src/Movement/Kinematics/PolarKinematics.cpp index b3c04a85..8e9d4af6 100644 --- a/src/Movement/Kinematics/PolarKinematics.cpp +++ b/src/Movement/Kinematics/PolarKinematics.cpp @@ -96,9 +96,9 @@ bool PolarKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const Strin } else if (!seenNonGeometry && !gb.Seen('K')) { - reply.printf("Kinematics is Polar with radius %.1f to %.1fmm, homed radius %.1fmm, segments/sec %d, min. segment length %.2f", - (double)minRadius, (double)maxRadius, (double)homedRadius, - (int)GetSegmentsPerSecond(), (double)GetMinSegmentLength()); + Kinematics::Configure(mCode, gb, reply, error); + reply.catf(", radius %.1f to %.1fmm, homed radius %.1fmm", + (double)minRadius, (double)maxRadius, (double)homedRadius); } return seen; } diff --git a/src/Movement/Kinematics/RotaryDeltaKinematics.cpp b/src/Movement/Kinematics/RotaryDeltaKinematics.cpp index 6ec33dc4..9ef081a2 100644 --- a/src/Movement/Kinematics/RotaryDeltaKinematics.cpp +++ b/src/Movement/Kinematics/RotaryDeltaKinematics.cpp @@ -154,7 +154,8 @@ bool RotaryDeltaKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const } else if (!seenNonGeometry && !gb.Seen('K')) { - reply.printf("Kinematics is rotary delta, arms (%.3f,%.2f,%.3f)mm, rods (%.3f,%.3f,%.3f)mm, bearingHeights (%.3f,%.2f,%.3f)mm" + Kinematics::Configure(mCode, gb, reply, error); + reply.catf(", arms (%.3f,%.2f,%.3f)mm, rods (%.3f,%.3f,%.3f)mm, bearingHeights (%.3f,%.2f,%.3f)mm" ", arm movement %.1f to %.1f" DEGREE_SYMBOL ", delta radius %.3f, bed radius %.1f" ", angle corrections (%.3f,%.3f,%.3f)" DEGREE_SYMBOL , diff --git a/src/Movement/Kinematics/ScaraKinematics.cpp b/src/Movement/Kinematics/ScaraKinematics.cpp index 4a80872c..6c9a2e31 100644 --- a/src/Movement/Kinematics/ScaraKinematics.cpp +++ b/src/Movement/Kinematics/ScaraKinematics.cpp @@ -223,13 +223,13 @@ bool ScaraKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const Strin } else if (!seenNonGeometry && !gb.Seen('K')) { - reply.printf("Kinematics is Scara with proximal arm %.2fmm range %.1f to %.1f" DEGREE_SYMBOL - "%s, distal arm %.2fmm range %.1f to %.1f" DEGREE_SYMBOL "%s, crosstalk %.1f:%.1f:%.1f, bed origin (%.1f, %.1f), segments/sec %d, min. segment length %.2f", + Kinematics::Configure(mCode, gb, reply, error); + reply.printf(", proximal arm %.2fmm range %.1f to %.1f" DEGREE_SYMBOL + "%s, distal arm %.2fmm range %.1f to %.1f" DEGREE_SYMBOL "%s, crosstalk %.1f:%.1f:%.1f, bed origin (%.1f, %.1f)", (double)proximalArmLength, (double)thetaLimits[0], (double)thetaLimits[1], (supportsContinuousRotation[0]) ? " (continuous)" : "", (double)distalArmLength, (double)psiLimits[0], (double)psiLimits[1], (supportsContinuousRotation[0]) ? " (continuous)" : "", (double)crosstalk[0], (double)crosstalk[1], (double)crosstalk[2], - (double)xOffset, (double)yOffset, - (int)GetSegmentsPerSecond(), (double)GetMinSegmentLength()); + (double)xOffset, (double)yOffset); } return seen; } diff --git a/src/Movement/Kinematics/ZLeadscrewKinematics.cpp b/src/Movement/Kinematics/ZLeadscrewKinematics.cpp index 1d56972a..44ade884 100644 --- a/src/Movement/Kinematics/ZLeadscrewKinematics.cpp +++ b/src/Movement/Kinematics/ZLeadscrewKinematics.cpp @@ -64,7 +64,7 @@ constexpr ObjectModelTableEntry ZLeadscrewKinematics::objectModelTable[] = constexpr uint8_t ZLeadscrewKinematics::objectModelTableDescriptor[] = { 2, 1, 6 }; -DEFINE_GET_OBJECT_MODEL_TABLE(ZLeadscrewKinematics) +DEFINE_GET_OBJECT_MODEL_TABLE_WITH_PARENT(ZLeadscrewKinematics, Kinematics) #endif |