From eec2f0604bb08139638ad49c30b8cda54405188d Mon Sep 17 00:00:00 2001 From: bparks13 Date: Mon, 7 Jul 2025 11:29:08 -0400 Subject: [PATCH 1/4] Add liboni as a submodule - To account for the new submodule, update the CMakeLists file with the new folder paths - Add instructions to the README with how to build the relevant projects and the specific targets for this repo - Remove any Mac / Linux specific instructions in the README and the CMakeLists file, as neither platforms are currently supported by this plugin --- .gitmodules | 3 + CMakeLists.txt | 71 +++++--------------- README.md | 46 +++++-------- libONI/include/oni.h | 87 ------------------------ libONI/include/onidefs.h | 94 -------------------------- libONI/include/onidriver.h | 56 ---------------- libONI/include/onix.h | 99 ---------------------------- libONI/linux/liboni.so | Bin 30760 -> 0 bytes libONI/osx/liboni.dylib | Bin 36568 -> 0 bytes libONI/win64/liboni.dll | Bin 52224 -> 0 bytes libONI/win64/liboni.lib | Bin 5048 -> 0 bytes libONI/win64/libonidriver_riffa.dll | Bin 13824 -> 0 bytes libONI/win64/onidriver_riffa.lib | Bin 4374 -> 0 bytes libONI/win64/riffa.dll | Bin 17920 -> 0 bytes libONI/win64/riffa.lib | Bin 3114 -> 0 bytes liboni | 1 + 16 files changed, 36 insertions(+), 421 deletions(-) create mode 100644 .gitmodules delete mode 100644 libONI/include/oni.h delete mode 100644 libONI/include/onidefs.h delete mode 100644 libONI/include/onidriver.h delete mode 100644 libONI/include/onix.h delete mode 100644 libONI/linux/liboni.so delete mode 100644 libONI/osx/liboni.dylib delete mode 100644 libONI/win64/liboni.dll delete mode 100644 libONI/win64/liboni.lib delete mode 100644 libONI/win64/libonidriver_riffa.dll delete mode 100644 libONI/win64/onidriver_riffa.lib delete mode 100644 libONI/win64/riffa.dll delete mode 100644 libONI/win64/riffa.lib create mode 160000 liboni diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d7eac97 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "liboni"] + path = liboni + url = https://github.com/open-ephys/liboni diff --git a/CMakeLists.txt b/CMakeLists.txt index e6beb36..c386d25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,12 +12,6 @@ get_filename_component(PLUGIN_NAME ${PROJECT_FOLDER} NAME) project(OE_PLUGIN_${PLUGIN_NAME}) set(CMAKE_SHARED_LIBRARY_PREFIX "") -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(LINUX 1) - if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug) - endif() -endif() set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS OEPLUGIN @@ -29,7 +23,6 @@ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$:NDEBUG=1> ) - set(SOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Source) file(GLOB_RECURSE SRC_FILES LIST_DIRECTORIES false "${SOURCE_PATH}/*.cpp" "${SOURCE_PATH}/*.h") set(GUI_COMMONLIB_DIR ${GUI_BASE_DIR}/installed_libs) @@ -38,11 +31,7 @@ set(CONFIGURATION_FOLDER $<$:Debug>$<$>:Releas list(APPEND CMAKE_PREFIX_PATH ${GUI_COMMONLIB_DIR} ${GUI_COMMONLIB_DIR}/${CONFIGURATION_FOLDER}) -if (APPLE) - add_library(${PLUGIN_NAME} MODULE ${SRC_FILES}) -else() - add_library(${PLUGIN_NAME} SHARED ${SRC_FILES}) -endif() +add_library(${PLUGIN_NAME} SHARED ${SRC_FILES}) target_compile_features(${PLUGIN_NAME} PUBLIC cxx_auto_type cxx_generalized_initializers) target_include_directories(${PLUGIN_NAME} PUBLIC ${GUI_BASE_DIR}/JuceLibraryCode ${GUI_BASE_DIR}/JuceLibraryCode/modules ${GUI_BASE_DIR}/Plugins/Headers ${GUI_COMMONLIB_DIR}/include) @@ -60,30 +49,13 @@ if (NOT CMAKE_LIBRARY_ARCHITECTURE) endif() #Libraries and compiler options -if(MSVC) - target_link_libraries(${PLUGIN_NAME} ${GUI_BIN_DIR}/open-ephys.lib) - target_compile_options(${PLUGIN_NAME} PRIVATE /sdl- /W0) - - install(TARGETS ${PLUGIN_NAME} RUNTIME DESTINATION ${GUI_BIN_DIR}/plugins CONFIGURATIONS ${CMAKE_CONFIGURATION_TYPES}) - install(FILES $ DESTINATION ${GUI_BIN_DIR}/plugins OPTIONAL) - - set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../libs) -elseif(LINUX) - target_link_libraries(${PLUGIN_NAME} GL X11 Xext Xinerama asound dl freetype pthread rt) - set_property(TARGET ${PLUGIN_NAME} APPEND_STRING PROPERTY LINK_FLAGS - "-fvisibility=hidden -fPIC -rdynamic -Wl,-rpath,'$$ORIGIN/../shared'") - target_compile_options(${PLUGIN_NAME} PRIVATE -fPIC -rdynamic) - target_compile_options(${PLUGIN_NAME} PRIVATE -O3) #enable optimization for linux debug - - install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${GUI_BIN_DIR}/plugins) -elseif(APPLE) - set_target_properties(${PLUGIN_NAME} PROPERTIES BUNDLE TRUE) - set_property(TARGET ${PLUGIN_NAME} APPEND_STRING PROPERTY LINK_FLAGS - "-undefined dynamic_lookup -rpath @loader_path/../../../../shared") - - install(TARGETS ${PLUGIN_NAME} DESTINATION $ENV{HOME}/Library/Application\ Support/open-ephys/plugins-api8) - set(CMAKE_PREFIX_PATH /opt/local) -endif() +target_link_libraries(${PLUGIN_NAME} ${GUI_BIN_DIR}/open-ephys.lib) +target_compile_options(${PLUGIN_NAME} PRIVATE /sdl- /W0 /MP) + +install(TARGETS ${PLUGIN_NAME} RUNTIME DESTINATION ${GUI_BIN_DIR}/plugins CONFIGURATIONS ${CMAKE_CONFIGURATION_TYPES}) +install(FILES $ DESTINATION ${GUI_BIN_DIR}/plugins OPTIONAL) + +set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../libs) #create filters for vs and xcode @@ -95,21 +67,12 @@ foreach( src_file IN ITEMS ${SRC_FILES}) endforeach() #additional libraries, if needed -set(LIBONI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libONI) -target_include_directories(${PLUGIN_NAME} PRIVATE ${LIBONI_DIR}/include) - -if (MSVC) - set(LIBONI_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libONI/win64) - target_link_libraries(${PLUGIN_NAME} "${LIBONI_LIB_DIR}/liboni.lib") - target_link_libraries(${PLUGIN_NAME} "${LIBONI_LIB_DIR}/riffa.lib") - target_link_libraries(${PLUGIN_NAME} "${LIBONI_LIB_DIR}/onidriver_riffa.lib") - install(DIRECTORY ${LIBONI_LIB_DIR}/ DESTINATION ${GUI_BIN_DIR}/shared FILES_MATCHING PATTERN "*.dll") -elseif(LINUX) - find_library(LIBONI_LIBRARIES oni liboni PATHS ${CMAKE_CURRENT_SOURCE_DIR}/libONI/linux) - target_link_libraries(${PLUGIN_NAME} ${LIBONI_LIBRARIES}) - install(DIRECTORY ${LIBONI_DIR}/linux/ DESTINATION ${GUI_BIN_DIR}/shared FILES_MATCHING PATTERN "*.so") -elseif(APPLE) - set(LIBONI_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libONI/osx) - target_link_libraries(${PLUGIN_NAME} "${LIBONI_LIB_DIR}/liboni.dylib") - install(FILES ${LIBONI_LIB_DIR}/liboni.dylib DESTINATION $ENV{HOME}/Library/Application\ Support/open-ephys/shared-api8) -endif() +set(LIBONI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liboni/api/liboni") +set(LIBONI_LIB_DIR "${LIBONI_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/ReleaseStatic") +set(LIBONI_DRIVER_DIR "${LIBONI_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release") +target_include_directories(${PLUGIN_NAME} PRIVATE ${LIBONI_DIR}) + +target_link_libraries(${PLUGIN_NAME} "${LIBONI_LIB_DIR}/liboni.lib") +target_link_libraries(${PLUGIN_NAME} "${LIBONI_DRIVER_DIR}/riffa.lib") +target_link_libraries(${PLUGIN_NAME} "${LIBONI_DRIVER_DIR}/onidriver_riffa.lib") +install(FILES "${LIBONI_DRIVER_DIR}/riffa.dll" "${LIBONI_DRIVER_DIR}/libonidriver_riffa.dll" DESTINATION ${GUI_BIN_DIR}/shared) diff --git a/README.md b/README.md index 0a64f7f..6ec5b50 100644 --- a/README.md +++ b/README.md @@ -29,51 +29,35 @@ Code │ └── ... ``` -### Windows - -**Requirements:** [Visual Studio](https://visualstudio.microsoft.com/) and [CMake](https://cmake.org/install/) - -From the `Build` directory, enter: - -```bash -cmake -G "Visual Studio 17 2022" -A x64 .. -``` - -Next, launch Visual Studio and open the `OE_PLUGIN_onix-source.sln` file that was just created. Select the appropriate configuration (Debug/Release) and build the solution. - -Selecting the `INSTALL` project and manually building it will copy the `.dll` and any other required files into the GUI's `plugins` directory. The next time you launch the GUI from Visual Studio, the ONIX Source plugin should be available. +To get a fresh install of the repository, use `git clone --recurse-submodules` to fetch the submodule as well. +For existing clones of the repo, run `git submodule update --init --recursive` to initialize the submodule and update it simultaneously. -### Linux +### Windows -**Requirements:** [CMake](https://cmake.org/install/) +**Requirements:** [Visual Studio](https://visualstudio.microsoft.com/) and [CMake](https://cmake.org/install/) -From the `Build` directory, enter: +#### Build liboni and associated drivers -```bash -cmake -G "Unix Makefiles" .. -cd Debug -make -j -make install -``` +Enter the `liboni/api/liboni` directory, and open the `liboni.sln` file using Visual Studio. Alternatively, build the project from the command line using `msbuild` or equivalent command. -This will build the plugin and copy the `.so` file into the GUI's `plugins` directory. The next time you launch the compiled version of the GUI, the ONIX Source plugin should be available. +To ensure that this project functions correctly, the following projects must be built so that they can be properly linked by the `cmake` command below: +- `liboni` +- `onidriver_riffa` +- `riffa` -### macOS +NOTE: For proper linking, these projects must be built using the `ReleaseStatic` configuration. This will create `liboni` as a static library, while leaving the other two libraries as dynamic. -**Requirements:** [Xcode](https://developer.apple.com/xcode/) and [CMake](https://cmake.org/install/) +#### Create OnixSource project using CMAKE From the `Build` directory, enter: ```bash -cmake -G "Xcode" .. +cmake -G "Visual Studio 17 2022" -A x64 .. ``` -Next, launch Xcode and open the `onix-source.xcodeproj` file that now lives in the “Build” directory. - -Running the `ALL_BUILD` scheme will compile the plugin; running the `INSTALL` scheme will install the `.bundle` file to `/Users//Library/Application Support/open-ephys/plugins-api8`. the ONIX Source plugin should be available the next time you launch the GUI from Xcode. - - +Next, launch Visual Studio and open the `OE_PLUGIN_onix-source.sln` file that was just created. Select the appropriate configuration (Debug/Release) and build the solution. +Selecting the `INSTALL` project and manually building it will copy the `.dll` and any other required files into the GUI's `plugins` directory. The next time you launch the GUI from Visual Studio, the ONIX Source plugin should be available. diff --git a/libONI/include/oni.h b/libONI/include/oni.h deleted file mode 100644 index 05521fe..0000000 --- a/libONI/include/oni.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef __ONI_H__ -#define __ONI_H__ - -// Version macros for compile-time API version detection -// NB: see https://semver.org/ -#define ONI_VERSION_MAJOR 4 -#define ONI_VERSION_MINOR 3 -#define ONI_VERSION_PATCH 5 - -#define ONI_MAKE_VERSION(major, minor, patch) \ - ((major) * 10000 + (minor) * 100 + (patch)) -#define ONI_VERSION \ - ONI_MAKE_VERSION(ONI_VERSION_MAJOR, ONI_VERSION_MINOR, ONI_VERSION_PATCH) - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -// OS-specific definitions -#ifdef _WIN32 -#ifdef LIBONI_EXPORTS -#define ONI_EXPORT __declspec(dllexport) -#else -#define ONI_EXPORT -#endif -#else -#define ONI_EXPORT -#endif - -#include "onidefs.h" - -// Acquisition context -typedef struct oni_ctx_impl *oni_ctx; - -// Device type -typedef struct { - // NB: Block read so don't change order - oni_size_t idx; // Complete rsv.rsv.hub.idx device table index - oni_dev_id_t id; // Device ID number - oni_size_t version; // Device firmware version - oni_size_t read_size; // Device data read size per frame in bytes - oni_size_t write_size; // Device data write size per frame in bytes - -} oni_device_t; - -// Frame type -typedef struct { - const oni_fifo_time_t time; // Frame time (ACQCLKHZ) - const oni_fifo_dat_t dev_idx; // Device index that produced or accepts the frame - const oni_fifo_dat_t data_sz; // Size in bytes of data buffer - char *data; // Raw data block - -} oni_frame_t; - -// Context management -ONI_EXPORT oni_ctx oni_create_ctx(const char *drv_name); -ONI_EXPORT int oni_init_ctx(oni_ctx ctx, int host_idx); -ONI_EXPORT int oni_destroy_ctx(oni_ctx ctx); - -// Context option getting/setting -ONI_EXPORT int oni_get_opt(const oni_ctx ctx, int ctx_opt, void *value, size_t *size); -ONI_EXPORT int oni_set_opt(oni_ctx ctx, int ctx_opt, const void *value, size_t size); - -// Driver option getting/setting -ONI_EXPORT int oni_get_driver_opt(const oni_ctx ctx, int drv_opt, void *value, size_t *size); -ONI_EXPORT int oni_set_driver_opt(oni_ctx ctx, int drv_opt, const void *value, size_t size); - -// Hardware inspection, manipulation, and IO -ONI_EXPORT int oni_read_reg(const oni_ctx ctx, oni_dev_idx_t dev_idx, oni_reg_addr_t addr, oni_reg_val_t *value); -ONI_EXPORT int oni_write_reg(const oni_ctx ctx, oni_dev_idx_t dev_idx, oni_reg_addr_t addr, oni_reg_val_t value); -ONI_EXPORT int oni_read_frame(const oni_ctx ctx, oni_frame_t **frame); -ONI_EXPORT int oni_create_frame(const oni_ctx ctx, oni_frame_t **frame, oni_dev_idx_t dev_idx, void *data, size_t data_sz); -ONI_EXPORT int oni_write_frame(const oni_ctx ctx, const oni_frame_t *frame); -ONI_EXPORT void oni_destroy_frame(oni_frame_t *frame); - -// Helpers -ONI_EXPORT void oni_version(int *major, int *minor, int *patch); -ONI_EXPORT const char *oni_error_str(int err); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libONI/include/onidefs.h b/libONI/include/onidefs.h deleted file mode 100644 index 147a02f..0000000 --- a/libONI/include/onidefs.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef __ONI_DEFS_H__ -#define __ONI_DEFS_H__ -#include - -// Frame header size in bytes -// NB: Header is [dev_idx, data_sz, time] -#define ONI_FRAMEHEADERSZ 2 * sizeof(oni_fifo_dat_t) + sizeof(oni_fifo_time_t) - -// Context options -enum { - ONI_OPT_DEVICETABLE = 0, - ONI_OPT_NUMDEVICES, - ONI_OPT_RUNNING, - ONI_OPT_RESET, - ONI_OPT_SYSCLKHZ, - ONI_OPT_ACQCLKHZ, - ONI_OPT_RESETACQCOUNTER, - ONI_OPT_HWADDRESS, - ONI_OPT_MAXREADFRAMESIZE, - ONI_OPT_MAXWRITEFRAMESIZE, - ONI_OPT_BLOCKREADSIZE, - ONI_OPT_BLOCKWRITESIZE, - ONI_OPT_CUSTOMBEGIN, -}; - -// NB: If you add an error here, make sure to update oni_error_str() in oni.c -enum { - ONI_ESUCCESS = 0, // Success - ONI_EPATHINVALID = -1, // Invalid stream path, fail on open - ONI_EDEVID = -2, // Invalid device ID - ONI_EDEVIDX = -3, // Invalid device index - ONI_EWRITESIZE = -4, // Data size is not an integer multiple of the write size for the designated device - ONI_EREADFAILURE = -5, // Failure to read from a stream/register - ONI_EWRITEFAILURE = -6, // Failure to write to a stream/register - ONI_ENULLCTX = -7, // Attempt to use a NULL context - ONI_ESEEKFAILURE = -8, // Failure to seek on stream - ONI_EINVALSTATE = -9, // Invalid operation for the current context run state - ONI_EINVALOPT = -10, // Invalid context option - ONI_EINVALARG = -11, // Invalid function arguments - ONI_ECOBSPACK = -12, // Invalid COBS packet - ONI_ERETRIG = -13, // Attempt to trigger an already triggered operation - ONI_EBUFFERSIZE = -14, // Supplied buffer is too small - ONI_EBADDEVTABLE = -15, // Badly formatted device table supplied by firmware - ONI_EBADALLOC = -16, // Bad dynamic memory allocation - ONI_ECLOSEFAIL = -17, // File descriptor close failure, check errno - ONI_EREADONLY = -18, // Attempted write to read only object (register, context option, etc) - ONI_EUNIMPL = -19, // Specified, but unimplemented, feature - ONI_EINVALREADSIZE = -20, // Block read size is smaller than the maximal read frame size - ONI_ENOREADDEV = -21, // Frame read attempted when there are no readable devices in the device table - ONI_EINIT = -22, // Hardware initialization failed - ONI_EWRITEONLY = -23, // Attempted to read from a write only object (register, context option, etc) - ONI_EINVALWRITESIZE = -24, // Write buffer pre-allocation size is smaller than the maximal write frame size - ONI_ENOTWRITEDEV = -25, // Frame allocation attempted for a non-writable device - ONI_EDEVIDXREPEAT = -26, // Device table contains repeated device indices - ONI_EPROTCONFIG = -27, // Attempted to directly read or write a protected configuration option - - // NB: Always at bottom - ONI_MINERRORNUM = -28 -}; - -// Registers available in the specification -typedef enum { - ONI_CONFIG_DEV_IDX = 0, - ONI_CONFIG_REG_ADDR, - ONI_CONFIG_REG_VALUE, - ONI_CONFIG_RW, - ONI_CONFIG_TRIG, - ONI_CONFIG_RUNNING, - ONI_CONFIG_RESET, - ONI_CONFIG_SYSCLKHZ, - ONI_CONFIG_ACQCLKHZ, - ONI_CONFIG_RESETACQCOUNTER, - ONI_CONFIG_HWADDRESS, - ONI_CONFIG_CUSTOMBEGIN, -} oni_config_t; - -// Fixed width device types -// TODO: I feel like oni.h and onidefs.h should only deal with standard signed -// or unsigned integer types and it should be the drivers' job to translate -// these to fixed width integers instead of having these typedefs -typedef uint32_t oni_size_t; -typedef uint32_t oni_dev_id_t; // Device IDs are 32-bit numbers -typedef uint32_t oni_dev_idx_t; // Device idx are 32-bit, byte.byte.btye.byte addresses -typedef uint32_t oni_reg_addr_t; // Registers use a 32-bit address -typedef uint32_t oni_reg_val_t; // Registers have 32-bit values -typedef uint32_t oni_fifo_dat_t; // FIFOs use 32-bit words; // TODO: find a way to remove -typedef uint64_t oni_fifo_time_t; // FIFO bound timers use 64-bit words; // TODO: find a way to remove - -#define BYTE_TO_FIFO_SHIFT 2; // TODO: find a way to remove - -// Register size -#define ONI_REGSZ sizeof(oni_reg_val_t) - -#endif diff --git a/libONI/include/onidriver.h b/libONI/include/onidriver.h deleted file mode 100644 index 9b28306..0000000 --- a/libONI/include/onidriver.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __ONI_DRIVER_H__ -#define __ONI_DRIVER_H__ - -#include -#include - -#include "onidefs.h" - -// Possible read streams -typedef enum { - ONI_READ_STREAM_DATA = 0, - ONI_READ_STREAM_SIGNAL -} oni_read_stream_t; - -// Possible write streams. -typedef enum { - ONI_WRITE_STREAM_DATA = 0 -} oni_write_stream_t; - -// Generic pointer for driver-specific options -typedef void *oni_driver_ctx; - -// Prototype functions for drivers. Every driver has to implement these -#ifndef ONI_DRIVER_IGNORE_FUNCTION_PROTOTYPES // For use only for including in the main library driver loader -#ifdef _WIN32 -#define ONI_DRIVER_EXPORT __declspec(dllexport) -#else -#define ONI_DRIVER_EXPORT -#endif - -ONI_DRIVER_EXPORT oni_driver_ctx oni_driver_create_ctx(); -ONI_DRIVER_EXPORT int oni_driver_destroy_ctx(oni_driver_ctx); - -// Initialize driver. Argument is the host device index -ONI_DRIVER_EXPORT int oni_driver_init(oni_driver_ctx driver_ctx, int host_idx); -ONI_DRIVER_EXPORT int oni_driver_read_stream(oni_driver_ctx driver_ctx, oni_read_stream_t stream, void *data, size_t size); -ONI_DRIVER_EXPORT int oni_driver_write_stream(oni_driver_ctx driver_ctx, oni_write_stream_t stream, const char *data, size_t size); -ONI_DRIVER_EXPORT int oni_driver_read_config(oni_driver_ctx driver_ctx, oni_config_t config, oni_reg_val_t *value); -ONI_DRIVER_EXPORT int oni_driver_write_config(oni_driver_ctx driver_ctx, oni_config_t config, oni_reg_val_t value); - -// This gets called when oni_set_opt is called. This method does not need to -// perform any configuration but it is provided for the driver to do some -// internal adjustments if required -ONI_DRIVER_EXPORT int oni_driver_set_opt_callback(oni_driver_ctx driver_ctx, int oni_option, const void *value, size_t option_len); - -// Functions to get and set set driver-specific options. This kind of optiosn -// must be avoided when necessary to allow for a general interface -ONI_DRIVER_EXPORT int oni_driver_set_opt(oni_driver_ctx driver_ctx, int driver_option, const void *value, size_t option_len); -ONI_DRIVER_EXPORT int oni_driver_get_opt(oni_driver_ctx driver_ctx, int driver_option, void *value, size_t* option_len); - -// Get a string identifying the driver -ONI_DRIVER_EXPORT const oni_driver_info_t *oni_driver_info(); - -#endif - -#endif diff --git a/libONI/include/onix.h b/libONI/include/onix.h deleted file mode 100644 index b2e616c..0000000 --- a/libONI/include/onix.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef __ONIX_H__ -#define __ONIX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 -#define ONI_EXPORT __declspec(dllexport) -#else -#define ONI_EXPORT -#endif - -// NB: Device IDs are 32-bit integers with the following format: -// Reserved(8-bit).Company(8-bit).Device(16-bit) -// NB: If you add a device here, make sure to update oni_device_str(). -enum { - ONIX_NULL = 0, // Placeholder device - ONIX_INFO = 1, // Virtual device that provides status and error information - ONIX_RHD2132 = 2, // Intan RHD2132 bioamplifier - ONIX_RHD2164 = 3, // Intan RHD2162 bioamplifier - ONIX_ESTIM = 4, // Electrical stimulation subcircuit - ONIX_OSTIM = 5, // Optical stimulation subcircuit - ONIX_TS4231 = 6, // Triad semiconductor TS421 optical to digital converter - ONIX_DINPUT32 = 7, // 32-bit digital input port - ONIX_DOUTPUT32 = 8, // 32-bit digital output port - ONIX_BNO055 = 9, // BNO055 9-DOF IMU - ONIX_TEST0 = 10, // A test device used for debugging - ONIX_NEUROPIX1R0 = 11, // Neuropixels 1.0 - ONIX_HEARTBEAT = 12, // Host heartbeat - ONIX_AD51X2 = 13, // AD51X2 digital potentiometer - ONIX_FMCVCTRL = 14, // Open Ephys FMC Host Board rev. 1.3 link voltage control subcircuit - ONIX_AD7617 = 15, // AD7617 ADC/DAS - ONIX_AD576X = 16, // AD576X DAC - ONIX_TESTREG0 = 17, // A test device used for testing remote register programming - ONIX_BREAKDIG1R3 = 18, // Open Ephys Breakout Board rev. 1.3 digital and user IO - ONIX_FMCCLKIN1R3 = 19, // Open Ephys FMC Host Board rev. 1.3 clock input subcircuit - ONIX_FMCCLKOUT1R3 = 20, // Open Ephys FMC Host Board rev. 1.3 clock output subcircuit - ONIX_TS4231V2ARR = 21, // Triad semiconductor TS421 optical to digital converter array targeting V2 base-stations - ONIX_FMCANALOG1R3 = 22, // Open Ephys FMC Host Board rev. 1.3 analog IO subcircuit - ONIX_FMCLINKCTRL = 23, // Open Ephys FMC Host Board coaxial headstage link control circuit - ONIX_DS90UB9RAW = 24, // Raw DS90UB9x deserializer - ONIX_TS4231V1ARR = 25, // Triad semiconductor TS421 optical to digital converter array targeting V1 base-stations - ONIX_MAX10ADCCORE = 26, // Max10 internal ADC device - ONIX_LOADTEST = 27, // Variable load testing device - ONIX_MEMUSAGE = 28, // Acquisition hardware buffer usage reporting device - // Accidentally skipped - ONIX_HARPSYNCINPUT = 30, // Harp synchronization data input device - ONIX_RHS2116 = 31, // Intan RHS2116 bioamplifier and stimulator - ONIX_RHS2116TRIGGER = 32, // Multi Intan RHS2116 stimulation trigger - ONIX_NRIC1384 = 33 // IMEC NRIC1384 384-channel bioaquisition chip -}; - -// Each hub has a "hidden" information device with a fixed device index and -// several read only registers -#define ONIX_HUB_DEV_IDX 254 // Device index - -// Hub device register addresses -enum { - ONIX_HUB_HARDWAREID = 0, // Hub hardware ID - ONIX_HUB_HARDWAREREV = 1, // Hub hardware revision - ONIX_HUB_FIRMWAREVER = 2, // Hub firmware version - ONIX_HUB_CLKRATEHZ = 4, // Hub clock rate in Hz - ONIX_HUB_DELAYNS = 5, // Hub to host transmission delay in nanoseconds -}; - -// NB: Hub IDs are 32-bit integers that uniquely identify the hub. They have the folowing format: -// Reserved(8-bit).Company(8-bit).Hub(16-bit) -// NB: If you add a hub here, make sure to update oni_hub_str(). -enum { - ONIX_HUB_NULL = 0, // Placeholder hub - ONIX_HUB_FMCHOST = 1, // Open Ephys FMC host - ONIX_HUB_HS64 = 2, // Open Ephys headstage-64 - ONIX_HUB_HSNP = 3, // Open Ephys headstage-neuropix1 - ONIX_HUB_HSRHS2116 = 4, // Open Ephys headstage-rhs2116 - ONIX_HUB_HS64S = 5, // Open Ephys headstage-64s - ONIX_HUB_HSNP1ET = 6, // Open Ephys headstage-neuropix1e-te - ONIX_HUB_HSNP2EB = 7, // Open Ephys headstage-neuropix2e-beta - ONIX_HUB_HSNP2E = 8, // Open Ephys headstage-neuropix2e - ONIX_HUB_HSNRIC1384 = 9, // Open Ephys headstage-nric1384 - ONIX_HUB_HSNP1EH = 10, // Open Ephys headstage-neuropix1e-hirose - ONIX_HUB_RHYTHM = 11 // Open Ephys Acquisition Board Rhythm wrapper - -}; - -// ONIX Specific configuration registers -enum { - ONIX_OPT_PASSTHROUGH = ONI_OPT_CUSTOMBEGIN, -}; - -// Human readable strings from IDs -ONI_EXPORT const char *onix_device_str(int dev_id); -ONI_EXPORT const char *onix_hub_str(int hub_hardware_id); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libONI/linux/liboni.so b/libONI/linux/liboni.so deleted file mode 100644 index a5e163d129dcca46f755e525428a4aa32585f4b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30760 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 Lov#^#si^#4{FEX2 diff --git a/libONI/osx/liboni.dylib b/libONI/osx/liboni.dylib deleted file mode 100644 index cbc38e4ea7e0e1378e9d6674a78d68af566aa93f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36568 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 diff --git a/libONI/win64/riffa.dll b/libONI/win64/riffa.dll deleted file mode 100644 index 9966d5e43e73bd22a4cccc0dff0a0d95f0c63949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17920 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 K$|`>~ll_0ce6cJ5 diff --git a/libONI/win64/riffa.lib b/libONI/win64/riffa.lib deleted file mode 100644 index 20b004beb5d78a168664e55de966cd7b0437f0ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3114 zcmcIm&1+LZ5T7J%K1&T+1ra5Mfc0Qo+oTpOnra10KS|SD;Uy-oZ8Tpdsn;r$QlwJo zAE2P%$*brwhu)MTh+y&Ht%8Dzr&7>5vmftm(o~bSF3j86nR)x$-TBSi*V-4$$7e6Q zJACEs{Dtzd9CZpM&@Hv78vu?2*fs&|P5?(AfOCtBXAOYFHO0lf4ZvgxdlEkvPZZ-& zoU2@1C5$g=+Th6eSU92$T%WiW9vqL1g|&QgdO8N0Haa;xyxR@)%+I}%8zyc17l3p#gkRq81=;ektj;M@^)obR7NQoQYdH;&P)&{-03J;IFa0QiL>;VrWR zG(#J-EF2w4#`D=icDm?m3!n214~`BAe_2PAre%--Qj|0=J{y^4U_dCIP3Lf(EejUQ z&W;+7fkx!n*lpDeS|!ZyZHL`;BUFvN@rnijI3p@(QR7r;d^qRtAV_}oXa>_HH> zvC$eC(iP}c7-EIa$AcR$*}`af)ftlDF5{^%q+1$^Ay4H%^u&<=koj6NdK#Co=Vep( zne}!lXJ&(y7b_bd5rC(+`kDQus)F*Es4A(d)E0t}tg3*tQ`|c_5Iw~m^4ZpMuBQ-w z4=UDsssZCqh5kgSG!u*Zyl0*69V%${&E#KSV``|I@5UwQGf{RPd|4;HS|kelu$v%; zR%1<7!+5fEdF1fb}z=3eTFKKl?^Jvzv%?Hy;E={%k4xx|M$TfzHk$QP{O_ df*4w@9FU(O1>?Ts(vK5};glHShr*Z}{s3jru`mDt diff --git a/liboni b/liboni new file mode 160000 index 0000000..9c73bbb --- /dev/null +++ b/liboni @@ -0,0 +1 @@ +Subproject commit 9c73bbb3b05461b30e01d43f9fc37994f696357e From e4d03d446901718ec56362c17bf1d4bfdc843b2b Mon Sep 17 00:00:00 2001 From: bparks13 Date: Wed, 9 Jul 2025 12:56:34 -0400 Subject: [PATCH 2/4] Update CMakeLists to automatically build dependencies - This is done by adding a custom command to the onix-source plugin as a pre-build step, and then linking the appropriate build objects --- CMakeLists.txt | 74 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c386d25..61f11ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,13 +66,69 @@ foreach( src_file IN ITEMS ${SRC_FILES}) source_group("${group_name}" FILES "${src_file}") endforeach() -#additional libraries, if needed +# add liboni project + set(LIBONI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liboni/api/liboni") -set(LIBONI_LIB_DIR "${LIBONI_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/ReleaseStatic") -set(LIBONI_DRIVER_DIR "${LIBONI_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release") -target_include_directories(${PLUGIN_NAME} PRIVATE ${LIBONI_DIR}) - -target_link_libraries(${PLUGIN_NAME} "${LIBONI_LIB_DIR}/liboni.lib") -target_link_libraries(${PLUGIN_NAME} "${LIBONI_DRIVER_DIR}/riffa.lib") -target_link_libraries(${PLUGIN_NAME} "${LIBONI_DRIVER_DIR}/onidriver_riffa.lib") -install(FILES "${LIBONI_DRIVER_DIR}/riffa.dll" "${LIBONI_DRIVER_DIR}/libonidriver_riffa.dll" DESTINATION ${GUI_BIN_DIR}/shared) +set(LIBONI_NAME liboni) + +add_custom_command( + TARGET "${PLUGIN_NAME}" + PRE_BUILD + COMMAND ${CMAKE_MAKE_PROGRAM} "${LIBONI_DIR}/liboni.vcxproj" /p:Configuration=ReleaseStatic /p:Platform=${CMAKE_LIBRARY_ARCHITECTURE} + WORKING_DIRECTORY "${LIBONI_DIR}" + COMMENT "Building liboni" + VERBATIM +) + +add_library("${LIBONI_NAME}" STATIC IMPORTED) +set_target_properties("${LIBONI_NAME}" PROPERTIES + IMPORTED_LOCATION "${LIBONI_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/ReleaseStatic/liboni.lib" + INTERFACE_INCLUDE_DIRECTORIES "${LIBONI_DIR}") + +target_link_libraries(${PLUGIN_NAME} "${LIBONI_NAME}") + +# add riffa project + +set(RIFFA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liboni/drivers/riffa/windows/lib") +set(RIFFA_NAME riffa) + +add_custom_command( + TARGET "${PLUGIN_NAME}" + PRE_BUILD + COMMAND ${CMAKE_MAKE_PROGRAM} "${RIFFA_DIR}/riffa.vcxproj" /p:Configuration=Release /p:Platform=${CMAKE_LIBRARY_ARCHITECTURE} + WORKING_DIRECTORY "${RIFFA_DIR}" + COMMENT "Building riffa" + VERBATIM +) + +add_library("${RIFFA_NAME}" STATIC IMPORTED) +set_target_properties("${RIFFA_NAME}" PROPERTIES + IMPORTED_LOCATION "${RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/riffa.lib" + INTERFACE_INCLUDE_DIRECTORIES "${RIFFA_DIR}") + +target_link_libraries(${PLUGIN_NAME} "${RIFFA_NAME}") + +# add onidriver_riffa project + +set(ONIDRIVER_RIFFA_DIR "${LIBONI_DIR}/drivers/riffa") +set(ONIDRIVER_RIFFA_NAME libonidriver_riffa) + +add_custom_command( + TARGET "${PLUGIN_NAME}" + PRE_BUILD + COMMAND ${CMAKE_MAKE_PROGRAM} "${ONIDRIVER_RIFFA_DIR}/onidriver_riffa.vcxproj" /p:Configuration=Release /p:Platform=${CMAKE_LIBRARY_ARCHITECTURE} + WORKING_DIRECTORY "${ONIDRIVER_RIFFA_DIR}" + COMMENT "Building onidriver_riffa" + VERBATIM +) + +add_library("${ONIDRIVER_RIFFA_NAME}" STATIC IMPORTED) +set_target_properties("${ONIDRIVER_RIFFA_NAME}" PROPERTIES + IMPORTED_LOCATION "${ONIDRIVER_RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/onidriver_riffa.lib" + INTERFACE_INCLUDE_DIRECTORIES "${ONIDRIVER_RIFFA_DIR}") + +target_link_libraries(${PLUGIN_NAME} "${ONIDRIVER_RIFFA_NAME}") + +# # Ensure needed DLLs are installed to the shared folder + +install(FILES "${RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/riffa.dll" "${ONIDRIVER_RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/${ONIDRIVER_RIFFA_NAME}.dll" DESTINATION ${GUI_BIN_DIR}/shared) From 7351dea8fff19c2997dc7f383054f2a270d24e05 Mon Sep 17 00:00:00 2001 From: bparks13 Date: Wed, 9 Jul 2025 13:09:01 -0400 Subject: [PATCH 3/4] Remove manual steps from README --- README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.md b/README.md index 6ec5b50..a4cc210 100644 --- a/README.md +++ b/README.md @@ -37,18 +37,6 @@ For existing clones of the repo, run `git submodule update --init --recursive` t **Requirements:** [Visual Studio](https://visualstudio.microsoft.com/) and [CMake](https://cmake.org/install/) -#### Build liboni and associated drivers - -Enter the `liboni/api/liboni` directory, and open the `liboni.sln` file using Visual Studio. Alternatively, build the project from the command line using `msbuild` or equivalent command. - -To ensure that this project functions correctly, the following projects must be built so that they can be properly linked by the `cmake` command below: - -- `liboni` -- `onidriver_riffa` -- `riffa` - -NOTE: For proper linking, these projects must be built using the `ReleaseStatic` configuration. This will create `liboni` as a static library, while leaving the other two libraries as dynamic. - #### Create OnixSource project using CMAKE From the `Build` directory, enter: From f80b4be2b7d5792758a1d313220f6b785822779c Mon Sep 17 00:00:00 2001 From: Aaron Cuevas Lopez Date: Thu, 10 Jul 2025 00:48:27 +0200 Subject: [PATCH 4/4] Make CMake use native VS projects in the plugin solution --- CMakeLists.txt | 71 ++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61f11ee..7e985f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.5.0) + if (NOT DEFINED GUI_BASE_DIR) if (DEFINED ENV{GUI_BASE_DIR}) set(GUI_BASE_DIR $ENV{GUI_BASE_DIR}) @@ -66,69 +67,71 @@ foreach( src_file IN ITEMS ${SRC_FILES}) source_group("${group_name}" FILES "${src_file}") endforeach() + +function(vs_set_all_configurations target_name target_config_name) + foreach(config ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${config} config_upper) + set_property( + TARGET ${target_name} + APPEND PROPERTY MAP_IMPORTED_CONFIG_${config_upper} "${target_config_name}" + ) + endforeach() +endfunction() + + # add liboni project set(LIBONI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liboni/api/liboni") set(LIBONI_NAME liboni) +set(LIBONI_PNAME "submodule_${LIBONI_NAME}") -add_custom_command( - TARGET "${PLUGIN_NAME}" - PRE_BUILD - COMMAND ${CMAKE_MAKE_PROGRAM} "${LIBONI_DIR}/liboni.vcxproj" /p:Configuration=ReleaseStatic /p:Platform=${CMAKE_LIBRARY_ARCHITECTURE} - WORKING_DIRECTORY "${LIBONI_DIR}" - COMMENT "Building liboni" - VERBATIM +include_external_msproject ( + ${LIBONI_PNAME} + "${LIBONI_DIR}/liboni.vcxproj" + PLATFORM ${CMAKE_LIBRARY_ARCHITECTURE} ) +vs_set_all_configurations(${LIBONI_PNAME} "ReleaseStatic") + add_library("${LIBONI_NAME}" STATIC IMPORTED) set_target_properties("${LIBONI_NAME}" PROPERTIES IMPORTED_LOCATION "${LIBONI_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/ReleaseStatic/liboni.lib" INTERFACE_INCLUDE_DIRECTORIES "${LIBONI_DIR}") +add_dependencies(${LIBONI_NAME} ${LIBONI_PNAME}) target_link_libraries(${PLUGIN_NAME} "${LIBONI_NAME}") # add riffa project set(RIFFA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liboni/drivers/riffa/windows/lib") set(RIFFA_NAME riffa) +set(RIFFA_PNAME "submodule_${RIFFA_NAME}") -add_custom_command( - TARGET "${PLUGIN_NAME}" - PRE_BUILD - COMMAND ${CMAKE_MAKE_PROGRAM} "${RIFFA_DIR}/riffa.vcxproj" /p:Configuration=Release /p:Platform=${CMAKE_LIBRARY_ARCHITECTURE} - WORKING_DIRECTORY "${RIFFA_DIR}" - COMMENT "Building riffa" - VERBATIM +include_external_msproject ( + ${RIFFA_PNAME} + "${RIFFA_DIR}/riffa.vcxproj" + PLATFORM ${CMAKE_LIBRARY_ARCHITECTURE} ) -add_library("${RIFFA_NAME}" STATIC IMPORTED) -set_target_properties("${RIFFA_NAME}" PROPERTIES - IMPORTED_LOCATION "${RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/riffa.lib" - INTERFACE_INCLUDE_DIRECTORIES "${RIFFA_DIR}") - -target_link_libraries(${PLUGIN_NAME} "${RIFFA_NAME}") +vs_set_all_configurations(${RIFFA_PNAME} "Release") # add onidriver_riffa project set(ONIDRIVER_RIFFA_DIR "${LIBONI_DIR}/drivers/riffa") set(ONIDRIVER_RIFFA_NAME libonidriver_riffa) +set(ONIDRIVER_RIFFA_PNAME "submodule_${ONIDRIVER_RIFFA_NAME}") -add_custom_command( - TARGET "${PLUGIN_NAME}" - PRE_BUILD - COMMAND ${CMAKE_MAKE_PROGRAM} "${ONIDRIVER_RIFFA_DIR}/onidriver_riffa.vcxproj" /p:Configuration=Release /p:Platform=${CMAKE_LIBRARY_ARCHITECTURE} - WORKING_DIRECTORY "${ONIDRIVER_RIFFA_DIR}" - COMMENT "Building onidriver_riffa" - VERBATIM +include_external_msproject ( + ${ONIDRIVER_RIFFA_PNAME} + "${ONIDRIVER_RIFFA_DIR}/onidriver_riffa.vcxproj" + PLATFORM ${CMAKE_LIBRARY_ARCHITECTURE} ) -add_library("${ONIDRIVER_RIFFA_NAME}" STATIC IMPORTED) -set_target_properties("${ONIDRIVER_RIFFA_NAME}" PROPERTIES - IMPORTED_LOCATION "${ONIDRIVER_RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/onidriver_riffa.lib" - INTERFACE_INCLUDE_DIRECTORIES "${ONIDRIVER_RIFFA_DIR}") +vs_set_all_configurations(${ONIDRIVER_RIFFA_PNAME} "Release") + -target_link_libraries(${PLUGIN_NAME} "${ONIDRIVER_RIFFA_NAME}") +add_dependencies(${ONIDRIVER_RIFFA_PNAME} ${RIFFA_PNAME}) -# # Ensure needed DLLs are installed to the shared folder +# Ensure needed DLLs are installed to the shared folder -install(FILES "${RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/riffa.dll" "${ONIDRIVER_RIFFA_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/Release/${ONIDRIVER_RIFFA_NAME}.dll" DESTINATION ${GUI_BIN_DIR}/shared) +install(FILES "${CMAKE_BINARY_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/$/riffa.dll" "${CMAKE_BINARY_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/$/${ONIDRIVER_RIFFA_NAME}.dll" DESTINATION ${GUI_BIN_DIR}/shared)