From d0258923e84a30fa7c14bd30ec7e9adee0007b29 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 14 Jan 2015 23:49:37 -0800 Subject: [PATCH] More Java nivision wrapper fixes. - Fix sliceByteBuffer, getBytes, and putBytes implementations, which had functional errors. Also, getBytes and putBytes now use the ByteBuffer get/put byte[] functions, which should improve performance. - Don't generate wrappers for functions that are not available in the shared library. Change-Id: Iaf45814b34720d3fdcd58adf99ad9c3ff2703bc3 --- .gitignore | 2 + .../src/main/java/com/ni/vision/NIVision.java | 1542 +---------------- wpilibj/wpilibJavaJNI/lib/NIVisionJNI.cpp | 1250 ------------- .../wpilibJavaJNI/nivision/dxattr_funcs.txt | 21 + wpilibj/wpilibJavaJNI/nivision/gen_java.py | 46 +- wpilibj/wpilibJavaJNI/nivision/generateJNI.sh | 12 +- 6 files changed, 81 insertions(+), 2792 deletions(-) create mode 100644 wpilibj/wpilibJavaJNI/nivision/dxattr_funcs.txt diff --git a/.gitignore b/.gitignore index 53eac49064..18ed277ee9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ wpilibj/wpilibJavaJNI/nivision/*.cpp wpilibj/wpilibJavaJNI/nivision/*.s wpilibj/wpilibJavaJNI/nivision/*_arm.ini wpilibj/wpilibJavaJNI/nivision/*.java +wpilibj/wpilibJavaJNI/nivision/nivision_funcs.txt +wpilibj/wpilibJavaJNI/nivision/imaqdx_funcs.txt # Created by the jenkins test script test-reports diff --git a/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java b/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java index e0863530f8..dfc46d5fd4 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/com/ni/vision/NIVision.java @@ -51,21 +51,29 @@ public class NIVision { } public static ByteBuffer sliceByteBuffer(ByteBuffer bb, int offset, int size) { - ByteBuffer new_bb = bb.duplicate().order(ByteOrder.nativeOrder()); - new_bb.position(offset); - new_bb.limit(size); + int pos = bb.position(); + int lim = bb.limit(); + bb.position(offset); + bb.limit(offset+size); + ByteBuffer new_bb = bb.slice().order(ByteOrder.nativeOrder()); + bb.position(pos); + bb.limit(lim); return new_bb; } public static ByteBuffer getBytes(ByteBuffer bb, byte[] dst, int offset, int size) { - for (int i=offset; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numFilters*4); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numPaths*4); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_selectedCount*84); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_reportCount*84); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numEdges*32); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numCircles*16); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numMatches*52); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numEdges*32); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numBarcodes*64); - for (int i=0, off=0; i 0 && array_addr != 0) { - ByteBuffer bb = newDirectByteBuffer(array_addr, array_numMatches*72); - for (int i=0, off=0; i...") + if len(sys.argv) < 5 or ((len(sys.argv)-1) % 4) != 0: + print("Usage: gen_wrap.py ...") exit(0) inputs = [] - for i in range(1, len(sys.argv), 3): + for i in range(1, len(sys.argv), 4): fname = sys.argv[i] config_struct_name = sys.argv[i+1] configname = sys.argv[i+2] - inputs.append((fname, config_struct_name, configname)) + funcs_name = sys.argv[i+3] + inputs.append((fname, config_struct_name, configname, funcs_name)) generate("", "", inputs) diff --git a/wpilibj/wpilibJavaJNI/nivision/generateJNI.sh b/wpilibj/wpilibJavaJNI/nivision/generateJNI.sh index 6d4791a45f..3f92311586 100755 --- a/wpilibj/wpilibJavaJNI/nivision/generateJNI.sh +++ b/wpilibj/wpilibJavaJNI/nivision/generateJNI.sh @@ -13,18 +13,28 @@ python gen_struct_sizer.py ../../../wpilibc/wpilibC++Devices/include/NIIMAQdx.h arm-frc-linux-gnueabi-gcc -I../../../wpilibc/wpilibC++Devices/include -S struct_sizer.c cat struct_sizer.s | python get_struct_size.py > imaqdx_arm.ini +# Get functions actually in the .so; some functions are in the header but +# not the shared library! +arm-frc-linux-gnueabi-nm -D ../../../ni-libraries/libnivision.so.14.0.0 | cut -c 12- | grep ^imaq > nivision_funcs.txt +echo Priv_ReadJPEGString_C >> nivision_funcs.txt +arm-frc-linux-gnueabi-nm -D ../../../ni-libraries/libniimaqdx.so.14.0.0 | cut -c 12- | grep ^IMAQdx > imaqdx_funcs.txt + # Run python generator. python gen_java.py \ ../../../wpilibc/wpilibC++Devices/include/nivision.h \ nivision_arm.ini \ nivision_2011.ini \ + nivision_funcs.txt \ \ ../../../wpilibc/wpilibC++Devices/include/NIIMAQdx.h \ imaqdx_arm.ini \ imaqdx.ini \ + imaqdx_funcs.txt \ + \ dxattr.h \ imaqdx_arm.ini \ - dxattr.ini + dxattr.ini \ + dxattr_funcs.txt # Stick generated files into appropriate places. cp NIVision.cpp ../lib/NIVisionJNI.cpp