blob: f53dd235a75310c566176adb7b9736dc8b74f68e [file] [log] [blame]
Alex Perry20762632019-01-21 17:48:02 -05001#include <string.h>
2
3#include "Eigen/Dense"
4
5#include "frc971/control_loops/drivetrain/spline.h"
6
7namespace frc971 {
8namespace control_loops {
9namespace drivetrain {
10
11extern "C" {
12 NSpline<6>* newSpline(double x[6], double y[6]) {
13 return new NSpline<6>((::Eigen::Matrix<double, 2, 6>() << x[0], x[1], x[2],
14 x[3], x[4], x[5], y[0], y[1], y[2], y[3], y[4],
15 y[5]).finished());
16 }
17
18 void deleteSpline(NSpline<6>* spline) {
19 delete spline;
20 }
21
22 void Point(NSpline<6>* spline, double alpha, double* res) {
23 double* val = spline->Point(alpha).data();
24 res[0] = val[0];
25 res[1] = val[1];
26 }
27
28 void DPoint(NSpline<6>* spline, double alpha, double* res) {
29 double* val = spline->DPoint(alpha).data();
30 res[0] = val[0];
31 res[1] = val[1];
32 }
33
34 void DDPoint(NSpline<6>* spline, double alpha, double* res) {
35 double* val = spline->DDPoint(alpha).data();
36 res[0] = val[0];
37 res[1] = val[1];
38 }
39
40 void DDDPoint(NSpline<6>* spline, double alpha, double* res) {
41 double* val = spline->DDDPoint(alpha).data();
42 res[0] = val[0];
43 res[1] = val[1];
44 }
45
46 double Theta(NSpline<6>* spline, double alpha) {
47 return spline->Theta(alpha);
48 }
49
50 double DTheta(NSpline<6>* spline, double alpha) {
51 return spline->DTheta(alpha);
52 }
53
54 double DDTheta(NSpline<6>* spline, double alpha) {
55 return spline->DDTheta(alpha);
56 }
57
58 void control_points(NSpline<6>* spline, double* x, double* y) {
59 auto points = spline->control_points();
60 // Deal with incorrectly strided matrix.
61 for (int i = 0; i < 6; ++i) {
62 x[i] = points(0, i);
63 y[i] = points(1, i);
64 }
65 }
66}
67
68} // namespace drivetrain
69} // namespace control_loops
70} // namespace frc971