From 430722c4a322495dd8b59694529786f6623c1378 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 9 Dec 2014 00:48:57 -0800 Subject: [PATCH] Add Java nivision wrappers. Only very basic testing performed to date. The wrappers are still a bit incomplete (some structures and functions), but are much more complete than the old ones. Fixes artf3796. Changes from initial changeset: - Use // for comments. - Add auto-generate notices to the beginning of each generated file. - Include error number with error text in exception. - Add free() function to structures. - Fix out-of-order / non-array enums. - Avoid duplicate calls to DisposedStruct.write() as .getAddress() does it. - Refactor OpaqueStruct. - Default to no null allowed except when overridden. - Implement unowned return values. - Add gen_struct_sizer script. Change-Id: Ie0d102c45817ea8812d98fe4938d1a2255c61664 --- .gitignore | 6 + .../src/main/java/com/ni/vision/NIVision.java | 24555 ++++++++++++++++ .../java/com/ni/vision/VisionException.java | 20 + wpilibj/wpilibJavaJNI/lib/NIVisionJNI.cpp | 4717 +++ wpilibj/wpilibJavaJNI/nivision/gen_java.py | 1670 ++ .../nivision/gen_struct_sizer.py | 113 + wpilibj/wpilibJavaJNI/nivision/generateJNI.sh | 12 + .../wpilibJavaJNI/nivision/nivision_2011.ini | 821 + .../wpilibJavaJNI/nivision/nivision_arm.ini | 1863 ++ .../wpilibJavaJNI/nivision/nivision_parse.py | 220 + 10 files changed, 33997 insertions(+) create mode 100644 wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java create mode 100644 wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/VisionException.java create mode 100644 wpilibj/wpilibJavaJNI/lib/NIVisionJNI.cpp create mode 100644 wpilibj/wpilibJavaJNI/nivision/gen_java.py create mode 100644 wpilibj/wpilibJavaJNI/nivision/gen_struct_sizer.py create mode 100755 wpilibj/wpilibJavaJNI/nivision/generateJNI.sh create mode 100644 wpilibj/wpilibJavaJNI/nivision/nivision_2011.ini create mode 100644 wpilibj/wpilibJavaJNI/nivision/nivision_arm.ini create mode 100644 wpilibj/wpilibJavaJNI/nivision/nivision_parse.py diff --git a/.gitignore b/.gitignore index b79f6c2f8c..4919c92565 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ bin/ .project .classpath **/dependency-reduced-pom.xml +wpilibj/wpilibJavaJNI/nivision/*.c +wpilibj/wpilibJavaJNI/nivision/*.java # Created by the jenkins test script test-reports @@ -155,6 +157,10 @@ local.properties .settings/ .loadpath +### Python ### +*.pyc +__pycache__ + # External tool builders .externalToolBuilders/ diff --git a/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java b/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java new file mode 100644 index 0000000000..bc549d0d0a --- /dev/null +++ b/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java @@ -0,0 +1,24555 @@ +// +// This file is auto-generated by wpilibj/wpilibJavaJNI/nivision/gen_java.py +// Please do not edit! +// + +package com.ni.vision; + +import java.lang.reflect.*; +import java.io.UnsupportedEncodingException; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class NIVision { + private NIVision() {} + + private static native void imaqDispose(long addr); + + private static Constructor constructDirectByteBuffer; + private static Field bufferAddressField; + + static { + try { + Class[] cArg = new Class[2]; + cArg[0] = long.class; + cArg[1] = int.class; + constructDirectByteBuffer = Class.forName("java.nio.DirectByteBuffer").getDeclaredConstructor(cArg); + constructDirectByteBuffer.setAccessible(true); + + bufferAddressField = Buffer.class.getDeclaredField("address"); + bufferAddressField.setAccessible(true); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + private static ByteBuffer newDirectByteBuffer(long addr, int cap) { + try { + return ((ByteBuffer)(constructDirectByteBuffer.newInstance(addr, cap))).order(ByteOrder.nativeOrder()); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + private static long getByteBufferAddress(ByteBuffer bb) { + try { + return bufferAddressField.getLong(bb); + } catch (IllegalAccessException e) { + return 0; + } + } + + public static ByteBuffer sliceByteBuffer(ByteBuffer bb, int offset, int size) { + ByteBuffer new_bb = bb.duplicate(); + new_bb.position(offset); + new_bb.limit(size); + return new_bb; + } + + public static ByteBuffer getBytes(ByteBuffer bb, byte[] dst, int offset, int size) { + for (int i=offset; i