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}