diff --git a/.gitignore b/.gitignore index 6f18ba50..5e5bf233 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode +.vs config.h build/ html/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a13e22c..48547647 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,10 +62,10 @@ foreach(example ${EXAMPLE_LIST}) # Link arm64 or x64 version of libFlexivRdk if (${BUILD_FOR_ARM64}) target_link_libraries(${example} - ${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp/arm64/libFlexivRdk.a) + ${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/cpp/arm64/libFlexivRdk.a) else() target_link_libraries(${example} - ${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp/x64/libFlexivRdk.a) + ${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/cpp/x64/libFlexivRdk.a) endif() endforeach() @@ -108,10 +108,10 @@ foreach(test ${TEST_LIST}) # Link arm64 or x64 version of libFlexivRdk if (${BUILD_FOR_ARM64}) target_link_libraries(${test} - ${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp/arm64/libFlexivRdk.a) + ${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/cpp/arm64/libFlexivRdk.a) else() target_link_libraries(${test} - ${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp/x64/libFlexivRdk.a) + ${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/cpp/x64/libFlexivRdk.a) endif() endforeach() diff --git a/README.md b/README.md index cb316f10..3ba4fc43 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,7 @@ ![CMake Badge](https://github.com/flexivrobotics/flexiv_rdk/actions/workflows/cmake.yml/badge.svg) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) -Flexiv RDK (Robot Development Kit) is a powerful toolkit as an add-on to the Flexiv software platform. It enables the users to create complex applications with APIs that provide low-level real-time access to the robot. - -**C++** (access to all APIs) and **Python** (access to non-real-time APIs only) are supported. +Flexiv RDK (Robotic Development Kit), a key component of the Flexiv Robotic Software Platform, is a powerful development toolkit that enables the users to create complex and customized robotic applications using APIs that provide both low-level real-time (RT) and high-level non-real-time (NRT) access to Flexiv robots. ## License @@ -15,30 +13,46 @@ Flexiv RDK is licensed under the [Apache 2.0 license](https://www.apache.org/lic [Flexiv RDK main webpage](https://rdk.flexiv.com/) contains important information like the user manual and API documentation, please read them carefully before proceeding. +## OS and language support + +Supported OS: + +* Linux: Ubuntu 18.04 / 20.04 +* Windows: 10 with MSVC 14.0+ + +Supported programming languages: + +* C++ (Linux and Windows) +* Python (Linux only) + ## Run example programs -**NOTE:** the instruction below is only a quick reference, assuming you've already gone through the Flexiv RDK Manual. +**NOTE:** the instruction below is only a quick reference, assuming you've already gone through [Flexiv RDK Manual](https://rdk.flexiv.com/manual/). -### C++ interface +### Linux C++ interface -1. Configure and compile example programs for x64 processors: +1. Configure CMake and compile all C++ example programs for the x64 processor platform: cd flexiv_rdk mkdir build && cd build cmake .. make -j4 - For arm64 processors, set the additional CMake option when configuring: + If compiling for the arm64 processor platform, set the additional CMake option when configuring: cmake .. -DBUILD_FOR_ARM64=ON 2. The compiled program binaries will be output to ``flexiv_rdk/build/example`` -3. Assume the robot is booted and connected, to run an example program: +3. Assume the robot is booted and connected, to run an example program from a Linux Terminal: cd flexiv_rdk/build/example + ./ <...> + + If ``flexiv::Scheduler`` is used in this program, then ``sudo`` is required to grant root privileges to the integrated scheduler: + sudo ./ <...> -### Python interface +### Linux Python interface **NOTE:** Python 3.8 is required to use this interface, see Flexiv RDK Manual for more details. @@ -46,14 +60,27 @@ Flexiv RDK is licensed under the [Apache 2.0 license](https://www.apache.org/lic python3 --version -2. Assume the robot is booted and connected, to run an example program: +2. Assume the robot is booted and connected, to run an example program from a Linux Terminal: cd flexiv_rdk/example_py - sudo python3 .py <...> + python3 .py <...> + + Note that ``sudo`` is not required for Python interface. + +### Windows C++ interface + +1. Install any edition of Microsoft Visual Studio with version 2010 or above. +2. Use Visual Studio to open the example solution file at ``flexiv_rdk\example\windows\windows.sln``. Several example projects are pre-configured for x64 and x86 processor platforms, with each of them corresponding to an example under ``flexiv_rdk\example\``. +3. Check that the global solution configuration is set to **Release**. This setting can usually be found near the top menu bar. +4. Use *Build* -> *Build Solution* to compile all example projects. The compiled ``.exe`` executable binary files are output to ``flexiv_rdk\build\windows\``. +5. Assume the robot is booted and connected, to run an example program from a Windows Command Prompt: + + cd flexiv_rdk_dev\build\windows\\Release\ + .exe <...> ## Integrated visualization -Flexiv RDK has integrated visualization (only available for C++ interface) based on Meshcat. To use this feature: +Flexiv RDK has integrated visualization (only available for **Linux C++ interface**) based on Meshcat. To use this feature: 1. Install Meshcat server using ``pip``: diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index cbd72224..df498bf1 100755 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -38,7 +38,7 @@ PROJECT_NAME = "Flexiv RDK APIs" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "0.5.0" +PROJECT_NUMBER = "0.5" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/example/auto_recovery.cpp b/example/auto_recovery.cpp index 5094b5bf..c64320e5 100644 --- a/example/auto_recovery.cpp +++ b/example/auto_recovery.cpp @@ -44,7 +44,14 @@ int main(int argc, char* argv[]) // Enable the robot, make sure the E-stop is released before enabling log.info("Enabling robot ..."); - robot.enable(); + // TODO: remove this extra try catch block after the destructor bug in + // Windows library is fixed + try { + robot.enable(); + } catch (const flexiv::Exception& e) { + log.error(e.what()); + return 0; + } // Application-specific Code //============================================================================= diff --git a/example/display_robot_states.cpp b/example/display_robot_states.cpp index 40d2fb38..9d91268a 100644 --- a/example/display_robot_states.cpp +++ b/example/display_robot_states.cpp @@ -8,57 +8,39 @@ #include #include #include -#include #include -#include #include -#include -namespace { -/** Mutex on shared data */ -std::mutex g_mutex; -} - -/** User-defined high-priority periodic task @ 1kHz */ -void highPriorityTask(flexiv::Robot* robot, flexiv::RobotStates* robotStates, - flexiv::Scheduler* scheduler, flexiv::Log* log) +/** User-defined periodic task @ 1Hz */ +void periodicTask(flexiv::Robot* robot, flexiv::Log* log) { + unsigned int printCounter = 0; + + // Data struct for storing robot states + flexiv::RobotStates robotStates; + try { - // Safely write shared data - std::lock_guard lock(g_mutex); - // Get robot states - robot->getRobotStates(robotStates); + while (true) { + // Wake up every second to do something + std::this_thread::sleep_for(std::chrono::seconds(1)); - } catch (const flexiv::Exception& e) { - log->error(e.what()); - scheduler->stop(); - } -} + // Get robot states + robot->getRobotStates(&robotStates); -/** User-defined low-priority periodic task @ 1Hz */ -void lowPriorityTask(flexiv::RobotStates* robotStates) -{ - static unsigned int printCounter = 0; - constexpr size_t k_nominalDof = 7; - - // Safely read shared data - flexiv::RobotStates robotStatesCopy; - { - std::lock_guard lock(g_mutex); - robotStatesCopy = *robotStates; - } + // Print all robot states in JSON format using the built-in ostream + // operator overloading + std::cout << "\n\n[" << ++printCounter << "]"; + std::cout + << "=========================================================" + << std::endl; - // Print only when the data is valid - if (robotStatesCopy.m_q.size() == k_nominalDof) { - // Print divider - std::cout << "\n\n[" << ++printCounter << "]"; - std::cout << "=========================================================" - << std::endl; + std::cout << robotStates << std::endl; + } - // Print all robot states in JSON format using the built-in ostream - // operator overloading - std::cout << robotStatesCopy << std::endl; + } catch (const flexiv::Exception& e) { + log->error(e.what()); + return; } } @@ -86,21 +68,45 @@ int main(int argc, char* argv[]) // Instantiate robot interface flexiv::Robot robot(robotIP, localIP); - // Create data struct for storing robot states - flexiv::RobotStates robotStates; + // Clear fault on robot server if any + if (robot.isFault()) { + log.warn("Fault occurred on robot server, trying to clear ..."); + // Try to clear the fault + robot.clearFault(); + std::this_thread::sleep_for(std::chrono::seconds(2)); + // Check again + if (robot.isFault()) { + log.error("Fault cannot be cleared, exiting ..."); + return 0; + } + log.info("Fault on robot server is cleared"); + } + + // Enable the robot, make sure the E-stop is released before enabling + log.info("Enabling robot ..."); + // TODO: remove this extra try catch block after the destructor bug in + // Windows library is fixed + try { + robot.enable(); + } catch (const flexiv::Exception& e) { + log.error(e.what()); + return 0; + } + + // Wait for the robot to become operational + while (!robot.isOperational()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + log.info("Robot is now operational"); // Periodic Tasks //============================================================================= - flexiv::Scheduler scheduler; - // Add periodic task with 1ms interval and highest applicable priority - scheduler.addTask( - std::bind(highPriorityTask, &robot, &robotStates, &scheduler, &log), - "HP periodic", 1, 45); - // Add periodic task with 1s interval and lowest applicable priority - scheduler.addTask( - std::bind(lowPriorityTask, &robotStates), "LP periodic", 1000, 0); - // Start all added tasks, this is by default a blocking method - scheduler.start(); + // Use std::thread to do scheduling since this example is used for both + // Linux and Windows, and the latter does not support flexiv::Scheduler + std::thread lowPriorityThread(std::bind(periodicTask, &robot, &log)); + + // Properly exit thread + lowPriorityThread.join(); } catch (const flexiv::Exception& e) { log.error(e.what()); diff --git a/example/gripper_control.cpp b/example/gripper_control.cpp index ca1489f2..9908fe54 100644 --- a/example/gripper_control.cpp +++ b/example/gripper_control.cpp @@ -54,7 +54,14 @@ int main(int argc, char* argv[]) // Enable the robot, make sure the E-stop is released before enabling log.info("Enabling robot ..."); - robot.enable(); + // TODO: remove this extra try catch block after the destructor bug in + // Windows library is fixed + try { + robot.enable(); + } catch (const flexiv::Exception& e) { + log.error(e.what()); + return 0; + } // Wait for the robot to become operational while (!robot.isOperational()) { @@ -99,7 +106,7 @@ int main(int argc, char* argv[]) log.info("Opening fingers"); gripper.move(0.08, 0.1); std::this_thread::sleep_for(std::chrono::milliseconds(500)); - log.info("Stopping grippergripper"); + log.info("Stopping gripper"); gripper.stop(); } catch (const flexiv::Exception& e) { diff --git a/example/plan_execution.cpp b/example/plan_execution.cpp index 0367e749..80c1af0b 100644 --- a/example/plan_execution.cpp +++ b/example/plan_execution.cpp @@ -153,7 +153,14 @@ int main(int argc, char* argv[]) // Enable the robot, make sure the E-stop is released before enabling log.info("Enabling robot ..."); - robot.enable(); + // TODO: remove this extra try catch block after the destructor bug in + // Windows library is fixed + try { + robot.enable(); + } catch (const flexiv::Exception& e) { + log.error(e.what()); + return 0; + } // Wait for the robot to become operational while (!robot.isOperational()) { diff --git a/example/primitive_execution.cpp b/example/primitive_execution.cpp index 8e160bbd..11c6b2ac 100644 --- a/example/primitive_execution.cpp +++ b/example/primitive_execution.cpp @@ -208,7 +208,14 @@ int main(int argc, char* argv[]) // Enable the robot, make sure the E-stop is released before enabling log.info("Enabling robot ..."); - robot.enable(); + // TODO: remove this extra try catch block after the destructor bug in + // Windows library is fixed + try { + robot.enable(); + } catch (const flexiv::Exception& e) { + log.error(e.what()); + return 0; + } // Wait for the robot to become operational while (!robot.isOperational()) { diff --git a/example/windows/auto_recovery/auto_recovery.vcxproj b/example/windows/auto_recovery/auto_recovery.vcxproj new file mode 100644 index 00000000..fa66e6e2 --- /dev/null +++ b/example/windows/auto_recovery/auto_recovery.vcxproj @@ -0,0 +1,102 @@ + + + + + Release + Win32 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {e4d92af2-66f5-4e1f-83ee-70c84bb45a14} + auto_recovery + 10.0 + + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x86\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x64\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + + \ No newline at end of file diff --git a/example/windows/auto_recovery/auto_recovery.vcxproj.filters b/example/windows/auto_recovery/auto_recovery.vcxproj.filters new file mode 100644 index 00000000..5ca5fa55 --- /dev/null +++ b/example/windows/auto_recovery/auto_recovery.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/example/windows/auto_recovery/auto_recovery.vcxproj.user b/example/windows/auto_recovery/auto_recovery.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/example/windows/auto_recovery/auto_recovery.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/example/windows/clear_fault/clear_fault.vcxproj b/example/windows/clear_fault/clear_fault.vcxproj new file mode 100644 index 00000000..9b595f3c --- /dev/null +++ b/example/windows/clear_fault/clear_fault.vcxproj @@ -0,0 +1,102 @@ + + + + + Release + Win32 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {fbccaaba-4e1a-431c-a94a-e8b207d73c08} + clear_fault + 10.0 + + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x86\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x64\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + + \ No newline at end of file diff --git a/example/windows/clear_fault/clear_fault.vcxproj.filters b/example/windows/clear_fault/clear_fault.vcxproj.filters new file mode 100644 index 00000000..acfb6a91 --- /dev/null +++ b/example/windows/clear_fault/clear_fault.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/example/windows/clear_fault/clear_fault.vcxproj.user b/example/windows/clear_fault/clear_fault.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/example/windows/clear_fault/clear_fault.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/example/windows/display_robot_states/display_robot_states.vcxproj b/example/windows/display_robot_states/display_robot_states.vcxproj new file mode 100644 index 00000000..77492f00 --- /dev/null +++ b/example/windows/display_robot_states/display_robot_states.vcxproj @@ -0,0 +1,102 @@ + + + + + Release + Win32 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {34b0f436-2500-4328-b981-af66ef54a1d6} + displayrobotstates + 10.0 + + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x86\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x64\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + + \ No newline at end of file diff --git a/example/windows/display_robot_states/display_robot_states.vcxproj.filters b/example/windows/display_robot_states/display_robot_states.vcxproj.filters new file mode 100644 index 00000000..ecf08557 --- /dev/null +++ b/example/windows/display_robot_states/display_robot_states.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/example/windows/display_robot_states/display_robot_states.vcxproj.user b/example/windows/display_robot_states/display_robot_states.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/example/windows/display_robot_states/display_robot_states.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/example/windows/gripper_control/gripper_control.vcxproj b/example/windows/gripper_control/gripper_control.vcxproj new file mode 100644 index 00000000..e4b6495c --- /dev/null +++ b/example/windows/gripper_control/gripper_control.vcxproj @@ -0,0 +1,102 @@ + + + + + Release + Win32 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {9060ade2-9b80-43a6-b354-ee074e2c7862} + gripper_control + 10.0 + + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x86\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x64\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + + \ No newline at end of file diff --git a/example/windows/gripper_control/gripper_control.vcxproj.filters b/example/windows/gripper_control/gripper_control.vcxproj.filters new file mode 100644 index 00000000..274dae89 --- /dev/null +++ b/example/windows/gripper_control/gripper_control.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/example/windows/gripper_control/gripper_control.vcxproj.user b/example/windows/gripper_control/gripper_control.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/example/windows/gripper_control/gripper_control.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/example/windows/plan_execution/plan_execution.vcxproj b/example/windows/plan_execution/plan_execution.vcxproj new file mode 100644 index 00000000..a3afbee1 --- /dev/null +++ b/example/windows/plan_execution/plan_execution.vcxproj @@ -0,0 +1,102 @@ + + + + + Release + Win32 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {7508d147-1bfe-408a-9843-9d567e845502} + plan_execution + 10.0 + + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x86\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x64\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + + \ No newline at end of file diff --git a/example/windows/plan_execution/plan_execution.vcxproj.filters b/example/windows/plan_execution/plan_execution.vcxproj.filters new file mode 100644 index 00000000..1d548e30 --- /dev/null +++ b/example/windows/plan_execution/plan_execution.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/example/windows/plan_execution/plan_execution.vcxproj.user b/example/windows/plan_execution/plan_execution.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/example/windows/plan_execution/plan_execution.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/example/windows/primitive_execution/primitive_execution.vcxproj b/example/windows/primitive_execution/primitive_execution.vcxproj new file mode 100644 index 00000000..82c7d297 --- /dev/null +++ b/example/windows/primitive_execution/primitive_execution.vcxproj @@ -0,0 +1,102 @@ + + + + + Release + Win32 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {781a43e7-b6aa-42e1-ba64-b4d93d9e9c95} + primitive_execution + 10.0 + + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\ + $(SolutionDir)\..\..\build\windows\$(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x86\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\..\include\;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)\..\..\lib\windows\cpp\x64\;%(AdditionalLibraryDirectories) + FvrBase.lib;FlexivRdk.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + + \ No newline at end of file diff --git a/example/windows/primitive_execution/primitive_execution.vcxproj.filters b/example/windows/primitive_execution/primitive_execution.vcxproj.filters new file mode 100644 index 00000000..bd40dabc --- /dev/null +++ b/example/windows/primitive_execution/primitive_execution.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/example/windows/primitive_execution/primitive_execution.vcxproj.user b/example/windows/primitive_execution/primitive_execution.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/example/windows/primitive_execution/primitive_execution.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/example/windows/windows.sln b/example/windows/windows.sln new file mode 100644 index 00000000..f97c4f3c --- /dev/null +++ b/example/windows/windows.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32407.343 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "display_robot_states", "display_robot_states\display_robot_states.vcxproj", "{34B0F436-2500-4328-B981-AF66EF54A1D6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "clear_fault", "clear_fault\clear_fault.vcxproj", "{FBCCAABA-4E1A-431C-A94A-E8B207D73C08}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plan_execution", "plan_execution\plan_execution.vcxproj", "{7508D147-1BFE-408A-9843-9D567E845502}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "auto_recovery", "auto_recovery\auto_recovery.vcxproj", "{E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "primitive_execution", "primitive_execution\primitive_execution.vcxproj", "{781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gripper_control", "gripper_control\gripper_control.vcxproj", "{9060ADE2-9B80-43A6-B354-EE074E2C7862}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {34B0F436-2500-4328-B981-AF66EF54A1D6}.Debug|x64.ActiveCfg = Release|x64 + {34B0F436-2500-4328-B981-AF66EF54A1D6}.Debug|x86.ActiveCfg = Release|Win32 + {34B0F436-2500-4328-B981-AF66EF54A1D6}.Release|x64.ActiveCfg = Release|x64 + {34B0F436-2500-4328-B981-AF66EF54A1D6}.Release|x64.Build.0 = Release|x64 + {34B0F436-2500-4328-B981-AF66EF54A1D6}.Release|x86.ActiveCfg = Release|Win32 + {34B0F436-2500-4328-B981-AF66EF54A1D6}.Release|x86.Build.0 = Release|Win32 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Debug|x64.ActiveCfg = Release|x64 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Debug|x64.Build.0 = Release|x64 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Debug|x86.ActiveCfg = Release|Win32 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Debug|x86.Build.0 = Release|Win32 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Release|x64.ActiveCfg = Release|x64 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Release|x64.Build.0 = Release|x64 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Release|x86.ActiveCfg = Release|Win32 + {FBCCAABA-4E1A-431C-A94A-E8B207D73C08}.Release|x86.Build.0 = Release|Win32 + {7508D147-1BFE-408A-9843-9D567E845502}.Debug|x64.ActiveCfg = Release|x64 + {7508D147-1BFE-408A-9843-9D567E845502}.Debug|x64.Build.0 = Release|x64 + {7508D147-1BFE-408A-9843-9D567E845502}.Debug|x86.ActiveCfg = Release|Win32 + {7508D147-1BFE-408A-9843-9D567E845502}.Debug|x86.Build.0 = Release|Win32 + {7508D147-1BFE-408A-9843-9D567E845502}.Release|x64.ActiveCfg = Release|x64 + {7508D147-1BFE-408A-9843-9D567E845502}.Release|x64.Build.0 = Release|x64 + {7508D147-1BFE-408A-9843-9D567E845502}.Release|x86.ActiveCfg = Release|Win32 + {7508D147-1BFE-408A-9843-9D567E845502}.Release|x86.Build.0 = Release|Win32 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Debug|x64.ActiveCfg = Release|x64 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Debug|x64.Build.0 = Release|x64 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Debug|x86.ActiveCfg = Release|Win32 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Debug|x86.Build.0 = Release|Win32 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Release|x64.ActiveCfg = Release|x64 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Release|x64.Build.0 = Release|x64 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Release|x86.ActiveCfg = Release|Win32 + {E4D92AF2-66F5-4E1F-83EE-70C84BB45A14}.Release|x86.Build.0 = Release|Win32 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Debug|x64.ActiveCfg = Release|x64 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Debug|x64.Build.0 = Release|x64 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Debug|x86.ActiveCfg = Release|Win32 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Debug|x86.Build.0 = Release|Win32 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Release|x64.ActiveCfg = Release|x64 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Release|x64.Build.0 = Release|x64 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Release|x86.ActiveCfg = Release|Win32 + {781A43E7-B6AA-42E1-BA64-B4D93D9E9C95}.Release|x86.Build.0 = Release|Win32 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Debug|x64.ActiveCfg = Release|x64 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Debug|x64.Build.0 = Release|x64 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Debug|x86.ActiveCfg = Release|Win32 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Debug|x86.Build.0 = Release|Win32 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Release|x64.ActiveCfg = Release|x64 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Release|x64.Build.0 = Release|x64 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Release|x86.ActiveCfg = Release|Win32 + {9060ADE2-9B80-43A6-B354-EE074E2C7862}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {504EAA0B-F2BB-4533-BCCB-C3F7F15216AC} + EndGlobalSection +EndGlobal diff --git a/example_py/auto_recovery.py b/example_py/auto_recovery.py index 333eb35c..e3653516 100644 --- a/example_py/auto_recovery.py +++ b/example_py/auto_recovery.py @@ -17,7 +17,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -42,8 +42,8 @@ def main(): robot = flexivrdk.Robot(args.robot_ip, args.local_ip) # Enable the robot, make sure the E-stop is released before enabling - robot.enable() log.info("Enabling robot ...") + robot.enable() # Application-specific Code # ============================================================================= diff --git a/example_py/clear_fault.py b/example_py/clear_fault.py index 405d9520..ec52c287 100644 --- a/example_py/clear_fault.py +++ b/example_py/clear_fault.py @@ -14,7 +14,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on diff --git a/example_py/display_robot_states.py b/example_py/display_robot_states.py index 8456a638..984c2fa8 100644 --- a/example_py/display_robot_states.py +++ b/example_py/display_robot_states.py @@ -14,7 +14,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -39,6 +39,27 @@ def main(): # Instantiate robot interface robot = flexivrdk.Robot(args.robot_ip, args.local_ip) + # Clear fault on robot server if any + if robot.isFault(): + log.warn("Fault occurred on robot server, trying to clear ...") + # Try to clear the fault + robot.clearFault() + time.sleep(2) + # Check again + if robot.isFault(): + log.error("Fault cannot be cleared, exiting ...") + return + log.info("Fault on robot server is cleared") + + # Enable the robot, make sure the E-stop is released before enabling + log.info("Enabling robot ...") + robot.enable() + + # Wait for the robot to become operational + while not robot.isOperational(): + time.sleep(1) + log.info("Robot is now operational") + # Application-specific Code # ============================================================================= while True: diff --git a/example_py/gripper_control.py b/example_py/gripper_control.py index da9419c6..5e43a2f3 100644 --- a/example_py/gripper_control.py +++ b/example_py/gripper_control.py @@ -15,7 +15,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -55,8 +55,8 @@ def main(): log.info("Fault on robot server is cleared") # Enable the robot, make sure the E-stop is released before enabling - robot.enable() log.info("Enabling robot ...") + robot.enable() # Wait for the robot to become operational while not robot.isOperational(): diff --git a/example_py/nrt_cartesian_impedance_control.py b/example_py/nrt_cartesian_impedance_control.py index 2b9ae6b9..d80648b5 100644 --- a/example_py/nrt_cartesian_impedance_control.py +++ b/example_py/nrt_cartesian_impedance_control.py @@ -15,7 +15,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -66,8 +66,8 @@ def main(): log.info("Fault on robot server is cleared") # Enable the robot, make sure the E-stop is released before enabling - robot.enable() log.info("Enabling robot ...") + robot.enable() # Wait for the robot to become operational while not robot.isOperational(): diff --git a/example_py/nrt_joint_position_control.py b/example_py/nrt_joint_position_control.py index 510cdba5..b5b80758 100644 --- a/example_py/nrt_joint_position_control.py +++ b/example_py/nrt_joint_position_control.py @@ -15,7 +15,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -66,8 +66,8 @@ def main(): log.info("Fault on robot server is cleared") # Enable the robot, make sure the E-stop is released before enabling - robot.enable() log.info("Enabling robot ...") + robot.enable() # Wait for the robot to become operational while not robot.isOperational(): diff --git a/example_py/plan_execution.py b/example_py/plan_execution.py index 8eb2debb..94966c8a 100644 --- a/example_py/plan_execution.py +++ b/example_py/plan_execution.py @@ -14,7 +14,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -52,8 +52,8 @@ def main(): log.info("Fault on robot server is cleared") # Enable the robot, make sure the E-stop is released before enabling - robot.enable() log.info("Enabling robot ...") + robot.enable() # Wait for the robot to become operational while not robot.isOperational(): diff --git a/example_py/primitive_execution.py b/example_py/primitive_execution.py index c8641c83..01d9cb8f 100644 --- a/example_py/primitive_execution.py +++ b/example_py/primitive_execution.py @@ -14,7 +14,7 @@ # Import Flexiv RDK Python library # fmt: off import sys -sys.path.insert(0, "../lib/python/x64/") +sys.path.insert(0, "../lib/linux/python/x64/") import flexivrdk # fmt: on @@ -52,8 +52,8 @@ def main(): log.info("Fault on robot server is cleared") # Enable the robot, make sure the E-stop is released before enabling - robot.enable() log.info("Enabling robot ...") + robot.enable() # Wait for the robot to become operational while not robot.isOperational(): diff --git a/lib/cpp/arm64/libFlexivRdk.a b/lib/linux/cpp/arm64/libFlexivRdk.a similarity index 94% rename from lib/cpp/arm64/libFlexivRdk.a rename to lib/linux/cpp/arm64/libFlexivRdk.a index 6752c822..acf3a556 100644 Binary files a/lib/cpp/arm64/libFlexivRdk.a and b/lib/linux/cpp/arm64/libFlexivRdk.a differ diff --git a/lib/cpp/x64/libFlexivRdk.a b/lib/linux/cpp/x64/libFlexivRdk.a similarity index 93% rename from lib/cpp/x64/libFlexivRdk.a rename to lib/linux/cpp/x64/libFlexivRdk.a index 55371386..1edbeced 100644 Binary files a/lib/cpp/x64/libFlexivRdk.a and b/lib/linux/cpp/x64/libFlexivRdk.a differ diff --git a/lib/python/arm64/flexivrdk.so b/lib/linux/python/arm64/flexivrdk.so similarity index 51% rename from lib/python/arm64/flexivrdk.so rename to lib/linux/python/arm64/flexivrdk.so index de1be0a5..66a9050a 100755 Binary files a/lib/python/arm64/flexivrdk.so and b/lib/linux/python/arm64/flexivrdk.so differ diff --git a/lib/linux/python/x64/flexivrdk.so b/lib/linux/python/x64/flexivrdk.so new file mode 100755 index 00000000..6fcad88d Binary files /dev/null and b/lib/linux/python/x64/flexivrdk.so differ diff --git a/lib/python/x64/flexivrdk.so b/lib/python/x64/flexivrdk.so deleted file mode 100755 index cc0862a3..00000000 Binary files a/lib/python/x64/flexivrdk.so and /dev/null differ diff --git a/lib/windows/cpp/x64/FlexivRdk.lib b/lib/windows/cpp/x64/FlexivRdk.lib new file mode 100644 index 00000000..e727d2fc Binary files /dev/null and b/lib/windows/cpp/x64/FlexivRdk.lib differ diff --git a/lib/windows/cpp/x64/FvrBase.lib b/lib/windows/cpp/x64/FvrBase.lib new file mode 100644 index 00000000..4f51d07d Binary files /dev/null and b/lib/windows/cpp/x64/FvrBase.lib differ diff --git a/lib/windows/cpp/x86/FlexivRdk.lib b/lib/windows/cpp/x86/FlexivRdk.lib new file mode 100644 index 00000000..a0b11a9d Binary files /dev/null and b/lib/windows/cpp/x86/FlexivRdk.lib differ diff --git a/lib/windows/cpp/x86/FvrBase.lib b/lib/windows/cpp/x86/FvrBase.lib new file mode 100644 index 00000000..d3afb830 Binary files /dev/null and b/lib/windows/cpp/x86/FvrBase.lib differ