/*----------------------------------------------------------------------------*/ /* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #include #include #include "Eigen/Core" #include "drake/math/discrete_algebraic_riccati_equation.h" #include "edu_wpi_first_math_WPIMathJNI.h" #include "unsupported/Eigen/MatrixFunctions" using namespace wpi::java; extern "C" { /* * Class: edu_wpi_first_math_WPIMathJNI * Method: discreteAlgebraicRiccatiEquation * Signature: ([D[D[D[DII[D)V */ JNIEXPORT void JNICALL Java_edu_wpi_first_math_WPIMathJNI_discreteAlgebraicRiccatiEquation (JNIEnv* env, jclass, jdoubleArray A, jdoubleArray B, jdoubleArray Q, jdoubleArray R, jint states, jint inputs, jdoubleArray S) { jdouble* nativeA = env->GetDoubleArrayElements(A, nullptr); jdouble* nativeB = env->GetDoubleArrayElements(B, nullptr); jdouble* nativeQ = env->GetDoubleArrayElements(Q, nullptr); jdouble* nativeR = env->GetDoubleArrayElements(R, nullptr); Eigen::Map< Eigen::Matrix> Amat{nativeA, states, states}; Eigen::Map< Eigen::Matrix> Bmat{nativeB, states, inputs}; Eigen::Map< Eigen::Matrix> Qmat{nativeQ, states, states}; Eigen::Map< Eigen::Matrix> Rmat{nativeR, inputs, inputs}; Eigen::MatrixXd result = drake::math::DiscreteAlgebraicRiccatiEquation(Amat, Bmat, Qmat, Rmat); env->ReleaseDoubleArrayElements(A, nativeA, 0); env->ReleaseDoubleArrayElements(B, nativeB, 0); env->ReleaseDoubleArrayElements(Q, nativeQ, 0); env->ReleaseDoubleArrayElements(R, nativeR, 0); env->SetDoubleArrayRegion(S, 0, states * states, result.data()); } } // extern "C"