001/*----------------------------------------------------------------------------*/
002/* Copyright (c) FIRST 2017-2018. All Rights Reserved.                        */
003/* Open Source Software - may be modified and shared by FRC teams. The code   */
004/* must be accompanied by the FIRST BSD license file in the root directory of */
005/* the project.                                                               */
006/*----------------------------------------------------------------------------*/
007
008package edu.wpi.first.networktables;
009
010import java.io.File;
011import java.io.InputStream;
012import java.io.OutputStream;
013import java.io.FileOutputStream;
014import java.io.IOException;
015import java.nio.ByteBuffer;
016import edu.wpi.first.wpiutil.RuntimeDetector;
017
018public final class NetworkTablesJNI {
019  static boolean libraryLoaded = false;
020  static File jniLibrary = null;
021  static {
022    if (!libraryLoaded) {
023      try {
024        System.loadLibrary("ntcore");
025      } catch (UnsatisfiedLinkError e) {
026        try {
027          String resname = RuntimeDetector.getLibraryResource("ntcore");
028          InputStream is = NetworkTablesJNI.class.getResourceAsStream(resname);
029          if (is != null) {
030            // create temporary file
031            if (System.getProperty("os.name").startsWith("Windows"))
032              jniLibrary = File.createTempFile("NetworkTablesJNI", ".dll");
033            else if (System.getProperty("os.name").startsWith("Mac"))
034              jniLibrary = File.createTempFile("libNetworkTablesJNI", ".dylib");
035            else
036              jniLibrary = File.createTempFile("libNetworkTablesJNI", ".so");
037            // flag for delete on exit
038            jniLibrary.deleteOnExit();
039            OutputStream os = new FileOutputStream(jniLibrary);
040
041            byte[] buffer = new byte[1024];
042            int readBytes;
043            try {
044              while ((readBytes = is.read(buffer)) != -1) {
045                os.write(buffer, 0, readBytes);
046              }
047            } finally {
048              os.close();
049              is.close();
050            }
051            System.load(jniLibrary.getAbsolutePath());
052          } else {
053            System.loadLibrary("ntcore");
054          }
055        } catch (IOException ex) {
056          ex.printStackTrace();
057          System.exit(1);
058        }
059      }
060      libraryLoaded = true;
061    }
062  }
063
064  public static native int getDefaultInstance();
065  public static native int createInstance();
066  public static native void destroyInstance(int inst);
067  public static native int getInstanceFromHandle(int handle);
068
069  public static native int getEntry(int inst, String key);
070  public static native int[] getEntries(int inst, String prefix, int types);
071  public static native String getEntryName(int entry);
072  public static native long getEntryLastChange(int entry);
073
074  public static native int getType(int entry);
075
076  public static native boolean setBoolean(int entry, long time, boolean value, boolean force);
077  public static native boolean setDouble(int entry, long time, double value, boolean force);
078  public static native boolean setString(int entry, long time, String value, boolean force);
079  public static native boolean setRaw(int entry, long time, byte[] value, boolean force);
080  public static native boolean setRaw(int entry, long time, ByteBuffer value, int len, boolean force);
081  public static native boolean setBooleanArray(int entry, long time, boolean[] value, boolean force);
082  public static native boolean setDoubleArray(int entry, long time, double[] value, boolean force);
083  public static native boolean setStringArray(int entry, long time, String[] value, boolean force);
084
085  public static native NetworkTableValue getValue(int entry);
086
087  public static native boolean getBoolean(int entry, boolean defaultValue);
088  public static native double getDouble(int entry, double defaultValue);
089  public static native String getString(int entry, String defaultValue);
090  public static native byte[] getRaw(int entry, byte[] defaultValue);
091  public static native boolean[] getBooleanArray(int entry, boolean[] defaultValue);
092  public static native double[] getDoubleArray(int entry, double[] defaultValue);
093  public static native String[] getStringArray(int entry, String[] defaultValue);
094  public static native boolean setDefaultBoolean(int entry, long time, boolean defaultValue);
095
096  public static native boolean setDefaultDouble(int entry, long time, double defaultValue);
097  public static native boolean setDefaultString(int entry, long time, String defaultValue);
098  public static native boolean setDefaultRaw(int entry, long time, byte[] defaultValue);
099  public static native boolean setDefaultBooleanArray(int entry, long time, boolean[] defaultValue);
100  public static native boolean setDefaultDoubleArray(int entry, long time, double[] defaultValue);
101  public static native boolean setDefaultStringArray(int entry, long time, String[] defaultValue);
102
103  public static native void setEntryFlags(int entry, int flags);
104  public static native int getEntryFlags(int entry);
105
106  public static native void deleteEntry(int entry);
107
108  public static native void deleteAllEntries(int inst);
109
110  public static native EntryInfo getEntryInfoHandle(NetworkTableInstance inst, int entry);
111  public static native EntryInfo[] getEntryInfo(NetworkTableInstance instObject, int inst, String prefix, int types);
112
113  public static native int createEntryListenerPoller(int inst);
114  public static native void destroyEntryListenerPoller(int poller);
115  public static native int addPolledEntryListener(int poller, String prefix, int flags);
116  public static native int addPolledEntryListener(int poller, int entry, int flags);
117  public static native EntryNotification[] pollEntryListener(NetworkTableInstance inst, int poller) throws InterruptedException;
118  public static native EntryNotification[] pollEntryListenerTimeout(NetworkTableInstance inst, int poller, double timeout) throws InterruptedException;
119  public static native void cancelPollEntryListener(int poller);
120  public static native void removeEntryListener(int entryListener);
121  public static native boolean waitForEntryListenerQueue(int inst, double timeout);
122
123  public static native int createConnectionListenerPoller(int inst);
124  public static native void destroyConnectionListenerPoller(int poller);
125  public static native int addPolledConnectionListener(int poller, boolean immediateNotify);
126  public static native ConnectionNotification[] pollConnectionListener(NetworkTableInstance inst, int poller) throws InterruptedException;
127  public static native ConnectionNotification[] pollConnectionListenerTimeout(NetworkTableInstance inst, int poller, double timeout) throws InterruptedException;
128  public static native void cancelPollConnectionListener(int poller);
129  public static native void removeConnectionListener(int connListener);
130  public static native boolean waitForConnectionListenerQueue(int inst, double timeout);
131
132  public static native int createRpcCallPoller(int inst);
133  public static native void destroyRpcCallPoller(int poller);
134  public static native void createPolledRpc(int entry, byte[] def, int poller);
135  public static native RpcAnswer[] pollRpc(NetworkTableInstance inst, int poller) throws InterruptedException;
136  public static native RpcAnswer[] pollRpcTimeout(NetworkTableInstance inst, int poller, double timeout) throws InterruptedException;
137  public static native void cancelPollRpc(int poller);
138  public static native boolean waitForRpcCallQueue(int inst, double timeout);
139  public static native void postRpcResponse(int entry, int call, byte[] result);
140  public static native int callRpc(int entry, byte[] params);
141  public static native byte[] getRpcResult(int entry, int call);
142  public static native byte[] getRpcResult(int entry, int call, double timeout);
143  public static native void cancelRpcResult(int entry, int call);
144
145  public static native byte[] getRpc(int entry, byte[] defaultValue);
146
147  public static native void setNetworkIdentity(int inst, String name);
148  public static native int getNetworkMode(int inst);
149  public static native void startServer(int inst, String persistFilename, String listenAddress, int port);
150  public static native void stopServer(int inst);
151  public static native void startClient(int inst);
152  public static native void startClient(int inst, String serverName, int port);
153  public static native void startClient(int inst, String[] serverNames, int[] ports);
154  public static native void startClientTeam(int inst, int team, int port);
155  public static native void stopClient(int inst);
156  public static native void setServer(int inst, String serverName, int port);
157  public static native void setServer(int inst, String[] serverNames, int[] ports);
158  public static native void setServerTeam(int inst, int team, int port);
159  public static native void startDSClient(int inst, int port);
160  public static native void stopDSClient(int inst);
161  public static native void setUpdateRate(int inst, double interval);
162
163  public static native void flush(int inst);
164
165  public static native ConnectionInfo[] getConnections(int inst);
166
167  public static native boolean isConnected(int inst);
168
169  public static native void savePersistent(int inst, String filename) throws PersistentException;
170  public static native String[] loadPersistent(int inst, String filename) throws PersistentException;  // returns warnings
171
172  public static native void saveEntries(int inst, String filename, String prefix) throws PersistentException;
173  public static native String[] loadEntries(int inst, String filename, String prefix) throws PersistentException;  // returns warnings
174
175  public static native long now();
176
177  public static native int createLoggerPoller(int inst);
178  public static native void destroyLoggerPoller(int poller);
179  public static native int addPolledLogger(int poller, int minLevel, int maxLevel);
180  public static native LogMessage[] pollLogger(NetworkTableInstance inst, int poller) throws InterruptedException;
181  public static native LogMessage[] pollLoggerTimeout(NetworkTableInstance inst, int poller, double timeout) throws InterruptedException;
182  public static native void cancelPollLogger(int poller);
183  public static native void removeLogger(int logger);
184  public static native boolean waitForLoggerQueue(int inst, double timeout);
185}