aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/chelper
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/chelper')
-rw-r--r--klippy/chelper/__init__.py13
-rw-r--r--klippy/chelper/kin_deltesian.c41
2 files changed, 50 insertions, 4 deletions
diff --git a/klippy/chelper/__init__.py b/klippy/chelper/__init__.py
index fa776d14..04119614 100644
--- a/klippy/chelper/__init__.py
+++ b/klippy/chelper/__init__.py
@@ -20,8 +20,8 @@ SOURCE_FILES = [
'pyhelper.c', 'serialqueue.c', 'stepcompress.c', 'itersolve.c', 'trapq.c',
'pollreactor.c', 'msgblock.c', 'trdispatch.c',
'kin_cartesian.c', 'kin_corexy.c', 'kin_corexz.c', 'kin_delta.c',
- 'kin_polar.c', 'kin_rotary_delta.c', 'kin_winch.c', 'kin_extruder.c',
- 'kin_shaper.c',
+ 'kin_deltesian.c', 'kin_polar.c', 'kin_rotary_delta.c', 'kin_winch.c',
+ 'kin_extruder.c', 'kin_shaper.c',
]
DEST_LIB = "c_helper.so"
OTHER_FILES = [
@@ -117,6 +117,11 @@ defs_kin_delta = """
, double tower_x, double tower_y);
"""
+defs_kin_deltesian = """
+ struct stepper_kinematics *deltesian_stepper_alloc(double arm2
+ , double arm_x);
+"""
+
defs_kin_polar = """
struct stepper_kinematics *polar_stepper_alloc(char type);
"""
@@ -205,8 +210,8 @@ defs_all = [
defs_pyhelper, defs_serialqueue, defs_std, defs_stepcompress,
defs_itersolve, defs_trapq, defs_trdispatch,
defs_kin_cartesian, defs_kin_corexy, defs_kin_corexz, defs_kin_delta,
- defs_kin_polar, defs_kin_rotary_delta, defs_kin_winch, defs_kin_extruder,
- defs_kin_shaper,
+ defs_kin_deltesian, defs_kin_polar, defs_kin_rotary_delta, defs_kin_winch,
+ defs_kin_extruder, defs_kin_shaper,
]
# Update filenames to an absolute path
diff --git a/klippy/chelper/kin_deltesian.c b/klippy/chelper/kin_deltesian.c
new file mode 100644
index 00000000..c5fcb2e9
--- /dev/null
+++ b/klippy/chelper/kin_deltesian.c
@@ -0,0 +1,41 @@
+// Deltesian kinematics stepper pulse time generation
+//
+// Copyright (C) 2022 Fabrice Gallet <tircown@gmail.com>
+//
+// This file may be distributed under the terms of the GNU GPLv3 license.
+
+#include <math.h> // sqrt
+#include <stddef.h> // offsetof
+#include <stdlib.h> // malloc
+#include <string.h> // memset
+#include "compiler.h" // __visible
+#include "itersolve.h" // struct stepper_kinematics
+#include "trapq.h" // move_get_coord
+
+struct deltesian_stepper {
+ struct stepper_kinematics sk;
+ double arm2, arm_x;
+};
+
+static double
+deltesian_stepper_calc_position(struct stepper_kinematics *sk, struct move *m
+ , double move_time)
+{
+ struct deltesian_stepper *ds = container_of(
+ sk, struct deltesian_stepper, sk);
+ struct coord c = move_get_coord(m, move_time);
+ double dx = c.x - ds->arm_x;
+ return sqrt(ds->arm2 - dx*dx) + c.z;
+}
+
+struct stepper_kinematics * __visible
+deltesian_stepper_alloc(double arm2, double arm_x)
+{
+ struct deltesian_stepper *ds = malloc(sizeof(*ds));
+ memset(ds, 0, sizeof(*ds));
+ ds->arm2 = arm2;
+ ds->arm_x = arm_x;
+ ds->sk.calc_position_cb = deltesian_stepper_calc_position;
+ ds->sk.active_flags = AF_X | AF_Z;
+ return &ds->sk;
+}