From da47f06d70cba3e8b387ca208fe32e62c18eb402 Mon Sep 17 00:00:00 2001 From: DeltaDizzy Date: Wed, 19 Feb 2025 23:08:17 -0600 Subject: [PATCH] [datalog] Move all DataLog functionality to new datalog library (#7641) Currently the major DataLog backend API (reading and writing) is split between wpiutil and glass. In the interest of allowing code that wants to use these APIs to not need to link to glass and declutter wpiutil, all of those APIs are moved to a new library named "datalog". Signed-off-by: Jade Turner Co-authored-by: Jade Turner Co-authored-by: Gold856 <117957790+Gold856@users.noreply.github.com> --- CMakeLists.txt | 2 + datalog/.styleguide | 29 +++ datalog/BUILD.bazel | 106 ++++++++ datalog/CMakeLists.txt | 108 ++++++++ datalog/build.gradle | 32 +++ datalog/datalog-config.cmake.in | 5 + {wpiutil => datalog}/doc/datalog.adoc | 0 .../examples/printlog/datalog.py | 0 .../examples/printlog/printlog.cpp | 8 +- .../examples/writelog/writelog.cpp | 5 +- .../java/edu/wpi/first/datalog/DevMain.java | 12 + datalog/src/dev/native/cpp/main.cpp | 5 + .../first}/datalog/BooleanArrayLogEntry.java | 2 +- .../wpi/first}/datalog/BooleanLogEntry.java | 2 +- .../java/edu/wpi/first}/datalog/DataLog.java | 2 +- .../datalog/DataLogBackgroundWriter.java | 2 +- .../edu/wpi/first}/datalog/DataLogEntry.java | 2 +- .../wpi/first}/datalog/DataLogIterator.java | 2 +- .../edu/wpi/first}/datalog/DataLogJNI.java | 82 ++++++- .../edu/wpi/first}/datalog/DataLogReader.java | 2 +- .../edu/wpi/first}/datalog/DataLogRecord.java | 2 +- .../edu/wpi/first}/datalog/DataLogWriter.java | 2 +- .../first}/datalog/DoubleArrayLogEntry.java | 2 +- .../wpi/first}/datalog/DoubleLogEntry.java | 2 +- .../edu/wpi/first/datalog}/FileLogger.java | 8 +- .../first}/datalog/FloatArrayLogEntry.java | 2 +- .../edu/wpi/first}/datalog/FloatLogEntry.java | 2 +- .../first}/datalog/IntegerArrayLogEntry.java | 2 +- .../wpi/first}/datalog/IntegerLogEntry.java | 2 +- .../wpi/first}/datalog/ProtobufLogEntry.java | 2 +- .../edu/wpi/first}/datalog/RawLogEntry.java | 2 +- .../first}/datalog/StringArrayLogEntry.java | 2 +- .../wpi/first}/datalog/StringLogEntry.java | 2 +- .../first}/datalog/StructArrayLogEntry.java | 2 +- .../wpi/first}/datalog/StructLogEntry.java | 2 +- .../src/main/native/cpp/DataLog.cpp | 14 +- .../native/cpp/DataLogBackgroundWriter.cpp | 2 +- .../src/main/native/cpp/DataLogReader.cpp | 8 +- .../main/native/cpp}/DataLogReaderThread.cpp | 6 +- .../src/main/native/cpp/DataLogWriter.cpp | 6 +- .../src/main/native/cpp/FileLogger.cpp | 9 +- .../src/main/native/cpp/jni/DataLogJNI.cpp | 231 +++++++++++++----- datalog/src/main/native/cpp/jni/DataLogJNI.h | 18 ++ .../native/include/wpi/datalog}/DataLog.h | 19 +- .../wpi/datalog}/DataLogBackgroundWriter.h | 7 +- .../include/wpi/datalog}/DataLogReader.h | 2 +- .../wpi/datalog}/DataLogReaderThread.h | 7 +- .../include/wpi/datalog}/DataLogWriter.h | 2 +- .../native/include/wpi/datalog}/DataLog_c.h | 1 + .../native/include/wpi/datalog}/FileLogger.h | 6 +- .../src/printlog/java/printlog/PrintLog.java | 4 +- .../edu/wpi/first}/datalog/DataLogTest.java | 2 +- .../src/test/native/cpp/DataLogTest.cpp | 6 +- .../src/test/native/cpp/FileLoggerTest.cpp | 12 +- datalog/src/test/native/cpp/main.cpp | 11 + datalogtool/CMakeLists.txt | 2 +- datalogtool/build.gradle | 3 +- datalogtool/src/main/native/cpp/Exporter.cpp | 10 +- epilogue-runtime/BUILD.bazel | 1 + epilogue-runtime/build.gradle | 1 + .../first/epilogue/logging/FileBackend.java | 30 +-- glass/build.gradle | 7 +- ntcore/BUILD.bazel | 2 + ntcore/CMakeLists.txt | 4 +- ntcore/build.gradle | 8 + .../main/java/NetworkTableInstance.java.jinja | 2 +- .../main/java/NetworkTablesJNI.java.jinja | 2 +- .../networktables/NetworkTableInstance.java | 2 +- .../first/networktables/NetworkTablesJNI.java | 2 +- ntcore/src/main/native/cpp/ConnectionList.h | 2 +- .../main/native/cpp/local/LocalDataLogger.cpp | 2 +- .../native/cpp/local/LocalDataLoggerEntry.h | 2 +- .../native/cpp/local/LocalStorageImpl.cpp | 2 +- .../src/main/native/cpp/DataLogManager.cpp | 6 +- settings.gradle | 1 + sysid/CMakeLists.txt | 4 +- sysid/build.gradle | 6 +- .../src/main/native/cpp/view/DataSelector.cpp | 15 +- sysid/src/main/native/cpp/view/LogLoader.cpp | 8 +- .../native/include/sysid/view/DataSelector.h | 16 +- .../native/include/sysid/view/LogLoader.h | 10 +- wpilibNewCommands/CMakeLists.txt | 1 + wpilibNewCommands/build.gradle | 1 + wpilibc/BUILD.bazel | 1 + wpilibc/CMakeLists.txt | 2 +- wpilibc/build.gradle | 1 + .../src/main/native/cpp/DataLogManager.cpp | 8 +- wpilibc/src/main/native/cpp/DriverStation.cpp | 2 +- .../include/frc/sysid/SysIdRoutineLog.h | 2 +- wpilibj/BUILD.bazel | 1 + wpilibj/CMakeLists.txt | 1 + wpilibj/build.gradle | 1 + .../edu/wpi/first/wpilibj/DataLogManager.java | 10 +- .../edu/wpi/first/wpilibj/DriverStation.java | 10 +- .../first/wpilibj/sysid/SysIdRoutineLog.java | 4 +- wpiutil/BUILD.bazel | 32 --- wpiutil/CMakeLists.txt | 6 +- .../java/edu/wpi/first/util/WPIUtilJNI.java | 18 -- .../src/main/native/cpp/jni/WPIUtilJNI.cpp | 40 --- 99 files changed, 778 insertions(+), 330 deletions(-) create mode 100644 datalog/.styleguide create mode 100644 datalog/BUILD.bazel create mode 100644 datalog/CMakeLists.txt create mode 100644 datalog/build.gradle create mode 100644 datalog/datalog-config.cmake.in rename {wpiutil => datalog}/doc/datalog.adoc (100%) rename {wpiutil => datalog}/examples/printlog/datalog.py (100%) rename {wpiutil => datalog}/examples/printlog/printlog.cpp (97%) rename {wpiutil => datalog}/examples/writelog/writelog.cpp (97%) create mode 100644 datalog/src/dev/java/edu/wpi/first/datalog/DevMain.java create mode 100644 datalog/src/dev/native/cpp/main.cpp rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/BooleanArrayLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/BooleanLogEntry.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLog.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogBackgroundWriter.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogEntry.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogIterator.java (97%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogJNI.java (83%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogReader.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogRecord.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DataLogWriter.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DoubleArrayLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/DoubleLogEntry.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first/datalog}/FileLogger.java (82%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/FloatArrayLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/FloatLogEntry.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/IntegerArrayLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/IntegerLogEntry.java (98%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/ProtobufLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/RawLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/StringArrayLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/StringLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/StructArrayLogEntry.java (99%) rename {wpiutil/src/main/java/edu/wpi/first/util => datalog/src/main/java/edu/wpi/first}/datalog/StructLogEntry.java (99%) rename {wpiutil => datalog}/src/main/native/cpp/DataLog.cpp (99%) rename {wpiutil => datalog}/src/main/native/cpp/DataLogBackgroundWriter.cpp (99%) rename {wpiutil => datalog}/src/main/native/cpp/DataLogReader.cpp (98%) rename {glass/src/lib/native/cpp/support => datalog/src/main/native/cpp}/DataLogReaderThread.cpp (98%) rename {wpiutil => datalog}/src/main/native/cpp/DataLogWriter.cpp (97%) rename {wpiutil => datalog}/src/main/native/cpp/FileLogger.cpp (96%) rename {wpiutil => datalog}/src/main/native/cpp/jni/DataLogJNI.cpp (70%) create mode 100644 datalog/src/main/native/cpp/jni/DataLogJNI.h rename {wpiutil/src/main/native/include/wpi => datalog/src/main/native/include/wpi/datalog}/DataLog.h (99%) rename {wpiutil/src/main/native/include/wpi => datalog/src/main/native/include/wpi/datalog}/DataLogBackgroundWriter.h (98%) rename {wpiutil/src/main/native/include/wpi => datalog/src/main/native/include/wpi/datalog}/DataLogReader.h (99%) rename {glass/src/lib/native/include/glass/support => datalog/src/main/native/include/wpi/datalog}/DataLogReaderThread.h (97%) rename {wpiutil/src/main/native/include/wpi => datalog/src/main/native/include/wpi/datalog}/DataLogWriter.h (98%) rename {wpiutil/src/main/native/include/wpi => datalog/src/main/native/include/wpi/datalog}/DataLog_c.h (99%) rename {wpiutil/src/main/native/include/wpi => datalog/src/main/native/include/wpi/datalog}/FileLogger.h (95%) rename {wpiutil => datalog}/src/printlog/java/printlog/PrintLog.java (98%) rename {wpiutil/src/test/java/edu/wpi/first/util => datalog/src/test/java/edu/wpi/first}/datalog/DataLogTest.java (99%) rename {wpiutil => datalog}/src/test/native/cpp/DataLogTest.cpp (99%) rename {wpiutil => datalog}/src/test/native/cpp/FileLoggerTest.cpp (85%) create mode 100644 datalog/src/test/native/cpp/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index df1e06e890..6b88f9e010 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -291,6 +291,8 @@ set(WPIUNITS_DEP_REPLACE_IMPL "find_dependency(wpiunits)") set(WPIUTIL_DEP_REPLACE "find_dependency(wpiutil)") add_subdirectory(wpiutil) +add_subdirectory(datalog) + if(WITH_NTCORE) set(NTCORE_DEP_REPLACE "find_dependency(ntcore)") set(WPINET_DEP_REPLACE "find_dependency(wpinet)") diff --git a/datalog/.styleguide b/datalog/.styleguide new file mode 100644 index 0000000000..7d2e853332 --- /dev/null +++ b/datalog/.styleguide @@ -0,0 +1,29 @@ +cppHeaderFileInclude { + \.h$ +} + +cppSrcFileInclude { + \.cpp$ +} + +licenseUpdateExclude { + examples/printlog +} + +modifiableFileExclude { + examples/printlog/datalog\.py$ +} + +repoRootNameOverride { + datalog +} + +includeOtherLibs { + ^fmt/ + ^gtest/ + ^wpi/(?!datalog) +} + +includeProject { + ^wpi/datalog/ +} diff --git a/datalog/BUILD.bazel b/datalog/BUILD.bazel new file mode 100644 index 0000000000..1e3c34c117 --- /dev/null +++ b/datalog/BUILD.bazel @@ -0,0 +1,106 @@ +load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") +load("@rules_java//java:defs.bzl", "java_binary") +load("@rules_python//python:defs.bzl", "py_binary") +load("//shared/bazel/rules:java_rules.bzl", "wpilib_java_junit5_test") +load("//shared/bazel/rules:jni_rules.bzl", "wpilib_jni_cc_library", "wpilib_jni_java_library") + +cc_library( + name = "datalog.static", + srcs = glob( + ["src/main/native/cpp/**"], + exclude = ["src/main/native/cpp/jni/**"], + ), + hdrs = glob(["src/main/native/include/**"]), + includes = [ + "src/main/native/cpp", + "src/main/native/include", + ], + strip_include_prefix = "src/main/native/include", + visibility = ["//visibility:public"], + deps = [ + "//wpiutil:wpiutil.static", + ], +) + +wpilib_jni_cc_library( + name = "datalogjni", + srcs = glob(["src/main/native/cpp/jni/**"]), + java_dep = ":datalog-java", + visibility = ["//visibility:public"], + deps = [ + ":datalog.static", + ], +) + +wpilib_jni_java_library( + name = "datalog-java", + srcs = glob(["src/main/java/**/*.java"]), + native_libs = [":datalogjni"], + visibility = ["//visibility:public"], + deps = [ + "//wpiutil:wpiutil-java", + "@maven//:us_hebi_quickbuf_quickbuf_runtime", + ], +) + +py_binary( + name = "datalog", + srcs = ["examples/printlog/datalog.py"], + tags = ["manual"], +) + +cc_binary( + name = "printlog", + srcs = ["examples/printlog/printlog.cpp"], + deps = [ + ":datalog.static", + "//wpiutil:wpiutil.static", + ], +) + +cc_binary( + name = "writelog", + srcs = ["examples/writelog/writelog.cpp"], + deps = [ + ":datalog.static", + "//wpiutil:wpiutil.static", + ], +) + +java_binary( + name = "printlog-java", + srcs = ["src/printlog/java/printlog/PrintLog.java"], + main_class = "printlog.PrintLog", + deps = [ + ":datalog-java", + ], +) + +cc_test( + name = "datalog-cpp-test", + size = "small", + srcs = glob([ + "src/test/native/**/*.cpp", + "src/test/native/**/*.h", + ]), + tags = [ + "exclusive", + "no-asan", + "no-tsan", + ], + deps = [ + ":datalog.static", + "//thirdparty/googletest:googletest.static", + "//wpiutil:wpiutil-testlib", + ], +) + +wpilib_java_junit5_test( + name = "datalog-java-test", + srcs = glob(["src/test/java/**/*.java"]), + tags = ["exclusive"], + deps = [ + ":datalog-java", + "//wpiutil:wpiutil-java", + ], +) diff --git a/datalog/CMakeLists.txt b/datalog/CMakeLists.txt new file mode 100644 index 0000000000..2e31dc10c4 --- /dev/null +++ b/datalog/CMakeLists.txt @@ -0,0 +1,108 @@ +project(datalog) + +include(CompileWarnings) + +file(GLOB datalog_native_src src/main/native/cpp/*.cpp) + +file(GLOB datalog_jni_src src/main/native/cpp/jni/DataLogJNI.cpp) +list(REMOVE_ITEM datalog_native_src ${datalog_jni_src}) + +add_library(datalog ${datalog_native_src}) +set_target_properties(datalog PROPERTIES DEBUG_POSTFIX "d") + +target_compile_features(datalog PUBLIC cxx_std_20) +if(MSVC) + target_compile_options( + datalog + PUBLIC /permissive- /Zc:preprocessor /Zc:__cplusplus /Zc:throwingNew /MP /bigobj /utf-8 + ) + target_compile_definitions(datalog PRIVATE -D_CRT_SECURE_NO_WARNINGS) +endif() +wpilib_target_warnings(datalog) + +target_include_directories( + datalog + PUBLIC $ +) + +target_link_libraries(datalog PRIVATE wpiutil) + +subdir_list(datalog_examples "${CMAKE_CURRENT_SOURCE_DIR}/examples") +foreach(example ${datalog_examples}) + file(GLOB datalog_example_src examples/${example}/*.cpp) + if(datalog_example_src) + add_executable(datalog_${example} ${datalog_example_src}) + wpilib_target_warnings(datalog_${example}) + target_link_libraries(datalog_${example} datalog wpiutil) + set_property(TARGET datalog_${example} PROPERTY FOLDER "examples") + endif() +endforeach() + +# Java bindings +if(WITH_JAVA) + include(UseJava) + + set(CMAKE_JNI_TARGET true) + + file(GLOB_RECURSE JAVA_SOURCES src/main/java/*.java) + file(GLOB QUICKBUF_JAR ${WPILIB_BINARY_DIR}/wpiutil/thirdparty/quickbuf/*.jar) + + add_jar( + datalog_jar + ${JAVA_SOURCES} + # INCLUDE_JARS ${JACKSON_JARS} ${QUICKBUF_JAR} + INCLUDE_JARS wpiutil_jar ${QUICKBUF_JAR} + OUTPUT_NAME datalog + OUTPUT_DIR ${WPILIB_BINARY_DIR}/${java_lib_dest} + GENERATE_NATIVE_HEADERS datalog_jni_headers + ) + set_property(TARGET datalog_jar PROPERTY FOLDER "java") + + install_jar(datalog_jar DESTINATION ${java_lib_dest}) + install_jar_exports(TARGETS datalog_jar FILE datalog_jar.cmake DESTINATION share/datalog) + + add_library(datalogjni ${datalog_jni_src}) + wpilib_target_warnings(datalogjni) + target_link_libraries(datalogjni PUBLIC datalog wpiutil) + + set_property(TARGET datalogjni PROPERTY FOLDER "libraries") + + target_link_libraries(datalogjni PRIVATE datalog_jni_headers) + add_dependencies(datalogjni datalog_jar) + + install(TARGETS datalogjni EXPORT datalogjni) + export(TARGETS datalogjni FILE datalogjni.cmake NAMESPACE datalogjni::) +endif() + +if(WITH_JAVA_SOURCE) + include(UseJava) + include(CreateSourceJar) + add_source_jar( + datalog_src_jar + BASE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java + OUTPUT_NAME datalog-sources + OUTPUT_DIR ${WPILIB_BINARY_DIR}/${java_lib_dest} + ) + set_property(TARGET datalog_src_jar PROPERTY FOLDER "java") + + install_jar(datalog_src_jar DESTINATION ${java_lib_dest}) +endif() + +install(TARGETS datalog EXPORT datalog) +export(TARGETS datalog FILE datalog.cmake NAMESPACE datalog::) + +configure_file(datalog-config.cmake.in ${WPILIB_BINARY_DIR}/datalog-config.cmake) +install(FILES ${WPILIB_BINARY_DIR}/datalog-config.cmake DESTINATION share/datalog) +install(EXPORT datalog DESTINATION share/datalog) + +if(WITH_TESTS) + file(GLOB_RECURSE datalog_testlib_src src/test/native/include/*.h) + add_library(datalog_testlib INTERFACE ${datalog_test_src}) + target_include_directories(datalog_testlib INTERFACE src/test/native/include) + + wpilib_add_test(datalog src/test/native/cpp) + target_link_libraries(datalog_test datalog googletest datalog_testlib wpiutil) + if(MSVC) + target_compile_options(datalog_test PRIVATE /utf-8) + endif() +endif() diff --git a/datalog/build.gradle b/datalog/build.gradle new file mode 100644 index 0000000000..211908a4d2 --- /dev/null +++ b/datalog/build.gradle @@ -0,0 +1,32 @@ +ext { + useJava = true + useCpp = true + baseId = 'datalog' + groupId = 'edu.wpi.first.datalog' + + nativeName = 'datalog' + devMain = 'edu.wpi.first.datalog.DevMain' +} + +apply from: "${rootDir}/shared/jni/setupBuild.gradle" + +nativeUtils.exportsConfigs { + datalog { + } +} + +model { + components { + all { + it.sources.each { + it.exportedHeaders { + srcDirs 'src/main/native/include' + } + } + } + } +} + +dependencies { + api project(":wpiutil") +} diff --git a/datalog/datalog-config.cmake.in b/datalog/datalog-config.cmake.in new file mode 100644 index 0000000000..eb26b9cb31 --- /dev/null +++ b/datalog/datalog-config.cmake.in @@ -0,0 +1,5 @@ +@FILENAME_DEP_REPLACE@ +include(${SELF_DIR}/wpiutil.cmake) +if(@WITH_JAVA@) + include(${SELF_DIR}/wpiutil_jar.cmake) +endif() diff --git a/wpiutil/doc/datalog.adoc b/datalog/doc/datalog.adoc similarity index 100% rename from wpiutil/doc/datalog.adoc rename to datalog/doc/datalog.adoc diff --git a/wpiutil/examples/printlog/datalog.py b/datalog/examples/printlog/datalog.py similarity index 100% rename from wpiutil/examples/printlog/datalog.py rename to datalog/examples/printlog/datalog.py diff --git a/wpiutil/examples/printlog/printlog.cpp b/datalog/examples/printlog/printlog.cpp similarity index 97% rename from wpiutil/examples/printlog/printlog.cpp rename to datalog/examples/printlog/printlog.cpp index a17d30b385..8a04995984 100644 --- a/wpiutil/examples/printlog/printlog.cpp +++ b/datalog/examples/printlog/printlog.cpp @@ -9,11 +9,11 @@ #include #include #include +#include +#include +#include -#include "wpi/DataLogReader.h" -#include "wpi/DenseMap.h" -#include "wpi/MemoryBuffer.h" -#include "wpi/print.h" +#include "wpi/datalog/DataLogReader.h" int main(int argc, const char** argv) { if (argc != 2) { diff --git a/wpiutil/examples/writelog/writelog.cpp b/datalog/examples/writelog/writelog.cpp similarity index 97% rename from wpiutil/examples/writelog/writelog.cpp rename to datalog/examples/writelog/writelog.cpp index dd9f8fa33d..f65fbb2d56 100644 --- a/wpiutil/examples/writelog/writelog.cpp +++ b/datalog/examples/writelog/writelog.cpp @@ -8,8 +8,9 @@ #include #include -#include "wpi/DataLogBackgroundWriter.h" -#include "wpi/print.h" +#include + +#include "wpi/datalog/DataLogBackgroundWriter.h" int main(int argc, char** argv) { using std::chrono::duration_cast; diff --git a/datalog/src/dev/java/edu/wpi/first/datalog/DevMain.java b/datalog/src/dev/java/edu/wpi/first/datalog/DevMain.java new file mode 100644 index 0000000000..2c424d6c84 --- /dev/null +++ b/datalog/src/dev/java/edu/wpi/first/datalog/DevMain.java @@ -0,0 +1,12 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package edu.wpi.first.datalog; + +public final class DevMain { + /** Main entry point. */ + public static void main(String[] args) {} + + private DevMain() {} +} diff --git a/datalog/src/dev/native/cpp/main.cpp b/datalog/src/dev/native/cpp/main.cpp new file mode 100644 index 0000000000..a3e363efca --- /dev/null +++ b/datalog/src/dev/native/cpp/main.cpp @@ -0,0 +1,5 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +int main() {} diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/BooleanArrayLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/BooleanArrayLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/BooleanArrayLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/BooleanArrayLogEntry.java index 76b85f518c..01a3fffce1 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/BooleanArrayLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/BooleanArrayLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.util.Arrays; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/BooleanLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/BooleanLogEntry.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/BooleanLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/BooleanLogEntry.java index ba1783e161..b037370fcc 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/BooleanLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/BooleanLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** Log boolean values. */ public class BooleanLogEntry extends DataLogEntry { diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLog.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLog.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLog.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLog.java index 4a89542cb7..fed02a0a49 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLog.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLog.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import edu.wpi.first.util.WPIUtilJNI; import edu.wpi.first.util.protobuf.Protobuf; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogBackgroundWriter.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogBackgroundWriter.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogBackgroundWriter.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogBackgroundWriter.java index 18a6e5e63c..f9ac427e6a 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogBackgroundWriter.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogBackgroundWriter.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** * A data log background writer that periodically flushes the data log on a background thread. The diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogEntry.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogEntry.java index 8502428405..9c58f94e97 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** Log entry base class. */ public class DataLogEntry { diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogIterator.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogIterator.java similarity index 97% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogIterator.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogIterator.java index 3f1d66e72d..f6579e54a4 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogIterator.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogIterator.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.util.Iterator; import java.util.NoSuchElementException; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogJNI.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogJNI.java similarity index 83% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogJNI.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogJNI.java index 8b949e55ce..bffd6ab3c3 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogJNI.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogJNI.java @@ -2,18 +2,72 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; -import edu.wpi.first.util.WPIUtilJNI; +import edu.wpi.first.util.RuntimeLoader; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; /** - * DataLog wpiutil JNI Functions. + * DataLog JNI Functions. * - * @see "wpiutil/DataLog.h" + * @see "datalog/DataLog.h" */ -public class DataLogJNI extends WPIUtilJNI { +public class DataLogJNI { + static boolean libraryLoaded = false; + + /** Sets whether JNI should be loaded in the static block. */ + public static class Helper { + private static AtomicBoolean extractOnStaticLoad = new AtomicBoolean(true); + + /** + * Returns true if the JNI should be loaded in the static block. + * + * @return True if the JNI should be loaded in the static block. + */ + public static boolean getExtractOnStaticLoad() { + return extractOnStaticLoad.get(); + } + + /** + * Sets whether the JNI should be loaded in the static block. + * + * @param load Whether the JNI should be loaded in the static block. + */ + public static void setExtractOnStaticLoad(boolean load) { + extractOnStaticLoad.set(load); + } + + /** Utility class. */ + private Helper() {} + } + + static { + if (Helper.getExtractOnStaticLoad()) { + try { + RuntimeLoader.loadLibrary("datalogjni"); + } catch (Exception ex) { + ex.printStackTrace(); + System.exit(1); + } + libraryLoaded = true; + } + } + + /** + * Force load the library. + * + * @throws IOException if the library failed to load + */ + public static synchronized void forceLoad() throws IOException { + if (libraryLoaded) { + return; + } + RuntimeLoader.loadLibrary("datalogjni"); + libraryLoaded = true; + } + /** * Create a new Data Log background writer. The log will be initially created with a temporary * filename. @@ -298,6 +352,24 @@ public class DataLogJNI extends WPIUtilJNI { */ static native void appendStringArray(long impl, int entry, String[] value, long timestamp); + /** + * Create a native FileLogger. When the specified file is modified, appended data will be appended + * to the specified data log. + * + * @param file path to the file + * @param log data log implementation handle + * @param key log key to append data to + * @return The FileLogger handle. + */ + public static native long createFileLogger(String file, long log, String key); + + /** + * Free a native FileLogger. This causes the FileLogger to stop appending data to the log. + * + * @param fileTail The FileLogger handle. + */ + public static native void freeFileLogger(long fileTail); + /** Utility class. */ private DataLogJNI() {} } diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogReader.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogReader.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogReader.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogReader.java index 55eabf3ad7..c58da2dc16 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogReader.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogReader.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.io.IOException; import java.io.RandomAccessFile; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogRecord.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogRecord.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogRecord.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogRecord.java index 5e3965b5aa..cf7f2d2d52 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogRecord.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogRecord.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogWriter.java b/datalog/src/main/java/edu/wpi/first/datalog/DataLogWriter.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogWriter.java rename to datalog/src/main/java/edu/wpi/first/datalog/DataLogWriter.java index 058d6dd8a4..ce751d7776 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DataLogWriter.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DataLogWriter.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.io.IOException; import java.io.OutputStream; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DoubleArrayLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/DoubleArrayLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DoubleArrayLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/DoubleArrayLogEntry.java index 2fe528f1bd..7a9b494352 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DoubleArrayLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DoubleArrayLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.util.Arrays; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DoubleLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/DoubleLogEntry.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/DoubleLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/DoubleLogEntry.java index 2484063aba..e4ec6909af 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/DoubleLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/DoubleLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** Log double values. */ public class DoubleLogEntry extends DataLogEntry { diff --git a/wpiutil/src/main/java/edu/wpi/first/util/FileLogger.java b/datalog/src/main/java/edu/wpi/first/datalog/FileLogger.java similarity index 82% rename from wpiutil/src/main/java/edu/wpi/first/util/FileLogger.java rename to datalog/src/main/java/edu/wpi/first/datalog/FileLogger.java index 438861b53e..afa98b2a6f 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/FileLogger.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/FileLogger.java @@ -2,9 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util; - -import edu.wpi.first.util.datalog.DataLog; +package edu.wpi.first.datalog; /** * A class version of `tail -f`, otherwise known as `tail -f` at home. Watches a file and puts the @@ -22,11 +20,11 @@ public class FileLogger implements AutoCloseable { * @param key The log key to append data to. */ public FileLogger(String file, DataLog log, String key) { - m_impl = WPIUtilJNI.createFileLogger(file, log.getImpl(), key); + m_impl = DataLogJNI.createFileLogger(file, log.getImpl(), key); } @Override public void close() { - WPIUtilJNI.freeFileLogger(m_impl); + DataLogJNI.freeFileLogger(m_impl); } } diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/FloatArrayLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/FloatArrayLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/FloatArrayLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/FloatArrayLogEntry.java index 136b7e5b42..8532e3ab1e 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/FloatArrayLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/FloatArrayLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.util.Arrays; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/FloatLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/FloatLogEntry.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/FloatLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/FloatLogEntry.java index 8cb02cfafd..2286a7328c 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/FloatLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/FloatLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** Log float values. */ public class FloatLogEntry extends DataLogEntry { diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/IntegerArrayLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/IntegerArrayLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/IntegerArrayLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/IntegerArrayLogEntry.java index 80e2be36d9..1f9c9ff64e 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/IntegerArrayLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/IntegerArrayLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.util.Arrays; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/IntegerLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/IntegerLogEntry.java similarity index 98% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/IntegerLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/IntegerLogEntry.java index 25f491cc03..0b807e70e9 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/IntegerLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/IntegerLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** Log integer values. */ public class IntegerLogEntry extends DataLogEntry { diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/ProtobufLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/ProtobufLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/ProtobufLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/ProtobufLogEntry.java index 9108e56bbf..f91cc47bf4 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/ProtobufLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/ProtobufLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import edu.wpi.first.util.protobuf.Protobuf; import edu.wpi.first.util.protobuf.ProtobufBuffer; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/RawLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/RawLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/RawLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/RawLogEntry.java index 9ab59e9659..b2a29b9b27 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/RawLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/RawLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.nio.ByteBuffer; import java.util.Arrays; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StringArrayLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/StringArrayLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/StringArrayLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/StringArrayLogEntry.java index 0218502fc0..f93603833c 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StringArrayLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/StringArrayLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import java.util.Arrays; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StringLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/StringLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/StringLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/StringLogEntry.java index 523abd6646..367c0c8986 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StringLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/StringLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; /** Log string values. */ public class StringLogEntry extends DataLogEntry { diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StructArrayLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/StructArrayLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/StructArrayLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/StructArrayLogEntry.java index 43d69b10f1..1fcd6f05d1 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StructArrayLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/StructArrayLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import edu.wpi.first.util.struct.Struct; import edu.wpi.first.util.struct.StructBuffer; diff --git a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StructLogEntry.java b/datalog/src/main/java/edu/wpi/first/datalog/StructLogEntry.java similarity index 99% rename from wpiutil/src/main/java/edu/wpi/first/util/datalog/StructLogEntry.java rename to datalog/src/main/java/edu/wpi/first/datalog/StructLogEntry.java index c7bdf0a858..1d0351e7fc 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/datalog/StructLogEntry.java +++ b/datalog/src/main/java/edu/wpi/first/datalog/StructLogEntry.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import edu.wpi.first.util.struct.Struct; import edu.wpi.first.util.struct.StructBuffer; diff --git a/wpiutil/src/main/native/cpp/DataLog.cpp b/datalog/src/main/native/cpp/DataLog.cpp similarity index 99% rename from wpiutil/src/main/native/cpp/DataLog.cpp rename to datalog/src/main/native/cpp/DataLog.cpp index 16e66187f8..021ac6b8d4 100644 --- a/wpiutil/src/main/native/cpp/DataLog.cpp +++ b/datalog/src/main/native/cpp/DataLog.cpp @@ -2,8 +2,6 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -#include "wpi/DataLog.h" - #include #include #include @@ -13,11 +11,13 @@ #include #include -#include "wpi/Endian.h" -#include "wpi/Logger.h" -#include "wpi/SmallString.h" -#include "wpi/print.h" -#include "wpi/timestamp.h" +#include +#include +#include +#include +#include + +#include "wpi/datalog/DataLog.h" using namespace wpi::log; diff --git a/wpiutil/src/main/native/cpp/DataLogBackgroundWriter.cpp b/datalog/src/main/native/cpp/DataLogBackgroundWriter.cpp similarity index 99% rename from wpiutil/src/main/native/cpp/DataLogBackgroundWriter.cpp rename to datalog/src/main/native/cpp/DataLogBackgroundWriter.cpp index c8028af128..f5f5c991ad 100644 --- a/wpiutil/src/main/native/cpp/DataLogBackgroundWriter.cpp +++ b/datalog/src/main/native/cpp/DataLogBackgroundWriter.cpp @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -#include "wpi/DataLogBackgroundWriter.h" +#include "wpi/datalog/DataLogBackgroundWriter.h" #ifndef _WIN32 #include diff --git a/wpiutil/src/main/native/cpp/DataLogReader.cpp b/datalog/src/main/native/cpp/DataLogReader.cpp similarity index 98% rename from wpiutil/src/main/native/cpp/DataLogReader.cpp rename to datalog/src/main/native/cpp/DataLogReader.cpp index 7eb88a6518..d9ddc229bf 100644 --- a/wpiutil/src/main/native/cpp/DataLogReader.cpp +++ b/datalog/src/main/native/cpp/DataLogReader.cpp @@ -2,13 +2,13 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -#include "wpi/DataLogReader.h" - #include #include -#include "wpi/DataLog.h" -#include "wpi/Endian.h" +#include + +#include "wpi/datalog/DataLog.h" +#include "wpi/datalog/DataLogReader.h" using namespace wpi::log; diff --git a/glass/src/lib/native/cpp/support/DataLogReaderThread.cpp b/datalog/src/main/native/cpp/DataLogReaderThread.cpp similarity index 98% rename from glass/src/lib/native/cpp/support/DataLogReaderThread.cpp rename to datalog/src/main/native/cpp/DataLogReaderThread.cpp index c4336f6556..830bb6344d 100644 --- a/glass/src/lib/native/cpp/support/DataLogReaderThread.cpp +++ b/datalog/src/main/native/cpp/DataLogReaderThread.cpp @@ -2,15 +2,15 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -#include "glass/support/DataLogReaderThread.h" - #include #include #include #include -using namespace glass; +#include "wpi/datalog/DataLogReaderThread.h" + +using namespace wpi::log; DataLogReaderThread::~DataLogReaderThread() { if (m_thread.joinable()) { diff --git a/wpiutil/src/main/native/cpp/DataLogWriter.cpp b/datalog/src/main/native/cpp/DataLogWriter.cpp similarity index 97% rename from wpiutil/src/main/native/cpp/DataLogWriter.cpp rename to datalog/src/main/native/cpp/DataLogWriter.cpp index b33266f75b..121c0e92f4 100644 --- a/wpiutil/src/main/native/cpp/DataLogWriter.cpp +++ b/datalog/src/main/native/cpp/DataLogWriter.cpp @@ -2,13 +2,13 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -#include "wpi/DataLogWriter.h" - #include #include #include -#include "wpi/raw_ostream.h" +#include + +#include "wpi/datalog/DataLogWriter.h" using namespace wpi::log; diff --git a/wpiutil/src/main/native/cpp/FileLogger.cpp b/datalog/src/main/native/cpp/FileLogger.cpp similarity index 96% rename from wpiutil/src/main/native/cpp/FileLogger.cpp rename to datalog/src/main/native/cpp/FileLogger.cpp index 70ee9f95ec..29643dc3b1 100644 --- a/wpiutil/src/main/native/cpp/FileLogger.cpp +++ b/datalog/src/main/native/cpp/FileLogger.cpp @@ -2,8 +2,6 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -#include "wpi/FileLogger.h" - #ifdef __linux__ #include #include @@ -18,10 +16,11 @@ #include #include +#include -#include "wpi/StringExtras.h" +#include "wpi/datalog/FileLogger.h" -namespace wpi { +namespace wpi::log { FileLogger::FileLogger(std::string_view file, std::function callback) #ifdef __linux__ @@ -101,4 +100,4 @@ std::function FileLogger::Buffer( buf.append(leftover.begin(), leftover.end()); }; } -} // namespace wpi +} // namespace wpi::log diff --git a/wpiutil/src/main/native/cpp/jni/DataLogJNI.cpp b/datalog/src/main/native/cpp/jni/DataLogJNI.cpp similarity index 70% rename from wpiutil/src/main/native/cpp/jni/DataLogJNI.cpp rename to datalog/src/main/native/cpp/jni/DataLogJNI.cpp index 782266874d..2cc965e177 100644 --- a/wpiutil/src/main/native/cpp/jni/DataLogJNI.cpp +++ b/datalog/src/main/native/cpp/jni/DataLogJNI.cpp @@ -2,6 +2,8 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. +#include "DataLogJNI.h" + #include #include @@ -9,17 +11,47 @@ #include #include +#include -#include "WPIUtilJNI.h" -#include "edu_wpi_first_util_datalog_DataLogJNI.h" -#include "wpi/DataLog.h" -#include "wpi/DataLogBackgroundWriter.h" -#include "wpi/DataLogWriter.h" -#include "wpi/jni_util.h" +#include "edu_wpi_first_datalog_DataLogJNI.h" +#include "wpi/datalog/DataLog.h" +#include "wpi/datalog/DataLogBackgroundWriter.h" +#include "wpi/datalog/DataLogWriter.h" +#include "wpi/datalog/FileLogger.h" using namespace wpi::java; using namespace wpi::log; +static bool mockTimeEnabled = false; +static uint64_t mockNow = 0; + +static JException illegalArgEx; +static JException indexOobEx; +static JException ioEx; +static JException nullPointerEx; + +static const JExceptionInit exceptions[] = { + {"java/lang/IllegalArgumentException", &illegalArgEx}, + {"java/lang/IndexOutOfBoundsException", &indexOobEx}, + {"java/io/IOException", &ioEx}, + {"java/lang/NullPointerException", &nullPointerEx}}; + +void wpi::ThrowIllegalArgumentException(JNIEnv* env, std::string_view msg) { + illegalArgEx.Throw(env, msg); +} + +void wpi::ThrowIndexOobException(JNIEnv* env, std::string_view msg) { + indexOobEx.Throw(env, msg); +} + +void wpi::ThrowIOException(JNIEnv* env, std::string_view msg) { + ioEx.Throw(env, msg); +} + +void wpi::ThrowNullPointerException(JNIEnv* env, std::string_view msg) { + nullPointerEx.Throw(env, msg); +} + namespace { class buf_ostream : public wpi::raw_uvector_ostream { private: @@ -34,13 +66,40 @@ class buf_ostream : public wpi::raw_uvector_ostream { extern "C" { +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { + return JNI_ERR; + } + + for (auto& c : exceptions) { + *c.cls = JException(env, c.name); + if (!*c.cls) { + return JNI_ERR; + } + } + + return JNI_VERSION_1_6; +} + +JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) { + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { + return; + } + + for (auto& c : exceptions) { + c.cls->free(env); + } +} + /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: bgCreate * Signature: (Ljava/lang/String;Ljava/lang/String;DLjava/lang/String;)J */ JNIEXPORT jlong JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_bgCreate +Java_edu_wpi_first_datalog_DataLogJNI_bgCreate (JNIEnv* env, jclass, jstring dir, jstring filename, jdouble period, jstring extraHeader) { @@ -62,12 +121,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_bgCreate } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: bgSetFilename * Signature: (JLjava/lang/String;)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_bgSetFilename +Java_edu_wpi_first_datalog_DataLogJNI_bgSetFilename (JNIEnv* env, jclass, jlong impl, jstring filename) { if (impl == 0) { @@ -83,12 +142,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_bgSetFilename } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: fgCreate * Signature: (Ljava/lang/String;Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_fgCreate +Java_edu_wpi_first_datalog_DataLogJNI_fgCreate (JNIEnv* env, jclass, jstring filename, jstring extraHeader) { if (!filename) { @@ -111,12 +170,28 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_fgCreate } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_util_WPIUtilJNI + * Method: now + * Signature: ()J + */ +JNIEXPORT jlong JNICALL +Java_edu_wpi_first_util_WPIUtilJNI_now + (JNIEnv*, jclass) +{ + if (mockTimeEnabled) { + return mockNow; + } else { + return wpi::Now(); + } +} + +/* + * Class: edu_wpi_first_datalog_DataLogJNI * Method: fgCreateMemory * Signature: (Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_fgCreateMemory +Java_edu_wpi_first_datalog_DataLogJNI_fgCreateMemory (JNIEnv* env, jclass, jstring extraHeader) { if (!extraHeader) { @@ -129,12 +204,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_fgCreateMemory } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: flush * Signature: (J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_flush +Java_edu_wpi_first_datalog_DataLogJNI_flush (JNIEnv* env, jclass, jlong impl) { if (impl == 0) { @@ -145,12 +220,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_flush } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: copyWriteBuffer * Signature: (J[BI)I */ JNIEXPORT jint JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_copyWriteBuffer +Java_edu_wpi_first_datalog_DataLogJNI_copyWriteBuffer (JNIEnv* env, jclass, jlong impl, jbyteArray buf, jint start) { if (impl == 0) { @@ -172,12 +247,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_copyWriteBuffer } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: pause * Signature: (J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_pause +Java_edu_wpi_first_datalog_DataLogJNI_pause (JNIEnv* env, jclass, jlong impl) { if (impl == 0) { @@ -188,12 +263,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_pause } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: resume * Signature: (J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_resume +Java_edu_wpi_first_datalog_DataLogJNI_resume (JNIEnv* env, jclass, jlong impl) { if (impl == 0) { @@ -204,12 +279,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_resume } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: stop * Signature: (J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_stop +Java_edu_wpi_first_datalog_DataLogJNI_stop (JNIEnv* env, jclass, jlong impl) { if (impl == 0) { @@ -220,12 +295,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_stop } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: addSchema * Signature: (JLjava/lang/String;Ljava/lang/String;[BJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_addSchema +Java_edu_wpi_first_datalog_DataLogJNI_addSchema (JNIEnv* env, jclass, jlong impl, jstring name, jstring type, jbyteArray schema, jlong timestamp) { @@ -239,12 +314,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_addSchema } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: addSchemaString * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_addSchemaString +Java_edu_wpi_first_datalog_DataLogJNI_addSchemaString (JNIEnv* env, jclass, jlong impl, jstring name, jstring type, jstring schema, jlong timestamp) { @@ -261,12 +336,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_addSchemaString } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: start * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)I */ JNIEXPORT jint JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_start +Java_edu_wpi_first_datalog_DataLogJNI_start (JNIEnv* env, jclass, jlong impl, jstring name, jstring type, jstring metadata, jlong timestamp) { @@ -280,12 +355,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_start } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: finish * Signature: (JIJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_finish +Java_edu_wpi_first_datalog_DataLogJNI_finish (JNIEnv* env, jclass, jlong impl, jint entry, jlong timestamp) { if (impl == 0) { @@ -296,12 +371,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_finish } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: setMetadata * Signature: (JILjava/lang/String;J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_setMetadata +Java_edu_wpi_first_datalog_DataLogJNI_setMetadata (JNIEnv* env, jclass, jlong impl, jint entry, jstring metadata, jlong timestamp) { @@ -314,24 +389,24 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_setMetadata } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: close * Signature: (J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_close +Java_edu_wpi_first_datalog_DataLogJNI_close (JNIEnv*, jclass, jlong impl) { delete reinterpret_cast(impl); } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendRaw * Signature: (JI[BIIJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendRaw +Java_edu_wpi_first_datalog_DataLogJNI_appendRaw (JNIEnv* env, jclass, jlong impl, jint entry, jbyteArray value, jint start, jint length, jlong timestamp) { @@ -362,12 +437,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendRaw } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendRawBuffer * Signature: (JILjava/lang/Object;IIJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendRawBuffer +Java_edu_wpi_first_datalog_DataLogJNI_appendRawBuffer (JNIEnv* env, jclass, jlong impl, jint entry, jobject value, jint start, jint length, jlong timestamp) { @@ -398,12 +473,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendRawBuffer } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendBoolean * Signature: (JIZJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendBoolean +Java_edu_wpi_first_datalog_DataLogJNI_appendBoolean (JNIEnv* env, jclass, jlong impl, jint entry, jboolean value, jlong timestamp) { if (impl == 0) { @@ -414,12 +489,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendBoolean } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendInteger * Signature: (JIJJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendInteger +Java_edu_wpi_first_datalog_DataLogJNI_appendInteger (JNIEnv* env, jclass, jlong impl, jint entry, jlong value, jlong timestamp) { if (impl == 0) { @@ -430,12 +505,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendInteger } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendFloat * Signature: (JIFJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloat +Java_edu_wpi_first_datalog_DataLogJNI_appendFloat (JNIEnv* env, jclass, jlong impl, jint entry, jfloat value, jlong timestamp) { if (impl == 0) { @@ -446,12 +521,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloat } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendDouble * Signature: (JIDJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendDouble +Java_edu_wpi_first_datalog_DataLogJNI_appendDouble (JNIEnv* env, jclass, jlong impl, jint entry, jdouble value, jlong timestamp) { if (impl == 0) { @@ -462,12 +537,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendDouble } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendString * Signature: (JILjava/lang/String;J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendString +Java_edu_wpi_first_datalog_DataLogJNI_appendString (JNIEnv* env, jclass, jlong impl, jint entry, jstring value, jlong timestamp) { if (impl == 0) { @@ -479,12 +554,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendString } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendBooleanArray * Signature: (JI[ZJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendBooleanArray +Java_edu_wpi_first_datalog_DataLogJNI_appendBooleanArray (JNIEnv* env, jclass, jlong impl, jint entry, jbooleanArray value, jlong timestamp) { @@ -501,12 +576,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendBooleanArray } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendIntegerArray * Signature: (JI[JJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendIntegerArray +Java_edu_wpi_first_datalog_DataLogJNI_appendIntegerArray (JNIEnv* env, jclass, jlong impl, jint entry, jlongArray value, jlong timestamp) { @@ -534,12 +609,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendIntegerArray } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendFloatArray * Signature: (JI[FJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloatArray +Java_edu_wpi_first_datalog_DataLogJNI_appendFloatArray (JNIEnv* env, jclass, jlong impl, jint entry, jfloatArray value, jlong timestamp) { @@ -556,12 +631,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloatArray } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendDoubleArray * Signature: (JI[DJ)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendDoubleArray +Java_edu_wpi_first_datalog_DataLogJNI_appendDoubleArray (JNIEnv* env, jclass, jlong impl, jint entry, jdoubleArray value, jlong timestamp) { @@ -578,12 +653,12 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendDoubleArray } /* - * Class: edu_wpi_first_util_datalog_DataLogJNI + * Class: edu_wpi_first_datalog_DataLogJNI * Method: appendStringArray * Signature: (JI[Ljava/lang/Object;J)V */ JNIEXPORT void JNICALL -Java_edu_wpi_first_util_datalog_DataLogJNI_appendStringArray +Java_edu_wpi_first_datalog_DataLogJNI_appendStringArray (JNIEnv* env, jclass, jlong impl, jint entry, jobjectArray value, jlong timestamp) { @@ -610,5 +685,41 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendStringArray } reinterpret_cast(impl)->AppendStringArray(entry, arr, timestamp); } +/* + * Class: edu_wpi_first_datalog_DataLogJNI + * Method: createFileLogger + * Signature: (Ljava/lang/String;JLjava/lang/String;)J + */ +JNIEXPORT jlong JNICALL +Java_edu_wpi_first_datalog_DataLogJNI_createFileLogger + (JNIEnv* env, jclass, jstring file, jlong log, jstring key) +{ + if (!file) { + wpi::ThrowNullPointerException(env, "file is null"); + return 0; + } + auto* f = reinterpret_cast(log); + if (!f) { + wpi::ThrowNullPointerException(env, "log is null"); + return 0; + } + if (!key) { + wpi::ThrowNullPointerException(env, "key is null"); + return 0; + } + return reinterpret_cast(new wpi::log::FileLogger{ + JStringRef{env, file}, *f, JStringRef{env, key}}); +} +/* + * Class: edu_wpi_first_datalog_DataLogJNI + * Method: freeFileLogger + * Signature: (J)V + */ +JNIEXPORT void JNICALL +Java_edu_wpi_first_datalog_DataLogJNI_freeFileLogger + (JNIEnv* env, jclass, jlong fileTail) +{ + delete reinterpret_cast(fileTail); +} } // extern "C" diff --git a/datalog/src/main/native/cpp/jni/DataLogJNI.h b/datalog/src/main/native/cpp/jni/DataLogJNI.h new file mode 100644 index 0000000000..4d08fdbf8b --- /dev/null +++ b/datalog/src/main/native/cpp/jni/DataLogJNI.h @@ -0,0 +1,18 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#pragma once + +#include + +#include + +namespace wpi { + +void ThrowIllegalArgumentException(JNIEnv* env, std::string_view msg); +void ThrowIndexOobException(JNIEnv* env, std::string_view msg); +void ThrowIOException(JNIEnv* env, std::string_view msg); +void ThrowNullPointerException(JNIEnv* env, std::string_view msg); + +} // namespace wpi diff --git a/wpiutil/src/main/native/include/wpi/DataLog.h b/datalog/src/main/native/include/wpi/datalog/DataLog.h similarity index 99% rename from wpiutil/src/main/native/include/wpi/DataLog.h rename to datalog/src/main/native/include/wpi/datalog/DataLog.h index 50c3aed8f1..166572b2f1 100644 --- a/wpiutil/src/main/native/include/wpi/DataLog.h +++ b/datalog/src/main/native/include/wpi/datalog/DataLog.h @@ -19,15 +19,16 @@ #include #include -#include "wpi/DataLog_c.h" -#include "wpi/DenseMap.h" -#include "wpi/SmallVector.h" -#include "wpi/StringMap.h" -#include "wpi/mutex.h" -#include "wpi/protobuf/Protobuf.h" -#include "wpi/string.h" -#include "wpi/struct/Struct.h" -#include "wpi/timestamp.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wpi/datalog/DataLog_c.h" namespace wpi { class Logger; diff --git a/wpiutil/src/main/native/include/wpi/DataLogBackgroundWriter.h b/datalog/src/main/native/include/wpi/datalog/DataLogBackgroundWriter.h similarity index 98% rename from wpiutil/src/main/native/include/wpi/DataLogBackgroundWriter.h rename to datalog/src/main/native/include/wpi/datalog/DataLogBackgroundWriter.h index 7926299ca1..4ec6302329 100644 --- a/wpiutil/src/main/native/include/wpi/DataLogBackgroundWriter.h +++ b/datalog/src/main/native/include/wpi/datalog/DataLogBackgroundWriter.h @@ -12,9 +12,10 @@ #include #include -#include "wpi/DataLog.h" -#include "wpi/condition_variable.h" -#include "wpi/mutex.h" +#include +#include + +#include "wpi/datalog/DataLog.h" namespace wpi { class Logger; diff --git a/wpiutil/src/main/native/include/wpi/DataLogReader.h b/datalog/src/main/native/include/wpi/datalog/DataLogReader.h similarity index 99% rename from wpiutil/src/main/native/include/wpi/DataLogReader.h rename to datalog/src/main/native/include/wpi/datalog/DataLogReader.h index cb9a8cb8ff..2a22725c7c 100644 --- a/wpiutil/src/main/native/include/wpi/DataLogReader.h +++ b/datalog/src/main/native/include/wpi/datalog/DataLogReader.h @@ -12,7 +12,7 @@ #include #include -#include "wpi/MemoryBuffer.h" +#include namespace wpi::log { diff --git a/glass/src/lib/native/include/glass/support/DataLogReaderThread.h b/datalog/src/main/native/include/wpi/datalog/DataLogReaderThread.h similarity index 97% rename from glass/src/lib/native/include/glass/support/DataLogReaderThread.h rename to datalog/src/main/native/include/wpi/datalog/DataLogReaderThread.h index 2cfb89e39b..349b7001ae 100644 --- a/glass/src/lib/native/include/glass/support/DataLogReaderThread.h +++ b/datalog/src/main/native/include/wpi/datalog/DataLogReaderThread.h @@ -13,17 +13,18 @@ #include #include -#include #include #include #include #include +#include "wpi/datalog/DataLogReader.h" + #ifndef NO_PROTOBUF #include #endif -namespace glass { +namespace wpi::log { class DataLogReaderRange { public: @@ -105,4 +106,4 @@ class DataLogReaderThread { std::thread m_thread; }; -} // namespace glass +} // namespace wpi::log diff --git a/wpiutil/src/main/native/include/wpi/DataLogWriter.h b/datalog/src/main/native/include/wpi/datalog/DataLogWriter.h similarity index 98% rename from wpiutil/src/main/native/include/wpi/DataLogWriter.h rename to datalog/src/main/native/include/wpi/datalog/DataLogWriter.h index f69c7b5b25..7da1d89d9f 100644 --- a/wpiutil/src/main/native/include/wpi/DataLogWriter.h +++ b/datalog/src/main/native/include/wpi/datalog/DataLogWriter.h @@ -8,7 +8,7 @@ #include #include -#include "wpi/DataLog.h" +#include "wpi/datalog/DataLog.h" namespace wpi { class raw_ostream; diff --git a/wpiutil/src/main/native/include/wpi/DataLog_c.h b/datalog/src/main/native/include/wpi/datalog/DataLog_c.h similarity index 99% rename from wpiutil/src/main/native/include/wpi/DataLog_c.h rename to datalog/src/main/native/include/wpi/datalog/DataLog_c.h index 654181a843..21e66c6c43 100644 --- a/wpiutil/src/main/native/include/wpi/DataLog_c.h +++ b/datalog/src/main/native/include/wpi/datalog/DataLog_c.h @@ -7,6 +7,7 @@ #include // NOLINT #include + #include #ifdef __cplusplus diff --git a/wpiutil/src/main/native/include/wpi/FileLogger.h b/datalog/src/main/native/include/wpi/datalog/FileLogger.h similarity index 95% rename from wpiutil/src/main/native/include/wpi/FileLogger.h rename to datalog/src/main/native/include/wpi/datalog/FileLogger.h index c04cf5b7ed..30a2a41ca6 100644 --- a/wpiutil/src/main/native/include/wpi/FileLogger.h +++ b/datalog/src/main/native/include/wpi/datalog/FileLogger.h @@ -8,9 +8,9 @@ #include #include -#include "wpi/DataLog.h" +#include "wpi/datalog/DataLog.h" -namespace wpi { +namespace wpi::log { /** * A class version of `tail -f`, otherwise known as `tail -f` at home. Watches * a file and puts the data somewhere else. Only works on Linux-based platforms. @@ -58,4 +58,4 @@ class FileLogger { std::thread m_thread; #endif }; -} // namespace wpi +} // namespace wpi::log diff --git a/wpiutil/src/printlog/java/printlog/PrintLog.java b/datalog/src/printlog/java/printlog/PrintLog.java similarity index 98% rename from wpiutil/src/printlog/java/printlog/PrintLog.java rename to datalog/src/printlog/java/printlog/PrintLog.java index c0074df0b7..739e5ec187 100644 --- a/wpiutil/src/printlog/java/printlog/PrintLog.java +++ b/datalog/src/printlog/java/printlog/PrintLog.java @@ -4,8 +4,8 @@ package printlog; -import edu.wpi.first.util.datalog.DataLogReader; -import edu.wpi.first.util.datalog.DataLogRecord; +import edu.wpi.first.datalog.DataLogReader; +import edu.wpi.first.datalog.DataLogRecord; import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneOffset; diff --git a/wpiutil/src/test/java/edu/wpi/first/util/datalog/DataLogTest.java b/datalog/src/test/java/edu/wpi/first/datalog/DataLogTest.java similarity index 99% rename from wpiutil/src/test/java/edu/wpi/first/util/datalog/DataLogTest.java rename to datalog/src/test/java/edu/wpi/first/datalog/DataLogTest.java index b6d140bfbd..217bb7d409 100644 --- a/wpiutil/src/test/java/edu/wpi/first/util/datalog/DataLogTest.java +++ b/datalog/src/test/java/edu/wpi/first/datalog/DataLogTest.java @@ -2,7 +2,7 @@ // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. -package edu.wpi.first.util.datalog; +package edu.wpi.first.datalog; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/wpiutil/src/test/native/cpp/DataLogTest.cpp b/datalog/src/test/native/cpp/DataLogTest.cpp similarity index 99% rename from wpiutil/src/test/native/cpp/DataLogTest.cpp rename to datalog/src/test/native/cpp/DataLogTest.cpp index 149d3a36b7..d52a5a8e94 100644 --- a/wpiutil/src/test/native/cpp/DataLogTest.cpp +++ b/datalog/src/test/native/cpp/DataLogTest.cpp @@ -8,10 +8,10 @@ #include #include +#include +#include -#include "wpi/DataLogWriter.h" -#include "wpi/Logger.h" -#include "wpi/raw_ostream.h" +#include "wpi/datalog/DataLogWriter.h" namespace { struct ThingA { diff --git a/wpiutil/src/test/native/cpp/FileLoggerTest.cpp b/datalog/src/test/native/cpp/FileLoggerTest.cpp similarity index 85% rename from wpiutil/src/test/native/cpp/FileLoggerTest.cpp rename to datalog/src/test/native/cpp/FileLoggerTest.cpp index f402ef583d..633a086c98 100644 --- a/wpiutil/src/test/native/cpp/FileLoggerTest.cpp +++ b/datalog/src/test/native/cpp/FileLoggerTest.cpp @@ -8,11 +8,11 @@ #include -#include "wpi/FileLogger.h" +#include "wpi/datalog/FileLogger.h" TEST(FileLoggerTest, BufferSingleLine) { std::vector buf; - auto func = wpi::FileLogger::Buffer( + auto func = wpi::log::FileLogger::Buffer( [&buf](std::string_view line) { buf.emplace_back(line); }); func("qwertyuiop\n"); EXPECT_EQ("qwertyuiop", buf[0]); @@ -20,7 +20,7 @@ TEST(FileLoggerTest, BufferSingleLine) { TEST(FileLoggerTest, BufferMultiLine) { std::vector buf; - auto func = wpi::FileLogger::Buffer( + auto func = wpi::log::FileLogger::Buffer( [&buf](std::string_view line) { buf.emplace_back(line); }); func("line 1\nline 2\nline 3\n"); EXPECT_EQ("line 1\nline 2\nline 3", buf[0]); @@ -28,7 +28,7 @@ TEST(FileLoggerTest, BufferMultiLine) { TEST(FileLoggerTest, BufferPartials) { std::vector buf; - auto func = wpi::FileLogger::Buffer( + auto func = wpi::log::FileLogger::Buffer( [&buf](std::string_view line) { buf.emplace_back(line); }); func("part 1"); func("part 2\npart 3"); @@ -39,7 +39,7 @@ TEST(FileLoggerTest, BufferPartials) { TEST(FileLoggerTest, BufferMultiplePartials) { std::vector buf; - auto func = wpi::FileLogger::Buffer( + auto func = wpi::log::FileLogger::Buffer( [&buf](std::string_view line) { buf.emplace_back(line); }); func("part 1"); func("part 2"); @@ -49,7 +49,7 @@ TEST(FileLoggerTest, BufferMultiplePartials) { } TEST(FileLoggerTest, BufferMultipleMultiLinePartials) { std::vector buf; - auto func = wpi::FileLogger::Buffer( + auto func = wpi::log::FileLogger::Buffer( [&buf](std::string_view line) { buf.emplace_back(line); }); func("part 1"); func("part 2\npart 3"); diff --git a/datalog/src/test/native/cpp/main.cpp b/datalog/src/test/native/cpp/main.cpp new file mode 100644 index 0000000000..e993c1f14e --- /dev/null +++ b/datalog/src/test/native/cpp/main.cpp @@ -0,0 +1,11 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#include + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + int ret = RUN_ALL_TESTS(); + return ret; +} diff --git a/datalogtool/CMakeLists.txt b/datalogtool/CMakeLists.txt index ba9475d2eb..0c74557c57 100644 --- a/datalogtool/CMakeLists.txt +++ b/datalogtool/CMakeLists.txt @@ -25,7 +25,7 @@ add_executable( ${APP_ICON_MACOSX} ) wpilib_link_macos_gui(datalogtool) -target_link_libraries(datalogtool libglass ssh) +target_link_libraries(datalogtool libglass ssh datalog wpiutil) if(WIN32) set_target_properties(datalogtool PROPERTIES WIN32_EXECUTABLE YES) diff --git a/datalogtool/build.gradle b/datalogtool/build.gradle index 418dd60294..1cea1ef5ea 100644 --- a/datalogtool/build.gradle +++ b/datalogtool/build.gradle @@ -99,9 +99,10 @@ model { } it.cppCompiler.define("LIBSSH_STATIC") lib project: ':glass', library: 'glass', linkage: 'static' - lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' lib project: ':wpigui', library: 'wpigui', linkage: 'static' + lib project: ':datalog', library: 'datalog', linkage: 'static' lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static' + lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' nativeUtils.useRequiredLibrary(it, 'libssh') if (it.targetPlatform.operatingSystem.isWindows()) { it.linker.args << 'Gdi32.lib' << 'Shell32.lib' << 'd3d11.lib' << 'd3dcompiler.lib' diff --git a/datalogtool/src/main/native/cpp/Exporter.cpp b/datalogtool/src/main/native/cpp/Exporter.cpp index 149b671830..2cf399b71c 100644 --- a/datalogtool/src/main/native/cpp/Exporter.cpp +++ b/datalogtool/src/main/native/cpp/Exporter.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +40,7 @@ namespace { struct InputFile { - explicit InputFile(std::unique_ptr datalog); + explicit InputFile(std::unique_ptr datalog); InputFile(std::string_view filename, std::string_view status) : filename{filename}, @@ -51,7 +51,7 @@ struct InputFile { std::string filename; std::string stem; - std::unique_ptr datalog; + std::unique_ptr datalog; std::string status; bool highlight = false; }; @@ -140,7 +140,7 @@ static void RebuildEntryTree() { } } -InputFile::InputFile(std::unique_ptr datalog_) +InputFile::InputFile(std::unique_ptr datalog_) : filename{datalog_->GetBufferIdentifier()}, stem{fs::path{filename}.stem().string()}, datalog{std::move(datalog_)} { @@ -196,7 +196,7 @@ static std::unique_ptr LoadDataLog(std::string_view filename) { } return std::make_unique( - std::make_unique(std::move(reader))); + std::make_unique(std::move(reader))); } void DisplayInputFiles() { diff --git a/epilogue-runtime/BUILD.bazel b/epilogue-runtime/BUILD.bazel index 6e02a5dfcb..0fe3a4f6df 100644 --- a/epilogue-runtime/BUILD.bazel +++ b/epilogue-runtime/BUILD.bazel @@ -6,6 +6,7 @@ java_library( srcs = glob(["src/main/java/**/*.java"]), visibility = ["//visibility:public"], deps = [ + "//datalog:datalog-java", "//ntcore:networktables-java", "//wpiunits", "//wpiutil:wpiutil-java", diff --git a/epilogue-runtime/build.gradle b/epilogue-runtime/build.gradle index fb96095a0a..ffcf6c096f 100644 --- a/epilogue-runtime/build.gradle +++ b/epilogue-runtime/build.gradle @@ -13,4 +13,5 @@ dependencies { api(project(':ntcore')) api(project(':wpiutil')) api(project(':wpiunits')) + api(project(':datalog')) } diff --git a/epilogue-runtime/src/main/java/edu/wpi/first/epilogue/logging/FileBackend.java b/epilogue-runtime/src/main/java/edu/wpi/first/epilogue/logging/FileBackend.java index 2b5b6b2071..b9fbbb95dc 100644 --- a/epilogue-runtime/src/main/java/edu/wpi/first/epilogue/logging/FileBackend.java +++ b/epilogue-runtime/src/main/java/edu/wpi/first/epilogue/logging/FileBackend.java @@ -6,21 +6,21 @@ package edu.wpi.first.epilogue.logging; import static edu.wpi.first.util.ErrorMessages.requireNonNullParam; -import edu.wpi.first.util.datalog.BooleanArrayLogEntry; -import edu.wpi.first.util.datalog.BooleanLogEntry; -import edu.wpi.first.util.datalog.DataLog; -import edu.wpi.first.util.datalog.DataLogEntry; -import edu.wpi.first.util.datalog.DoubleArrayLogEntry; -import edu.wpi.first.util.datalog.DoubleLogEntry; -import edu.wpi.first.util.datalog.FloatArrayLogEntry; -import edu.wpi.first.util.datalog.FloatLogEntry; -import edu.wpi.first.util.datalog.IntegerArrayLogEntry; -import edu.wpi.first.util.datalog.IntegerLogEntry; -import edu.wpi.first.util.datalog.RawLogEntry; -import edu.wpi.first.util.datalog.StringArrayLogEntry; -import edu.wpi.first.util.datalog.StringLogEntry; -import edu.wpi.first.util.datalog.StructArrayLogEntry; -import edu.wpi.first.util.datalog.StructLogEntry; +import edu.wpi.first.datalog.BooleanArrayLogEntry; +import edu.wpi.first.datalog.BooleanLogEntry; +import edu.wpi.first.datalog.DataLog; +import edu.wpi.first.datalog.DataLogEntry; +import edu.wpi.first.datalog.DoubleArrayLogEntry; +import edu.wpi.first.datalog.DoubleLogEntry; +import edu.wpi.first.datalog.FloatArrayLogEntry; +import edu.wpi.first.datalog.FloatLogEntry; +import edu.wpi.first.datalog.IntegerArrayLogEntry; +import edu.wpi.first.datalog.IntegerLogEntry; +import edu.wpi.first.datalog.RawLogEntry; +import edu.wpi.first.datalog.StringArrayLogEntry; +import edu.wpi.first.datalog.StringLogEntry; +import edu.wpi.first.datalog.StructArrayLogEntry; +import edu.wpi.first.datalog.StructLogEntry; import edu.wpi.first.util.struct.Struct; import java.util.HashMap; import java.util.Map; diff --git a/glass/build.gradle b/glass/build.gradle index 354036dec7..4ef5686b49 100644 --- a/glass/build.gradle +++ b/glass/build.gradle @@ -93,11 +93,12 @@ model { it.buildable = false return } - lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared' + lib project: ':wpimath', library: 'wpimath', linkage: 'shared' lib project: ':wpigui', library: 'wpigui', linkage: 'static' lib project: ':fieldImages', library: 'fieldImages', linkage: 'shared' lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static' + lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared' } appendDebugPathToBinaries(binaries) } @@ -123,11 +124,11 @@ model { lib library: nativeName, linkage: 'static' project(':ntcore').addNtcoreDependency(it, 'shared') lib project: ':wpinet', library: 'wpinet', linkage: 'shared' - lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared' lib project: ':wpimath', library: 'wpimath', linkage: 'shared' lib project: ':wpigui', library: 'wpigui', linkage: 'static' lib project: ':fieldImages', library: 'fieldImages', linkage: 'shared' lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static' + lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared' } appendDebugPathToBinaries(binaries) } @@ -162,12 +163,12 @@ model { lib library: nativeName, linkage: 'static' project(':ntcore').addNtcoreDependency(it, 'static') lib project: ':wpinet', library: 'wpinet', linkage: 'static' - lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' lib project: ':wpimath', library: 'wpimath', linkage: 'static' lib project: ':wpigui', library: 'wpigui', linkage: 'static' lib project: ':fieldImages', library: 'fieldImages', linkage: 'static' nativeUtils.useRequiredLibrary(it, 'opencv_static') lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static' + lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' if (it.targetPlatform.operatingSystem.isWindows()) { it.linker.args << 'Gdi32.lib' << 'Shell32.lib' << 'd3d11.lib' << 'd3dcompiler.lib' it.linker.args << '/DELAYLOAD:MF.dll' << '/DELAYLOAD:MFReadWrite.dll' << '/DELAYLOAD:MFPlat.dll' << '/delay:nobind' diff --git a/ntcore/BUILD.bazel b/ntcore/BUILD.bazel index 9b020297c5..4147b8ef81 100644 --- a/ntcore/BUILD.bazel +++ b/ntcore/BUILD.bazel @@ -47,6 +47,7 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":generated_cc_headers", + "//datalog:datalog.static", "//wpinet:wpinet.static", "//wpiutil:wpiutil.static", ], @@ -68,6 +69,7 @@ wpilib_jni_java_library( native_libs = [":ntcorejni"], visibility = ["//visibility:public"], deps = [ + "//datalog:datalog-java", "//wpiutil:wpiutil-java", "@maven//:us_hebi_quickbuf_quickbuf_runtime", ], diff --git a/ntcore/CMakeLists.txt b/ntcore/CMakeLists.txt index f108a9133d..c248d532aa 100644 --- a/ntcore/CMakeLists.txt +++ b/ntcore/CMakeLists.txt @@ -26,7 +26,7 @@ target_include_directories( ) wpilib_target_warnings(ntcore) target_compile_features(ntcore PUBLIC cxx_std_20) -target_link_libraries(ntcore PUBLIC wpinet wpiutil) +target_link_libraries(ntcore PUBLIC wpinet wpiutil datalog) set_property(TARGET ntcore PROPERTY FOLDER "libraries") @@ -53,7 +53,7 @@ if(WITH_JAVA) add_jar( ntcore_jar ${JAVA_SOURCES} - INCLUDE_JARS wpiutil_jar ${QUICKBUF_JAR} + INCLUDE_JARS wpiutil_jar ${QUICKBUF_JAR} datalog_jar OUTPUT_NAME ntcore OUTPUT_DIR ${WPILIB_BINARY_DIR}/${java_lib_dest} GENERATE_NATIVE_HEADERS ntcore_jni_headers diff --git a/ntcore/build.gradle b/ntcore/build.gradle index 937c2d11b8..e4c3da5673 100644 --- a/ntcore/build.gradle +++ b/ntcore/build.gradle @@ -1,10 +1,12 @@ ext { addNtcoreDependency = { binary, shared-> binary.lib project: ':ntcore', library: 'ntcore', linkage: shared + binary.lib project: ':datalog', library: 'datalog', linkage: shared } addNtcoreJniDependency = { binary-> binary.lib project: ':ntcore', library: 'ntcoreJNIShared', linkage: 'shared' + binary.lib project: ':datalog', library: 'datalogJNIShared', linkage: 'shared' } nativeName = 'ntcore' @@ -34,9 +36,11 @@ model { if (it.component.name == "${nativeName}JNI") { lib project: ':wpinet', library: 'wpinet', linkage: 'static' lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' + lib project: ':datalog', library: 'datalog', linkage: 'static' } else { lib project: ':wpinet', library: 'wpinet', linkage: 'shared' lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared' + lib project: ':datalog', library: 'datalog', linkage: 'shared' } } } @@ -61,3 +65,7 @@ nativeUtils.exportsConfigs { x64SymbolFilter = symbolFilter } } + +dependencies { + api project(":datalog") +} diff --git a/ntcore/src/generate/main/java/NetworkTableInstance.java.jinja b/ntcore/src/generate/main/java/NetworkTableInstance.java.jinja index 50883074a3..28f8687cb9 100644 --- a/ntcore/src/generate/main/java/NetworkTableInstance.java.jinja +++ b/ntcore/src/generate/main/java/NetworkTableInstance.java.jinja @@ -6,9 +6,9 @@ package edu.wpi.first.networktables; +import edu.wpi.first.datalog.DataLog; import edu.wpi.first.util.WPIUtilJNI; import edu.wpi.first.util.concurrent.Event; -import edu.wpi.first.util.datalog.DataLog; import edu.wpi.first.util.protobuf.Protobuf; import edu.wpi.first.util.struct.Struct; import java.nio.charset.StandardCharsets; diff --git a/ntcore/src/generate/main/java/NetworkTablesJNI.java.jinja b/ntcore/src/generate/main/java/NetworkTablesJNI.java.jinja index c63515d3e0..06f69e292f 100644 --- a/ntcore/src/generate/main/java/NetworkTablesJNI.java.jinja +++ b/ntcore/src/generate/main/java/NetworkTablesJNI.java.jinja @@ -6,8 +6,8 @@ package edu.wpi.first.networktables; +import edu.wpi.first.datalog.DataLog; import edu.wpi.first.util.RuntimeLoader; -import edu.wpi.first.util.datalog.DataLog; import java.io.IOException; import java.nio.ByteBuffer; import java.util.EnumSet; diff --git a/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTableInstance.java b/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTableInstance.java index 5b116148f7..8f31e5d993 100644 --- a/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTableInstance.java +++ b/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTableInstance.java @@ -6,9 +6,9 @@ package edu.wpi.first.networktables; +import edu.wpi.first.datalog.DataLog; import edu.wpi.first.util.WPIUtilJNI; import edu.wpi.first.util.concurrent.Event; -import edu.wpi.first.util.datalog.DataLog; import edu.wpi.first.util.protobuf.Protobuf; import edu.wpi.first.util.struct.Struct; import java.nio.charset.StandardCharsets; diff --git a/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTablesJNI.java b/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTablesJNI.java index 4fddd9f51f..4cbcb895c4 100644 --- a/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTablesJNI.java +++ b/ntcore/src/generated/main/java/edu/wpi/first/networktables/NetworkTablesJNI.java @@ -6,8 +6,8 @@ package edu.wpi.first.networktables; +import edu.wpi.first.datalog.DataLog; import edu.wpi.first.util.RuntimeLoader; -import edu.wpi.first.util.datalog.DataLog; import java.io.IOException; import java.nio.ByteBuffer; import java.util.EnumSet; diff --git a/ntcore/src/main/native/cpp/ConnectionList.h b/ntcore/src/main/native/cpp/ConnectionList.h index c46266d5c1..6551ee468c 100644 --- a/ntcore/src/main/native/cpp/ConnectionList.h +++ b/ntcore/src/main/native/cpp/ConnectionList.h @@ -13,8 +13,8 @@ #include #include -#include #include +#include #include #include "Handle.h" diff --git a/ntcore/src/main/native/cpp/local/LocalDataLogger.cpp b/ntcore/src/main/native/cpp/local/LocalDataLogger.cpp index 121c99ab39..3ae62f60b1 100644 --- a/ntcore/src/main/native/cpp/local/LocalDataLogger.cpp +++ b/ntcore/src/main/native/cpp/local/LocalDataLogger.cpp @@ -5,8 +5,8 @@ #include "LocalDataLogger.h" #include -#include #include +#include using namespace nt::local; diff --git a/ntcore/src/main/native/cpp/local/LocalDataLoggerEntry.h b/ntcore/src/main/native/cpp/local/LocalDataLoggerEntry.h index 53ff480b19..0d86ea893c 100644 --- a/ntcore/src/main/native/cpp/local/LocalDataLoggerEntry.h +++ b/ntcore/src/main/native/cpp/local/LocalDataLoggerEntry.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include "ntcore_c.h" diff --git a/ntcore/src/main/native/cpp/local/LocalStorageImpl.cpp b/ntcore/src/main/native/cpp/local/LocalStorageImpl.cpp index 60a03c1c77..fd00bc9aa6 100644 --- a/ntcore/src/main/native/cpp/local/LocalStorageImpl.cpp +++ b/ntcore/src/main/native/cpp/local/LocalStorageImpl.cpp @@ -11,9 +11,9 @@ #include #include -#include #include #include +#include #include "IListenerStorage.h" #include "Log.h" diff --git a/ntcoreffi/src/main/native/cpp/DataLogManager.cpp b/ntcoreffi/src/main/native/cpp/DataLogManager.cpp index d758c02a2a..96377feef2 100644 --- a/ntcoreffi/src/main/native/cpp/DataLogManager.cpp +++ b/ntcoreffi/src/main/native/cpp/DataLogManager.cpp @@ -13,10 +13,10 @@ #include #include #include -#include -#include #include #include +#include +#include #include #include @@ -202,7 +202,7 @@ struct Thread final : public wpi::SafeThread { NT_DataLogger m_ntEntryLogger = 0; NT_ConnectionDataLogger m_ntConnLogger = 0; bool m_consoleLoggerEnabled = false; - wpi::FileLogger m_consoleLogger; + wpi::log::FileLogger m_consoleLogger; wpi::log::StringLogEntry m_messageLog; }; diff --git a/settings.gradle b/settings.gradle index 45ef87e77d..8f55ab798e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -59,6 +59,7 @@ include 'epilogue-runtime' include 'thirdparty:googletest' include 'thirdparty:imgui_suite' include 'wpical' +include 'datalog' buildCache { def cred = { diff --git a/sysid/CMakeLists.txt b/sysid/CMakeLists.txt index 8bcb224d4d..389f8d0614 100644 --- a/sysid/CMakeLists.txt +++ b/sysid/CMakeLists.txt @@ -25,7 +25,7 @@ endif() wpilib_link_macos_gui(sysid) wpilib_target_warnings(sysid) target_include_directories(sysid PRIVATE src/main/native/include) -target_link_libraries(sysid wpimath libglass) +target_link_libraries(sysid wpimath libglass datalog) if(WIN32) set_target_properties(sysid PROPERTIES WIN32_EXECUTABLE YES) @@ -42,5 +42,5 @@ if(WITH_TESTS) target_compile_options(sysid_test PRIVATE /utf-8) endif() target_include_directories(sysid_test PRIVATE src/main/native/cpp src/main/native/include) - target_link_libraries(sysid_test wpimath libglass googletest) + target_link_libraries(sysid_test wpimath libglass datalog googletest) endif() diff --git a/sysid/build.gradle b/sysid/build.gradle index d5e927b284..cb0964bfd3 100644 --- a/sysid/build.gradle +++ b/sysid/build.gradle @@ -98,9 +98,10 @@ model { } lib project: ':glass', library: 'glass', linkage: 'static' lib project: ':wpimath', library: 'wpimath', linkage: 'static' - lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' lib project: ':wpigui', library: 'wpigui', linkage: 'static' + lib project: ':datalog', library: 'datalog', linkage: 'static' lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static' + lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' if (it.targetPlatform.operatingSystem.isWindows()) { it.linker.args << 'Gdi32.lib' << 'Shell32.lib' << 'd3d11.lib' << 'd3dcompiler.lib' it.linker.args << '/DELAYLOAD:MF.dll' << '/DELAYLOAD:MFReadWrite.dll' << '/DELAYLOAD:MFPlat.dll' << '/delay:nobind' @@ -137,9 +138,10 @@ model { } lib project: ':glass', library: 'glass', linkage: 'static' lib project: ':wpimath', library: 'wpimath', linkage: 'static' - lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' + lib project: ':datalog', library: 'datalog', linkage: 'static' lib project: ':wpigui', library: 'wpigui', linkage: 'static' lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static' + lib project: ':wpiutil', library: 'wpiutil', linkage: 'static' if (it.targetPlatform.operatingSystem.isWindows()) { it.linker.args << 'Gdi32.lib' << 'Shell32.lib' << 'd3d11.lib' << 'd3dcompiler.lib' it.linker.args << '/DELAYLOAD:MF.dll' << '/DELAYLOAD:MFReadWrite.dll' << '/DELAYLOAD:MFPlat.dll' << '/delay:nobind' diff --git a/sysid/src/main/native/cpp/view/DataSelector.cpp b/sysid/src/main/native/cpp/view/DataSelector.cpp index 3409bf6ee3..17b2ab27e2 100644 --- a/sysid/src/main/native/cpp/view/DataSelector.cpp +++ b/sysid/src/main/native/cpp/view/DataSelector.cpp @@ -10,11 +10,11 @@ #include #include -#include #include -#include #include #include +#include +#include #include "sysid/Util.h" #include "sysid/analysis/AnalysisType.h" @@ -25,7 +25,7 @@ using namespace sysid; static constexpr const char* kAnalysisTypes[] = {"Elevator", "Arm", "Simple"}; static bool EmitEntryTarget(const char* name, bool isString, - const glass::DataLogReaderEntry** entry) { + const wpi::log::DataLogReaderEntry** entry) { if (*entry) { auto text = fmt::format("{}: {} ({})", name, (*entry)->name, (*entry)->type); @@ -38,8 +38,9 @@ static bool EmitEntryTarget(const char* name, bool isString, if (ImGui::BeginDragDropTarget()) { if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload( isString ? "DataLogEntryString" : "DataLogEntry")) { - assert(payload->DataSize == sizeof(const glass::DataLogReaderEntry*)); - *entry = *static_cast(payload->Data); + assert(payload->DataSize == sizeof(const wpi::log::DataLogReaderEntry*)); + *entry = + *static_cast(payload->Data); rv = true; } ImGui::EndDragDropTarget(); @@ -179,7 +180,7 @@ void DataSelector::Reset() { } DataSelector::Tests DataSelector::LoadTests( - const glass::DataLogReaderEntry& testStateEntry) { + const wpi::log::DataLogReaderEntry& testStateEntry) { Tests tests; for (auto&& range : testStateEntry.ranges) { std::string_view prevState; @@ -245,7 +246,7 @@ static void AddSamples(std::vector>& samples, } static std::vector> GetData( - const glass::DataLogReaderEntry& entry, double scale) { + const wpi::log::DataLogReaderEntry& entry, double scale) { std::vector> rv; bool isDouble = entry.type == "double"; for (auto&& range : entry.ranges) { diff --git a/sysid/src/main/native/cpp/view/LogLoader.cpp b/sysid/src/main/native/cpp/view/LogLoader.cpp index 8e0fe429b2..b21bea4615 100644 --- a/sysid/src/main/native/cpp/view/LogLoader.cpp +++ b/sysid/src/main/native/cpp/view/LogLoader.cpp @@ -12,13 +12,13 @@ #include #include -#include #include #include #include #include #include #include +#include #include using namespace sysid; @@ -55,7 +55,7 @@ void LogLoader::Display() { } unload(); m_reader = - std::make_unique(std::move(reader)); + std::make_unique(std::move(reader)); m_entryTree.clear(); } m_opener.reset(); @@ -108,7 +108,7 @@ void LogLoader::Display() { void LogLoader::RebuildEntryTree() { m_entryTree.clear(); wpi::SmallVector parts; - m_reader->ForEachEntryName([&](const glass::DataLogReaderEntry& entry) { + m_reader->ForEachEntryName([&](const wpi::log::DataLogReaderEntry& entry) { // only show double/float/string entries (TODO: support struct/protobuf) if (entry.type != "double" && entry.type != "float" && entry.type != "string") { @@ -167,7 +167,7 @@ void LogLoader::RebuildEntryTree() { } static void EmitEntry(const std::string& name, - const glass::DataLogReaderEntry& entry) { + const wpi::log::DataLogReaderEntry& entry) { ImGui::TableNextColumn(); ImGui::Selectable(name.c_str()); if (ImGui::BeginDragDropSource()) { diff --git a/sysid/src/main/native/include/sysid/view/DataSelector.h b/sysid/src/main/native/include/sysid/view/DataSelector.h index 71732a7ed7..1020bc563a 100644 --- a/sysid/src/main/native/include/sysid/view/DataSelector.h +++ b/sysid/src/main/native/include/sysid/view/DataSelector.h @@ -12,17 +12,19 @@ #include #include -#include #include +#include #include "sysid/analysis/Storage.h" namespace glass { -class DataLogReaderEntry; class Storage; } // namespace glass namespace wpi { +namespace log { +class DataLogReaderEntry; +} // namespace log class Logger; } // namespace wpi @@ -64,10 +66,10 @@ class DataSelector : public glass::View { std::future m_testsFuture; Tests m_tests; std::string m_selectedTest; - const glass::DataLogReaderEntry* m_testStateEntry = nullptr; - const glass::DataLogReaderEntry* m_velocityEntry = nullptr; - const glass::DataLogReaderEntry* m_positionEntry = nullptr; - const glass::DataLogReaderEntry* m_voltageEntry = nullptr; + const wpi::log::DataLogReaderEntry* m_testStateEntry = nullptr; + const wpi::log::DataLogReaderEntry* m_velocityEntry = nullptr; + const wpi::log::DataLogReaderEntry* m_positionEntry = nullptr; + const wpi::log::DataLogReaderEntry* m_voltageEntry = nullptr; double m_velocityScale = 1.0; double m_positionScale = 1.0; int m_selectedUnit = 0; @@ -75,7 +77,7 @@ class DataSelector : public glass::View { std::future m_testdataFuture; std::vector m_testdataStats; - static Tests LoadTests(const glass::DataLogReaderEntry& testStateEntry); + static Tests LoadTests(const wpi::log::DataLogReaderEntry& testStateEntry); TestData BuildTestData(); }; } // namespace sysid diff --git a/sysid/src/main/native/include/sysid/view/LogLoader.h b/sysid/src/main/native/include/sysid/view/LogLoader.h index 04ddd84dab..70931bc8ca 100644 --- a/sysid/src/main/native/include/sysid/view/LogLoader.h +++ b/sysid/src/main/native/include/sysid/view/LogLoader.h @@ -13,8 +13,6 @@ #include namespace glass { -class DataLogReaderEntry; -class DataLogReaderThread; class Storage; } // namespace glass @@ -23,6 +21,10 @@ class open_file; } // namespace pfd namespace wpi { +namespace log { +class DataLogReaderEntry; +class DataLogReaderThread; +} // namespace log class Logger; } // namespace wpi @@ -57,7 +59,7 @@ class LogLoader : public glass::View { std::string m_filename; std::unique_ptr m_opener; - std::unique_ptr m_reader; + std::unique_ptr m_reader; std::string m_error; @@ -67,7 +69,7 @@ class LogLoader : public glass::View { explicit EntryTreeNode(std::string_view name) : name{name} {} std::string name; // name of just this node std::string path; // full path if entry is nullptr - const glass::DataLogReaderEntry* entry = nullptr; + const wpi::log::DataLogReaderEntry* entry = nullptr; std::vector children; // children, sorted by name }; std::vector m_entryTree; diff --git a/wpilibNewCommands/CMakeLists.txt b/wpilibNewCommands/CMakeLists.txt index f7c664802e..d4107abb67 100644 --- a/wpilibNewCommands/CMakeLists.txt +++ b/wpilibNewCommands/CMakeLists.txt @@ -22,6 +22,7 @@ if(WITH_JAVA) wpiunits_jar wpiutil_jar wpilibj_jar + datalog_jar OUTPUT_NAME wpilibNewCommands OUTPUT_DIR ${WPILIB_BINARY_DIR}/${java_lib_dest} ) diff --git a/wpilibNewCommands/build.gradle b/wpilibNewCommands/build.gradle index 588c3113b3..dd5930e3ec 100644 --- a/wpilibNewCommands/build.gradle +++ b/wpilibNewCommands/build.gradle @@ -21,6 +21,7 @@ dependencies { implementation project(':hal') implementation project(':wpimath') implementation project(':wpilibj') + api project(':datalog') testImplementation 'org.mockito:mockito-core:4.1.0' } diff --git a/wpilibc/BUILD.bazel b/wpilibc/BUILD.bazel index c11298d3d5..62e871af19 100644 --- a/wpilibc/BUILD.bazel +++ b/wpilibc/BUILD.bazel @@ -40,6 +40,7 @@ cc_library( ":generated_cc_headers", "//cameraserver:cameraserver.static", "//cscore:cscore.static", + "//datalog:datalog.static", "//hal:wpiHal.static", "//ntcore:ntcore.static", "//wpimath:wpimath.static", diff --git a/wpilibc/CMakeLists.txt b/wpilibc/CMakeLists.txt index ec1016244d..7f4907b296 100644 --- a/wpilibc/CMakeLists.txt +++ b/wpilibc/CMakeLists.txt @@ -35,7 +35,7 @@ else() ) endif() -target_link_libraries(wpilibc PUBLIC hal ntcore wpimath wpiutil) +target_link_libraries(wpilibc PUBLIC hal ntcore wpimath datalog) set_property(TARGET wpilibc PROPERTY FOLDER "libraries") diff --git a/wpilibc/build.gradle b/wpilibc/build.gradle index 4fa684ccfc..1bc014ee51 100644 --- a/wpilibc/build.gradle +++ b/wpilibc/build.gradle @@ -112,6 +112,7 @@ model { lib project: ':wpinet', library: 'wpinet', linkage: 'shared' lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared' lib project: ':wpimath', library: 'wpimath', linkage: 'shared' + lib project: ':datalog', library: 'datalog', linkage: 'shared' } } "${nativeName}"(NativeLibrarySpec) { diff --git a/wpilibc/src/main/native/cpp/DataLogManager.cpp b/wpilibc/src/main/native/cpp/DataLogManager.cpp index 278e824130..15c179e243 100644 --- a/wpilibc/src/main/native/cpp/DataLogManager.cpp +++ b/wpilibc/src/main/native/cpp/DataLogManager.cpp @@ -15,11 +15,11 @@ #include #include #include -#include -#include -#include #include #include +#include +#include +#include #include #include #include @@ -51,7 +51,7 @@ struct Thread final : public wpi::SafeThread { NT_DataLogger m_ntEntryLogger = 0; NT_ConnectionDataLogger m_ntConnLogger = 0; bool m_consoleLoggerEnabled = false; - wpi::FileLogger m_consoleLogger; + wpi::log::FileLogger m_consoleLogger; wpi::log::StringLogEntry m_messageLog; }; diff --git a/wpilibc/src/main/native/cpp/DriverStation.cpp b/wpilibc/src/main/native/cpp/DriverStation.cpp index 6318c8899e..001f6ff81f 100644 --- a/wpilibc/src/main/native/cpp/DriverStation.cpp +++ b/wpilibc/src/main/native/cpp/DriverStation.cpp @@ -23,9 +23,9 @@ #include #include #include -#include #include #include +#include #include #include #include diff --git a/wpilibc/src/main/native/include/frc/sysid/SysIdRoutineLog.h b/wpilibc/src/main/native/include/frc/sysid/SysIdRoutineLog.h index 5e72716906..9d53847e6b 100644 --- a/wpilibc/src/main/native/include/frc/sysid/SysIdRoutineLog.h +++ b/wpilibc/src/main/native/include/frc/sysid/SysIdRoutineLog.h @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace frc::sysid { diff --git a/wpilibj/BUILD.bazel b/wpilibj/BUILD.bazel index e5b8b0dd99..b5f193f2c4 100644 --- a/wpilibj/BUILD.bazel +++ b/wpilibj/BUILD.bazel @@ -26,6 +26,7 @@ java_library( deps = [ "//cameraserver:cameraserver-java", "//cscore:cscore-java", + "//datalog:datalog-java", "//hal:hal-java", "//ntcore:networktables-java", "//wpimath:wpimath-java", diff --git a/wpilibj/CMakeLists.txt b/wpilibj/CMakeLists.txt index 5ea91bdee0..e27bbbb21f 100644 --- a/wpilibj/CMakeLists.txt +++ b/wpilibj/CMakeLists.txt @@ -41,6 +41,7 @@ if(WITH_JAVA) wpimath_jar wpiunits_jar wpiutil_jar + datalog_jar OUTPUT_NAME wpilibj OUTPUT_DIR ${WPILIB_BINARY_DIR}/${java_lib_dest} ) diff --git a/wpilibj/build.gradle b/wpilibj/build.gradle index 81642b195e..07f5df67da 100644 --- a/wpilibj/build.gradle +++ b/wpilibj/build.gradle @@ -69,6 +69,7 @@ dependencies { implementation project(':wpimath') implementation project(':ntcore') implementation project(':cscore') + api project(':datalog') implementation project(':cameraserver') testImplementation 'org.mockito:mockito-core:4.1.0' devImplementation sourceSets.main.output diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DataLogManager.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DataLogManager.java index c4d1c5be35..450168f3e5 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DataLogManager.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DataLogManager.java @@ -4,15 +4,15 @@ package edu.wpi.first.wpilibj; +import edu.wpi.first.datalog.DataLog; +import edu.wpi.first.datalog.DataLogBackgroundWriter; +import edu.wpi.first.datalog.FileLogger; +import edu.wpi.first.datalog.IntegerLogEntry; +import edu.wpi.first.datalog.StringLogEntry; import edu.wpi.first.hal.HAL; import edu.wpi.first.networktables.NetworkTableInstance; -import edu.wpi.first.util.FileLogger; import edu.wpi.first.util.WPIUtilJNI; import edu.wpi.first.util.concurrent.Event; -import edu.wpi.first.util.datalog.DataLog; -import edu.wpi.first.util.datalog.DataLogBackgroundWriter; -import edu.wpi.first.util.datalog.IntegerLogEntry; -import edu.wpi.first.util.datalog.StringLogEntry; import java.io.File; import java.io.IOException; import java.nio.file.Files; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DriverStation.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DriverStation.java index c75c9ea1b2..4145484916 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DriverStation.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DriverStation.java @@ -4,6 +4,11 @@ package edu.wpi.first.wpilibj; +import edu.wpi.first.datalog.BooleanArrayLogEntry; +import edu.wpi.first.datalog.BooleanLogEntry; +import edu.wpi.first.datalog.DataLog; +import edu.wpi.first.datalog.FloatArrayLogEntry; +import edu.wpi.first.datalog.IntegerArrayLogEntry; import edu.wpi.first.hal.AllianceStationID; import edu.wpi.first.hal.ControlWord; import edu.wpi.first.hal.DriverStationJNI; @@ -16,11 +21,6 @@ import edu.wpi.first.networktables.StringPublisher; import edu.wpi.first.networktables.StringTopic; import edu.wpi.first.util.EventVector; import edu.wpi.first.util.WPIUtilJNI; -import edu.wpi.first.util.datalog.BooleanArrayLogEntry; -import edu.wpi.first.util.datalog.BooleanLogEntry; -import edu.wpi.first.util.datalog.DataLog; -import edu.wpi.first.util.datalog.FloatArrayLogEntry; -import edu.wpi.first.util.datalog.IntegerArrayLogEntry; import java.nio.ByteBuffer; import java.util.Map; import java.util.Optional; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/sysid/SysIdRoutineLog.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/sysid/SysIdRoutineLog.java index 82c9ed9b05..f80332a26b 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/sysid/SysIdRoutineLog.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/sysid/SysIdRoutineLog.java @@ -12,6 +12,8 @@ import static edu.wpi.first.units.Units.RotationsPerSecond; import static edu.wpi.first.units.Units.Second; import static edu.wpi.first.units.Units.Volts; +import edu.wpi.first.datalog.DoubleLogEntry; +import edu.wpi.first.datalog.StringLogEntry; import edu.wpi.first.units.measure.Angle; import edu.wpi.first.units.measure.AngularAcceleration; import edu.wpi.first.units.measure.AngularVelocity; @@ -20,8 +22,6 @@ import edu.wpi.first.units.measure.Distance; import edu.wpi.first.units.measure.LinearAcceleration; import edu.wpi.first.units.measure.LinearVelocity; import edu.wpi.first.units.measure.Voltage; -import edu.wpi.first.util.datalog.DoubleLogEntry; -import edu.wpi.first.util.datalog.StringLogEntry; import edu.wpi.first.wpilibj.DataLogManager; import java.util.HashMap; import java.util.Map; diff --git a/wpiutil/BUILD.bazel b/wpiutil/BUILD.bazel index 646858441c..3fcfaecc2b 100644 --- a/wpiutil/BUILD.bazel +++ b/wpiutil/BUILD.bazel @@ -1,6 +1,5 @@ load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") load("@rules_java//java:defs.bzl", "java_binary") -load("@rules_python//python:defs.bzl", "py_binary") load("//shared/bazel/rules:java_rules.bzl", "wpilib_java_junit5_test") load("//shared/bazel/rules:jni_rules.bzl", "wpilib_jni_cc_library", "wpilib_jni_java_library") load("//shared/bazel/rules/gen:gen-resources.bzl", "generate_resources") @@ -305,34 +304,3 @@ java_binary( ":wpiutil-java", ], ) - -py_binary( - name = "datalog", - srcs = ["examples/printlog/datalog.py"], - tags = ["manual"], -) - -cc_binary( - name = "printlog", - srcs = ["examples/printlog/printlog.cpp"], - deps = [ - ":wpiutil.static", - ], -) - -cc_binary( - name = "writelog", - srcs = ["examples/writelog/writelog.cpp"], - deps = [ - ":wpiutil.static", - ], -) - -java_binary( - name = "printlog-java", - srcs = ["src/printlog/java/printlog/PrintLog.java"], - main_class = "printlog.PrintLog", - deps = [ - ":wpiutil-java", - ], -) diff --git a/wpiutil/CMakeLists.txt b/wpiutil/CMakeLists.txt index 9d98b7fc98..e0af46d8df 100644 --- a/wpiutil/CMakeLists.txt +++ b/wpiutil/CMakeLists.txt @@ -6,11 +6,7 @@ include(CompileWarnings) include(AddTest) include(DownloadAndCheck) -file( - GLOB wpiutil_jni_src - src/main/native/cpp/jni/WPIUtilJNI.cpp - src/main/native/cpp/jni/DataLogJNI.cpp -) +file(GLOB wpiutil_jni_src src/main/native/cpp/jni/WPIUtilJNI.cpp) # Java bindings if(WITH_JAVA) diff --git a/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java b/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java index 2818489c59..acd93408e6 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java +++ b/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java @@ -222,24 +222,6 @@ public class WPIUtilJNI { public static native int[] waitForObjectsTimeout(int[] handles, double timeout) throws InterruptedException; - /** - * Create a native FileLogger. When the specified file is modified, appended data will be appended - * to the specified data log. - * - * @param file path to the file - * @param log data log implementation handle - * @param key log key to append data to - * @return The FileLogger handle. - */ - public static native long createFileLogger(String file, long log, String key); - - /** - * Free a native FileLogger. This causes the FileLogger to stop appending data to the log. - * - * @param fileTail The FileLogger handle. - */ - public static native void freeFileLogger(long fileTail); - /** Utility class. */ protected WPIUtilJNI() {} } diff --git a/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp b/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp index b55100de0e..55764642a4 100644 --- a/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp +++ b/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp @@ -7,8 +7,6 @@ #include #include "edu_wpi_first_util_WPIUtilJNI.h" -#include "wpi/DataLog.h" -#include "wpi/FileLogger.h" #include "wpi/RawFrame.h" #include "wpi/RuntimeCheck.h" #include "wpi/Synchronization.h" @@ -464,42 +462,4 @@ Java_edu_wpi_first_util_WPIUtilJNI_setRawFrameInfo f->stride = stride; f->pixelFormat = pixelFormat; } - -/* - * Class: edu_wpi_first_util_WPIUtilJNI - * Method: createFileLogger - * Signature: (Ljava/lang/String;JLjava/lang/String;)J - */ -JNIEXPORT jlong JNICALL -Java_edu_wpi_first_util_WPIUtilJNI_createFileLogger - (JNIEnv* env, jclass, jstring file, jlong log, jstring key) -{ - if (!file) { - wpi::ThrowNullPointerException(env, "file is null"); - return 0; - } - auto* f = reinterpret_cast(log); - if (!f) { - wpi::ThrowNullPointerException(env, "log is null"); - return 0; - } - if (!key) { - wpi::ThrowNullPointerException(env, "key is null"); - return 0; - } - return reinterpret_cast( - new wpi::FileLogger{JStringRef{env, file}, *f, JStringRef{env, key}}); -} - -/* - * Class: edu_wpi_first_util_WPIUtilJNI - * Method: freeFileLogger - * Signature: (J)V - */ -JNIEXPORT void JNICALL -Java_edu_wpi_first_util_WPIUtilJNI_freeFileLogger - (JNIEnv* env, jclass, jlong fileTail) -{ - delete reinterpret_cast(fileTail); -} } // extern "C"