2020-07-24 08:34:30 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
/* 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. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
2020-08-07 09:38:13 -07:00
|
|
|
package edu.wpi.first.math;
|
2020-07-24 08:34:30 -07:00
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
|
|
|
|
import edu.wpi.first.wpiutil.RuntimeLoader;
|
|
|
|
|
|
2020-08-07 09:38:13 -07:00
|
|
|
public final class WPIMathJNI {
|
2020-07-24 08:34:30 -07:00
|
|
|
static boolean libraryLoaded = false;
|
2020-08-07 09:38:13 -07:00
|
|
|
static RuntimeLoader<WPIMathJNI> loader = null;
|
2020-07-24 08:34:30 -07:00
|
|
|
|
|
|
|
|
static {
|
|
|
|
|
if (Helper.getExtractOnStaticLoad()) {
|
|
|
|
|
try {
|
2020-08-06 23:57:39 -07:00
|
|
|
loader = new RuntimeLoader<>("wpimathjni", RuntimeLoader.getDefaultExtractionRoot(),
|
2020-08-07 09:38:13 -07:00
|
|
|
WPIMathJNI.class);
|
2020-07-24 08:34:30 -07:00
|
|
|
loader.loadLibrary();
|
|
|
|
|
} catch (IOException ex) {
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
System.exit(1);
|
|
|
|
|
}
|
|
|
|
|
libraryLoaded = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Force load the library.
|
|
|
|
|
*
|
|
|
|
|
* @throws IOException If the library could not be loaded or found.
|
|
|
|
|
*/
|
|
|
|
|
public static synchronized void forceLoad() throws IOException {
|
|
|
|
|
if (libraryLoaded) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-08-06 23:57:39 -07:00
|
|
|
loader = new RuntimeLoader<>("wpimathjni", RuntimeLoader.getDefaultExtractionRoot(),
|
2020-08-07 09:38:13 -07:00
|
|
|
WPIMathJNI.class);
|
2020-07-24 08:34:30 -07:00
|
|
|
loader.loadLibrary();
|
|
|
|
|
libraryLoaded = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Solves the discrete alegebraic Riccati equation.
|
|
|
|
|
*
|
|
|
|
|
* @param A Array containing elements of A in row-major order.
|
|
|
|
|
* @param B Array containing elements of B in row-major order.
|
|
|
|
|
* @param Q Array containing elements of Q in row-major order.
|
|
|
|
|
* @param R Array containing elements of R in row-major order.
|
|
|
|
|
* @param states Number of states in A matrix.
|
|
|
|
|
* @param inputs Number of inputs in B matrix.
|
|
|
|
|
* @param S Array storage for DARE solution.
|
|
|
|
|
*/
|
|
|
|
|
public static native void discreteAlgebraicRiccatiEquation(
|
|
|
|
|
double[] A,
|
|
|
|
|
double[] B,
|
|
|
|
|
double[] Q,
|
|
|
|
|
double[] R,
|
|
|
|
|
int states,
|
|
|
|
|
int inputs,
|
|
|
|
|
double[] S);
|
|
|
|
|
|
|
|
|
|
public static class Helper {
|
|
|
|
|
private static AtomicBoolean extractOnStaticLoad = new AtomicBoolean(true);
|
|
|
|
|
|
|
|
|
|
public static boolean getExtractOnStaticLoad() {
|
|
|
|
|
return extractOnStaticLoad.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void setExtractOnStaticLoad(boolean load) {
|
|
|
|
|
extractOnStaticLoad.set(load);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|