blob: 117290d7589a556c741ab42332ac5111c1417fb6 [file] [log] [blame]
Alex Perrya60da442019-01-21 19:00:27 -05001#include <vector>
Alex Perry20762632019-01-21 17:48:02 -05002
3#include "Eigen/Dense"
4
Alex Perrya60da442019-01-21 19:00:27 -05005#include "frc971/control_loops/drivetrain/distance_spline.h"
Alex Perry20762632019-01-21 17:48:02 -05006#include "frc971/control_loops/drivetrain/spline.h"
7
8namespace frc971 {
9namespace control_loops {
10namespace drivetrain {
11
12extern "C" {
Alex Perrya60da442019-01-21 19:00:27 -050013 NSpline<6>* NewSpline(double x[6], double y[6]) {
Alex Perry20762632019-01-21 17:48:02 -050014 return new NSpline<6>((::Eigen::Matrix<double, 2, 6>() << x[0], x[1], x[2],
15 x[3], x[4], x[5], y[0], y[1], y[2], y[3], y[4],
16 y[5]).finished());
17 }
18
19 void deleteSpline(NSpline<6>* spline) {
20 delete spline;
21 }
22
Alex Perrya60da442019-01-21 19:00:27 -050023 void SplinePoint(NSpline<6>* spline, double alpha, double* res) {
Alex Perry20762632019-01-21 17:48:02 -050024 double* val = spline->Point(alpha).data();
25 res[0] = val[0];
26 res[1] = val[1];
27 }
28
Alex Perrya60da442019-01-21 19:00:27 -050029 void SplineDPoint(NSpline<6>* spline, double alpha, double* res) {
Alex Perry20762632019-01-21 17:48:02 -050030 double* val = spline->DPoint(alpha).data();
31 res[0] = val[0];
32 res[1] = val[1];
33 }
34
Alex Perrya60da442019-01-21 19:00:27 -050035 void SplineDDPoint(NSpline<6>* spline, double alpha, double* res) {
Alex Perry20762632019-01-21 17:48:02 -050036 double* val = spline->DDPoint(alpha).data();
37 res[0] = val[0];
38 res[1] = val[1];
39 }
40
Alex Perrya60da442019-01-21 19:00:27 -050041 void SplineDDDPoint(NSpline<6>* spline, double alpha, double* res) {
Alex Perry20762632019-01-21 17:48:02 -050042 double* val = spline->DDDPoint(alpha).data();
43 res[0] = val[0];
44 res[1] = val[1];
45 }
46
Alex Perrya60da442019-01-21 19:00:27 -050047 double SplineTheta(NSpline<6>* spline, double alpha) {
Alex Perry20762632019-01-21 17:48:02 -050048 return spline->Theta(alpha);
49 }
50
Alex Perrya60da442019-01-21 19:00:27 -050051 double SplineDTheta(NSpline<6>* spline, double alpha) {
Alex Perry20762632019-01-21 17:48:02 -050052 return spline->DTheta(alpha);
53 }
54
Alex Perrya60da442019-01-21 19:00:27 -050055 double SplineDDTheta(NSpline<6>* spline, double alpha) {
Alex Perry20762632019-01-21 17:48:02 -050056 return spline->DDTheta(alpha);
57 }
58
Alex Perrya60da442019-01-21 19:00:27 -050059 void SplineControlPoints(NSpline<6>* spline, double* x, double* y) {
Alex Perry20762632019-01-21 17:48:02 -050060 auto points = spline->control_points();
61 // Deal with incorrectly strided matrix.
62 for (int i = 0; i < 6; ++i) {
63 x[i] = points(0, i);
64 y[i] = points(1, i);
65 }
66 }
Alex Perrya60da442019-01-21 19:00:27 -050067
68 DistanceSpline* NewDistanceSpline(Spline** splines, int count) {
69 ::std::vector<Spline> splines_;
70 for (int i = 0; i < count; ++i) {
71 splines_.push_back(*splines[i]);
72 }
73 return new DistanceSpline(::std::vector<Spline>(splines_));
74 }
75
76 void deleteDistanceSpline(DistanceSpline* spline) {
77 delete spline;
78 }
79
80 void DistanceSplineXY(DistanceSpline *spline, double distance, double *res) {
81 double *val = spline->XY(distance).data();
82 res[0] = val[0];
83 res[1] = val[1];
84 }
85
86 void DistanceSplineDXY(DistanceSpline *spline, double distance, double *res) {
87 double *val = spline->DXY(distance).data();
88 res[0] = val[0];
89 res[1] = val[1];
90 }
91
92 void DistanceSplineDDXY(DistanceSpline *spline, double distance,
93 double *res) {
94 double *val = spline->DDXY(distance).data();
95 res[0] = val[0];
96 res[1] = val[1];
97 }
98
99 double DistanceSplineTheta(DistanceSpline *spline, double distance) {
100 return spline->Theta(distance);
101 }
102
103 double DistanceSplineDTheta(DistanceSpline *spline, double distance) {
104 return spline->DTheta(distance);
105 }
106
107 double DistanceSplineDThetaDt(DistanceSpline *spline, double distance,
108 double velocity) {
109 return spline->DThetaDt(distance, velocity);
110 }
111
112 double DistanceSplineDDTheta(DistanceSpline *spline, double distance) {
113 return spline->DDTheta(distance);
114 }
115
116 double DistanceSplineLength(DistanceSpline *spline) {
117 return spline->length();
118 }
Alex Perry20762632019-01-21 17:48:02 -0500119}
120
121} // namespace drivetrain
122} // namespace control_loops
123} // namespace frc971