diff --git a/.gitmodules b/.gitmodules index 6eac6b9..8ca61c7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "resource/cmake/rticonnextdds-cmake-utils"] path = resource/cmake/rticonnextdds-cmake-utils url = https://github.com/rticommunity/rticonnextdds-cmake-utils +[submodule "examples/lss_robot/LSS_Library_Python"] + path = examples/lss_robot/LSS_Library_Python + url = https://github.com/Lynxmotion/LSS_Library_Python.git diff --git a/README.md b/README.md index 652c9b2..27b33be 100644 --- a/README.md +++ b/README.md @@ -257,6 +257,8 @@ Security Artifacts Structure in [security](./system_arch/security/): Check out the the [system_arch](./system_arch/) folder, where the system architecture artifacts live and are covered in more depth! +Also see the [examples](./examples/README.md) folder for runnable, hands-on examples (Joystick, Xbox, LSS Robot, Telemetry Bridge, and WIS) that demonstrate devices and services acting as first-class citizens in the reference architecture. + ## Additional References - [RTI XML-Based Application Creation](https://community.rti.com/static/documentation/connext-dds/7.3.0/doc/manuals/connext_dds_professional/xml_application_creation/xml_based_app_creation_guide/XMLAppCreationGSG_title.htm#) diff --git a/containers/base/Dockerfile b/containers/base/Dockerfile new file mode 100644 index 0000000..47e6d85 --- /dev/null +++ b/containers/base/Dockerfile @@ -0,0 +1,121 @@ +# The Dockerfile is based on the official Ubuntu image for the jammy release. +# The CONNEXT_VERSION argument is used to specify the version of RTI Connext to install. +# The RTI_LICENSE_AGREEMENT_ACCEPTED argument is used to accept the RTI license agreement during installation. +# The NDDSHOME environment variable is set to the installation directory of RTI Connext. +# +# The Dockerfile installs the RTI Connext Debian Package from the official RTI repository. It also installs some build tools and the license file. +# +# The CMD instruction specifies the default command to run when the container starts. In this case, it runs the /bin/bash shell. +# +# To build the Docker image, run the following command from the root repository folder: +# docker build -t connext:medtech_ra -f containers/base/Dockerfile --build-arg RTI_LICENSE_AGREEMENT_ACCEPTED=accepted --build-arg CONNEXT_VERSION=7.3.0 . +# +# To run the Docker container, run the following command: +# +# docker run --rm -it --network host -e DISPLAY --privileged --hostname rtimedtech -v $XAUTHORITY:/root/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix -v $RTI_LICENSE_FILE:/root/rti_license.dat connext:medtech_ra bash +# +# Explanation of the options used in the docker run command: +# The -it option is used to run the container in interactive mode. +# The --rm option is used to remove the container when it exits. +# The --network host option is used to share the host's network stack with the container +# The -e DISPLAY option is used to set the DISPLAY environment variable in the container to the host's DISPLAY variable. +# The --privileged option is used to give the container additional privileges. +# The --hostname option is used to set the hostname of the container to rtimedtech. +# The -v $XAUTHORITY:/root/.Xauthority option is used to mount the X11 authentication file from the host to the container. +# The -v /tmp/.X11-unix:/tmp/.X11-unix option is used to mount the X11 socket from the host to the container. +# The -v $RTI_LICENSE_FILE:/root/rti_license.dat option is used to mount the RTI license file from the host to the container. +# +# The container will start and run the /bin/bash shell. + + +FROM ubuntu:jammy AS install-stage + +ARG CONNEXT_VERSION=7.3.0 +ARG RTI_LICENSE_AGREEMENT_ACCEPTED + +ENV DISPLAY=:0 +ENV SHELL=/bin/bash +ENV TZ=Europe/Madrid +ENV NDDSHOME=/opt/rti.com/rti_connext_dds-${CONNEXT_VERSION} +SHELL ["/bin/bash", "-c"] + +# Install the required packages +RUN export DEBIAN_FRONTEND=noninteractive \ + && apt-get update \ + && apt-get install -y \ + ca-certificates \ + dash \ + tzdata \ + git \ + build-essential \ + cmake \ + libgtk-3-dev \ + libgtksourceviewmm-3.0-dev \ + python3 \ + python3-gi \ + python3-gi-cairo \ + python3-numpy \ + python3-matplotlib \ + python3-pip \ + gir1.2-gtk-4.0 \ + libgtk2.0-0 \ + libxxf86vm1 \ + libsm6 \ + libcanberra-gtk-module \ + iproute2 \ + iputils-ping \ + curl \ + nano \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists + +# Install the RTI Connext Python API +RUN pip install rti.connext + +# Install the RTI Connext Debian Package +RUN curl -sSL -o /usr/share/keyrings/rti-official-archive.gpg \ + https://packages.rti.com/deb/official/repo.key + +RUN printf -- "deb [arch=%s, signed-by=%s] %s %s main\n" \ + $(dpkg --print-architecture) \ + /usr/share/keyrings/rti-official-archive.gpg \ + https://packages.rti.com/deb/official \ + $(. /etc/os-release && echo ${VERSION_CODENAME}) | tee /etc/apt/sources.list.d/rti-official.list >/dev/null + +RUN export DEBIAN_FRONTEND=noninteractive \ + RTI_LICENSE_AGREEMENT_ACCEPTED=${RTI_LICENSE_AGREEMENT_ACCEPTED} \ + && apt-get update \ + && apt-get install -y \ + rti-connext-dds-${CONNEXT_VERSION} \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists + +RUN echo "source ${NDDSHOME}/resource/scripts/rtisetenv_*.bash" >> /root/.bashrc + +WORKDIR /root + +RUN git clone --recurse-submodule https://github.com/rticommunity/rticonnextdds-medtech-reference-architecture.git medtech_ra +WORKDIR /root/medtech_ra/modules/01-operating-room + +# Create a script to build the sources +RUN echo "#!/bin/bash" > build_module_01.sh +RUN echo "source ${NDDSHOME}/resource/scripts/rtisetenv_*.bash" >> build_module_01.sh +RUN echo "mkdir build && cd build && cmake .. && cmake --build ." >> build_module_01.sh +RUN chmod +x build_module_01.sh + +# Configure licence file +RUN echo "export RTI_LICENSE_FILE=/root/rti_license.dat" >> /root/.bashrc +RUN rm ${NDDSHOME}/rti_license.dat +RUN ln -s /root/rti_licence.dat ${NDDSHOME}/rti_license.dat + +FROM scratch AS final-stage + +WORKDIR /root + +COPY --from=install-stage / / + +WORKDIR /root/medtech_ra/modules/01-operating-room +RUN ./build_module_01.sh + +WORKDIR /root +CMD ["/bin/bash"] \ No newline at end of file diff --git a/containers/examples/Dockerfile b/containers/examples/Dockerfile new file mode 100644 index 0000000..dbb5ed9 --- /dev/null +++ b/containers/examples/Dockerfile @@ -0,0 +1,141 @@ +# The Dockerfile is based on the official Ubuntu image for the jammy release. +# The CONNEXT_VERSION argument is used to specify the version of RTI Connext to install. +# The RTI_LICENSE_AGREEMENT_ACCEPTED argument is used to accept the RTI license agreement during installation. +# The NDDSHOME environment variable is set to the installation directory of RTI Connext. +# +# The Dockerfile installs the RTI Connext Debian Package from the official RTI repository. It also installs some build tools and the license file. +# +# The CMD instruction specifies the default command to run when the container starts. In this case, it runs the /bin/bash shell. +# +# To build the Docker image, run the following command from the root repository folder: +# docker build -t connext:medtech_ra -f containers/examples/Dockerfile --build-arg RTI_LICENSE_AGREEMENT_ACCEPTED=accepted --build-arg CONNEXT_VERSION=7.3.0 . +# +# To run the Docker container, run the following command: +# +# docker run --rm -it --network host -e DISPLAY -e SDL_AUDIODRIVER=dummy --device=/dev/ttyUSB0 --privileged --hostname rtimedtech -v $XAUTHORITY:/root/.Xauthority -v /tmp/.X11-unix:/tmp/.X11-unix -v $RTI_LICENSE_FILE:/root/rti_license.dat connext:medtech_ra bash +# +# Explanation of the options used in the docker run command: +# The -it option is used to run the container in interactive mode. +# The --rm option is used to remove the container when it exits. +# The --network host option is used to share the host's network stack with the container +# The -e DISPLAY option is used to set the DISPLAY environment variable in the container to the host's DISPLAY variable. +# The -e SDL_AUDIODRIVER=dummy option is used to set the SDL_AUDIODRIVER environment variable to dummy to avoid audio issues. +# The --device=/dev/ttyUSB0 option is used to give the container access to the USB device (e.g., joystick or xbox controller). +# The --privileged option is used to give the container additional privileges. +# The --hostname option is used to set the hostname of the container to rtimedtech. +# The -v $XAUTHORITY:/root/.Xauthority option is used to mount the X11 authentication file from the host to the container. +# The -v /tmp/.X11-unix:/tmp/.X11-unix option is used to mount the X11 socket from the host to the container. +# The -v $RTI_LICENSE_FILE:/root/rti_license.dat option is used to mount the RTI license file from the host to the container. +# +# The container will start and run the /bin/bash shell. + + +FROM ubuntu:jammy AS install-stage + +ARG CONNEXT_VERSION=7.3.0 +ARG RTI_LICENSE_AGREEMENT_ACCEPTED + +ENV DISPLAY=:0 +ENV SHELL=/bin/bash +ENV TZ=Europe/Madrid +ENV NDDSHOME=/opt/rti.com/rti_connext_dds-${CONNEXT_VERSION} +SHELL ["/bin/bash", "-c"] + +# Install the required packages +RUN export DEBIAN_FRONTEND=noninteractive \ + && apt-get update \ + && apt-get install -y \ + ca-certificates \ + dash \ + tzdata \ + git \ + build-essential \ + cmake \ + libgtk-3-dev \ + libgtksourceviewmm-3.0-dev \ + python3 \ + python3-gi \ + python3-gi-cairo \ + python3-numpy \ + python3-matplotlib \ + python3-pip \ + python3-pygame \ + python3-serial \ + gir1.2-gtk-4.0 \ + libgtk2.0-0 \ + libxxf86vm1 \ + libsm6 \ + libcanberra-gtk-module \ + iproute2 \ + iputils-ping \ + curl \ + nano \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists + +# Install the RTI Connext Python API +RUN pip install rti.connext + +# Install the RTI Connext Debian Package +RUN curl -sSL -o /usr/share/keyrings/rti-official-archive.gpg \ + https://packages.rti.com/deb/official/repo.key + +RUN printf -- "deb [arch=%s, signed-by=%s] %s %s main\n" \ + $(dpkg --print-architecture) \ + /usr/share/keyrings/rti-official-archive.gpg \ + https://packages.rti.com/deb/official \ + $(. /etc/os-release && echo ${VERSION_CODENAME}) | tee /etc/apt/sources.list.d/rti-official.list >/dev/null + +RUN export DEBIAN_FRONTEND=noninteractive \ + RTI_LICENSE_AGREEMENT_ACCEPTED=${RTI_LICENSE_AGREEMENT_ACCEPTED} \ + && apt-get update \ + && apt-get install -y \ + rti-connext-dds-${CONNEXT_VERSION} \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists + +RUN echo "source ${NDDSHOME}/resource/scripts/rtisetenv_*.bash" >> /root/.bashrc + +WORKDIR /root + +RUN git clone --recurse-submodule https://github.com/rticommunity/rticonnextdds-medtech-reference-architecture.git medtech_ra +WORKDIR /root/medtech_ra/modules/01-operating-room + +# Copy additional source files +COPY ./examples/joystick_controller/joystick_controller.py \ + ./examples/lss_robot/lss_robot_app.py \ + ./examples/lss_robot/LSS_Library_Python/src/lss.py \ + ./examples/lss_robot/LSS_Library_Python/src/lss_const.py \ + ./examples/telemetry_bridge/telemetry_app.py \ + ./examples/xbox_controller/xbox_controller.py \ + /root/medtech_ra/modules/01-operating-room/src/ + +# Copy launch scripts +COPY ./examples/joystick_controller/launch_arm_joystick.sh \ + ./examples/lss_robot/launch_robot_app.sh \ + ./examples/telemetry_bridge/launch_telemetry_app.sh \ + ./examples/xbox_controller/launch_arm_xbox.sh \ + /root/medtech_ra/modules/01-operating-room/scripts/ + +# Create a script to build the sources +RUN echo "#!/bin/bash" > build_module_01.sh +RUN echo "source ${NDDSHOME}/resource/scripts/rtisetenv_*.bash" >> build_module_01.sh +RUN echo "mkdir build && cd build && cmake .. && cmake --build ." >> build_module_01.sh +RUN chmod +x build_module_01.sh + +# Configure licence file +RUN echo "export RTI_LICENSE_FILE=/root/rti_license.dat" >> /root/.bashrc +RUN rm ${NDDSHOME}/rti_license.dat +RUN ln -s /root/rti_licence.dat ${NDDSHOME}/rti_license.dat + +FROM scratch AS final-stage + +WORKDIR /root + +COPY --from=install-stage / / + +WORKDIR /root/medtech_ra/modules/01-operating-room +RUN ./build_module_01.sh + +WORKDIR /root +CMD ["/bin/bash"] \ No newline at end of file diff --git a/examples/CANoe/README.md b/examples/CANoe/README.md new file mode 100644 index 0000000..db2625a --- /dev/null +++ b/examples/CANoe/README.md @@ -0,0 +1,265 @@ +# Vector CANoe Integration — RTI MedTech Reference Architecture + +This example demonstrates a Vector CANoe integration that leverages CANoe's native Python scripting capabilities to create a bidirectional bridge between multiple DDS domains, enabling both topic translation and domain bridging while providing real-time monitoring and control capabilities. + +Unlike the standalone [telemetry_bridge](../telemetry_bridge) application included with the RTI MedTech Reference Architecture, this CANoe-based solution brings the bridge logic into the analysis platform itself, eliminating the need for separate executable processes. This approach provides several advantages: unified monitoring through CANoe's built-in visualization tools, simplified deployment in integrated test environments, and real-time synchronization between control inputs and telemetry outputs within a single software ecosystem. + +See the project root [README.md](../../README.md) for overall architecture and how this example fits in. + +## Contents + +- [Example Description](#example-description) +- [Setup and Installation](#setup-and-installation) +- [Run the Example](#run-the-example) +- [Interactive Control Panel](#interactive-control-panel) +- [Monitoring and Debugging](#monitoring-and-debugging) +- [Visualization and Graphical Analysis](#visualization-and-graphical-analysis) +- [Multi-Desktop Workspace Configuration](#multi-desktop-workspace-configuration) +- [Integration with Operating Room Module](#integration-with-operating-room-module) +- [Use Cases](#use-cases) + +## Example Description + +This example implements a Vector CANoe integration for the surgical robot arm and patient monitoring. The system consists of: + +### Data Flow and Domain Bridging + +The integration implements a multi-layer data handling system: + +- **Input Domain (Domain 0):** Receives `MotorControl` commands on the `t/MotorControl` topic, compatible with control signals from the Arm Controller application +- **Output Domain (Domain 6):** Publishes `MotorTelemetry` updates on the `topic/MotorTelemetry` topic with simulated sensor data +- **Monitoring Domain (Domain 0):** Subscribes to patient vital signs on the `t/Vitals` topic for integrated monitoring + +### DDS Data Structures + +The integration defines two primary DDS types via the [SurgicalRobot.vCDL](SurgicalRobot.vCDL) specification: + +#### MotorControl Structure + +Used for sending motor control commands from the Arm Controller: + +- **id** (Motors enum): Target motor identifier (BASE, SHOULDER, ELBOW, WRIST, HAND) +- **direction** (MotorDirections enum): Movement direction (STATIONARY, INCREMENT, DECREMENT) + +#### MotorTelemetry Structure + +Published in response to motor commands with simulated sensor readings: + +- **id** (Motors enum): Source motor identifier +- **position_deg** (float): Current angular position in degrees (normalized to ±180°) +- **speed_rpm** (float): Motor rotational speed +- **current_mA** (float): Current draw in milliamps +- **voltage_V** (float): Supply voltage +- **temp_c** (float): Motor temperature in Celsius + +#### Vitals Structure + +Monitored from patient monitoring systems: + +- **patient_id** (string): Key identifier for the patient +- **hr** (uint32): Heart rate in beats per minute +- **spo2** (uint32): Peripheral oxygen saturation percentage +- **etco2** (uint32): End-tidal CO₂ in mmHg +- **nibp_s** (uint32): Systolic non-invasive blood pressure +- **nibp_d** (uint32): Diastolic non-invasive blood pressure + +### Quality of Service (QoS) Configuration + +The integration employs differentiated QoS policies appropriate to each data flow: + +- **Motor Control Subscription:** RELIABLE reliability with KEEP_ALL history for guaranteed command delivery +- **Telemetry Publication:** BEST_EFFORT reliability with KEEP_ALL history for efficient streaming of sensor data +- **Vital Signs Subscription:** BEST_EFFORT reliability appropriate for periodic vital sign updates + +### Python Integration Script + +The core integration logic resides in [telemetry.py](telemetry.py), a Vector CANoe measurement script that implements: + +#### Motor Control Processing + +The script subscribes to incoming `MotorControl` messages and processes motor movement commands with the following capabilities: + +- **Smooth Motion Emulation:** Converts discrete INCREMENT/DECREMENT directives into smooth, continuous angular position updates using single-degree increments +- **Angle Normalization:** Maintains motor positions within the standard ±180° range using modulo-based normalization +- **Dual-Source Synchronization:** Seamlessly reconciles control signals from both the Arm Controller and the CANoe control panel, preventing position jumps through careful state management + +#### Telemetry Generation + +Upon each motor control update, the script generates realistic telemetry data: + +- Real-time position tracking with configurable step resolution (default 1.0°) +- Simulated sensor readings with realistic ranges: + - Current: 1.0–1.5 mA + - Voltage: 12.0–12.5 V + - Temperature: 26–29°C + +#### User Interface Integration + +The script monitors a `panelHelper` interface structure that provides real-time synchronization with CANoe's interactive control panel: + +- **Bi-directional Synchronization:** Panel slider movements trigger motor control commands; motor position updates automatically reflect in panel controls +- **Visual Feedback:** All state changes are logged to the CANoe Write window for real-time debugging and monitoring +- **Seamless Multi-Source Control:** The Arm Controller and CANoe panel can be operated together without state conflicts + +## Setup and Installation + +### 1. Install Dependencies + +This example requires: + +- [Vector CANoe with DDS support](https://www.vector.com/us/en/products/products-a-z/software/canoe/option-dds/#) +- [RTI Connext 7.3.0](https://community.rti.com/static/documentation/connext-dds/7.3.0/doc/manuals/connext_dds_professional/installation_guide/installation_guide/Installing.htm#Chapter_1_Installing_RTI%C2%A0Connext) + +### 2. Configure CANoe Project + +Ensure the CANoe configuration file [RTIMedTech.cfg](RTIMedTech.cfg) is properly configured with the correct paths to: + +- DDS type definitions ([SurgicalRobot.vCDL](SurgicalRobot.vCDL)) +- Python measurement script ([telemetry.py](telemetry.py)) +- Control panel ([RobotPanel.xvp](RobotPanel.xvp)) + +### 3. Configure Environment + +Ensure RTI Connext DDS environment variables are configured and accessible to CANoe. + +## Run the Example + +### 1. Open CANoe Configuration + +Open the [RTIMedTech.cfg](RTIMedTech.cfg) configuration file in Vector CANoe. + +### 2. Start Measurement + +Start the CANoe measurement to begin the integration: + +>**Observe:** The integration will subscribe to motor control commands and publish telemetry to Domain 6. The control panel provides interactive control of the robot arm motors. All state changes are logged to the CANoe Write window for real-time debugging and monitoring. + +## Interactive Control Panel + +The [RobotPanel.xvp](RobotPanel.xvp) graphical interface provides real-time control and monitoring of all five robotic arm joints: + +### Control Elements + +- **Base Rotation:** Directional compass display with ±180° slider control +- **Shoulder, Elbow, Wrist, Hand Joints:** Individual position sliders with real-time value display + +### User Interaction Model + +Operators adjust motor positions using the panel sliders, which directly trigger motor control messages on the DDS network. The integration script processes these commands and publishes corresponding telemetry updates, creating a real-time feedback loop. This design enables: + +- Rapid manual testing of robotic arm behavior +- Real-time visual verification of motion commands +- Integration testing with external Arm Controller instances +- Demonstration of CANoe's suitability for real-time medical device control systems + +## Monitoring and Debugging + +The integration provides multiple levels of observability: + +### Write Window Output + +Detailed debug logging captures all significant events: + +![CANoe write panel](img/CANoe_write_panel.png) + +The script outputs human-readable messages for: + +- Incoming motor control commands with direction and motor identification +- Outgoing telemetry updates with calculated positions +- Motor position updates triggered via panel controls +- Error conditions with detailed exception information + +### DDS Trace Window + +Raw DDS network activity is visible at the middleware level: + +![CANoe trace panel](img/CANoe_trace_panel.png) + +Provides insight into: + +- Topic subscription and publication events +- Message transmission and reception timing +- QoS policy violations or negotiation issues +- Domain participant lifecycle events + +### DataSource Windows + +Real-time monitoring of data values at the application level: + +![CANoe robot pubsub panel](img/CANoe_robot_pubsub_panel.png) + +Displays current values for: + +- Motor control inputs (topic: `t/MotorControl`, domain: 0) +- Motor telemetry outputs (topic: `topic/MotorTelemetry`, domain: 6) +- Patient vital signs (topic: `t/Vitals`, domain: 0) + +## Visualization and Graphical Analysis + +### Motor Telemetry Dashboard + +Real-time graphs track motor behavior metrics with time-series visualization. Operators can monitor motor positions, velocities, currents, voltages, and temperatures simultaneously across all five joints: + +![CANoe Arm Monitor](img/CANoe_arm_monitor.png) + +### Patient Monitoring Dashboard + +Parallel visualization of vital signs with configurable axis parameters enables clinical staff to monitor patient status while robotic procedures are underway: + +![CANoe Patient Monitor](img/CANoe_patient_monitor.png) + +#### Configuring Graph Axis Parameters + +The patient monitor graph's axis labels and ranges can be customized via CANoe's configuration dialog: + +![CANoe graph config](img/CANoe_graph_config.png) + +This customization capability allows adaptation to different monitoring protocols and clinical requirements. + +### Control Panel Integration + +The RobotPanel provides an integrated view combining manual controls and live status indicators: + +![CANoe robot control panel](img/CANoe_robot_control_panel.png) + +## Multi-Desktop Workspace Configuration + +The integration defines two specialized desktops to optimize different operational workflows: + +### Desktop 1: Comprehensive System View + +Organized for detailed system analysis and testing, displaying: + +- Motor control and telemetry graphs (60% of display) +- Dual monitoring panels for patient vital signs and arm status +- Trace and Write windows for debugging +- DataSource windows for real-time value inspection + +![CANoe desktop view: comprehensive system](img/CANoe_desktop_1.png) + +### Desktop 2: Operator Control View + +Streamlined layout emphasizing the interactive robot panel and key monitoring displays: + +- Prominent RobotPanel for intuitive motor control +- Patient vital signs graph +- Arm telemetry monitoring +- Minimal secondary windows to reduce visual clutter + +![CANoe desktop view: operator control](img/CANoe_desktop_2.png) + +## Integration with Operating Room Module + +This CANoe integration functions as a complete peer application within the RTI MedTech Reference Architecture ecosystem: + +- **Arm Controller Compatibility:** The `t/MotorControl` topic subscription operates identically to the dedicated Arm Controller, enabling side-by-side operation or replacement of the external application +- **Telemetry Bridge Emulation:** Duplicates the functionality of the standalone telemetry_bridge for domain translation and data adaptation +- **Patient Monitor Integration:** The `t/Vitals` subscription provides equivalent monitoring to the dedicated Patient Monitor application +- **System Validation:** Demonstrates CANoe's capability as a comprehensive alternative to multiple distributed applications, suitable for integrated test laboratories and clinical deployment scenarios + +## Use Cases + +- **System Integration Testing:** Validate Arm Controller behavior in isolation without requiring complete distributed system deployment +- **Clinical Device Certification:** Demonstrate real-time monitoring and control of surgical robotic systems in a controlled, auditable environment +- **Real-Time Simulation:** Combine CANoe's powerful analysis capabilities with DDS-based control for hardware-in-the-loop testing +- **Educational Demonstrations:** Provide students and technicians with an interactive interface for understanding DDS-based medical device architectures diff --git a/examples/CANoe/RTIMedTech.cfg b/examples/CANoe/RTIMedTech.cfg new file mode 100644 index 0000000..db6de75 --- /dev/null +++ b/examples/CANoe/RTIMedTech.cfg @@ -0,0 +1,10728 @@ +;CANoeMedTech Version |4|19|0|56417 RTIMedTech +Version: 19.3.118 Build 118 +32 PRO +10 +APPDIR Vector.CANoe.SignalGenerators.DLL +Vector.CANoe.SignalGenerators, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.SignalGenerators.ComponentWrapper +1 +1.0.1 +APPDIR Vector.CANalyzer.ETH.SegmentView.DLL +Vector.CANalyzer.ETH.SegmentView, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ETH.SegmentView.SegmentViewController +2 +1.0.0 +VGlobalConfiguration 1 Begin_Of_Object +19 +VGlobalParameters 2 Begin_Of_Object +43 +0 +3,100,200,500 +1000000 1.000000 0 1000 1 1 0 0 1 1 1 0 0 0 1 0 0 0 +1 +0 +0 0 +ResetSignalsOnMeasurementStart=1 +VDatabaseContainerStreamer 3 Begin_Of_Object +10 +0 +1 +1 +0 +0 +0 +0 +0 +End_Of_Object VDatabaseContainerStreamer 3 +0 +0 +1 + 1 "RTIMedTech.cfg" +0 +0 +0 +1 +VPersistentEnvarSelectionData 3 Begin_Of_Object +1 +1 1 0 0 +~ +~ +End_Of_Object VPersistentEnvarSelectionData 3 +VPersistentExtensionData 3 Begin_Of_Object +3 +VPersistentRelation 4 Begin_Of_Object +1 +HookDLLActivations +1 +1 +End_Of_Object VPersistentRelation 4 +End_Of_Object VPersistentExtensionData 3 +VPersistentTreeStateInfo 3 Begin_Of_Object +1 +Version +5 +DialogBegin +1 +75 75 605 580 +SymbolExplorerDialogBegin +1 +HistoryBegin +1 0 +HistoryEnd +FiltersBegin +Begin +3 0 -1 +0 +SymbSelHeaderMgrBegin +1 6 +0 1 200 0 0 +1 1 100 0 0 +2 0 100 0 0 +3 0 75 1 1 +5 1 80 0 0 +6 1 200 0 0 +15 1 80 0 0 +SymbSelHeaderMgrEnd +End +Begin +3 0 -1 +-1 +SymbSelHeaderMgrBegin +1 4 +0 1 200 0 0 +10 1 75 0 0 +11 1 100 0 0 +6 1 200 0 0 +SymbSelHeaderMgrEnd +End +Begin +3 0 -1 +-1 +SymbSelHeaderMgrBegin +1 3 +0 1 200 0 0 +7 0 100 0 0 +6 1 200 0 0 +SymbSelHeaderMgrEnd +End + +FiltersEnd +0 0 +SymbolExplorerDialogEnd + +DialogEnd +End_Of_Object VPersistentTreeStateInfo 3 +VPrintSettings 3 Begin_Of_Object +1 +0 0 0 0 0 +End_Of_Object VPrintSettings 3 + 1 "..\..\..\Public\Documents\ProgramData\Vector\CANoe lite Family\18.3.50 (x64)\" +1 +VPortlinkConfigurationStreamer 3 Begin_Of_Object +1 +1 +0 +0 +0 +END_OF_DRIVER +END_OF_PORT_CONFIGURATION_STREAM +End_Of_Object VPortlinkConfigurationStreamer 3 +0 +0 +0 +0 + V2 275 + 6 + V2 20 1 -1 36 + V2 1 1 -1 47 + V2 0 1 -1 40 + V2 2 1 -1 47 + V2 4 1 -1 33 + V2 5 3 0 24 1 24 2 24 + 0 +EndOf +VGlobalActionsStreamer 3 Begin_Of_Object +3 +3 +0 +End_Of_Object VGlobalActionsStreamer 3 +VEventSortingConfigStreamer 3 Begin_Of_Object +1 +0 +0 +0 +0 +0 +1 +0 +End_Of_Object VEventSortingConfigStreamer 3 +FlexRayOptionParameters: 2 0 1 0 1 1 :0 : +FlexRayOptionParametersEnd +VCaplOptionsStreamer 3 Begin_Of_Object +2 +26 +1177 +1 +1448 +0 +2001 +1 +2002 +0 +2005 +0 +2008 +1 +2013 +1 +2020 +1 +2032 +1 +2038 +1 +2039 +0 +2040 +1 +2041 +1 +2054 +0 +2055 +1 +2056 +1 +2065 +0 +2071 +0 +2072 +0 +2075 +1 +2078 +1 +2085 +1 +2086 +1 +2087 +1 +2135 +1 +2201 +0 +1 +512 +End_Of_Object VCaplOptionsStreamer 3 +VSVConfigurationStreamer 3 Begin_Of_Object +1 +73 + + +2 +0 +End_Of_Object VSVConfigurationStreamer 3 +VOfflineBusStatisticSettings 3 Begin_Of_Object +1 +1 +1 +0 1 +1 0 +0 2 +1 0 +0 3 +1 0 +0 4 +1 0 +0 5 +1 0 +0 6 +1 0 +0 7 +1 0 +0 8 +1 0 +0 9 +1 0 +0 10 +1 0 +0 11 +1 0 +0 12 +1 0 +0 13 +1 0 +0 14 +1 0 +0 15 +1 0 +0 16 +1 0 +0 17 +1 0 +0 18 +1 0 +0 19 +1 0 +0 20 +1 0 +0 21 +1 0 +0 22 +1 0 +0 23 +1 0 +0 24 +1 0 +0 25 +1 0 +0 26 +1 0 +0 27 +1 0 +0 28 +1 0 +0 29 +1 0 +0 30 +1 0 +0 31 +1 0 +0 32 +1 0 +0 33 +1 0 +0 34 +1 0 +0 35 +1 0 +0 36 +1 0 +0 37 +1 0 +0 38 +1 0 +0 39 +1 0 +0 40 +1 0 +0 41 +1 0 +0 42 +1 0 +0 43 +1 0 +0 44 +1 0 +0 45 +1 0 +0 46 +1 0 +0 47 +1 0 +0 48 +1 0 +0 49 +1 0 +0 50 +1 0 +0 51 +1 0 +0 52 +1 0 +0 53 +1 0 +0 54 +1 0 +0 55 +1 0 +0 56 +1 0 +0 57 +1 0 +0 58 +1 0 +0 59 +1 0 +0 60 +1 0 +0 61 +1 0 +0 62 +1 0 +0 63 +1 0 +0 64 +1 0 +0 65 +1 0 +0 66 +1 0 +0 67 +1 0 +0 68 +1 0 +0 69 +1 0 +0 70 +1 0 +0 71 +1 0 +0 72 +1 0 +0 73 +1 0 +0 74 +1 0 +0 75 +1 0 +0 76 +1 0 +0 77 +1 0 +0 78 +1 0 +0 79 +1 0 +0 80 +1 0 +0 81 +1 0 +0 82 +1 0 +0 83 +1 0 +0 84 +1 0 +0 85 +1 0 +0 86 +1 0 +0 87 +1 0 +0 88 +1 0 +0 89 +1 0 +0 90 +1 0 +0 91 +1 0 +0 92 +1 0 +0 93 +1 0 +0 94 +1 0 +0 95 +1 0 +0 96 +1 0 +0 97 +1 0 +0 98 +1 0 +0 99 +1 0 +0 100 +1 0 +0 101 +1 0 +0 102 +1 0 +0 103 +1 0 +0 104 +1 0 +0 105 +1 0 +0 106 +1 0 +0 107 +1 0 +0 108 +1 0 +0 109 +1 0 +0 110 +1 0 +0 111 +1 0 +0 112 +1 0 +0 113 +1 0 +0 114 +1 0 +0 115 +1 0 +0 116 +1 0 +0 117 +1 0 +0 118 +1 0 +0 119 +1 0 +0 120 +1 0 +0 121 +1 0 +0 122 +1 0 +0 123 +1 0 +0 124 +1 0 +0 125 +1 0 +0 126 +1 0 +0 127 +1 0 +0 128 +1 0 +0 129 +1 0 +0 130 +1 0 +0 131 +1 0 +0 132 +1 0 +0 133 +1 0 +0 134 +1 0 +0 135 +1 0 +0 136 +1 0 +0 137 +1 0 +0 138 +1 0 +0 139 +1 0 +0 140 +1 0 +0 141 +1 0 +0 142 +1 0 +0 143 +1 0 +0 144 +1 0 +0 145 +1 0 +0 146 +1 0 +0 147 +1 0 +0 148 +1 0 +0 149 +1 0 +0 150 +1 0 +0 151 +1 0 +0 152 +1 0 +0 153 +1 0 +0 154 +1 0 +0 155 +1 0 +0 156 +1 0 +0 157 +1 0 +0 158 +1 0 +0 159 +1 0 +0 160 +1 0 +0 161 +1 0 +0 162 +1 0 +0 163 +1 0 +0 164 +1 0 +0 165 +1 0 +0 166 +1 0 +0 167 +1 0 +0 168 +1 0 +0 169 +1 0 +0 170 +1 0 +0 171 +1 0 +0 172 +1 0 +0 173 +1 0 +0 174 +1 0 +0 175 +1 0 +0 176 +1 0 +0 177 +1 0 +0 178 +1 0 +0 179 +1 0 +0 180 +1 0 +0 181 +1 0 +0 182 +1 0 +0 183 +1 0 +0 184 +1 0 +0 185 +1 0 +0 186 +1 0 +0 187 +1 0 +0 188 +1 0 +0 189 +1 0 +0 190 +1 0 +0 191 +1 0 +0 192 +1 0 +0 193 +1 0 +0 194 +1 0 +0 195 +1 0 +0 196 +1 0 +0 197 +1 0 +0 198 +1 0 +0 199 +1 0 +0 200 +1 0 +0 201 +1 0 +0 202 +1 0 +0 203 +1 0 +0 204 +1 0 +0 205 +1 0 +0 206 +1 0 +0 207 +1 0 +0 208 +1 0 +0 209 +1 0 +0 210 +1 0 +0 211 +1 0 +0 212 +1 0 +0 213 +1 0 +0 214 +1 0 +0 215 +1 0 +0 216 +1 0 +0 217 +1 0 +0 218 +1 0 +0 219 +1 0 +0 220 +1 0 +0 221 +1 0 +0 222 +1 0 +0 223 +1 0 +0 224 +1 0 +0 225 +1 0 +0 226 +1 0 +0 227 +1 0 +0 228 +1 0 +0 229 +1 0 +0 230 +1 0 +0 231 +1 0 +0 232 +1 0 +0 233 +1 0 +0 234 +1 0 +0 235 +1 0 +0 236 +1 0 +0 237 +1 0 +0 238 +1 0 +0 239 +1 0 +0 240 +1 0 +0 241 +1 0 +0 242 +1 0 +0 243 +1 0 +0 244 +1 0 +0 245 +1 0 +0 246 +1 0 +0 247 +1 0 +0 248 +1 0 +0 249 +1 0 +0 250 +1 0 +0 251 +1 0 +0 252 +1 0 +0 253 +1 0 +0 254 +1 0 +0 255 +1 0 +End_Of_Object VOfflineBusStatisticSettings 3 +VNETOptionsStreamer 3 Begin_Of_Object +5 +0 + 0 "..\..\AppData\Local\Temp" +1 + +0 +0 +End_Of_Object VNETOptionsStreamer 3 +0 +1 +VUserFileMgrAnlyz 3 Begin_Of_Object +2 +0 +0 +End_Of_Object VUserFileMgrAnlyz 3 +VCLibraryOptions 3 Begin_Of_Object +1 +0 +End_Of_Object VCLibraryOptions 3 +NValueObjectDisplay::VNameDisplaySettings 3 Begin_Of_Object +3 +13 +0 +4 +1 +4 +2 +4 +3 +4 +4 +1 +5 +1 +6 +4 +7 +4 +8 +4 +9 +6 +10 +4 +11 +4 +12 +4 +0 +13 +0 +0 +1 +0 +2 +0 +3 +0 +4 +0 +5 +0 +6 +0 +7 +0 +8 +0 +9 +0 +10 +0 +11 +0 +12 +0 +13 +0 +1 +1 +3 +2 +3 +3 +3 +4 +1 +5 +1 +6 +1 +7 +1 +8 +1 +9 +1 +10 +1 +11 +1 +12 +3 +13 +0 +511 +1 +511 +2 +511 +3 +511 +4 +511 +5 +511 +6 +511 +7 +511 +8 +511 +9 +128 +10 +511 +11 +511 +12 +511 +0 +End_Of_Object NValueObjectDisplay::VNameDisplaySettings 3 +ConfigurationSavedByCANwBeginner 0 +VGlobalExportAndLoggingSettings 3 Begin_Of_Object +10 +2 +1 +0 +0 +6 +1 +0.10000000000000001 +2 +0 +0.10000000000000001 +2 +19 +0 +1 +3 +1 +0 +:: +; +, + 1 "" +0 +0 +1 +1 +6 +0 +6 +0 +0 +0.10000000000000001 +0 +0 +0 +6 +730 +0 +0.10000000000000001 +0 +0 +1 +VLoggingComment 4 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 5 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 5 +End_Of_Object VLoggingComment 4 +1 +End_Of_Object VGlobalExportAndLoggingSettings 3 +0 +VRTFilterOptions 3 Begin_Of_Object +3 +0 +0 +0 +0 +0 +End_Of_Object VRTFilterOptions 3 +VRTTxBufferOptions 3 Begin_Of_Object +2 +1 +1 +500 +End_Of_Object VRTTxBufferOptions 3 +VRTIRQReductionOptions 3 Begin_Of_Object +2 +500 +End_Of_Object VRTIRQReductionOptions 3 +VPersistentDebuggerOptions 3 Begin_Of_Object +2 +64 +10000 +End_Of_Object VPersistentDebuggerOptions 3 +7 +0 +0 +0 +0 +0 +0 +0 +0 +1 +VAFDXGlobalSettings 3 Begin_Of_Object +4 +1000 +15 +1 +0 +0 +0 +0 +End_Of_Object VAFDXGlobalSettings 3 +VRTCANErrorFrameOptions 3 Begin_Of_Object +1 +1 +1 +End_Of_Object VRTCANErrorFrameOptions 3 +1 +ILConfiguration::VProxyManagerPersistentData 3 Begin_Of_Object +1 +0 +0 +End_Of_Object ILConfiguration::VProxyManagerPersistentData 3 +8 +VGlobalVariableSettings 3 Begin_Of_Object +1 +65001 +End_Of_Object VGlobalVariableSettings 3 +VGeneralLoggingBlockSettings 3 Begin_Of_Object +3 +2000 +111 +0 +3 +1 +End_Of_Object VGeneralLoggingBlockSettings 3 +0 +0 +111 +0 +1 +SecurityManager::VSecurityManager 3 Begin_Of_Object +6 +0 +0 +NULL +0 +NULL +0 +End_Of_Object SecurityManager::VSecurityManager 3 +VRTAutosarPDULayerMode 3 Begin_Of_Object +1 +2 +End_Of_Object VRTAutosarPDULayerMode 3 +VErtOptions 3 Begin_Of_Object +2 +0 +0 +End_Of_Object VErtOptions 3 +1 +0 +8 +VDistributedDebuggingSettings 3 Begin_Of_Object +1 +0 +2828 +End_Of_Object VDistributedDebuggingSettings 3 +VAdditionalLicenseOptions 3 Begin_Of_Object +1 +0 +End_Of_Object VAdditionalLicenseOptions 3 +10 +0 +VMultiCANoeOptions 3 Begin_Of_Object +9 +0 +10000 +0 +0 +1 +0 +Agent# +1 +Agent1 +127.0.0.1:2809 +2810 + +1 +0 +1 +0 +1 +0 +1 +Agent1 + +0 + +0 + +1 +1 +0 + +End_Of_Object VMultiCANoeOptions 3 +0 +VPythonOptions 3 Begin_Of_Object +2 +-1 +-1 +-1 +0 + +End_Of_Object VPythonOptions 3 +1 +0 +0 +End_Of_Object VGlobalParameters 2 +VDesktopManagerPersistentData 2 Begin_Of_Object +1 +1 +3 +VDesktop 3 Begin_Of_Object +1 +Desktop +{5EFA599C-741D-4351-BA90-037F8D7785AE} +Begin_Of_Multi_Line_String +3 + + + +* + + +0.769230769230769* + + +0.600585040501572* +{43F097DC-B62D-47B1-9F15-54CDF639378D} + + +0.399414959498428* + + +0.5* +{06738A1F-DC8D-430D-9BAF-63D6B7DF8E8B} + + +0.5* +{2AB00946-C0AE-48D2-AC41-A5B1C58698C9} + + +0 + + +1 + + +0.230769230769231* + + +0.348210628892623* +{B78B3D14-8330-440E-A14E-7508081EE52D} + + +0.279338301903162* +{66615185-4649-4D43-B85D-0DD2F54FF05B} + + +0.372451069204215* +{08187E53-2B11-403E-B662-20E6EC243AD7} + + +1 + + +0 + + +End_Of_Serialized_Data 3 +End_Of_Object VDesktop 3 +VDesktop 3 Begin_Of_Object +1 +Desktop1 +{7F6513B7-EFE9-4AE2-BDFC-8B9C901EE512} +Begin_Of_Multi_Line_String +3 + + + +* + + +0.5* +{7902E933-72AC-413A-90EC-BF01A148D3B1} + + +0.5* + + +0.5* +{6599BD51-288A-4CC6-873D-1D0BB97AF1B4} + + +0.5* +{D3DC6964-14E7-46A6-A953-EADDCE81654E} + + +0 + + +1 + + +End_Of_Serialized_Data 3 +End_Of_Object VDesktop 3 +VDesktop 3 Begin_Of_Object +1 + +{46CE7AEF-2871-44CD-A932-8F5F3880CBC6} + +End_Of_Object VDesktop 3 +4294967295 +4294967295 +4294967295 +1 +End_Of_Object VDesktopManagerPersistentData 2 +0 +VGBAnlyzBox 2 Begin_Of_Object +3 +VGrMnBox 3 Begin_Of_Object +1 +VUniqueBox 4 Begin_Of_Object +1 +VBoxRoot 5 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 0 0 1716 1141 + +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 0 0 1716 1141 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 0 0 1716 1141 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 0 0 1716 1141 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{7E9CDA9F-860D-49C0-B801-0D4787CF6017} +0 +End_Of_Object VBoxRoot 5 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 4 +End_Of_Object VGrMnBox 3 +VDOLocalInfoStruct 3 Begin_Of_Object +4 +1 +74 +VDAOGBFunctionBlock 4 Begin_Of_Object +1 +1 +0 +TABPredecessor: +0 +TABSuccessor: +2 +VPlugConf 5 Begin_Of_Object +1 +End_Of_Object VPlugConf 5 +VDAOGBFunctionBlock 5 Begin_Of_Object +1 +2 +0 +TABPredecessor: +1 +TABSuccessor: +4 +VSysVarFilterConfiguration 6 Begin_Of_Object +2 +VMigratedGenericConfiguration 7 Begin_Of_Object +1 +VSysVarFilterData 8 Begin_Of_Object +2 +1 +End_Of_Object VSysVarFilterData 8 +End_Of_Object VMigratedGenericConfiguration 7 +End_Of_Object VSysVarFilterConfiguration 6 +VDODynamicLine 6 Begin_Of_Object +1 +3 +0 +5 +VDAOGBFunctionBlock 7 Begin_Of_Object +1 +4 +0 +TABPredecessor: +2 +TABSuccessor: +5 +VChannelFilterConfiguration 8 Begin_Of_Object +3 +VMigratedGenericConfiguration 9 Begin_Of_Object +1 +VChannelFilterData 10 Begin_Of_Object +2 +1 +End_Of_Channel_Data +1 +End_Of_Object VChannelFilterData 10 +End_Of_Object VMigratedGenericConfiguration 9 +0 +0 +End_Of_Object VChannelFilterConfiguration 8 +VDAOGBHSStd 8 Begin_Of_Object +1 +5 +0 +0 0 +TABPredecessor: +4 +TABSuccessor: +37 +VDODynamicLine 9 Begin_Of_Object +1 +6 +0 +0 +VDOCrossing 10 Begin_Of_Object +2 +7 +0 +VDAOGBHSStd 11 Begin_Of_Object +1 +8 +0 +0 0 +TABPredecessor: +42 +TABSuccessor: +44 +VDODynamicLine 12 Begin_Of_Object +1 +9 +0 +0 +VDAOSwitch 13 Begin_Of_Object +1 +44 +0 +TABPredecessor: +8 +TABSuccessor: +45 +VDAOGBHSStd 14 Begin_Of_Object +1 +45 +0 +0 0 +TABPredecessor: +44 +TABSuccessor: +47 +VDODynamicLine 15 Begin_Of_Object +1 +46 +0 +0 +VDOFRamification 16 Begin_Of_Object +1 +47 +0 +TABPredecessor: +45 +TABSuccessor: +49 +5 +VDORefinement 17 Begin_Of_Object +1 +48 +0 +7 +VDAOGBHSStd 18 Begin_Of_Object +1 +49 +0 +0 0 +TABPredecessor: +47 +TABSuccessor: +51 +VDODynamicLine 19 Begin_Of_Object +1 +50 +0 +0 +VDAOGBFunctionBlock 20 Begin_Of_Object +1 +51 +0 +TABPredecessor: +49 +TABSuccessor: +54 +VTraceConfiguration 21 Begin_Of_Object +1 +VTraceControlCfg 22 Begin_Of_Object +9 +VTraceSearchCfg 23 Begin_Of_Object +1 +VEvCondBlock 24 Begin_Of_Object +1 +VEvCondGroup 25 Begin_Of_Object +2 +VEvCondPrimitive 26 Begin_Of_Object +1 +1 +End_Of_Object VEvCondPrimitive 26 +1 +0 +0 +End_Of_Object VEvCondGroup 25 +End_Of_Object VEvCondBlock 24 +0 +End_Of_Object VTraceSearchCfg 23 +VTraceFilterCfg 23 Begin_Of_Object +2 +0 +1 +VTraceAnalysisFilterGroup 24 Begin_Of_Object +2 +1 +Filter Group 0 +2 +VTraceAnalysisSingleFilter 25 Begin_Of_Object +4 +1 +1 +0 +End_Of_Object VTraceAnalysisSingleFilter 25 +VTraceAnalysisSingleFilter 25 Begin_Of_Object +4 +0 +0 +0 +End_Of_Object VTraceAnalysisSingleFilter 25 +1 +End_Of_Object VTraceAnalysisFilterGroup 24 +VTraceSequenceFilter 24 Begin_Of_Object +1 +1 +1 +1 +VTraceAnalysisSingleFilter 25 Begin_Of_Object +4 +0 +0 +0 +End_Of_Object VTraceAnalysisSingleFilter 25 +End_Of_Object VTraceSequenceFilter 24 +End_Of_Object VTraceFilterCfg 23 +1 +1 +0 +0 +46 +0 +0 +1 +0 +2 +0 +3 +0 +4 +0 +5 +0 +6 +1 +22 +GFver=7;ver=5: TF TF TF FF FF FF FF FF FF TF TF FF;F T CANoeMedTechTBE;F T _Security +End_Of_Serialized_Data 22 +7 +0 +8 +0 +9 +0 +10 +0 +11 +0 +12 +0 +13 +0 +14 +0 +15 +0 +16 +0 +17 +0 +18 +0 +19 +0 +20 +0 +21 +0 +22 +0 +23 +0 +24 +0 +25 +0 +26 +0 +27 +0 +28 +0 +29 +0 +30 +0 +31 +0 +32 +0 +33 +0 +34 +0 +35 +0 +36 +0 +37 +0 +38 +0 +39 +0 +40 +1 +22 +ver=5: FT FT FT FT FT FT FT FT FT FT FT +End_Of_Serialized_Data 22 +41 +0 +42 +0 +43 +0 +44 +0 +45 +0 +0 +1 +VTraceColumnConfiguration 23 Begin_Of_Object +5 +47 +Initial +157 +VTNColumnData 24 Begin_Of_Object +4 +0 +130 +0 +Time +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +1 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +2 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +3 +220 +1 +Name +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +4 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +5 +35 +4 +Dir +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +6 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +7 +170 +5 +Data +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +8 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +9 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +10 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +11 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +12 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +13 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +14 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +15 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +16 +50 +-1 +Type +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +17 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +18 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +19 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +20 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +21 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +22 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +23 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +24 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +25 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +26 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +27 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +28 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +29 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +30 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +31 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +32 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +33 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +34 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +35 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +36 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +37 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +38 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +39 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +40 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +41 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +42 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +43 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +44 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +45 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +46 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +47 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +48 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +49 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +50 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +51 +150 +-1 +Comment +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +52 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +53 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +54 +130 +-1 +Namespace +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +55 +120 +-1 +Diff Time (Ref. Event) +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +56 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +57 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +58 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +59 +120 +-1 +Date and Time +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +60 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +61 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +62 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +63 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +64 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +65 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +66 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +67 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +68 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +69 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +70 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +71 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +72 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +73 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +74 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +75 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +76 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +77 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +78 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +79 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +80 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +81 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +82 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +83 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +84 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +85 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +86 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +87 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +88 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +89 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +90 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +91 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +92 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +93 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +94 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +95 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +96 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +97 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +98 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +99 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +100 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +101 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +102 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +103 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +104 +120 +-1 +Diff Time (last Occ.) +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +105 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +106 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +107 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +108 +100 +2 +Object Type +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +109 +80 +-1 +Comm Role +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +110 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +111 +100 +3 +Object Detail +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +112 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +113 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +114 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +115 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +116 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +117 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +118 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +119 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +120 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +121 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +122 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +123 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +124 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +125 +170 +6 +Binding Info +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +126 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +127 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +128 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +129 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +130 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +131 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +132 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +133 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +134 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +135 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +136 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +137 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +138 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +139 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +140 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +141 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +142 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +143 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +144 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +145 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +146 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +147 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +148 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +149 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +150 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +151 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +152 +50 +-1 +--- +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +153 +50 +-1 + +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +154 +50 +-1 + +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +155 +50 +-1 + +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +VTNColumnData 24 Begin_Of_Object +4 +156 +50 +-1 + +1 +0 +1 +0 +0 +End_Of_Object VTNColumnData 24 +End_Of_Object VTraceColumnConfiguration 23 +0 +0 +VTraceControlFixedModeExpansionItems 23 Begin_Of_Object +3 +3 +NFunctionBus::VConfigDOMember 24 Begin_Of_Object +4 +VConfigEvent 25 Begin_Of_Object +1 +End_Of_Object VConfigEvent 25 +DDS::DDSMonitor.participantAvailabilityChangedEvent +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 24 +NFunctionBus::VConfigDOMember 24 Begin_Of_Object +4 +VConfigEvent 25 Begin_Of_Object +1 +End_Of_Object VConfigEvent 25 +DDS::DDSMonitor.readerAvailabilityChangedEvent +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 24 +NFunctionBus::VConfigDOMember 24 Begin_Of_Object +4 +VConfigEvent 25 Begin_Of_Object +1 +End_Of_Object VConfigEvent 25 +SurgicalRobot::Receiver.motorData +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 24 +2 +1 +0 +1 +1 +0 +0 +End_Of_Object VTraceControlFixedModeExpansionItems 23 +22 +C:\Users\Public\Documents\Vector\CANoe lite Family\19.0.97 (x64)\Templates\CANoeLite +End_Of_Serialized_Data 22 +22 +%s +End_Of_Serialized_Data 22 +22 + +End_Of_Serialized_Data 22 +0 +2 +1 +1 +22 +VLogExportPersister 23 Begin_Of_Object +7 +1416 +11062253 +%s + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 23 + +End_Of_Serialized_Data 22 +1 +0 +0 +290 +0 +150 + 1 "..\..\..\Public\Documents\Vector\CANoe lite Family\19.0.97 (x64)\Templates\CANoeLite" +47 +End_Of_Object VTraceControlCfg 22 +VNETTraceControlBox 22 Begin_Of_Object +1 +VNETControlBox 23 Begin_Of_Object +2 +VUniqueBox 24 Begin_Of_Object +1 +VBoxRoot 25 Begin_Of_Object +1 +1 +1 1 0 1 -1 -1 -1 -1 0 0 1716 759 +Trace +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 739 511 1473 848 +1 +1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 0 1716 759 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 0 1716 759 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{2AB00946-C0AE-48D2-AC41-A5B1C58698C9} +0 +End_Of_Object VBoxRoot 25 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 24 +0 +0 +End_Of_Object VNETControlBox 23 +End_Of_Object VNETTraceControlBox 22 +End_Of_Object VTraceConfiguration 21 +VDOLine 21 Begin_Of_Object +1 +52 +0 +130 0 +NULL +End_Of_Object VDOLine 21 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 20 +End_Of_Object VDODynamicLine 19 +End_Of_Object VDAOGBHSStd 18 +NULL +End_Of_Object VDORefinement 17 +VDORefinement 17 Begin_Of_Object +1 +53 +0 +4 +VDAOGBHSStd 18 Begin_Of_Object +1 +54 +0 +0 0 +TABPredecessor: +51 +TABSuccessor: +56 +VDODynamicLine 19 Begin_Of_Object +1 +55 +0 +0 +VDAOGBFunctionBlock 20 Begin_Of_Object +1 +56 +0 +TABPredecessor: +54 +TABSuccessor: +59 +VNETDataListControlHost 21 Begin_Of_Object +4 +VConfigurationRoot 22 Begin_Of_Object +1 +End_Of_Object VConfigurationRoot 22 +VNETDataBox 22 Begin_Of_Object +1 +VNETControlBox 23 Begin_Of_Object +2 +VUniqueBox 24 Begin_Of_Object +1 +VBoxRoot 25 Begin_Of_Object +1 +1 +1 0 0 1 -1 -1 -1 -1 858 0 1716 570 +Data +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 -1 -1 -1 -1 858 0 1716 570 +0 +0 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 858 0 1716 570 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 858 0 1716 570 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{6827E193-200C-4623-906F-4B13465B14A6} +0 +End_Of_Object VBoxRoot 25 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 24 +0 +0 +End_Of_Object VNETControlBox 23 +End_Of_Object VNETDataBox 22 +1 +9 +0 +20 150 16 100 75 75 50 100 100 100 1 +35 35 +30 +70 70 70 100 +100 +1 1 0 1 0 0 1 1 1 0 1 +0 0 +0 +0 0 0 0 +0 +1 0 +25000 0 10000 0 10000 +1 0 +VLogCfgData 22 Begin_Of_Object +14 +0 +0 +0 +0 +0 +0 +0 +0 +1024 +60 +0 +0 +0 +3 +1 +111 +1 +1 +0 +2 +0 +0 +22 +VLogExportPersister 23 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 23 + +End_Of_Serialized_Data 22 + 1 "..\..\appdata\local\temp\Data_Tabular.mdf" +0 +1 +0 +30 +80 +0 +1 +1 +0 + + + 1 "..\..\appdata\local\temp\{LoggingBlock}.mdf" + 1 "..\..\appdata\local\temp\Data_Tabular.mdf" +1 +0 + 1 "..\..\appdata\local\temp\{LoggingBlock}.mdf" +0 +f1d3add2-8ac8-4ba4-a2d5-2d8c3f17df33 +1 +VLoggingComment 23 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 24 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 24 +End_Of_Object VLoggingComment 23 +3 +0 +0 +End_Of_Object VLogCfgData 22 +1 +[End_of_Control] +426 +APPDIR Vector.CANalyzer.Data.DLL +Vector.CANalyzer.Data, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Data.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +Int32 +SelectedTabIndex +1 +APPDIR Vector.CANalyzer.Data.DLL +Vector.CANalyzer.Data, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Data.TreeListColumnSerializationInfo +3 +Column_0 +3 +TypeRef:3 +Column_1 +4 +TypeRef:3 +Column_2 +5 +TypeRef:3 +Column_3 +6 +TypeRef:3 +Column_4 +7 +TypeRef:3 +Column_5 +8 +TypeRef:3 +Column_6 +9 +TypeRef:3 +Column_7 +10 +TypeRef:3 +Column_8 +11 +TypeRef:3 +Column_9 +12 +TypeRef:3 +Column_10 +13 +TypeRef:3 +Column_11 +14 +TypeRef:3 +Column_12 +15 +TypeRef:3 +Column_13 +16 +TypeRef:3 +Column_14 +17 +Int32 +ColumnsNum +15 +Int32 +NumItemSerializers +0 +Int32 +LastValueTimeDecimalPlaces +6 +Boolean +PhysValueConditionalFormattingEnabled +True +Boolean +IsFavoriteFilteringActive +False +APPDIR Vector.CANalyzer.Data.DLL +Vector.CANalyzer.Data, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Data.Favorite +4 +CurrentFavorite +18 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Collections.Generic.List`1[[Vector.CANalyzer.Data.Favorite, Vector.CANalyzer.Data, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null]] +5 +Favorites +19 +Boolean +AllArrayFiltersActive +True +Boolean +AddNewSymbolsToActiveFavoriteGroup +True +Boolean +AddNewSymbolsToSameFavoriteGroupAsCustomGroup +True +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +6 +SerializationVersion +20 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +8 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +TypeRef:3 +3 +Int32 +columnID +0 +Int32 +columnIndex +0 +Boolean +columnIsVisible +True +Double +columnWidth +100 +TypeRef:6 +SerializationVersion +21 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:3 +4 +Int32 +columnID +1 +Int32 +columnIndex +1 +Boolean +columnIsVisible +True +Double +columnWidth +30 +--TextFormatter: End of Object-- +TypeRef:3 +5 +Int32 +columnID +2 +Int32 +columnIndex +2 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +6 +Int32 +columnID +3 +Int32 +columnIndex +3 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +7 +Int32 +columnID +4 +Int32 +columnIndex +4 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +8 +Int32 +columnID +5 +Int32 +columnIndex +5 +Boolean +columnIsVisible +True +Double +columnWidth +65 +--TextFormatter: End of Object-- +TypeRef:3 +9 +Int32 +columnID +6 +Int32 +columnIndex +6 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +10 +Int32 +columnID +7 +Int32 +columnIndex +7 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +11 +Int32 +columnID +8 +Int32 +columnIndex +8 +Boolean +columnIsVisible +True +Double +columnWidth +50 +--TextFormatter: End of Object-- +TypeRef:3 +12 +Int32 +columnID +9 +Int32 +columnIndex +9 +Boolean +columnIsVisible +True +Double +columnWidth +65 +--TextFormatter: End of Object-- +TypeRef:3 +13 +Int32 +columnID +10 +Int32 +columnIndex +10 +Boolean +columnIsVisible +False +Double +columnWidth +105 +--TextFormatter: End of Object-- +TypeRef:3 +14 +Int32 +columnID +11 +Int32 +columnIndex +11 +Boolean +columnIsVisible +True +Double +columnWidth +65 +--TextFormatter: End of Object-- +TypeRef:3 +15 +Int32 +columnID +12 +Int32 +columnIndex +12 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +16 +Int32 +columnID +13 +Int32 +columnIndex +13 +Boolean +columnIsVisible +True +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:3 +17 +Int32 +columnID +14 +Int32 +columnIndex +14 +Boolean +columnIsVisible +False +Double +columnWidth +80 +--TextFormatter: End of Object-- +TypeRef:4 +18 +Int32 +ID +1 +String +Name +1 +Favorite 1 +Int32 +Color +-13312 +TypeRef:6 +SerializationVersion +22 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:5 +19 +Array +_items +23 +TypeRef:4 +1 +0 +3 +TypeRef:4 +ArrayElement +24 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Object +7 +ArrayElement +0 +TypeRef:7 +ArrayElement +0 +TypeRef:7 +ArrayElement +0 +Int32 +_size +1 +Int32 +_version +1 +--TextFormatter: End of Object-- +TypeRef:4 +24 +Int32 +ID +1 +String +Name +1 +Favorite 1 +Int32 +Color +-13312 +--TextFormatter: End of Object-- +VLogCfgData 22 Begin_Of_Object +14 +0 +0 +0 +0 +0 +0 +0 +0 +1024 +60 +0 +0 +0 +3 +1 +111 +1 +1 +0 +2 +0 +0 +22 +VLogExportPersister 23 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 23 + +End_Of_Serialized_Data 22 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Data.mdf" +0 +0 +0 +30 +80 +0 +1 +1 +0 + + + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\{LoggingBlock}.mdf" + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Data.mdf" +1 +0 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\{LoggingBlock}.mdf" +0 +b1c6eb90-a227-4322-868a-5ae08ff1b316 +1 +VLoggingComment 23 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 24 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 24 +End_Of_Object VLoggingComment 23 +3 +0 +0 +End_Of_Object VLogCfgData 22 +End_Of_Object VNETDataListControlHost 21 +VDOLine 21 Begin_Of_Object +1 +57 +0 +130 0 +NULL +End_Of_Object VDOLine 21 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 20 +End_Of_Object VDODynamicLine 19 +End_Of_Object VDAOGBHSStd 18 +NULL +End_Of_Object VDORefinement 17 +VDORefinement 17 Begin_Of_Object +1 +58 +0 +5 +VDAOGBHSStd 18 Begin_Of_Object +1 +59 +0 +0 0 +TABPredecessor: +56 +TABSuccessor: +61 +VDODynamicLine 19 Begin_Of_Object +1 +60 +0 +0 +VDAOGBFunctionBlock 20 Begin_Of_Object +1 +61 +0 +TABPredecessor: +59 +TABSuccessor: +71 +VGraphBoxConf 21 Begin_Of_Object +1 +VNETGraphBox 22 Begin_Of_Object +1 +VNETControlBox 23 Begin_Of_Object +2 +VUniqueBox 24 Begin_Of_Object +1 +VBoxRoot 25 Begin_Of_Object +1 +1 +0 -1 0 1 -1 -1 -1 -1 0 570 1716 1141 +Patient Monitor +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 -1 -1 0 327 1473 629 +0 +1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 0 0 0 0 1920 422 +1 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 570 1716 1141 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{7902E933-72AC-413A-90EC-BF01A148D3B1} +0 +End_Of_Object VBoxRoot 25 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 24 +0 +0 +End_Of_Object VNETControlBox 23 +End_Of_Object VNETGraphBox 22 +81 +APPDIR Vector.CANalyzer.Graphic.DLL +Vector.CANalyzer.Graphic, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Graphic.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +Boolean +Expanded +True +Int32 +SplitterWidth +184 +Int32 +SplitterHeight +80 +APPDIR Vector.CANalyzer.Graphic.DLL +Vector.CANalyzer.Graphic, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Graphic.Position +3 +LegendPosition +3 +Int32 +value__ +0 +--TextFormatter: End of Object-- +APPDIR Vector.CANalyzer.Graphic.DLL +Vector.CANalyzer.Graphic, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Graphic.GraphicCommandID +4 +ScrollSignalsButton1Command +4 +Int32 +value__ +29 +--TextFormatter: End of Object-- +TypeRef:4 +ScrollSignalsButton2Command +5 +Int32 +value__ +30 +--TextFormatter: End of Object-- +TypeRef:4 +ScrollButton1Command +6 +Int32 +value__ +35 +--TextFormatter: End of Object-- +TypeRef:4 +ScrollButton2Command +7 +Int32 +value__ +36 +--TextFormatter: End of Object-- +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +5 +SerializationVersion +8 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +VSignalObjectStreamer 22 Begin_Of_Object +1 +5 +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +Receiver.patientVitals.nibp_d +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +PatientMonitor::Receiver.patientVitals +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 +nibp_d +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +Receiver.patientVitals.nibp_d +"" 159 800080 -8.82 92.82 -100. 100. 100 -10 0 0 576000000 1 1 0 0 NiBP_-_D +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +Receiver.patientVitals.nibp_s +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +PatientMonitor::Receiver.patientVitals +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 +nibp_s +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +Receiver.patientVitals.nibp_s +"" 159 8080 -13.125 138.125 -100. 100. 100 -10 0 0 576000000 1 1 0 0 NiBP_-_S +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +Receiver.patientVitals.etco2 +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +PatientMonitor::Receiver.patientVitals +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 +etco2 +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +Receiver.patientVitals.etco2 +"" 159 8000 -4.725 49.725 -100. 100. 50 0 0 0 576000000 1 1 0 0 EtCO2 +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +Receiver.patientVitals.hr +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +PatientMonitor::Receiver.patientVitals +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 +hr +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +Receiver.patientVitals.hr +"" 159 80 -6.825 71.825 -100. 100. 50 -10 0 0 576000000 1 1 0 0 HR +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +Receiver.patientVitals.spo2 +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +PatientMonitor::Receiver.patientVitals +1 +1 +2 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 +spo2 +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +Receiver.patientVitals.spo2 +"" 159 800000 -10.395 109.395 -100. 100. 100 -10 0 0 576000000 1 1 0 0 SpO2 +[GraphWindow:x_x_x_x_x_x_WindowBk_Grid_AxisBk_XAxisFr_YAxisFr_x_x_x_x_x_x] +140946.81372999999439 248187.55410999999731 135227.98751999999513 200000 576000000 1 ffffff b2b2b2 ffffff 0 0 1 0 1 1 1 0 +0 30 5000 +0 +0 100 +0 +16777215 +0 +2 +0 +1 +41943040 +0 +VLogExportPersister 23 Begin_Of_Object +7 +1416 +25200253 +Graphics Window + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 23 +12 +21 38 62 20 18 27 27 29 36 40 53 13 +184 +0 +0 +1 +0 +0 +0 +-11 +0 +0 +0 +0 +0 +0 +0 +400 +0 +Tahoma +2 +1 +0 +0 +0 +-11 +0 +0 +0 +34 +0 +0 +0 +400 +0 +Tahoma +0 +1 +1 +0 +0 +11711154 +32768 +0 +0 +0 +0 +0 +0 +0 +0 +0 +302 +1 10 +1 +5 +1 +0 0 + +NiBP - D +8388736 0 +1 +1 1 + +NiBP - S +32896 0 +1 +2 2 + +EtCO2 +32768 0 +1 +3 3 + +HR +128 0 +1 +4 4 + +SpO2 +8388608 0 +0 +VLogCfgData 23 Begin_Of_Object +14 +0 +0 +0 +0 +0 +0 +0 +0 +1024 +60 +0 +0 +0 +3 +1 +111 +1 +1 +0 +2 +0 +0 +23 +VLogExportPersister 24 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 24 + +End_Of_Serialized_Data 23 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Patient_Monitor.mdf" +0 +0 +0 +30 +80 +0 +1 +1 +0 + + + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\{LoggingBlock}.mdf" + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Patient_Monitor.mdf" +1 +0 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\{LoggingBlock}.mdf" +0 +263f11e0-04e4-43e6-a0d9-f4cf1d111e8f +1 +VLoggingComment 24 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 25 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 25 +End_Of_Object VLoggingComment 24 +3 +0 +0 +End_Of_Object VLogCfgData 23 +0 128 +0 0 0 0 +1 40 20 15 +0 1000000000 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +1 14 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 +0 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +21 38 82 27 27 29 36 40 53 53 82 40 82 82 +184 80 +0 +1 +30000000000 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +1 +0 +0 +0 +End_Of_Object VSignalObjectStreamer 22 +End_Of_Object VGraphBoxConf 21 +VDOLine 21 Begin_Of_Object +1 +62 +0 +130 0 +NULL +End_Of_Object VDOLine 21 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 20 +End_Of_Object VDODynamicLine 19 +End_Of_Object VDAOGBHSStd 18 +NULL +End_Of_Object VDORefinement 17 +VDORefinement 17 Begin_Of_Object +1 +70 +0 +5 +VDAOGBHSStd 18 Begin_Of_Object +1 +71 +0 +0 0 +TABPredecessor: +61 +TABSuccessor: +73 +VDODynamicLine 19 Begin_Of_Object +1 +72 +0 +0 +VDAOGBFunctionBlock 20 Begin_Of_Object +1 +73 +0 +TABPredecessor: +71 +TABSuccessor: +64 +VGraphBoxConf 21 Begin_Of_Object +1 +VNETGraphBox 22 Begin_Of_Object +1 +VNETControlBox 23 Begin_Of_Object +2 +VUniqueBox 24 Begin_Of_Object +1 +VBoxRoot 25 Begin_Of_Object +1 +1 +0 -1 0 1 0 0 0 0 384 169 1536 679 +Arm Monitor +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 0 0 963 427 1920 848 +1 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 0 0 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{D3DC6964-14E7-46A6-A953-EADDCE81654E} +0 +End_Of_Object VBoxRoot 25 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 24 +0 +0 +End_Of_Object VNETControlBox 23 +End_Of_Object VNETGraphBox 22 +81 +APPDIR Vector.CANalyzer.Graphic.DLL +Vector.CANalyzer.Graphic, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Graphic.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +Boolean +Expanded +True +Int32 +SplitterWidth +209 +Int32 +SplitterHeight +80 +APPDIR Vector.CANalyzer.Graphic.DLL +Vector.CANalyzer.Graphic, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Graphic.Position +3 +LegendPosition +3 +Int32 +value__ +0 +--TextFormatter: End of Object-- +APPDIR Vector.CANalyzer.Graphic.DLL +Vector.CANalyzer.Graphic, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Graphic.GraphicCommandID +4 +ScrollSignalsButton1Command +4 +Int32 +value__ +29 +--TextFormatter: End of Object-- +TypeRef:4 +ScrollSignalsButton2Command +5 +Int32 +value__ +30 +--TextFormatter: End of Object-- +TypeRef:4 +ScrollButton1Command +6 +Int32 +value__ +35 +--TextFormatter: End of Object-- +TypeRef:4 +ScrollButton2Command +7 +Int32 +value__ +36 +--TextFormatter: End of Object-- +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +5 +SerializationVersion +8 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +VSignalObjectStreamer 22 Begin_Of_Object +1 +5 +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +panelHelper.base_position_deg +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +SurgicalRobot::panelHelper.base_position_deg +1 +1 +3 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 + +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +panelHelper.base_position_deg +"" 1 800080 -94. 58. -100. 100. 100 0 0 0 576000000 1 1 0 0 BASE +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +panelHelper.shoulder_position_deg +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +SurgicalRobot::panelHelper.shoulder_position_deg +1 +1 +3 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 + +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +panelHelper.shoulder_position_deg +"" 1 80 -29. 125. -100. 100. 100 0 0 0 576000000 1 1 0 0 SHOULDER +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +panelHelper.elbow_position_deg +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +SurgicalRobot::panelHelper.elbow_position_deg +1 +1 +3 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 + +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +panelHelper.elbow_position_deg +"" 1 8080 -12. 53. -100. 100. 50 0 0 0 576000000 1 1 0 0 ELBOW +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +panelHelper.wrist_position_deg +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +SurgicalRobot::panelHelper.wrist_position_deg +1 +1 +3 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 + +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +panelHelper.wrist_position_deg +"" 1 800000 -30. 70. -100. 100. 50 0 0 0 576000000 1 1 0 0 WRIST +VFBDOMemberObject 23 Begin_Of_Object +1 +VHostSignal 24 Begin_Of_Object +2 +0 +panelHelper.hand_position_deg +0 +End_Of_Object VHostSignal 24 +23 +ValueObjectConfiguration::VConfiguredDOMember 24 Begin_Of_Object +2 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 Begin_Of_Object +1 +NFunctionBus::VConfigDOMember 27 Begin_Of_Object +4 +VConfigEvent 28 Begin_Of_Object +1 +End_Of_Object VConfigEvent 28 +SurgicalRobot::panelHelper.hand_position_deg +1 +1 +3 +0 +0 +End_Of_Object NFunctionBus::VConfigDOMember 27 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 26 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 25 +0 + +End_Of_Object ValueObjectConfiguration::VConfiguredDOMember 24 + +End_Of_Serialized_Data 23 +0 +End_Of_Object VFBDOMemberObject 23 +[MeasurementObject] +panelHelper.hand_position_deg +"" 1 8000 -81. 52. -100. 100. 100 0 0 0 576000000 1 1 0 0 HAND +[GraphWindow:x_x_x_x_x_x_WindowBk_Grid_AxisBk_XAxisFr_YAxisFr_x_x_x_x_x_x] +0 811505.1847500000149 811505.1847500000149 200000 576000000 1 ffffff b2b2b2 ffffff 0 0 0 0 1 1 1 1 +0 30 5000 +0 +0 100 +0 +16777215 +0 +2 +0 +1 +41943040 +1 +VLogExportPersister 23 Begin_Of_Object +7 +1416 +25200253 +Graphics Window + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 23 +12 +21 38 62 20 18 34 22 24 29 33 44 13 +209 +0 +0 +1 +0 +0 +0 +-11 +0 +0 +0 +0 +0 +0 +0 +400 +0 +Tahoma +2 +1 +0 +0 +0 +-11 +0 +0 +0 +34 +0 +0 +0 +400 +0 +Tahoma +0 +1 +1 +0 +0 +11711154 +32768 +0 +0 +0 +0 +0 +0 +0 +0 +0 +301 +0 10 +1 +5 +1 +0 0 + +panelHelper.base_position_deg +8388736 0 +1 +1 1 + +panelHelper.shoulder_position_deg +128 0 +1 +2 2 + +panelHelper.elbow_position_deg +32896 0 +1 +3 3 + +panelHelper.wrist_position_deg +8388608 0 +1 +4 4 + +panelHelper.hand_position_deg +32768 0 +0 +VLogCfgData 23 Begin_Of_Object +14 +0 +0 +0 +0 +0 +0 +0 +0 +1024 +60 +0 +0 +0 +3 +1 +111 +1 +1 +0 +2 +0 +0 +23 +VLogExportPersister 24 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 24 + +End_Of_Serialized_Data 23 + 1 "Graphics_2.mdf" +0 +1 +0 +30 +80 +0 +1 +1 +0 + + + 1 "{LoggingBlock}.mdf" + 1 "Graphics_2.mdf" +1 +0 + 1 "{LoggingBlock}.mdf" +0 +2d6a068d-0ab4-4e6e-9547-746e2fafb79c +1 +VLoggingComment 24 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 25 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 25 +End_Of_Object VLoggingComment 24 +3 +0 +0 +End_Of_Object VLogCfgData 23 +0 128 +0 0 0 0 +1 40 20 15 +0 0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 14 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 +0 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +21 38 82 34 22 24 29 33 44 44 82 30 82 82 +209 80 +0 +1 +30000000000 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +0 +1 +1 +0 +1 +0 +0 +0 +End_Of_Object VSignalObjectStreamer 22 +End_Of_Object VGraphBoxConf 21 +VDOLine 21 Begin_Of_Object +1 +74 +0 +130 0 +NULL +End_Of_Object VDOLine 21 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 20 +End_Of_Object VDODynamicLine 19 +End_Of_Object VDAOGBHSStd 18 +NULL +End_Of_Object VDORefinement 17 +VDORefinement 17 Begin_Of_Object +1 +63 +0 +6 +VDAOGBHSStd 18 Begin_Of_Object +1 +64 +0 +1 0 +TABPredecessor: +73 +TABSuccessor: +66 +VDODynamicLine 19 Begin_Of_Object +1 +65 +0 +0 +VDAOGBFunctionBlock 20 Begin_Of_Object +1 +66 +0 +TABPredecessor: +64 +TABSuccessor: +68 +VTriggerConfiguration 21 Begin_Of_Object +2 +VMigratedGenericConfiguration 22 Begin_Of_Object +1 +VTriggerCfgData 23 Begin_Of_Object +5 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +5000 +VEvCondBlock 24 Begin_Of_Object +1 +VEvCondGroup 25 Begin_Of_Object +2 +VEvCondPrimitive 26 Begin_Of_Object +1 +1 +End_Of_Object VEvCondPrimitive 26 +1 +0 +0 +End_Of_Object VEvCondGroup 25 +End_Of_Object VEvCondBlock 24 +VEvCondBlock 24 Begin_Of_Object +1 +VEvCondGroup 25 Begin_Of_Object +2 +VEvCondPrimitive 26 Begin_Of_Object +1 +1 +End_Of_Object VEvCondPrimitive 26 +1 +0 +0 +End_Of_Object VEvCondGroup 25 +End_Of_Object VEvCondBlock 24 +0 +0 +0 +116 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +End_Of_Object VTriggerCfgData 23 +End_Of_Object VMigratedGenericConfiguration 22 +VTriggerBox 22 Begin_Of_Object +1 +VBoxRoot 23 Begin_Of_Object +1 +1 +1 -1 0 1 0 0 0 0 344 229 1376 916 +Logging +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 -1 -1 344 229 1376 916 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 344 229 1376 916 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 344 229 1376 916 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{CC3015E5-D2E9-4039-9848-481DD9B242F3} +0 +End_Of_Object VBoxRoot 23 +End_Of_Object VTriggerBox 22 +0 +End_Of_Object VTriggerConfiguration 21 +VDOLine 21 Begin_Of_Object +1 +67 +0 +10 0 +VDAOGBFunctionBlock 22 Begin_Of_Object +1 +68 +0 +TABPredecessor: +66 +TABSuccessor: +0 +VLoggingConfiguration 23 Begin_Of_Object +5 +VMigratedGenericConfiguration 24 Begin_Of_Object +1 +VLogCfgData 25 Begin_Of_Object +14 +1 +1 +1 +0 +0 +0 +0 +0 +1024 +60 +1 +0 +0 +3 +1 +111 +1 +1 +0 +2 +0 +0 +25 +VLogExportPersister 26 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 26 + +End_Of_Serialized_Data 25 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging.blf" +0 +0 +0 +30 +80 +0 +1 +1 +1 + + + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\{LoggingBlock}.blf" + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\.blf" +1 +0 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\{LoggingBlock}.blf" +0 +7d383304-635e-4516-9fd2-02c13344ab43 +1 +VLoggingComment 26 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 27 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 27 +End_Of_Object VLoggingComment 26 +2 +0 +0 +End_Of_Object VLogCfgData 25 +End_Of_Object VMigratedGenericConfiguration 24 +1 +End_Of_Object VLoggingConfiguration 23 +VDOLine 23 Begin_Of_Object +1 +69 +0 +60 0 +NULL +End_Of_Object VDOLine 23 + +EndOfComment +1 +1 +End_Of_Object VDAOGBFunctionBlock 22 +End_Of_Object VDOLine 21 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 20 +End_Of_Object VDODynamicLine 19 +End_Of_Object VDAOGBHSStd 18 +NULL +End_Of_Object VDORefinement 17 +End_Of_Object VDOFRamification 16 +End_Of_Object VDODynamicLine 15 +End_Of_Object VDAOGBHSStd 14 +End_Of_Object VDAOSwitch 13 +End_Of_Object VDODynamicLine 12 +End_Of_Object VDAOGBHSStd 11 +NULL +VDODynamicLine 11 Begin_Of_Object +1 +36 +1 +20 +VDAOGBHSStd 12 Begin_Of_Object +1 +37 +1 +1 0 +TABPredecessor: +5 +TABSuccessor: +42 +VDODynamicLine 13 Begin_Of_Object +1 +38 +1 +0 +VDODynamicLine 14 Begin_Of_Object +1 +39 +1 +10 +VDODynamicLine 15 Begin_Of_Object +1 +40 +0 +20 +VDOLine 16 Begin_Of_Object +1 +41 +0 +10 0 +VDAOGBFunctionBlock 17 Begin_Of_Object +1 +42 +0 +TABPredecessor: +37 +TABSuccessor: +8 +VLoggingConfiguration 18 Begin_Of_Object +5 +VMigratedGenericConfiguration 19 Begin_Of_Object +1 +VLogCfgData 20 Begin_Of_Object +14 +0 +1 +1 +0 +0 +0 +0 +0 +1024 +60 +0 +0 +0 +3 +1 +111 +1 +1 +0 +2 +1 +0 +20 +VLogExportPersister 21 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 21 + +End_Of_Serialized_Data 20 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_PreFilter.blf" +0 +0 +0 +30 +80 +0 +1 +1 +1 + + + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_PreFilter.blf" + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_PreFilter.blf" +1 +0 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_PreFilter.blf" +0 +aa398d7f-42b6-49f2-8924-4fd132725d5d +1 +VLoggingComment 21 Begin_Of_Object +1 +1 +VLoggingCommentAttribute 22 Begin_Of_Object +1 +Comment + +1 +End_Of_Object VLoggingCommentAttribute 22 +End_Of_Object VLoggingComment 21 +2 +0 +0 +End_Of_Object VLogCfgData 20 +End_Of_Object VMigratedGenericConfiguration 19 +5 +End_Of_Object VLoggingConfiguration 18 +NULL + +EndOfComment +1 +1 +End_Of_Object VDAOGBFunctionBlock 17 +End_Of_Object VDOLine 16 +End_Of_Object VDODynamicLine 15 +End_Of_Object VDODynamicLine 14 +End_Of_Object VDODynamicLine 13 +End_Of_Object VDAOGBHSStd 12 +End_Of_Object VDODynamicLine 11 +4 +End_Of_Object VDOCrossing 10 +End_Of_Object VDODynamicLine 9 +End_Of_Object VDAOGBHSStd 8 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 7 +End_Of_Object VDODynamicLine 6 + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 5 + +EndOfComment +1 +1 +End_Of_Object VDAOGBFunctionBlock 4 +VDAOGBFunctionBlock 4 Begin_Of_Object +1 +43 +0 +TABPredecessor: +0 +TABSuccessor: +44 +VOfflineSrcConfiguration 5 Begin_Of_Object +3 +VMigratedGenericConfiguration 6 Begin_Of_Object +1 +VOfflineCfgData 7 Begin_Of_Object +2 +VReplayCfgBase 8 Begin_Of_Object +1 +0 +1 +End_Of_Object VReplayCfgBase 8 +VCfgBreakCondition 8 Begin_Of_Object +1 +VDataBreakCondition 9 Begin_Of_Object +1 +0 +VEvCondBlock 10 Begin_Of_Object +1 +VEvCondGroup 11 Begin_Of_Object +2 +VEvCondPrimitive 12 Begin_Of_Object +1 +1 +End_Of_Object VEvCondPrimitive 12 +1 +0 +0 +End_Of_Object VEvCondGroup 11 +End_Of_Object VEvCondBlock 10 +End_Of_Object VDataBreakCondition 9 +End_Of_Object VCfgBreakCondition 8 +0 +0 +0 +0 +0 +0 +End_Of_Object VOfflineCfgData 7 +End_Of_Object VMigratedGenericConfiguration 6 +VChannelMapping 6 Begin_Of_Object +2 +0 +End_Of_Object VChannelMapping 6 +End_Of_Object VOfflineSrcConfiguration 5 +NULL + +EndOfComment +1 +1 +End_Of_Object VDAOGBFunctionBlock 4 +0 +End_Of_Object VDOLocalInfoStruct 3 +67305472 +0 +0 +2 +VDOLocalInfoStruct 3 Begin_Of_Object +End_Of_Object VDOLocalInfoStruct 3 +End_Of_Serialized_Data 2 +0.000000 +0 0 +End_Of_Object VGBAnlyzBox 2 +VGBRealTimeBox 2 Begin_Of_Object +1 +VGrMnBox 3 Begin_Of_Object +1 +VUniqueBox 4 Begin_Of_Object +1 +VBoxRoot 5 Begin_Of_Object +1 +3 +1 -1 0 1 0 0 0 0 344 229 1376 916 + +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 -1 -1 0 0 1957 1061 +0 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 344 229 1376 916 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 344 229 1376 916 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{414CB402-95A0-42C2-89CC-E4EE7F8A6078} +0 +End_Of_Object VBoxRoot 5 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 4 +End_Of_Object VGrMnBox 3 +VDOLocalInfoStruct 3 Begin_Of_Object +4 +1 +32 +VDAOBus 4 Begin_Of_Object +1 +1 +0 +0 +TABPredecessor: +0 +TABSuccessor: +2 +VDAOGBFunctionBlock 5 Begin_Of_Object +1 +2 +0 +TABPredecessor: +1 +TABSuccessor: +0 +VCardConf 6 Begin_Of_Object +1 +End_Of_Object VCardConf 6 +NULL + +EndOfComment +0 +1 +End_Of_Object VDAOGBFunctionBlock 5 +End_Of_Object VDAOBus 4 +NULL +0 +End_Of_Object VDOLocalInfoStruct 3 +0.000000 +0 0 +1 1 0 59420 1 280 1 2882400001 699 979 511 1526 2882400002 0 0 0 0 0 20 0 2882400001 1820 2020 944 1144 2882400002 0 0 0 140704642098072 0 0 3 +SS_BEGIN_COMMON_INFO +1 +0 +SS_END_COMMON_INFO + +EOF_MBSSDATA +0 + +EOF_MBSSDATA +End_Of_Object VGBRealTimeBox 2 +VWriteBox 2 Begin_Of_Object +2 +VUniqueBox 3 Begin_Of_Object +1 +VBoxRoot 4 Begin_Of_Object +1 +3 +1 0 0 1 -1 -1 -1 -1 0 759 1716 1141 +Write +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 0 511 734 848 +1 +0 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 759 1716 1141 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 759 1716 1141 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{06738A1F-DC8D-430D-9BAF-63D6B7DF8E8B} +0 +End_Of_Object VBoxRoot 4 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 3 +2 +VWriteControlAdapter 3 Begin_Of_Object +2 +VControlAdapter 4 Begin_Of_Object +1 +End_Of_Object VControlAdapter 4 +1 +3 +WListVer 2 + 1 "..\..\..\Public\Documents\Vector\CANoe lite Family\19.0.97 (x64)\Templates\CANoeLite" + 0 1 1 1 1 0 + False 147 143 0 1048 760 760 760 +End_Of_Serialized_Data 3 +End_Of_Object VWriteControlAdapter 3 + +End_Of_Serialized_Data 2 +End_Of_Object VWriteBox 2 +VWinStore 2 Begin_Of_Object +1 +22 2 3 -1 -1 -1 -1 -8 -8 1924 1047 +End_Of_Child_List +End_Of_Object VWinStore 2 +VWinStore 2 Begin_Of_Object +1 +22 2 3 -1 -1 -1 -1 93 130 1369 1089 +End_Of_Child_List +End_Of_Object VWinStore 2 +VChipMultibusConfig 2 Begin_Of_Object +1 +Version 8 10 +5 255 +0 +9 0 +11 0 +1 +14 0 +1 +12 1 +3 +0 127 0 0 1 2900 10 0 0 0 +1 0 +5 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13 0 +2 +15 0 +7 0 +16 0 +1 +End_Of_Object VChipMultibusConfig 2 +VChipConfigC200 2 Begin_Of_Object +1 +0 +200 16000 0 0 +0 58 250 0 255 0 0 +1 1000 0 +0 +End_Of_Object VChipConfigC200 2 +VChipConfigC200 2 Begin_Of_Object +1 +0 +200 16000 0 0 +0 58 250 0 255 0 0 +1 1000 1 +0 +End_Of_Object VChipConfigC200 2 +VChipConfigC005 2 Begin_Of_Object +1 +0 +5 16000 0 0 +0 35 96 0 2047 0 0 0 0 0 +1 1000 0 +0 +End_Of_Object VChipConfigC005 2 +VChipConfigC005 2 Begin_Of_Object +1 +0 +5 16000 0 0 +0 35 96 0 2047 0 0 0 0 0 +1 1000 1 +0 +End_Of_Object VChipConfigC005 2 +VChipConfigC527 2 Begin_Of_Object +1 +0 +527 16000 0 0 +1 35 0 0 0 0 0 0 0 0 +1 1000 0 +0 +End_Of_Object VChipConfigC527 2 +VChipConfigC527 2 Begin_Of_Object +1 +0 +527 16000 0 0 +1 35 0 0 0 0 0 0 0 0 +1 1000 1 +0 +End_Of_Object VChipConfigC527 2 +VChipConfigC1000 2 Begin_Of_Object +1 +0 +1000 16000 0 0 +1 35 1 0 2 0 0 0 0 0 0 +1 1000 0 +0 +55 24 0 +2 2 27 12 2 2 0 +0 +0 0 +13 6 2 1 +0 0 +1 +80000 160000 2 +55 24 2 2 +27 12 2 2 +13 6 2 2 +80000 +End_Of_Object VChipConfigC1000 2 +VChipConfigC1000 2 Begin_Of_Object +1 +0 +1000 16000 0 0 +1 35 1 0 2 0 0 0 0 0 0 +1 1000 1 +0 +55 24 0 +2 2 27 12 2 2 0 +0 +0 0 +13 6 2 1 +0 0 +1 +80000 160000 2 +55 24 2 2 +27 12 2 2 +13 6 2 2 +80000 +End_Of_Object VChipConfigC1000 2 +VChipConfigC462 2 Begin_Of_Object +1 +462 16000 0 0 +125000 0 0 1 3 0 0 0 0 0 0 28 28 28 28 8 0 0 10 +1 1000 0 +0 +End_Of_Object VChipConfigC462 2 +VChipConfigC462 2 Begin_Of_Object +1 +462 16000 0 0 +125000 0 0 1 3 0 0 0 0 0 0 28 28 28 28 8 0 0 10 +1 1000 1 +0 +End_Of_Object VChipConfigC462 2 +0 +12 +3 0 +5 0 +7 0 +8 0 +9 0 +11 0 +13 0 +14 0 +15 0 +16 0 +17 0 +18 0 +VScanBaudrateConfiguration 2 Begin_Of_Object +1 +0 +End_Of_Object VScanBaudrateConfiguration 2 +4 +1 +VPanelBox 2 Begin_Of_Object +2 +VUniqueBox 3 Begin_Of_Object +1 +VBoxRoot 4 Begin_Of_Object +1 +3 +0 -1 0 1 0 0 0 0 384 169 1536 679 +RobotPanel +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 0 0 0 0 0 0 0 0 0 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 0 0 0 427 958 848 +1 +-1 +0 +1 +1 +0 +END_OF_DESKTOP_DATA +7 +0 0 0 0 0 0 0 0 0 0 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{6599BD51-288A-4CC6-873D-1D0BB97AF1B4} +0 +End_Of_Object VBoxRoot 4 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 3 +2 +VPanelAdapter 3 Begin_Of_Object +2 + 1 "RobotPanel.xvp" +1 +0 +3407973 +VPanelInfo 4 Begin_Of_Object +1 +VPanelActiveX 5 Begin_Of_Object +1 +4294967295 +0 + 1 "" +801091872 +End_Of_Object VPanelActiveX 5 +End_Of_Object VPanelInfo 4 +0 +End_Of_Object VPanelAdapter 3 + +End_Of_Serialized_Data 2 +End_Of_Object VPanelBox 2 +VPersistentPath 2 Begin_Of_Object +1 + 1 "RTIMedTech.cpd" +End_Of_Object VPersistentPath 2 +0 +0 +0 +0 +VPlugInsPersistentWrapper 2 Begin_Of_Object +1 + + +End_Of_Object VPlugInsPersistentWrapper 2 +0 +0 +VMacroStreamer 2 Begin_Of_Object +2 +VMacroManagerPersistentData 3 Begin_Of_Object +3 +0 +0 +0 +0 +End_Of_Object VMacroManagerPersistentData 3 +End_Of_Object VMacroStreamer 2 +VSignalGeneratorStreamer 2 Begin_Of_Object +1 +VAnlyzSigGeneratorManager 3 Begin_Of_Object +5 +0 +0 +0 +0 +0 +End_Of_Object VAnlyzSigGeneratorManager 3 +End_Of_Object VSignalGeneratorStreamer 2 +SignalGeneratorsReplay 1 +VNETStandaloneComponent 2 Begin_Of_Object +1 +VNETControlBox 3 Begin_Of_Object +2 +VUniqueBox 4 Begin_Of_Object +1 +VBoxRoot 5 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Signal Generators and Signal Replay +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{43FDA286-9264-499A-9C69-03D01879072C} +0 +End_Of_Object VBoxRoot 5 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 4 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 3 +31 +APPDIR Vector.CANoe.SignalGenerators.DLL +Vector.CANoe.SignalGenerators, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.SignalGenerators.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +1 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 2 +2 +1 +2 +1 + + +true +None + + + + + + + +true +0 +Ascending +200 + + +-1 +100 + + +true +1 +100 + + +-1 +100 + + +true +2 +100 + + +-1 +100 + + +-1 +100 + + +true +3 +100 + + +-1 +100 + + +-1 +100 + + +true +4 +200 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +Embedded/NetworkSymbols + + + + +END_OF_WORKSPACE_MEMBER_DATA +END_OF_WORKSPACE_MEMBER +3 +0 +0 +0 +0 +-1 +0 + +END_OF_WORKSPACE_DATA + +END_OF_WORKSPACE_CONFIGURATION +LinNMWindow 0 +LinScopeWindow 0 +VCanGlOpConf 2 Begin_Of_Object +1 +1 +1 +End_Of_Object VCanGlOpConf 2 +0 +1 +0 + +StartOfComment +EndOfComment +19.3 SP3 +VHILInterfaceMgrAnlyz 2 Begin_Of_Object +5 +0 +0 +2809 +0 +3030 +1 +End_Of_Object VHILInterfaceMgrAnlyz 2 +0 +BasicDiagnosticsEditor 1 +VNETStandaloneComponent 2 Begin_Of_Object +1 +VNETControlBox 3 Begin_Of_Object +2 +VUniqueBox 4 Begin_Of_Object +1 +VBoxRoot 5 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Basic Diagnostics +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{2CA627B4-51E6-45B0-8053-D0A0AEEC7F10} +0 +End_Of_Object VBoxRoot 5 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 4 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 3 +31 +APPDIR Vector.CANalyzer.BasicDiagnosticsEditor.DLL +Vector.CANalyzer.BasicDiagnosticsEditor, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.BasicDiagnosticsEditor.VBasicDiagnosticsEditorWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 2 +0 +CalculateExtendedStatistics 1 +0 +0 +25 +APPDIR CANw_Net.DLL +CANw_Net, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.SymbolSelectionListBox.Data.SymbolMRUList +1 +1 +Int32 +Count +0 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +2 +SerializationVersion +2 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +J1939::VGlobalSettings 2 Begin_Of_Object +2 +1 +0 +End_Of_Object J1939::VGlobalSettings 2 +VNETStandaloneComponent 2 Begin_Of_Object +1 +VNETControlBox 3 Begin_Of_Object +2 +VUniqueBox 4 Begin_Of_Object +1 +VBoxRoot 5 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Start Values +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{1EAA0C08-BF36-4C13-A730-7E6ECB43B27F} +0 +End_Of_Object VBoxRoot 5 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 4 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 3 +424 +APPDIR Vector.CANalyzer.StartValues.DLL +Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.StartValues.StartValuesController +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +APPDIR Vector.CANalyzer.StartValues.DLL +Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.StartValues.Model.StartValuesModel +3 +StartValuesModel +3 +APPDIR Vector.CANalyzer.StartValues.DLL +Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.StartValues.GUI.GUISettings +4 +GUISettings +4 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +5 +SerializationVersion +5 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +1 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +TypeRef:3 +3 +Boolean +SetValuesOnMeasurementStart +True + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Collections.Generic.List`1[[Vector.CANalyzer.StartValues.Model.StartValue, Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null]] +6 +StartValues +6 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Collections.Generic.List`1[[Vector.CANalyzer.StartValues.Model.StartValueGroup, Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null]] +7 +StartValuesGroups +7 +TypeRef:5 +SerializationVersion +8 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +1 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:4 +4 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Collections.Generic.List`1[[Vector.CANalyzer.StartValues.GUI.ColumnSettings, Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null]] +8 +ColumnSettings +9 +TypeRef:5 +SerializationVersion +10 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:6 +6 +Array +_items +11 +APPDIR Vector.CANalyzer.StartValues.DLL +Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.StartValues.Model.StartValue +9 +1 +0 +-1 +Int32 +_size +0 +Int32 +_version +0 +--TextFormatter: End of Object-- +TypeRef:7 +7 +Array +_items +12 +APPDIR Vector.CANalyzer.StartValues.DLL +Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.StartValues.Model.StartValueGroup +10 +1 +0 +3 +TypeRef:10 +ArrayElement +13 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Object +11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +Int32 +_size +1 +Int32 +_version +115 +--TextFormatter: End of Object-- +TypeRef:8 +9 +Array +_items +14 +APPDIR Vector.CANalyzer.StartValues.DLL +Vector.CANalyzer.StartValues, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.StartValues.GUI.ColumnSettings +12 +1 +0 +15 +TypeRef:12 +ArrayElement +15 +TypeRef:12 +ArrayElement +16 +TypeRef:12 +ArrayElement +17 +TypeRef:12 +ArrayElement +18 +TypeRef:12 +ArrayElement +19 +TypeRef:12 +ArrayElement +20 +TypeRef:12 +ArrayElement +21 +TypeRef:12 +ArrayElement +22 +TypeRef:12 +ArrayElement +23 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +TypeRef:11 +ArrayElement +0 +Int32 +_size +9 +Int32 +_version +159 +--TextFormatter: End of Object-- +TypeRef:10 +13 +Int32 +StartValueGroup_ID +0 +String +StartValueGroup_Name +1 +Start values group1 +String +StartValueGroup_Comment +1 + +Boolean +StartValueGroup_Active +True +Boolean +StartValueGroup_AutoPersist +False +TypeRef:5 +SerializationVersion +24 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +1 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:12 +15 +Int32 +mHandle +0 +Int32 +mDefaultWidth +25 +Int32 +mWidth +25 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +1 +TypeRef:5 +SerializationVersion +25 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +3 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:12 +16 +Int32 +mHandle +1 +Int32 +mDefaultWidth +142 +Int32 +mWidth +142 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +2 +--TextFormatter: End of Object-- +TypeRef:12 +17 +Int32 +mHandle +2 +Int32 +mDefaultWidth +130 +Int32 +mWidth +130 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +3 +--TextFormatter: End of Object-- +TypeRef:12 +18 +Int32 +mHandle +3 +Int32 +mDefaultWidth +84 +Int32 +mWidth +84 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +5 +--TextFormatter: End of Object-- +TypeRef:12 +19 +Int32 +mHandle +4 +Int32 +mDefaultWidth +120 +Int32 +mWidth +120 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +6 +--TextFormatter: End of Object-- +TypeRef:12 +20 +Int32 +mHandle +5 +Int32 +mDefaultWidth +70 +Int32 +mWidth +70 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +4 +--TextFormatter: End of Object-- +TypeRef:12 +21 +Int32 +mHandle +6 +Int32 +mDefaultWidth +55 +Int32 +mWidth +55 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +0 +--TextFormatter: End of Object-- +TypeRef:12 +22 +Int32 +mHandle +7 +Int32 +mDefaultWidth +198 +Int32 +mWidth +198 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +8 +--TextFormatter: End of Object-- +TypeRef:12 +23 +Int32 +mHandle +8 +Int32 +mDefaultWidth +40 +Int32 +mWidth +40 +Int32 +SortOrderInt +0 +Int32 +mVisibleIndex +7 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 2 +VStandaloneLoggingUserConfig 2 Begin_Of_Object +4 +0 +VLogCfgData 3 Begin_Of_Object +14 +1 +1 +0 +0 +1 +0 +0 +0 +1024 +60 +1 +0 +0 +3 +1 +111 +1 +1 +0 +2 +0 +0 +3 +VLogExportPersister 4 Begin_Of_Object +7 +1416 +11062249 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 4 + +End_Of_Serialized_Data 3 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_.blf" +0 +0 +1 +30 +80 +0 +1 +1 +1 + + + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_{MeasurementIndex}.blf" + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_001.blf" +0 +0 + 1 "..\..\..\Public\Documents\Vector\Public\Documents\Vector\CANoe lite\Sample Configurations 18.3.50\Logging_{MeasurementIndex}.blf" +0 +446b2bda-0712-4ba7-a223-d318bcc6d48d +1 +VLoggingComment 4 Begin_Of_Object +1 +0 +End_Of_Object VLoggingComment 4 +2 +0 +0 +End_Of_Object VLogCfgData 3 +0 +VAutoRunPreLoggingCaplBox 3 Begin_Of_Object +1 + 0 "" +0 +End_Of_Object VAutoRunPreLoggingCaplBox 3 +0 +VTriggerCfgData 3 Begin_Of_Object +5 +1 +0 +0 +1 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +1 +5000 +VEvCondBlock 4 Begin_Of_Object +1 +VEvCondGroup 5 Begin_Of_Object +2 +VEvCondPrimitive 6 Begin_Of_Object +1 +1 +End_Of_Object VEvCondPrimitive 6 +1 +0 +0 +End_Of_Object VEvCondGroup 5 +End_Of_Object VEvCondBlock 4 +VEvCondBlock 4 Begin_Of_Object +1 +VEvCondGroup 5 Begin_Of_Object +2 +VEvCondPrimitive 6 Begin_Of_Object +1 +1 +End_Of_Object VEvCondPrimitive 6 +1 +0 +0 +End_Of_Object VEvCondGroup 5 +End_Of_Object VEvCondBlock 4 +0 +0 +0 +116 +1 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +End_Of_Object VTriggerCfgData 3 +End_Of_Object VStandaloneLoggingUserConfig 2 +Mapping::VMappingManager 2 Begin_Of_Object +5 +1 +Mapping::VMappingGroup 3 Begin_Of_Object +3 +1 +1 +0 +Static Mapping +1 +Mapping::VMappingGroup 4 Begin_Of_Object +3 +1 +0 +1 +Group 1 +0 +0 +0 + 0 "..\..\AppData\Local\Temp" +1 +End_Of_Object Mapping::VMappingGroup 4 +0 +0 + 0 "..\..\AppData\Local\Temp" +1 +End_Of_Object Mapping::VMappingGroup 3 +0 + +0 +End_Of_Object Mapping::VMappingManager 2 +VTSystemControl 0 +TestConfigurationSetup +VTestConfigurationSetupWrapper 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Test Setup for Test Units +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{E818B395-94C8-4AD9-B5EC-2DFBC4900922} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +0 +End_Of_Object VNETControlBox 4 +35 +APPDIR Vector.CANoe.TestConfigurationSetup.DLL +Vector.CANoe.TestConfigurationSetup, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.TestConfigurationSetup.TestConfigurationSetup +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +TestConfigurationSetupPersistence +1 +0;-1;-1; +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +2 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +0 +End_Of_Object VTestConfigurationSetupWrapper 2 +AFDXVLStatisticSysVars +NAFDX::NStatisticsMonitor::VSVClient 2 Begin_Of_Object +1 +Begin_Of_Multi_Line_String +2 + + +End_Of_Serialized_Data 2 +End_Of_Object NAFDX::NStatisticsMonitor::VSVClient 2 +DocumentViewer +VDocumentViewerWrapper 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Documents +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{4B0EF685-A5A8-4F1F-B412-AE3D6A107F8E} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 4 +37 +APPDIR Vector.CANalyzer.DocumentViewer.DLL +Vector.CANalyzer.DocumentViewer, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.DocumentViewer.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +Boolean +SplitterExpanded +True +Int32 +DocumentListHeight +77 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +0 +0 +End_Of_Object VDocumentViewerWrapper 2 +SVDialogSettings +VSVDialogSettings 2 Begin_Of_Object +1 +-1 +-1 +930 +600 +1 +1 +0 +320 +440 +365 +0 +0 +0 +0 +0 +End_Of_Object VSVDialogSettings 2 +FunctionBusDialogSettings +VFunctionBusDialogSettings 2 Begin_Of_Object +2 +-1 +-1 +1140 +550 +300 +300 +-1 +0 +End_Of_Object VFunctionBusDialogSettings 2 +AutomationSequences +VAutomationSequencesWrapper 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Automation Sequences +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{A917572B-557F-42BB-819B-C571937930D3} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 4 +34 +APPDIR Vector.CANalyzer.AutomationSequences.DLL +Vector.CANalyzer.AutomationSequences, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.AutomationSequences.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +Int32 +SelectedTabPage +0 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +End_Of_Object VAutomationSequencesWrapper 2 +LogFileConverter +VLogFileConverter 2 Begin_Of_Object +1 +2 +VLogExportPersister 3 Begin_Of_Object +7 +1416 +78171113 + 1 "" + 1 "" + 1 "" +0 +2 +1 +:: +; +, + +0 +2 +0 +0.10000000000000001 +6 +1 +3 +2 +19 +0.10000000000000001 +1 +0 +0 +0 +0 + +0 +0 +0 +0 +730 +0 +0.10000000000000001 +0 +0 +1 +End_Of_Object VLogExportPersister 3 + +End_Of_Serialized_Data 2 +End_Of_Object VLogFileConverter 2 +ThreadingSettings +VPersistentThreadingSettings 2 Begin_Of_Object +1 +3 +7 +End_Of_Object VPersistentThreadingSettings 2 +GlSignalSamplingSettings +GlLoggerConfig::VGlSignalSamplingSettings 2 Begin_Of_Object +1 +0 +End_Of_Object GlLoggerConfig::VGlSignalSamplingSettings 2 +NodeLayerConfiguration +32 +APPDIR Vector.CANoe.NodeLayer.Configuration.Persistency.DLL +Vector.CANoe.NodeLayer.Configuration.Persistency, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.NodeLayer.Configuration.Persistency.Persistor +1 +1 +String +NodeLayers +7 + + 3 + + + + + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +2 +SerializationVersion +2 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +ILConfigurationComponent +VNETStandaloneComponent 2 Begin_Of_Object +1 +VNETControlBox 3 Begin_Of_Object +2 +VUniqueBox 4 Begin_Of_Object +1 +VBoxRoot 5 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 + +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{7065F41F-F2C5-41BC-BBFD-F5867328CED6} +0 +End_Of_Object VBoxRoot 5 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 4 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 3 +47 +APPDIR Vector.CANoe.ILConfiguration.DLL +Vector.CANoe.ILConfiguration, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.ILConfiguration.ILConfigurationComponent +1 +1 +APPDIR Vector.CANoe.ILConfiguration.DLL +Vector.CANoe.ILConfiguration, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.ILConfiguration.GUI.GUISettings +2 +GUISettings +2 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +Boolean +DbcSettingsAvailable +False +TypeRef:3 +SerializationVersion +4 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 2 +FrameworkData +56 +APPDIR Vector.CANalyzer.Framework.DLL +Vector.CANalyzer.Framework, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Framework.SerializationStore +1 +1 + +System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Collections.Generic.HashSet`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] +2 +WindowFavorites +2 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +Int32 +Version +0 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] +4 +Comparer +4 +Int32 +Capacity +3 +Array +Elements +5 + +mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 +System.String +5 +1 +0 +-1 +--TextFormatter: End of Object-- +TypeRef:4 +4 +--TextFormatter: End of Object-- +VCommonMacroSettings +VCommonMacroSettings 2 Begin_Of_Object +1 +3 +YYYY-MM-DD_hh-mm-ss +End_Of_Object VCommonMacroSettings 2 +EthernetSettings +NEthernet::VGlobalSettings 2 Begin_Of_Object +8 +1 +0 +1 +0 +1 +0 +0 +1 +End_Of_Object NEthernet::VGlobalSettings 2 +VSymbolSelectionDialogSettings +VSymbolSelectionDialogSettings 2 Begin_Of_Object +1 +Begin_Of_Multi_Line_String +2 + + +false +FunctionBusParticipants + + + + + + + +true +0 +Ascending +200 + + +true +1 +100 + + +true +2 +100 + + +true +3 +100 + + +true +4 +100 + + +true +5 +100 + + +true +6 +100 + + +true +9 +100 + + +true +7 +100 + + +true +8 +100 + + +true +12 +200 + + +true +13 +100 + + +true +14 +100 + + +true +15 +100 + + +true +16 +100 + + +true +17 +100 + + +true +10 +100 + + +true +11 +100 + + +true +18 +100 + + +true +19 +100 + + +true +20 +100 + + +/ + + + + + +true +0 +Ascending +200 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +true +1 +200 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +-1 +100 + + +1099511627776/FunctionBusParticipantSymbols + + +{RootSymbolItem/SurgicalRobot/panelHelper + + +{RootSymbolItem/SurgicalRobot/panelHelper/{FunctionBusDODataMemberGroupItem + + +{RootSymbolItem/SurgicalRobot/panelHelper/{FunctionBusDODataMemberGroupItem/base_position_deg + + +{RootSymbolItem/SurgicalRobot/panelHelper/{FunctionBusDODataMemberGroupItem/elbow_position_deg + + +{RootSymbolItem/SurgicalRobot/panelHelper/{FunctionBusDODataMemberGroupItem/hand_position_deg + + +{RootSymbolItem/SurgicalRobot/panelHelper/{FunctionBusDODataMemberGroupItem/shoulder_position_deg + + +{RootSymbolItem/SurgicalRobot/panelHelper/{FunctionBusDODataMemberGroupItem/wrist_position_deg + + + + + +End_Of_Serialized_Data 2 +End_Of_Object VSymbolSelectionDialogSettings 2 +FunctionBusData +NFunctionBus::NDataModel::VFunctionBusData 2 Begin_Of_Object +9 +1 +NFunctionBus::NDataModel::VBindingConfiguration 3 Begin_Of_Object +2 +5 +DDS +Abstract +CAPL +C# +Mapping +End_Of_Object NFunctionBus::NDataModel::VBindingConfiguration 3 +Begin_Of_Multi_Line_String +2 + + + + + + + evCDL + 2025-12-30T15:17:41.3708013+00:00 + SurgicalRobot.vCDL + 5ofE5P88MIepur5hYOnOAbYLXsHEW1RBSFLID3N+O9w= + + + 2 + { + "$id": "1", + "ImportParametersMap": { + "$id": "2", + "vCDL": { + "$id": "3", + "InjectedModuleNames": null, + "IncludeFiles": [ + "C:\\Users\\Andy\\CANoe\\RTIMedTech\\SurgicalRobot.vCDL" + ], + "FileType": 3, + "Version": 0, + "Networks": [], + "FileInfos": [ + { + "$id": "4", + "Type": 3, + "Path": "C:\\Users\\Andy\\CANoe\\RTIMedTech\\SurgicalRobot.vCDL", + "Name": "SurgicalRobot.vCDL", + "Version": "2.1" + } + ], + "DummyServiceFEPPrefix": "CANoe", + "DummyParticipantPrefix": "CANoe", + "SystemNamespace": "", + "UserObjectsNamespace": "UserObjects", + "NameSpaceDataTypesCOM": "DataTypes", + "NameSpaceDataObjectsCOM": "CommunicationObjects", + "NameSpaceParticipants": "Participants", + "NameSpaceTimings": "Timings", + "NameSpaceBindings": "BindingInfo", + "NameSpaceEncodings": "Encodings", + "CreateDummyParticipants": true, + "CreateDummyServiceFEPs": true, + "OEMType": 0 + } + } +} + eImported + + + + 2025-12-30T15:17:41.3708013+00:00 + SurgicalRobot.vCDL + 5ofE5P88MIepur5hYOnOAbYLXsHEW1RBSFLID3N+O9w= + + + + + + 16 + 0 + 4 + + +End_Of_Serialized_Data 2 +Begin_Of_Multi_Line_String +2 + + +End_Of_Serialized_Data 2 +End_Of_Object NFunctionBus::NDataModel::VFunctionBusData 2 +OfflineConfig +VOfflineConfigWrapper 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Offline Mode +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{00C8D7FF-B4B4-4C38-8C80-4078300A8EC9} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 4 +159 +APPDIR Vector.CANalyzer.OfflineMode.GUI.DLL +Vector.CANalyzer.OfflineMode.GUI, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.OfflineMode.GUI.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +OverallModel +125 + + + +ByMeasurementTime + + +14027a23-e508-4694-9b26-c076014ea99c +0 +0 + + + + +false +PT0S +NoBreak +EntireRange + + + + + + + + + + + + + +IsActive +true +0 +56 + + +FileTitle +true +1 +190 + + +MeasurementStart +true +2 +120 + + +MeasurementEnd +true +3 +120 + + +FirstTimeStamp +true +4 +120 + + +UserOffset +true +5 +100 + + +FileFormat +false +6 +80 + + +FormatVersion +false +7 +75 + + +DisplayTargetId +true +8 +80 + + +FileSize +false +9 +75 + + +UncompressedSize +false +10 +75 + + +NumberOfObjects +false +11 +80 + + +ChannelMappingSet +true +12 +100 + + +IndexField +false +13 +80 + + +FileName +true +14 +227 + + +150 +false + + + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +End_Of_Object VOfflineConfigWrapper 2 +CanDbSettings +VCanDbSettings 2 Begin_Of_Object +1 +255 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +End_Of_Object VCanDbSettings 2 +CANstressNGSettings +CANstressNG::VCANstressNGMgr 2 Begin_Of_Object +1 +0 +34 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +End_Of_Object CANstressNG::VCANstressNGMgr 2 +FunctionBusSetup +VFunctionBusSetupWrapper 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 1 -1 -1 -1 -1 0 0 957 759 +Communication Setup +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 0 0 1473 506 +1 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 0 957 759 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 -1 -1 -1 -1 0 0 957 759 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{43F097DC-B62D-47B1-9F15-54CDF639378D} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +0 +End_Of_Object VNETControlBox 4 +101 +APPDIR Vector.CANoe.FunctionBus.GUI.DLL +Vector.CANoe.FunctionBus.GUI, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.FunctionBusSetup.FunctionBusSetupComponent +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +DataModel +31 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +String +FolderViewGuiPersistency +15 + + +150 +100 +70 +70 +100 +70 +150 +120 +120 +120 +50 +150 + +String +MainPersistency +4 + +
+1 +
+String +SystemExplorerPersistency +8 + + +295 +true +150 +true +200 + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +5 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +End_Of_Object VFunctionBusSetupWrapper 2 +ApplicationModelSetup +VApplicationModelSetup 2 Begin_Of_Object +1 +1 +VApplicationModel 3 Begin_Of_Object +10 +1 + 1 "telemetry.py" +0 +telemetry.py +{10383055-FC58-4D96-AB2B-5E0FED15A14D} +1 +3 +NULL +End_Of_Serialized_Data 3 +4037115112 +3 +0 +End_Of_Object VApplicationModel 3 +End_Of_Object VApplicationModelSetup 2 +EthernetPortBasedVLANSettings +NEthernet::VPortBasedVLANSettings 2 Begin_Of_Object +1 +0 +End_Of_Object NEthernet::VPortBasedVLANSettings 2 +DiagnosticParameterWindow +VDiagnosticParameterWindowWrapper 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 9 0 0 0 0 40 40 540 440 +Diagnostic Parameters +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 9 0 0 -1 -1 40 40 540 440 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{6D579AA7-061F-4FB0-8CF5-B6BAFE51242D} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 4 +50 +APPDIR Vector.CANalyzer.DiagnosticParameterWindow.DLL +Vector.CANalyzer.DiagnosticParameterWindow, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.DiagnosticParameterWindow.DiagnosticParameterWindow +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +ParameterWindowCtrlPersistence +1 +-1;False;0,200,True;1,60,True;2,60,True;3,75,True;4,21,True;5,50,True;6,75,True; +APPDIR Vector.CANalyzer.DiagnosticParameterWindow.DLL +Vector.CANalyzer.DiagnosticParameterWindow, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.DiagnosticParameterWindow.Definitions.LastRecentSearchPopupItemList +3 +RecentSearchItems +3 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +4 +SerializationVersion +4 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +1 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +TypeRef:3 +3 +Int32 +Version +1 +Int32 +Count +0 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +0 +End_Of_Object VDiagnosticParameterWindowWrapper 2 +ParticipantModelSetup +VParticipantModelSetup 2 Begin_Of_Object +2 +0 +0 +End_Of_Object VParticipantModelSetup 2 +SimSetupPorts +VSSGlobalPortList 2 Begin_Of_Object +7 +0 +1 +0 +0 +0 +0 +1 +End_Of_Object VSSGlobalPortList 2 +VttTapClient +VttTapClientPersist 2 Begin_Of_Object +1 +0 +End_Of_Object VttTapClientPersist 2 +ConnectivitySettings +Connectivity::VConnectivitySettings 2 Begin_Of_Object +16 +0 + +0 + + +0 +0 + +0 + +0 +0 +3 +5 +-1 +0 +2 +0 +CANoe::Connectivity::MQTT +6 +0 +4 +0 +CANoe::Connectivity::HTTP +8 +0 +5 + +1 +256 +End_Of_Object Connectivity::VConnectivitySettings 2 +ErtSysVars +VErtSystemVariableManagerAnlyz 2 Begin_Of_Object +2 +0 +SystemVariables::VFilterConfig 3 Begin_Of_Object +1 +2 +0 +2 +0 +0 +0 +End_Of_Object SystemVariables::VFilterConfig 3 +SystemVariables::VFilterConfig 3 Begin_Of_Object +1 +2 +0 +2 +0 +0 +0 +End_Of_Object SystemVariables::VFilterConfig 3 +End_Of_Object VErtSystemVariableManagerAnlyz 2 +PDUIGComponentManager +0 +MGWSettings +VMGWSettings 2 Begin_Of_Object +1 +0 +End_Of_Object VMGWSettings 2 +FunctionBusInteractiveStimulation +NFunctionBusInteractiveStimulation::VStimulationManager 2 Begin_Of_Object +1 +3 +NFunctionBusInteractiveStimulation::VInteractiveStimulationWrapper 3 Begin_Of_Object +1 +VNETStandaloneComponent 4 Begin_Of_Object +1 +VNETControlBox 5 Begin_Of_Object +2 +VUniqueBox 6 Begin_Of_Object +1 +VBoxRoot 7 Begin_Of_Object +1 +3 +1 -1 0 1 0 0 0 0 384 169 1536 679 +SurgicalRobot::Receiver +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 1478 297 1920 531 +1 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{66615185-4649-4D43-B85D-0DD2F54FF05B} +0 +End_Of_Object VBoxRoot 7 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 6 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +0 +End_Of_Object VNETControlBox 5 +65 +APPDIR Vector.CANoe.FunctionBus.InteractiveStimulation.DLL +Vector.CANoe.FunctionBus.InteractiveStimulation, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.FunctionBus.InteractiveStimulation.InteractiveStimulationComponent +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +ComponentPersistency +4 + +
+SurgicalRobot::Receiver +
+String +FavoriteItemTreePersistency +8 + + + +Favorites + +true + + +String +MainViewPersistency +6 + + +250 +205 +130 + +String +WindowPersistency +4 + + +0 + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 4 +End_Of_Object NFunctionBusInteractiveStimulation::VInteractiveStimulationWrapper 3 +NFunctionBusInteractiveStimulation::VInteractiveStimulationWrapper 3 Begin_Of_Object +1 +VNETStandaloneComponent 4 Begin_Of_Object +1 +VNETControlBox 5 Begin_Of_Object +2 +VUniqueBox 6 Begin_Of_Object +1 +VBoxRoot 7 Begin_Of_Object +1 +3 +1 -1 0 1 0 0 0 0 384 169 1536 679 +PatientMonitor::Receiver +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 1478 0 1920 292 +1 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{B78B3D14-8330-440E-A14E-7508081EE52D} +0 +End_Of_Object VBoxRoot 7 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 6 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +0 +End_Of_Object VNETControlBox 5 +65 +APPDIR Vector.CANoe.FunctionBus.InteractiveStimulation.DLL +Vector.CANoe.FunctionBus.InteractiveStimulation, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.FunctionBus.InteractiveStimulation.InteractiveStimulationComponent +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +ComponentPersistency +4 + +
+PatientMonitor::Receiver +
+String +FavoriteItemTreePersistency +8 + + + +Favorites + +true + + +String +MainViewPersistency +6 + + +250 +205 +130 + +String +WindowPersistency +4 + + +0 + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 4 +End_Of_Object NFunctionBusInteractiveStimulation::VInteractiveStimulationWrapper 3 +NFunctionBusInteractiveStimulation::VInteractiveStimulationWrapper 3 Begin_Of_Object +1 +VNETStandaloneComponent 4 Begin_Of_Object +1 +VNETControlBox 5 Begin_Of_Object +2 +VUniqueBox 6 Begin_Of_Object +1 +VBoxRoot 7 Begin_Of_Object +1 +3 +1 -1 0 1 0 0 0 0 384 169 1536 679 +SurgicalRobot::Sender +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 0 0 1478 536 1920 848 +1 +-1 +0 +0 +1 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 0 0 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 0 0 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{08187E53-2B11-403E-B662-20E6EC243AD7} +0 +End_Of_Object VBoxRoot 7 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 6 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +0 +End_Of_Object VNETControlBox 5 +65 +APPDIR Vector.CANoe.FunctionBus.InteractiveStimulation.DLL +Vector.CANoe.FunctionBus.InteractiveStimulation, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.FunctionBus.InteractiveStimulation.InteractiveStimulationComponent +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +ComponentPersistency +4 + +
+SurgicalRobot::Sender +
+String +FavoriteItemTreePersistency +8 + + + +Favorites + +true + + +String +MainViewPersistency +6 + + +250 +205 +130 + +String +WindowPersistency +4 + + +0 + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 4 +End_Of_Object NFunctionBusInteractiveStimulation::VInteractiveStimulationWrapper 3 +End_Of_Object NFunctionBusInteractiveStimulation::VStimulationManager 2 +IntegrationBus +SilKitPersist 2 Begin_Of_Object +5 +0 + + + + 0 "..\..\AppData\Local\Temp" +0 +0 +0 +0 +0 +0 +End_Of_Object SilKitPersist 2 +BussiMapping +BussiMappingPersist 2 Begin_Of_Object +1 +0 +End_Of_Object BussiMappingPersist 2 +VSymbolAccessSettings +VSymbolAccessSettings 2 Begin_Of_Object +1 +1 +2 +End_Of_Object VSymbolAccessSettings 2 +GlobalConfigSwitchesPrior +NConfigSwitches::VConfigSwitchPersistence 2 Begin_Of_Object +1 +End_Of_Object NConfigSwitches::VConfigSwitchPersistence 2 +SystemVariableFilterConfiguration +SystemVariables::VFilterConfig 2 Begin_Of_Object +1 +2 +0 +2 +0 +0 +0 +End_Of_Object SystemVariables::VFilterConfig 2 +BusTunnelProtocolMapping +BusTunnelProtocolMappingPersist 2 Begin_Of_Object +1 +0 +End_Of_Object BusTunnelProtocolMappingPersist 2 +VDOGenerationChangeDetectionService +NFunctionBus::NBindings::VDOGenerationChangeDetectionService 2 Begin_Of_Object +2 +0 +End_Of_Object NFunctionBus::NBindings::VDOGenerationChangeDetectionService 2 +TunnelProtocolDecoderConfig +NTunnelProtocolDecoders::VTunnelProtocolDecoderConfig 2 Begin_Of_Object +1 +0 +0 +End_Of_Object NTunnelProtocolDecoders::VTunnelProtocolDecoderConfig 2 +SharedMemoryServer +NSharedMemory::VSMSAnlyz 2 Begin_Of_Object +1 +0 +End_Of_Object NSharedMemory::VSMSAnlyz 2 +ReplayConfig +VReplayConfigPersistence 2 Begin_Of_Object +1 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 1 0 0 0 0 391 212 1566 849 + +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 -1 -1 391 212 1566 849 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 391 212 1566 849 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 391 212 1566 849 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{AEEABA72-2EBD-4C23-885F-88929494A36E} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 4 +47 +APPDIR Vector.CANalyzer.Replay.DLL +Vector.CANalyzer.Replay, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.Replay.ComponentWrapper +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +String +OverallModel +13 + + + + + + + + + + + + + +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +End_Of_Object VReplayConfigPersistence 2 +DefaultChannelMapping +DefaultChannelMappingPersist 2 Begin_Of_Object +1 +0 +End_Of_Object DefaultChannelMappingPersist 2 +SegmentView +NEthernet::VSegmentViewDialogAdapter 2 Begin_Of_Object +0 +VNETStandaloneComponent 3 Begin_Of_Object +1 +VNETControlBox 4 Begin_Of_Object +2 +VUniqueBox 5 Begin_Of_Object +1 +VBoxRoot 6 Begin_Of_Object +1 +3 +1 -1 0 1 0 0 0 0 384 169 1536 679 +Segment View +1 + +MDI_DOCK_INFO_END +5 +1 +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +7 +0 1 0 0 -1 -1 384 169 1536 679 +0 +-1 +0 +0 +0 +0 +END_OF_DESKTOP_DATA +END_OF_DESKTOP_DATA_COLLECTION +0 +0 0 +END_OF_DESKTOP_MEMBER +{89077279-1A06-4BFA-BDCB-FE23ED11FD08} +0 +End_Of_Object VBoxRoot 6 +0 0 0 0 0 0 0 0 0 0 0 0 +End_Of_Object VUniqueBox 5 +1 +0 0 0 0 0 0 0 0 0 0 0 0 +1 +End_Of_Object VNETControlBox 4 +31 +APPDIR Vector.CANalyzer.ETH.SegmentView.DLL +Vector.CANalyzer.ETH.SegmentView, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ETH.SegmentView.SegmentViewController +1 +1 +APPDIR NetApplicationServices.DLL +NetApplicationServices, Version=19.3.118.0, Culture=neutral, PublicKeyToken=null +Vector.CANalyzer.ApplicationSerializer +2 +Application +2 +APPDIR Vector.CANalyzer.Serialization.DLL +Vector.CANalyzer.Serialization, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b273882a063429a6 +Vector.CANalyzer.Serialization.SerializationVersion +3 +SerializationVersion +3 +UInt16 +mMajor +1 +UInt16 +mMinor +0 +UInt16 +mPatch +0 +--TextFormatter: End of Object-- +--TextFormatter: End of Object-- +TypeRef:2 +2 +--TextFormatter: End of Object-- +End_Of_Object VNETStandaloneComponent 3 +End_Of_Object NEthernet::VSegmentViewDialogAdapter 2 +End_Of_Object VGlobalConfiguration 1 diff --git a/examples/CANoe/RTIMedTech.cfg.ini b/examples/CANoe/RTIMedTech.cfg.ini new file mode 100644 index 0000000..72d0907 --- /dev/null +++ b/examples/CANoe/RTIMedTech.cfg.ini @@ -0,0 +1,167 @@ +# This file contains some settings of the configuration along +# which it is placed. You should pass it along with the cfg file +# and store it in your configuration management system. +# +# You may edit the settings directly, read the comments for a +# description. There's not necessarily any further explanation +# in the online help. +# +# The file format is a simple .ini format. That means it's a +# key=value list, with the settings grouped into [sections]. + +# General runtime settings +[Runtime] +# Enforce initialization of optional values such that they are considered unset initially as long as +# not specified differently by vCDL attribute (same keyword). When set to 0, optional elements +# are initialized to the default value of their datatype. +InitializeOptionalsAsNone=1 + +# Default value for the [EnableChangeInfo] vCDL attribute, which can be applied to distributed object +# members. It enables the calculation of change information. When set to 1, it is tracked whether the +# value has changed, how often it has changed so far, and at which time it has most recently changed. +# The calculation of change info has a performance cost. If any change handlers are listening for +# changes of the DO member in question, its change info has to be calculated regardless of this setting. +EnableChangeInfo=0 + +# Control how boundary values for linear encodings from databases are applied for conversion between +# raw and physical values. When set to 1, linear encoding rules are applied only to values which lie +# exactly within the associated min/max interval. In case the flag is set to 0, linear encoding is also +# applied to values outside all encoding ranges such that the encoding of the next lower range is used +# or if the value is below all ranges, the encoding with the lowest range is used. +StrictLinearEncodingBoundaries=1 + +# Settings pertaining to the CAPL compiler and runtime. +[CAPL] + +# Compatibility switch: an old version of the CAPL compiler +# initialized integer constants and variables in a different +# (and target dependent) way, e.g., if they were initialized by a +# floating point constant (const dword x = 3.1). +# This was fixed to a documented behavior, but if you have +# old code which relies on the old behavior, set the switch to 1. +LegacyNumericInitializations=0 + +# Compatibility switch: an old version of the CAPL compiler +# treated DWORD expressions as long (i.e., signed) in +# comparisons. That was fixed, but if you have old CAPL code +# which relies on the old behavior, set the switch to 1. +CompareDwordAsLong=0 + +# Compatibility switch: an old version of the CAPL compiler +# stored each string constant separately in the data segment, +# even if they had the same value. This was changed so the +# memory is shared for equal string constants, sometimes +# significantly reducing the amount of memory needed. +# If you have old CAPL code which relies on the old behavior +# by _changing_ a string constant, but expecting other uses +# of an equal constant to remain the same, set the switch to 0. +ShareEqualStringConstants=1 + +# Compatibility switch: older versions of CANoe used case +# sensitive search when looking for specific CAPL callbacks +# (e.g., OnXCPEvent or OnTCPReceive), even though CAPL functions +# themselves are not case sensitive. +# If you have old CAPL code which relies on the old behavior +# by having overloads (functions with the same name, but different +# parameters) of which one of them shall work as such a callback, +# set the switch to 1. +CaseSensitiveCallbackSearch=0 + +# Compatibility switch: in CANoe DE configurations normal nodes +# in the Simulation Setup are assigned to a (single) bus +# (Gateways are assigned to more buses) and every bus has one +# or more databases assigned. +# Older versions of CANoe let a node access all databases of the +# current configuration, while in newer versions, a node can only +# access (see) the database(s) assigned to its bus. +# If you have old CAPL code which relies on the old behavior +# by accessing a database which is not assigned to its bus, +# set the switch to 1 +GlobalDatabaseAccess=0 + +# Settings pertaining to the Connectifity Feature Set +[Connectivity] + +# Whether to use the new implementation of the BackendCloudConnector +# (formerly known as the BackendCloudClient) which is responsable +# for commuicating requests of the different Bindings. Setting this +# to 0 will cause the old implementation to be used. +EnableNewBCC=1 + +# Set send-queue size. +# Increase this parameter if you get the error "Overrun send queue" during measurement. +QueueCapacity=1000 + +# Settings for the C# API, as well as the related build processes and runtime configuration options +[.NET] + +# Enabling this switch will override the .NET version setting to use .NET Framework 2.0 +# .NET Framework 2.0 is no longer supported by Microsoft and the use of this switch is deprecated +# The ability to use .NET Framework 2.0 may be removed in future versions of CANoe +UseNet20=0 + +# Compatibility switch: Enabling this switch causes types library assemblies to have configuration-specific names when using .NET Framework +UseCfgSpecificAssemblyNames=0 + +# .NET 8 application layer type library: Generate separate _Types and _Objects types in addition to the .Types and .Objects subtypes +GenerateLegacyTypes=0 + +[Simulation] +# Selects the architecture used for the Ethernet RestBus Simulation (RBS). +# This setting applies to AUTOSAR PDUs and SOME/IP (including SOME/IP-SD) over Ethernet. +# Possible values: +# InteractionLayer - Uses the traditional Interaction Layer (IL) for simulation, as in previous CANoe versions. +# SOMEIPNative - Uses the new, native SOME/IP architecture for RestBus simulation with enhanced functionality. +EthernetRBSArchitecture=InteractionLayer + +[SOMEIP] +# Enforce that the values of events/fields can be set via the service signal (e.g. $-operator) even if +# Application Objects are activated for the SimSetup. +# If Application Objects are disabled for the SimSetup, this option has no impact. +ForceActiveServiceSignals=0 + +# Threshold size to determine whether generated Application Layer Objects (SOME/IP or AUTOSAR PDUs) +# should use the high-performance 'Bytes' data type instead of a normal byte array. +# The 'Bytes' data type is used for byte arrays that are >= ByteArrayThresholdSize. +ByteArrayThresholdSize=1000 + +# Settings for the Python API +[Python] +# Enforce the restart of the RT Kernel after each measurement. This might be required if dynamically loaded +# Python modules can't be unloaded correctly and therefore cause a crash or undefined behavior in the RT Kernel. +# 0: Restart is not forced. +# 1: Restart is forced. +ForceRtKernelRestart=0 + +# Enable support for system variables with the Python API. +# Support for system variables can be disabled for performance and compatibility reasons. +# 0: Support for system variables is disabled. +# 1: Support for system variables is enabled. +SystemVariableSupport=1 + +# Diagnostics settings +[Diagnostics] +# Diagnostics on FlexRay +# Disable atomic PDU group update +# the atomic PDU group update ensures correct sequence of frames +# in a diagnostic message, transferred over multiple PDUs +# this feature guarantees message data integrity, +# but may slow down transmission performance by skipping some cycles +FR_DisableAtomicPDUGroupUpdate=0 + +[Ethernet] +# Determines whether the TLS socket communication is executed on a separate thread. +# 0: Use global default from can.ini. If not defined in can.ini, the default is off +# 1: use a seperate thread in real bus mode +# 2: use a seperate thread in real bus and simulated bus (animated with factor) mode +TlsUseMultithreading=0 +SignalProtocolDLL= + +[TunnelProtocolDecoders] +# Suppress shifting of CAN standard identifiers in ASAM CMP CAN / CAN FD Data Messages +# 0: The ID will be shifted by 18 bits (as defined in ASAM CMP specification) +# 1: The ID will *not* be shifted (behavior of CANoe/CANalyzer prior to 18 SP4) +CMPSuppressShiftingOfStandardCANIdentifiers=0 + +# Defines the time interval between multiple UART / RS-232 values ​​within the same CMP Data Message in nanoseconds. +CMPUartValueTimeIntervalNs=0 diff --git a/examples/CANoe/RobotPanel.xvp b/examples/CANoe/RobotPanel.xvp new file mode 100644 index 0000000..52d03a1 --- /dev/null +++ b/examples/CANoe/RobotPanel.xvp @@ -0,0 +1,117 @@ + + + + + Xc5d547c7edf0ae4777ea8f7e50cb247d7605 + 35, 15 + 256, 214 + Hand + + + X58e7ab1fecd09e4ddce9ed5ea21b1091bcb5 + 215, 47 + 256, 235 + True + 5 + 180 + -180 + 100000, 47 + -180 + 180 + 8;4096;SurgicalRobot;panelHelper.hand_position_deg;;1;2;;;-1;;;Value;;;16 + + + Xd46fed90ed806e4b5ce95d2ef342b9bc840b + 34, 15 + 23, 214 + Wrist + + + Xae3321a2e4107e4d96e96d9e694ef989030a + 215, 47 + 23, 235 + True + 4 + 180 + -180 + 100000, 47 + -180 + 180 + 8;4096;SurgicalRobot;panelHelper.wrist_position_deg;;1;2;;;-1;;;Value;;;16 + + + Xa5f43c36efc8ce4a9aeb2c2e05a0715c8395 + 39, 15 + 256, 144 + Elbow + + + Xdc4ac326ec6dae4bdaea4d4ef69cc1e3469d + 215, 47 + 256, 161 + True + 3 + 180 + -180 + 100000, 47 + -180 + 180 + 8;4096;SurgicalRobot;panelHelper.elbow_position_deg;;1;2;;;-1;;;Value;;;16 + + + + X3c8ac383ed745e48dbe9b34e400fdb684389 + 102, 102 + 225, 0 + Automatic + 8;4096;SurgicalRobot;panelHelper.base_position_deg;;1;2;;;-1;;;Direction;;;16 + + Black + Black + False + + + Xe84cf2cfe12a9e4696eb8ece117b80ff5ae3 + 215, 47 + 5, 33 + True + 1 + 180 + -180 + 100000, 47 + -180 + 180 + 8;4096;SurgicalRobot;panelHelper.base_position_deg;;1;2;;;-1;;;Value;;;16 + + Xfe9cfb4bef458e4f37eaf9ae3b7ee042b602 + 338, 110 + 18, 19 + Base + 3 + False + + + Xf8c4665ce9709e40aaebb15eab86afe65493 + 46, 15 + 23, 144 + Sholder + + + X181871f4e7cd5e4577e9df2e206dcb4d013a + 215, 47 + 23, 165 + True + 2 + 180 + -180 + 100000, 47 + -180 + 180 + 8;4096;SurgicalRobot;panelHelper.shoulder_position_deg;;1;2;;;-1;;;Value;;;16 + + Panel + 502, 309 + 0, 0 + White + + \ No newline at end of file diff --git a/examples/CANoe/SurgicalRobot.vCDL b/examples/CANoe/SurgicalRobot.vCDL new file mode 100644 index 0000000..8b93b73 --- /dev/null +++ b/examples/CANoe/SurgicalRobot.vCDL @@ -0,0 +1,107 @@ +version 2.1; + +import module "DDS"; + +[DDS::Settings::DomainParticipantMonitoring=ALL] + +refine module "DDS"; + +namespace PatientMonitor { + + struct Vitals { + [DDS::Key=true] + string patient_id; //@key //@ID 0 + uint32 hr; //@ID 1 + uint32 spo2; //@ID 2 + uint32 etco2; //@ID 3 + uint32 nibp_s; //@ID 4 + uint32 nibp_d; //@ID 5 + } //@Extensibility EXTENSIBLE_EXTENSIBILITY + + [CommunicationPattern=SendReceive] + [Binding="DDS"] + [DDS::Domain::ID=0] + interface IPatientMonitor { + consumed data Vitals patientVitals; + } + + // Subscribes + [DDS::Reader::Reliability=BEST_EFFORT] + [DDS::Reader::History=KEEP_ALL] + [DDS::Topic::Name="t/Vitals"] + IPatientMonitor Receiver; +} + +namespace SurgicalRobot { + + enum Motors : int32 { + BASE = 0, + SHOULDER = 1, + ELBOW = 2, + WRIST = 3, + HAND = 4, + } //@Extensibility EXTENSIBLE_EXTENSIBILITY + + enum MotorDirections : int32 { + STATIONARY = 0, + INCREMENT = 1, + DECREMENT = 2 + } //@Extensibility EXTENSIBLE_EXTENSIBILITY + + struct MotorControl { + [DDS::Key=true] + SurgicalRobot::Motors id; + SurgicalRobot::MotorDirections direction; + } //@Extensibility EXTENSIBLE_EXTENSIBILITY + + struct MotorTelemetry { + [DDS::Key=true] + SurgicalRobot::Motors id; + float position_deg; + float speed_rpm; + float current_mA; + float voltage_V; + float temp_c; + } + + [CommunicationPattern=SendReceive] + [Binding="DDS"] + [DDS::Domain::ID=0] + interface IMotorControl { + consumed data MotorControl motorData; + } + + [CommunicationPattern=SendReceive] + [Binding="DDS"] + [DDS::Domain::ID=6] + interface ITelemetry { + provided data MotorTelemetry telemetryData; + } + + interface IPanelHelper { + internal data float base_position_deg; + internal data float shoulder_position_deg; + internal data float elbow_position_deg; + internal data float wrist_position_deg; + internal data float hand_position_deg; + } + IPanelHelper panelHelper; + + // Subscribes + [DDS::Reader::Reliability=RELIABLE] + [DDS::Reader::History=KEEP_ALL] + [DDS::Topic::Name="t/MotorControl"] + IMotorControl Receiver; + + // Publishes + [DDS::Writer::Reliability=BEST_EFFORT] + [DDS::Writer::History=KEEP_ALL] + [DDS::Topic::Name="topic/MotorTelemetry"] + ITelemetry Sender; + + // Testing sending on the same MotorControl publisher + [DDS::Reader::Reliability=RELIABLE] + [DDS::Reader::History=KEEP_ALL] + [DDS::Topic::Name="t/MotorControl"] + reverse Controller; +} \ No newline at end of file diff --git a/examples/CANoe/img/CANoe_arm_monitor.png b/examples/CANoe/img/CANoe_arm_monitor.png new file mode 100644 index 0000000..904c935 Binary files /dev/null and b/examples/CANoe/img/CANoe_arm_monitor.png differ diff --git a/examples/CANoe/img/CANoe_desktop_1.png b/examples/CANoe/img/CANoe_desktop_1.png new file mode 100644 index 0000000..34d184c Binary files /dev/null and b/examples/CANoe/img/CANoe_desktop_1.png differ diff --git a/examples/CANoe/img/CANoe_desktop_2.png b/examples/CANoe/img/CANoe_desktop_2.png new file mode 100644 index 0000000..138099d Binary files /dev/null and b/examples/CANoe/img/CANoe_desktop_2.png differ diff --git a/examples/CANoe/img/CANoe_graph_config.png b/examples/CANoe/img/CANoe_graph_config.png new file mode 100644 index 0000000..7d27466 Binary files /dev/null and b/examples/CANoe/img/CANoe_graph_config.png differ diff --git a/examples/CANoe/img/CANoe_patient_monitor.png b/examples/CANoe/img/CANoe_patient_monitor.png new file mode 100644 index 0000000..73561c4 Binary files /dev/null and b/examples/CANoe/img/CANoe_patient_monitor.png differ diff --git a/examples/CANoe/img/CANoe_robot_control_panel.png b/examples/CANoe/img/CANoe_robot_control_panel.png new file mode 100644 index 0000000..b4b5710 Binary files /dev/null and b/examples/CANoe/img/CANoe_robot_control_panel.png differ diff --git a/examples/CANoe/img/CANoe_robot_pubsub_panel.png b/examples/CANoe/img/CANoe_robot_pubsub_panel.png new file mode 100644 index 0000000..323c104 Binary files /dev/null and b/examples/CANoe/img/CANoe_robot_pubsub_panel.png differ diff --git a/examples/CANoe/img/CANoe_trace_panel.png b/examples/CANoe/img/CANoe_trace_panel.png new file mode 100644 index 0000000..6718e48 Binary files /dev/null and b/examples/CANoe/img/CANoe_trace_panel.png differ diff --git a/examples/CANoe/img/CANoe_write_panel.png b/examples/CANoe/img/CANoe_write_panel.png new file mode 100644 index 0000000..109a4ae Binary files /dev/null and b/examples/CANoe/img/CANoe_write_panel.png differ diff --git a/examples/CANoe/telemetry.py b/examples/CANoe/telemetry.py new file mode 100644 index 0000000..321b110 --- /dev/null +++ b/examples/CANoe/telemetry.py @@ -0,0 +1,175 @@ +# +# (c) 2026 Copyright, Real-Time Innovations, Inc. (RTI) All rights reserved. +# +# RTI grants Licensee a license to use, modify, compile, and create derivative +# works of the software solely for use with RTI Connext DDS. Licensee may +# redistribute copies of the software provided that all such copies are +# subject to this license. The software is provided "as is", with no warranty +# of any type, including any warranty for fitness for any purpose. RTI is +# under no obligation to maintain or support the software. RTI shall not be +# liable for any incidental or consequential damages arising out of the use or +# inability to use the software. + +import vector.canoe +from application_layer import SurgicalRobot +import time, random + +@vector.canoe.measurement_script +class telemetry: + def __init__(self): + self.angles = { + SurgicalRobot.Motors.BASE : 0.0, + SurgicalRobot.Motors.SHOULDER : 0.0, + SurgicalRobot.Motors.ELBOW : 0.0, + SurgicalRobot.Motors.WRIST : 0.0, + SurgicalRobot.Motors.HAND : 0.0} + self.step : float = 1.0 + + # Called before measurement start to perform necessary initializations, + # e.g. to create objects. During measurement, few additional objects + # should be created to prevent garbage collection runs in time-critical + # simulations. + def initialize(self): + pass + + #Notification that the measurement starts. + def start(self): + pass + + #Notification that the measurement ends. + def stop(self): + pass + + # Cleanup after the measurement. Complement to Initialize. This is not + # a "Dispose" method; your object should still be usable afterwards. + def shutdown(self): + pass + + def get_motor_name(self, motor : SurgicalRobot.Motors_module.Motors) -> str: + # Determine a readable name for the motor enum/member in a robust way + try: + motor_name = motor.name + except Exception: + try: + motor_name = SurgicalRobot.Motors_module.Motors(motor).name + except Exception: + try: + motor_name = SurgicalRobot.Motors_module.Motors[motor].__name__ + except Exception: + motor_name = str(motor) + return motor_name + + def normalize_angle(self, angle: float) -> float: + """Normalize an angle (degrees) to the range [-180.0, 180.0]. + + Uses the standard shift-modulo-shift trick so values wrap cleanly. + """ + return ((angle + 180.0) % 360.0) - 180.0 + + def update_motor_pos(self, motor : SurgicalRobot.Motors_module.Motors, target_position : int): + # Update the motor position to the target position in single degree steps + motor_data = SurgicalRobot.MotorControl_module.MotorControl() + motor_data.id = motor + current_position = int(self.angles[motor]) + + while current_position != target_position: + if current_position < target_position: + motor_data.direction = SurgicalRobot.MotorDirections.INCREMENT + current_position += 1 + else: + motor_data.direction = SurgicalRobot.MotorDirections.DECREMENT + current_position -= 1 + + self.angles[motor] = float(current_position) + SurgicalRobot.Controller.motorData = motor_data + + vector.canoe.write(f"Updated {self.get_motor_name(motor)} Motor - position: {target_position}") + + def update_helper_pos(self, motor : SurgicalRobot.Motors_module.Motors, position=None): + # Synchronize the panel helper positions if needed from the motor telemetry updates. + if position is None: + position = self.angles[motor] + + # Use structural pattern matching (switch) for clarity and efficiency + match motor: + case SurgicalRobot.Motors.BASE: + if SurgicalRobot.panelHelper.base_position_deg != position: + SurgicalRobot.panelHelper.base_position_deg = position + case SurgicalRobot.Motors.SHOULDER: + if SurgicalRobot.panelHelper.shoulder_position_deg != position: + SurgicalRobot.panelHelper.shoulder_position_deg = position + case SurgicalRobot.Motors.ELBOW: + if SurgicalRobot.panelHelper.elbow_position_deg != position: + SurgicalRobot.panelHelper.elbow_position_deg = position + case SurgicalRobot.Motors.WRIST: + if SurgicalRobot.panelHelper.wrist_position_deg != position: + SurgicalRobot.panelHelper.wrist_position_deg = position + case SurgicalRobot.Motors.HAND: + if SurgicalRobot.panelHelper.hand_position_deg != position: + SurgicalRobot.panelHelper.hand_position_deg = position + case _: + # Unknown motor value — do nowt + pass + + + @vector.canoe.on_update(SurgicalRobot.Receiver.motorData) + def on_motorData_update(self): + # Handle incoming motor control commands, translate to telemetry updates for the digital twin + motor_sample = SurgicalRobot.Receiver.motorData.copy() + + try: + motor_id = SurgicalRobot.Motors(motor_sample.id._value) + except ValueError as e: + vector.canoe.write(f"Invalid motor enum: {motor_sample.id}, error: {e}") + return + + try: + direction = SurgicalRobot.MotorDirections(motor_sample.direction._value) + except ValueError as e: + vector.canoe.write(f"Invalid direction enum: {motor_sample.direction}, error: {e}") + return + + motor_name = self.get_motor_name(motor_id) + vector.canoe.write(f"Received update - motor: {motor_name}, direction: {str(direction)}") + + if SurgicalRobot.MotorDirections.INCREMENT == direction: + self.angles[motor_id] = self.normalize_angle(self.angles[motor_id] + self.step) + elif SurgicalRobot.MotorDirections.DECREMENT == direction: + self.angles[motor_id] = self.normalize_angle(self.angles[motor_id] - self.step) + + telemetry = SurgicalRobot.MotorTelemetry_module.MotorTelemetry() + telemetry.id = motor_id + telemetry.position_deg = self.angles[motor_id] + telemetry.current_mA = round(random.uniform(1,1.5),2) + telemetry.voltage_V = round(random.uniform(12,12.5),2) + telemetry.temp_c = round(random.uniform(26,29.0),2) + vector.canoe.write(f"Sent telemetry update - motor: {motor_name}, position: {telemetry.position_deg}") + + SurgicalRobot.Sender.telemetryData = telemetry + + self.update_helper_pos(motor_id) + + + @vector.canoe.on_update(SurgicalRobot.panelHelper.base_position_deg) + def on_base_pos_update(self): + self.update_motor_pos(SurgicalRobot.Motors.BASE, int(SurgicalRobot.panelHelper.base_position_deg.copy())) + + @vector.canoe.on_update(SurgicalRobot.panelHelper.shoulder_position_deg) + def on_shoulder_pos_update(self): + self.update_motor_pos(SurgicalRobot.Motors.SHOULDER, int(SurgicalRobot.panelHelper.shoulder_position_deg.copy())) + + @vector.canoe.on_update(SurgicalRobot.panelHelper.elbow_position_deg) + def on_elbow_pos_update(self): + self.update_motor_pos(SurgicalRobot.Motors.ELBOW, int(SurgicalRobot.panelHelper.elbow_position_deg.copy())) + + @vector.canoe.on_update(SurgicalRobot.panelHelper.wrist_position_deg) + def on_wrist_pos_update(self): + self.update_motor_pos(SurgicalRobot.Motors.WRIST, int(SurgicalRobot.panelHelper.wrist_position_deg.copy())) + + @vector.canoe.on_update(SurgicalRobot.panelHelper.hand_position_deg) + def on_hand_pos_update(self): + self.update_motor_pos(SurgicalRobot.Motors.HAND, int(SurgicalRobot.panelHelper.hand_position_deg.copy())) + + + + \ No newline at end of file diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..6eb724c --- /dev/null +++ b/examples/README.md @@ -0,0 +1,104 @@ +# Examples - RTI MedTech Reference Architecture + +This folder contains runnable example applications demonstrating how devices and services participate as first-class citizens in the RTI MedTech Reference Architecture. Each example includes a README with implementation details, button/axis mappings (where applicable), and step-by-step run instructions. + +See the project root [README.md](../README.md) for the overall architecture and examples of how these pieces interact. + +## Contents + +- [Example Applications](#example-applications) +- [Running Examples](#running-examples) +- [Tips](#tips) + +## Example Applications + +### [Joystick Controller](./joystick_controller/) + +Joystick Arm controller implementation (uses `pygame`). +See the example's README for details and button/stick mappings. + +### [Xbox Controller](./xbox_controller/) + +Xbox gamepad Arm controller implementation (uses `pygame`). +See the example's README for details and button/stick mappings. + +### [lss_robot](./lss_robot/) + +LynxMotion LSS serial-servo Robot Arm controller that publishes real `MotorTelemetry` to `topic/MotorTelemetry` on domain 6. +See the example's README for hardware setup and safety notes. + +### [telemetry_bridge](./telemetry_bridge/) + +Digital Twin bridge that subscribes to `MotorControl` and publishes simulated `MotorTelemetry` to `topic/MotorTelemetry` on domain 6. +See the example's README for details. + +### [WIS](./WIS/) (Web Integration Service) + +RTI Web Integration Service example that hosts a web UI which publishes `MotorControl` commands via WebSockets. +See the example's README for configuration and UI behavior. + +### [CANoe](./CANoe/) + +Vector CANoe Integration example that leverages CANoe's native Python scripting capabilities to create a bidirectional bridge between multiple DDS domains, enabling both topic translation and domain bridging while providing real-time monitoring and control capabilities. +See the example's README for details. + +## Running Examples + +### 1. Prerequisites + +***Unless otherwise noted in the example's README, these examples are best run from a Docker container running the image from [containers/examples/](./../containers/examples/Dockerfile). Currently, the examples (except Web Integration Service) are not designed to be run directly on a host machine and will likely fail to launch.*** + +To build the image: + +```bash +docker build \ + -t connext:medtech_ra \ + -f containers/examples/Dockerfile \ + --build-arg RTI_LICENSE_AGREEMENT_ACCEPTED=accepted \ + --build-arg CONNEXT_VERSION=7.3.0 \ + . +``` + +To start the container: + +```bash +# Ensure $RTI_LICENSE_FILE is set, or the applications may fail to start. +docker run --rm -it \ + --network host \ + -e DISPLAY \ + -e SDL_AUDIODRIVER=dummy \ + --device=/dev/ttyUSB0 \ + --privileged \ + --hostname rtimedtech \ + -v $HOME/.Xauthority:/root/.Xauthority \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $RTI_LICENSE_FILE:/root/rti_license.dat connext:medtech_ra \ + bash +``` + +Read the README in the example you intend to run for per-example prerequisites and run instructions (e.g., Python packages, hardware drivers, or Web Integration Service setup). + +### 2. Launch + +Use the included `launch_*` scripts where present from inside the container to start example apps with the intended settings. + +The docker image copies the necessary sources and launch scripts into the `01-operating-room` module folder for convenience. +Be sure to cd to the directory inside the container before launching example applications. + +```none +medtech_ra/modules/01-operating-room/scripts/ +|-- launch_OR_apps.sh +|-- launch_all.sh +|-- launch_arm_and_patient_monitor.sh +|-- launch_arm_controller.sh +|-- launch_arm_joystick.sh +|-- launch_arm_xbox.sh +|-- launch_robot_app.sh +`-- launch_telemetry_app.sh +``` + +## Tips + +- Don't have physical hardware to simulate telemetry? Use [telemetry_bridge](./telemetry_bridge/) - this helps validate orchestration and telemetry-receiving applications without the robot. +- Pay attention to controller axis/hat indices and button mappings - these may differ between controllers. +- For hardware examples, verify serial port names and permissions before running (e.g., `/dev/ttyUSB0` on Linux). diff --git a/examples/WIS/html/favicon.ico b/examples/WIS/html/favicon.ico new file mode 100644 index 0000000..0a978dc Binary files /dev/null and b/examples/WIS/html/favicon.ico differ diff --git a/examples/WIS/html/robot_arm.html b/examples/WIS/html/robot_arm.html new file mode 100644 index 0000000..f8070e5 --- /dev/null +++ b/examples/WIS/html/robot_arm.html @@ -0,0 +1,503 @@ + + + + + + + + + Robot Arm Controller + + + +
+

+ + Robot Arm Controller +

+ +
+
+ 🔄 + Base Rotation +
+
+ + +
+
+ +
+
+ 💪 + Shoulder +
+
+ + +
+
+ +
+
+ 🦾 + Elbow +
+
+ + +
+
+ +
+
+ + Wrist +
+
+ + +
+
+ +
+
+ 🤏 + Gripper +
+
+ + +
+
+ +
+ Ready to control +
+
+ + + + \ No newline at end of file diff --git a/examples/WIS/html/rti-logo.svg b/examples/WIS/html/rti-logo.svg new file mode 100644 index 0000000..35ebf01 --- /dev/null +++ b/examples/WIS/html/rti-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/WIS/readme.md b/examples/WIS/readme.md new file mode 100644 index 0000000..4518fa9 --- /dev/null +++ b/examples/WIS/readme.md @@ -0,0 +1,101 @@ +# Web Integration Service — RTI MedTech Reference Architecture + +This example demonstrates how the RTI Web Integration Service hosts a remote web page that sends MotorControl commands into the MedTech Reference Architecture over WebSockets. A remote web page (`examples/WIS/html/robot_arm.html`) uses Web Integration Service REST + WebSocket endpoints to connect and issue real-time motor control samples over the same Topics the Arm already operates on. + +See the project root [README.md](../../README.md) for overall architecture and how this example fits in. + +## Contents + +- [Example Description](#example-description) +- [Setup and Installation](#setup-and-installation) +- [Run the Example](#run-the-example) +- [Web Control Mappings](#web-control-mappings) +- [Hands-On: Going Further](#hands-on-going-further) + +## Example Description + +This example implements a web-based controller for the surgical robot arm using RTI Web Integration Service. The system consists of: + +### Web Integration Service Configuration + +The Web Integration Service configuration ([wis_service.xml](./xml_config/wis_service.xml)) reuses the already established system definitions for Data Types, Topics, Qos, and Domains. + +The single system architecture ensures tight component integration via a concrete data model. The absence of an application implementation in the system definition supports scaling the system by reusing the common data model for new or extended system applications. + +- A domain participant named `MotorControlParticipant` is configured on **Domain 0**, using the `RtiServicesLib::WebIntegrationService` QoS profile. +- A publisher and a `MotorControlWriter` data writer are defined; the writer uses the `DataFlowLibrary::Command` QoS profile. +- The Web Integration Service exposes REST endpoints to create WebSocket connections and a WebSocket endpoint that the web UI can connect to. + +### Web UI + +The web UI (`html/robot_arm.html`) connects to Web Integration Service and sends MotorControl commands via WebSocket. The web UI issues publish requests over the WebSocket and Web Integration Service translates these into DDS `MotorControl` samples on `t/MotorControl`. + +## Setup and Installation + +### 1. Install Dependencies + +This example requires: + +- [RTI Web Integration Service](https://community.rti.com/static/documentation/connext-dds/7.3.0/doc/manuals/connext_dds_professional/services/web_integration_service/index.html) +- Browser with WebSocket support + +## Run the Example + +### 1. Start Web Integration Service + +***Unlike other examples, this example does not need to be started from a prepared "examples" Docker container. The following commands can be ran directly from a host to launch Web Integration Service.*** + +Start Web Integration Service and enable WebSockets: + +```bash +./scripts/launch_wis.sh +``` + +Alternatively, run using RTI's public Docker image: + +```bash +docker run -it --rm \ + --network host \ + -v $RTI_LICENSE_FILE:/opt/rti.com/rti_connext_dds-7.3.0/rti_license.dat \ + -v $PWD/../..:/medtech_ra:ro \ + -e NDDS_QOS_PROFILES="/medtech_ra/system_arch/Types.xml;/medtech_ra/system_arch/qos/Qos.xml;/medtech_ra/system_arch/qos/NonSecureAppsQos.xml;/medtech_ra/system_arch/xml_app_creation/DomainLibrary.xml;/medtech_ra/system_arch/xml_app_creation/ParticipantLibrary.xml" \ + --name=web_integration_service \ + rticom/web-integration-service:7.3.0 \ + -cfgFile /medtech_ra/examples/WIS/xml_config/wis_service.xml \ + -cfgName MotorControlWebApp \ + -listeningPorts 8080 \ + -documentRoot /medtech_ra/examples/WIS \ + -enableKeepAlive yes \ + -enableWebSockets +``` + +### 2. Open Web UI + +Open `http://:/html/robot_arm.html` in a browser, and use the UI to send MotorControl commands. + +If running locally, this will be: [http://localhost:8080/html/robot_arm.html](http://localhost:8080/html/robot_arm.html). + +>**Observe:** The web page buttons send short, repeated MotorControl commands when pressed. Each control button encodes a target motor and a direction (increment/decrement) which Web Integration Service publishes as `MotorControl` messages to `t/MotorControl`. + +## Web Control Mappings + +The web UI provides buttons that map to specific motor controls: + +| Web UI Control | Motor | Direction +| -------------- | ----- | --------- +| Base: `ccw` | `Motors.BASE` | decrement +| Base: `cw` | `Motors.BASE` | increment +| Shoulder: `up` | `Motors.SHOULDER` | increment +| Shoulder: `down` | `Motors.SHOULDER` | decrement +| Elbow: `up` | `Motors.ELBOW` | increment +| Elbow: `down` | `Motors.ELBOW` | decrement +| Wrist: `up` | `Motors.WRIST` | increment +| Wrist: `down` | `Motors.WRIST` | decrement +| Gripper: `open` | `Motors.HAND` | increment +| Gripper: `close` | `Motors.HAND` | decrement + +## Hands-On: Going Further + +### 1. RTI Routing Service Integration + +When the remote web host cannot directly reach the Arm domain, RTI Routing Service (see [Module 03: Remote Teleoperation](../../modules/03-remote-teleoperation/)) can be configured to route the Web Integration Service-published `MotorControl` samples into local domains. Using the Routing Service configuration provided in Module 03 permits control samples published by Web Integration Service in a remote network to be routed locally for use by local Arms. diff --git a/examples/WIS/scripts/launch_wis.sh b/examples/WIS/scripts/launch_wis.sh new file mode 100644 index 0000000..3bfbea2 --- /dev/null +++ b/examples/WIS/scripts/launch_wis.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Store the "-s" argument if provided, otherwise default to an empty string +SEC_FLAG=${1:-} + +# Apply Security QoS if needed +if [ "$SEC_FLAG" = "-s" ]; then + echo "This example does not support running with Security. Please run without the -s flag." + exit 1 +else + echo "Running without Security..." +fi + +# Set up XML-related variables (QoS, XML App Creation, etc.) +export NDDS_QOS_PROFILES="../../system_arch/Types.xml;$NDDS_QOS_PROFILES" + +TYPES_FILE="../../system_arch/Types.xml" +QOS_FILE="../../system_arch/qos/Qos.xml" +APPS_QOS_FILE="../../system_arch/qos/NonSecureAppsQos.xml" +DOMAIN_LIBRARY_FILE="../../system_arch/xml_app_creation/DomainLibrary.xml" +PARTICIPANT_LIBRARY_FILE="../../system_arch/xml_app_creation/ParticipantLibrary.xml" + +export NDDS_QOS_PROFILES=$TYPES_FILE";"$QOS_FILE";"$APPS_QOS_FILE";"$DOMAIN_LIBRARY_FILE";"$PARTICIPANT_LIBRARY_FILE + +# Start the process +$NDDSHOME/bin/rtiwebintegrationservice -listeningPorts $PUBLIC_PORT -cfgFile ./xml_config/wis_service.xml -cfgName MotorControlWebApp -documentRoot $DOC_ROOT -enableKeepAlive yes -enableWebSockets diff --git a/examples/WIS/scripts/variables.sh b/examples/WIS/scripts/variables.sh new file mode 100755 index 0000000..3b87955 --- /dev/null +++ b/examples/WIS/scripts/variables.sh @@ -0,0 +1,12 @@ +##### Modify these variables for your environment + +# Variables for all scenarios +# export NDDSHOME= +# export PUBLIC_PORT= # Public port that the Web Integration Service will listen on. +# export DOC_ROOT= # Document root for the Web Integration Service. + + +export PUBLIC_PORT=8080 +export DOC_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +#if not using bash, change the above line to: +#export DOC_ROOT="$(cd "$(dirname "$0")/.." && pwd)" diff --git a/examples/WIS/xml_config/wis_service.xml b/examples/WIS/xml_config/wis_service.xml new file mode 100644 index 0000000..42b35e5 --- /dev/null +++ b/examples/WIS/xml_config/wis_service.xml @@ -0,0 +1,70 @@ + + + + + + + + + + BuiltinQosSnippetLib::QosPolicy.Reliability.Reliable + BuiltinQosSnippetLib::QosPolicy.History.KeepLast_1 + + BuiltinQosSnippetLib::Optimization.ReliabilityProtocol.KeepLast + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/joystick_controller/README.md b/examples/joystick_controller/README.md new file mode 100644 index 0000000..d8d2daf --- /dev/null +++ b/examples/joystick_controller/README.md @@ -0,0 +1,107 @@ +# Joystick Controller — RTI MedTech Reference Architecture + +This example implements a joystick-based Arm controller for the RTI MedTech Reference Architecture. The controller reads a standard gamepad/joystick through `pygame`, publishes motor control commands to the DDS `MotorControl` topic, and participates as a first-class Arm device by publishing device status and heartbeats and responding to orchestrator commands. + +See the project root [README](../../README.md) for overall architecture and how this example fits in. + +## Contents + +- [Example Description](#example-description) +- [Setup and Installation](#setup-and-installation) +- [Run the Example](#run-the-example) +- [Button and Stick Mappings](#button-and-stick-mappings) +- [Notes on Behavior](#notes-on-behavior) + +## Example Description + +This example implements a joystick-based controller for the surgical robot arm. The system consists of: + +### Main Application + +The `joystick_controller.py` application reads joystick input and publishes DDS messages: + +- Registers DDS types (DeviceStatus, DeviceHeartbeat, DeviceCommand, MotorControl) with Connext using `DdsUtils`. +- Creates a DomainParticipant from the configured QoS profiles and finds the pre-configured DataWriters/DataReaders using the FQNs in `DdsUtils`. +- Publishes an initial `DeviceStatus` indicating the Arm is ON, and runs a background heartbeat writer thread publishing `DeviceHeartbeat` messages. +- Subscribes to `DeviceCommand` from the Orchestrator and reacts to START, PAUSE, and SHUTDOWN commands (updating `DeviceStatus` accordingly). +- Reads joystick buttons and axes via `pygame` and writes `MotorControl` messages for commanded motors. + +### Launch Script + +The `launch_arm_joystick.sh` helper script starts the joystick controller with the appropriate environment and QoS profiles. + +## Setup and Installation + +### 1. Install Dependencies + +***This example is best run from a Docker container running the image from [containers/examples/](./../containers/examples/Dockerfile). Currently, the example is not designed to be run directly on a host machine and will fail to launch using the script.*** + +*Refer to [1. Prerequisites](./../README.md#1-prerequisites) to build and start the examples container.* + +This example uses: + +- Python 3 +- [pygame](https://www.pygame.org/wiki/GettingStarted) (for joystick input) +- [RTI Connext DDS Python API](https://community.rti.com/static/documentation/developers/get-started/pip-install.html#python-installation) (`rti.connextdds`) +- The repository `Types` and `DdsUtils` modules (included in [modules/01-operating-room/src](./../../modules/01-operating-room/src/)) + +## Run the Example + +### 1. Connect Controller + +Ensure your joystick/gamepad is connected and recognized by the OS. + +### 2. Start the examples container + +```bash +# Ensure $RTI_LICENSE_FILE is set, or the applications may fail to start. +docker run --rm -it \ + --network host \ + -e DISPLAY \ + -e SDL_AUDIODRIVER=dummy \ + --device=/dev/ttyUSB0 \ + --privileged \ + --hostname rtimedtech \ + --name rtimedtechra \ + -v $HOME/.Xauthority:/root/.Xauthority \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $RTI_LICENSE_FILE:/root/rti_license.dat \ + connext:medtech_ra \ + bash +``` + +### 3. Start the Controller + +Start the controller app using the provided script: + +```bash +cd ~/medtech_ra/modules/01-operating-room +./scripts/launch_arm_joystick.sh +``` + +>**Observe:** The controller will publish motor control commands based on joystick input. The app acts like any other managed device in the architecture: it sends heartbeats and status updates and listens for orchestrator commands so the Orchestrator can start, pause, or shutdown the Arm as part of a larger scenario. + +## Button and Stick Mappings + +The joystick inputs map to specific motor controls: + +| Controller Input | Motor | Direction +| ---------------- | ----- | --------- +| X-Axis (left) | `BASE` | decrement +| X-Axis (right) | `BASE` | increment +| `PRIMARY_LEFT` (button 3) + Y-Axis (up) | `SHOULDER` | increment +| `PRIMARY_LEFT` (button 3) + Y-Axis (down) | `SHOULDER` | decrement +| `PRIMARY_RIGHT` (button 0) + Y-Axis (up) | `ELBOW` | increment +| `PRIMARY_RIGHT` (button 0) + Y-Axis (down) | `ELBOW` | decrement +| `SECONDARY_LEFT` (button 4) + Y-Axis (up) | `WRIST` | increment +| `SECONDARY_LEFT` (button 4) + Y-Axis (down) | `WRIST` | decrement +| `SECONDARY_RIGHT` (button 1) + X-Axis (left) | `HAND` | decrement +| `SECONDARY_RIGHT` (button 1) + X-Axis (right) | `HAND` | increment + +*Note: Button indices are based on the joystick used when this example was written; indexes may differ between controllers.* + +## Notes on Behavior + +- The app publishes `MotorControl` messages based on axis polarity and the currently active target motor (determined by the pressed modifier button). +- If no joystick is detected, the app exits with `No joystick detected.` Ensure your joystick/gamepad is connected and recognized by the OS. +- Button indices may differ between controllers. Use `joystick.get_numbuttons()` and `joystick.get_axis()` in an interactive session to verify. diff --git a/examples/joystick_controller/joystick_controller.py b/examples/joystick_controller/joystick_controller.py new file mode 100644 index 0000000..24dd81f --- /dev/null +++ b/examples/joystick_controller/joystick_controller.py @@ -0,0 +1,233 @@ +# +# (c) 2026 Copyright, Real-Time Innovations, Inc. (RTI) All rights reserved. +# +# RTI grants Licensee a license to use, modify, compile, and create derivative +# works of the software solely for use with RTI Connext DDS. Licensee may +# redistribute copies of the software provided that all such copies are +# subject to this license. The software is provided "as is", with no warranty +# of any type, including any warranty for fitness for any purpose. RTI is +# under no obligation to maintain or support the software. RTI shall not be +# liable for any incidental or consequential damages arising out of the use or +# inability to use the software. + +import pygame +from enum import IntEnum +import asyncio, os, threading +import rti.connextdds as dds +import DdsUtils +from Types import Common, SurgicalRobot, Orchestrator + +class Buttons(IntEnum): + PRIMARY_LEFT = 3 + PRIMARY_RIGHT = 0 + SECONDARY_LEFT = 4 + SECONDARY_RIGHT = 1 + +class JoystickApp: + def __init__(self): + self.arm_status = None + self.joystick = None + self.up_down = [SurgicalRobot.Motors.SHOULDER, SurgicalRobot.Motors.ELBOW, SurgicalRobot.Motors.WRIST] + self.left_right = [SurgicalRobot.Motors.BASE, SurgicalRobot.Motors.HAND] + self.stop_event = asyncio.Event() + self.event_loop = asyncio.new_event_loop() + + def __del__(self): + self.event_loop.close() # Final cleanup + + + async def joystick_setup(self): + pygame.init() + pygame.joystick.init() + + # Check if joystick is available + if pygame.joystick.get_count() < 1: + print("No joystick detected.") + pygame.quit() + return False + + # Initialize joystick + self.joystick = pygame.joystick.Joystick(0) + self.joystick.init() + + print(f"Starting Joystick Controller, using joystick: {joystick.get_name()}") + + # Print detected joystick mapping for debugging + num_axes = joystick.get_numaxes() + num_buttons = joystick.get_numbuttons() + num_hats = joystick.get_numhats() + print(f"Joystick detected: axes={num_axes}, buttons={num_buttons}, hats={num_hats}") + print("Controls:") + print(" BASE <- X (L = CCW, R = CW)") + print(" SHOULDER <- Y + Left Primary Button") + print(" ELBOW <- Y + Right Primary Button") + print(" WRIST <- Y + Left Secondary Button") + print(" HAND <- X + Right Secondary Button (L = Open, R = Close)") + return True + + + async def connext_setup(self): + # Register DDS types, using a function from DdsUtils.py + DdsUtils.register_type(Common.DeviceStatus) + DdsUtils.register_type(Common.DeviceHeartbeat) + DdsUtils.register_type(Orchestrator.DeviceCommand) + DdsUtils.register_type(SurgicalRobot.MotorControl) + + # Connext will load XML files through the default provider from the + # NDDS_QOS_PROFILES environment variable + qos_provider = dds.QosProvider.default + + participant = qos_provider.create_participant_from_config(DdsUtils.arm_controller_dp_fqn) + + # Initialize DataWriters + self.status_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.status_dw_fqn) + ) + self.hb_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.device_hb_dw_fqn) + ) + self.motor_control_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.motor_control_dw_fqn) + ) + self.arm_status = Common.DeviceStatus( + device=Common.DeviceType.ARM, status=Common.DeviceStatuses.ON + ) + self.status_writer.write(self.arm_status) + + # Initialize DataReaders + self.cmd_reader = dds.DataReader( + participant.find_datareader(DdsUtils.device_command_dr_fqn) + ) + + # Setup command handling and waitsets + cmd_status_condition = dds.StatusCondition(self.cmd_reader) + cmd_status_condition.enabled_statuses = dds.StatusMask.DATA_AVAILABLE + cmd_status_condition.set_handler(self.cmd_handler) + self.cmd_waitset = dds.WaitSet() + self.cmd_waitset += cmd_status_condition + + print("Connext DDS setup complete.") + + + async def write_hb(self, hb_writer): + while not self.stop_event.is_set(): + hb = Common.DeviceHeartbeat() + hb.device = Common.DeviceType.ARM + hb_writer.write(hb) + await asyncio.sleep(0.05) # 20Hz heartbeat + + + async def waitsets(self): + while not self.stop_event.is_set(): + await self.cmd_waitset.dispatch_async(dds.Duration(1)) + + + def cmd_handler(self, _): + samples = self.cmd_reader.take_data() + for sample in samples: + if sample.command == Orchestrator.DeviceCommands.START: + print("Arm received Start Command, Turning on Arm") + self.arm_status.status = Common.DeviceStatuses.ON + elif sample.command == Orchestrator.DeviceCommands.PAUSE: + print("Arm received Pause Command, Pausing Arm") + self.arm_status.status = Common.DeviceStatuses.PAUSED + else: + print("Arm received Shutdown Command") + self.arm_status.status = Common.DeviceStatuses.OFF + self.stop_event.set() + + self.status_writer.write(self.arm_status) + + + def poll_joystick(self, joystick): + clock = pygame.time.Clock() + sample = SurgicalRobot.MotorControl + + try: + num_buttons = joystick.get_numbuttons() + num_axes = joystick.get_numaxes() + target = SurgicalRobot.Motors.BASE + + while not self.stop_event.is_set(): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + return + + # Poll joystick for button states + button_states = [joystick.get_button(i) for i in range(num_buttons)] + # Poll joystick for axis states + axis_states = [joystick.get_axis(i) for i in range(num_axes)] + + target = SurgicalRobot.Motors.BASE + + if button_states[Buttons.PRIMARY_LEFT]: + target = SurgicalRobot.Motors.SHOULDER + elif button_states[Buttons.PRIMARY_RIGHT]: + target = SurgicalRobot.Motors.ELBOW + elif button_states[Buttons.SECONDARY_LEFT]: + target = SurgicalRobot.Motors.WRIST + elif button_states[Buttons.SECONDARY_RIGHT]: + target = SurgicalRobot.Motors.HAND + + # Left/right + if target in self.left_right: + if int(axis_states[0]) < 0: # left + sample.id = target + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + elif round(axis_states[0]) > 0: # right + sample.id = target + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + elif target in self.up_down: + if int(axis_states[1]) < 0: # up + sample.id = target + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + elif round(axis_states[1]) > 0: # down + sample.id = target + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + + # Adjust the clock speed as needed + clock.tick(60) + + except KeyboardInterrupt: + pygame.quit() + + # Main function + async def run(self): + + print("Starting Joystick Controller") + + threading.Thread(target=self.event_loop.run_forever, daemon=True).start() + + joystick_ok, _ = await asyncio.gather( self.joystick_setup(), self.connext_setup(), return_exceptions=True ) + if not joystick_ok: + print("Joystick setup failed, exiting.") + return + + # Start tasks + hb_task = asyncio.create_task(self.write_hb(self.hb_writer)) + sub_task = asyncio.create_task(self.waitsets()) + + # Poll joystick for button and axis states + self.poll_joystick(self.joystick) + + print("Shutting down Joystick Controller") + + # Set status to off + self.arm_status.status = Common.DeviceStatuses.OFF + + # Wait for all async tasks to finish + await asyncio.gather(hb_task, sub_task) + + pygame.quit() + + print("Joystick Controller shutdown complete.") + + +if __name__ == "__main__": + thisapp = JoystickApp() + asyncio.run(thisapp.run()) diff --git a/examples/joystick_controller/launch_arm_joystick.sh b/examples/joystick_controller/launch_arm_joystick.sh new file mode 100755 index 0000000..f61d98b --- /dev/null +++ b/examples/joystick_controller/launch_arm_joystick.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Remember to source the .bash file to dynamically load the security libraries + +# Store the "-s" argument if provided +SEC_FLAG=${1:-} + +# Set up XML-related variables (QoS, XML App Creation, etc.) +source ./scripts/common.sh $SEC_FLAG + +# Start the processes +python3 src/joystick_controller.py & diff --git a/examples/lss_robot/LSS_Library_Python b/examples/lss_robot/LSS_Library_Python new file mode 160000 index 0000000..f1eb55d --- /dev/null +++ b/examples/lss_robot/LSS_Library_Python @@ -0,0 +1 @@ +Subproject commit f1eb55de7e5c14c0960ea57233243e5bec674fe3 diff --git a/examples/lss_robot/README.md b/examples/lss_robot/README.md new file mode 100644 index 0000000..f3a740e --- /dev/null +++ b/examples/lss_robot/README.md @@ -0,0 +1,144 @@ +# LSS Robot — RTI MedTech Reference Architecture + +This example implements a Robot Arm application that controls a LynxMotion LSS serial-servo arm and publishes real servo telemetry to the MedTech Reference Architecture. The application reads motor control commands from the `MotorControl` topic and publishes `MotorTelemetry` samples on the `topic/MotorTelemetry` topic on **Domain 6**. It participates as a first-class Arm device by publishing device status and heartbeats and responding to Orchestrator commands. + +See the project root [README.md](../../README.md) for overall architecture and how this example fits in. + +## Contents + +- [Example Description](#example-description) +- [Setup and Installation](#setup-and-installation) +- [Run the Example](#run-the-example) +- [Telemetry Outputs and Topic](#telemetry-outputs-and-topic) +- [Notes on Behavior](#notes-on-behavior) +- [Hands-On: Going Further](#hands-on-going-further) + +## Example Description + +This example implements a physical robot arm controller using LynxMotion LSS serial servos. The system consists of: + +### Main Application + +The `lss_robot_app.py` application controls LynxMotion servos and publishes telemetry: + +- Declares `SurgicalRobot::MotorTelemetry` via a Python `idl.struct` mapping and assigns it to `SurgicalRobot.MotorTelemetry`. +- Registers DDS types (DeviceStatus, DeviceHeartbeat, DeviceCommand, MotorControl, MotorTelemetry) with Connext using `DdsUtils`. +- Uses a QoS-configured DomainParticipant (via `DdsUtils.arm_dp_fqn`) for the Arm domain and creates a second `DomainParticipant(6)` for publishing telemetry to `topic/MotorTelemetry`. +- Hardware setup: opens the LynxMotion serial bus and initializes `LSS(i)` for each servo, resets axes and moves servos to a safe initial position. +- Subscribes to `MotorControl` and applies INCREMENT/DECREMENT commands to physical servos, respecting per-servo speed (`maxrpm`) and movement limits. +- Reads physical servo state (position, speed, current, voltage, temperature) and publishes `MotorTelemetry` samples on Domain 6 at a configurable frequency (default 0.5s). + +### Launch Script + +The `launch_robot_app.sh` helper script sets up environment variables and starts the application. + +## Setup and Installation + +### 1. Install Dependencies + +***This example is best run from a Docker container running the image from [containers/examples/](./../containers/examples/Dockerfile). Currently, the example is not designed to be run directly on a host machine and will fail to launch using the script.*** + +*Refer to [1. Prerequisites](./../README.md#1-prerequisites) to build and start the examples container.* + +This example uses: + +- Python 3 +- [LynxMotion LSS Python Library](https://github.com/Lynxmotion/LSS_PRO_Library_Python) +- [RTI Connext DDS Python API](https://community.rti.com/static/documentation/developers/get-started/pip-install.html#python-installation) (`rti.connextdds`) +- The repository `Types` and `DdsUtils` modules (included in [modules/01-operating-room/src](./../../modules/01-operating-room/src/)) + +### 2. Configure Hardware + +Ensure the serial port configured in the app (default `/dev/ttyUSB0`) is correct for your hardware and that the user has permission to access it. + +On Linux, add your user to the appropriate group or use `udev` rules. On Windows, set the correct COM port. + +## Run the Example + +### 1. Connect Hardware + +Ensure your LynxMotion LSS servos are connected and powered. + +### 2. Start the examples container + +```bash +# Ensure $RTI_LICENSE_FILE is set, or the applications may fail to start. +docker run --rm -it \ + --network host \ + -e DISPLAY \ + -e SDL_AUDIODRIVER=dummy \ + --device=/dev/ttyUSB0 \ + --privileged \ + --hostname rtimedtech \ + --name rtimedtechra \ + -v $HOME/.Xauthority:/root/.Xauthority \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $RTI_LICENSE_FILE:/root/rti_license.dat \ + connext:medtech_ra \ + bash +``` + +### 3. Start the Application + +Start the application using the provided script: + +```bash +cd ~/medtech_ra/modules/01-operating-room +./scripts/launch_robot_app.sh +``` + +>**Observe:** The application will control the physical servos based on motor control commands and publish real telemetry to `topic/MotorTelemetry` on Domain 6. The app acts like any other managed device in the architecture: it sends heartbeats and status updates and listens for orchestrator commands so the Orchestrator can start, pause, or shutdown the Arm as part of a larger scenario. + +## Telemetry Outputs and Topic + +The application publishes telemetry on the following topic: + +- **Topic**: `topic/MotorTelemetry` on **Domain 6** + +Published fields (per sample): + +| Field | Description +| ----- | ----------- +| `id` | Motor identifier (BASE, SHOULDER, ELBOW, WRIST, HAND) +| `position_deg` | Current servo position in degrees +| `speed_rpm` | Current servo speed in RPM +| `current_mA` | Current draw in milliamps +| `voltage_V` | Voltage in volts +| `temp_c` | Temperature in degrees Celsius + +Update frequency: 0.5 seconds by default (see `write_telemetry()` in the application). + +## Notes on Behavior + +- The app inverts ELBOW and WRIST directions when mapping control commands to physical movement to match the arm's mechanical conventions. Shoulder and elbow telemetry position may be inverted to align with the digital twin convention. +- Servo movement respects configured `limits` and `maxrpm` per axis to prevent unsafe motion. +- If you don't have the hardware available, run the `telemetry_bridge` Digital Twin example to simulate telemetry and validate orchestration and telemetry consumers before connecting the physical arm. +- Verify the serial port name and permissions before running (e.g., `/dev/ttyUSB0` on Linux). +- Use conservative `maxrpm` and `limits` when first testing physical hardware. + +## Hands-On: Going Further + +### 1. Telemetry Validation with RTI DDS Spy + +Quickly validate with RTI DDS Spy that the telemetry app is publishing data on Domain 6. + +```bash +$NDDSHOME/bin/rtiddsspy \ + -domainId 6 \ + -topicRegex "topic/MotorTelemetry" \ + -mode USER \ + -printSample +``` + +Or with public Docker image: + +```bash +docker run -it --rm \ + --network host \ + --name=dds_spy \ + rticom/dds-spy:latest \ + -domainId 6 \ + -topicRegex "topic/MotorTelemetry" \ + -mode USER \ + -printSample +``` diff --git a/examples/lss_robot/launch_robot_app.sh b/examples/lss_robot/launch_robot_app.sh new file mode 100755 index 0000000..a427a58 --- /dev/null +++ b/examples/lss_robot/launch_robot_app.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Remember to source the .bash file to dynamically load the security libraries + +# Store the "-s" argument if provided +SEC_FLAG=${1:-} + +# Set up XML-related variables (QoS, XML App Creation, etc.) +source ./scripts/common.sh $SEC_FLAG + +# Start the processes +python3 src/lss_robot_app.py & diff --git a/examples/lss_robot/lss_robot_app.py b/examples/lss_robot/lss_robot_app.py new file mode 100644 index 0000000..d4476db --- /dev/null +++ b/examples/lss_robot/lss_robot_app.py @@ -0,0 +1,265 @@ +# +# (c) 2026 Copyright, Real-Time Innovations, Inc. (RTI) All rights reserved. +# +# RTI grants Licensee a license to use, modify, compile, and create derivative +# works of the software solely for use with RTI Connext DDS. Licensee may +# redistribute copies of the software provided that all such copies are +# subject to this license. The software is provided "as is", with no warranty +# of any type, including any warranty for fitness for any purpose. RTI is +# under no obligation to maintain or support the software. RTI shall not be +# liable for any incidental or consequential damages arising out of the use or +# inability to use the software. + +# Robot Arm application which controls the LynxMotion arm, and publishes telemetry data + +import asyncio, threading +import rti.connextdds as dds +import DdsUtils +from Types import Common, SurgicalRobot, Orchestrator +import rti.idl as idl +# LynxMotion Serial Servo (LSS) library imports - https://github.com/Lynxmotion/LSS_PRO_Library_Python +import lss +import lss_const as lssc + + +@idl.struct( + type_annotations = [idl.type_name("SurgicalRobot::MotorTelemetry")], + + member_annotations = { + 'id': [idl.key, idl.default(0),], + } +) +class SurgicalRobot_MotorTelemetry: + id: SurgicalRobot.Motors = SurgicalRobot.Motors.BASE + position_deg: idl.float32 = 0.0 + speed_rpm: idl.float32 = 0.0 + current_mA: idl.float32 = 0.0 + voltage_V: idl.float32 = 0.0 + temp_c: idl.float32 = 0.0 + +SurgicalRobot.MotorTelemetry = SurgicalRobot_MotorTelemetry + +class RobotApp: + def __init__(self): + self.stop_event = asyncio.Event() + + self.lss_port = "/dev/ttyUSB0" # For Linux/Unix platforms + # self.lss_port = "COM230" # For windows platforms + self.lss_baud = lssc.LSS_DefaultBaud + self.arm_status = None + + self.maxrpm = [5,3,5,5,5] # How fast each servo should spin + self.limits = [(-90,180),(-30,75),(-90,15),(-85,65),(-90,-2)] # Movement limits for each servo + self.servolist = [] + + self.event_loop = asyncio.new_event_loop() + + + def __del__(self): + self.event_loop.close() # Final cleanup + + + async def robot_setup(self): + # Create and open a serial port + lss.initBus(self.lss_port, self.lss_baud) + + for i in range(1,6): + self.servolist.append(lss.LSS(i)) + + for i in [0, 1, 2, 3, 4]: + print(f"Resetting axis: {i}") + servo = self.servolist[i] + servo.reset() + await asyncio.sleep(1) + servo.move(0) # go to initial position + + await asyncio.sleep(2) + + for i in [0, 1, 2, 3, 4]: + self.servolist[i].move(0) # go to initial position + + print("Robot hardware setup complete.") + + + async def connext_setup(self): + # Register DDS types, using a function from DdsUtils.py + DdsUtils.register_type(Common.DeviceStatus) + DdsUtils.register_type(Common.DeviceHeartbeat) + DdsUtils.register_type(Orchestrator.DeviceCommand) + DdsUtils.register_type(SurgicalRobot.MotorControl) + DdsUtils.register_type(SurgicalRobot.MotorTelemetry) + + # Connext will load XML files through the default provider from the + # NDDS_QOS_PROFILES environment variable + qos_provider = dds.QosProvider.default + + participant = qos_provider.create_participant_from_config(DdsUtils.arm_dp_fqn) + + # Create a second participant for telemetry topic on the telemetry domain (6) + self.participant_6 = dds.DomainParticipant(6) + self.telemetry_topic = dds.Topic(self.participant_6, "topic/MotorTelemetry", SurgicalRobot.MotorTelemetry) + + # Initialize DataWriters + self.telemetry_writer = dds.DataWriter( + self.participant_6.implicit_publisher, self.telemetry_topic + ) + self.status_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.status_dw_fqn) + ) + self.hb_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.device_hb_dw_fqn) + ) + self.arm_status = Common.DeviceStatus( + device=Common.DeviceType.ARM, status=Common.DeviceStatuses.ON + ) + self.status_writer.write(self.arm_status) + + # Initialize DataReaders + self.motor_control_reader = dds.DataReader( + participant.find_datareader(DdsUtils.motor_control_dr_fqn) + ) + self.cmd_reader = dds.DataReader( + participant.find_datareader(DdsUtils.device_command_dr_fqn) + ) + + # Setup command condition + cmd_status_condition = dds.StatusCondition(self.cmd_reader) + cmd_status_condition.enabled_statuses = dds.StatusMask.DATA_AVAILABLE + cmd_status_condition.set_handler(self.cmd_handler) + + # Setup motor control condition + motor_status_condition = dds.StatusCondition(self.motor_control_reader) + motor_status_condition.enabled_statuses = dds.StatusMask.DATA_AVAILABLE + motor_status_condition.set_handler(self.motor_handler) + + self.general_waitset = dds.WaitSet() + self.general_waitset += cmd_status_condition + self.general_waitset += motor_status_condition + + print("Connext DDS setup complete.") + + + async def write_hb(self, hb_writer): + while not self.stop_event.is_set(): + hb = Common.DeviceHeartbeat() + hb.device = Common.DeviceType.ARM + hb_writer.write(hb) + await asyncio.sleep(0.05) # 20Hz heartbeat + + + async def write_telemetry(self, motor_id, position, speed, current, voltage, temp): + try: + sample = SurgicalRobot.MotorTelemetry() + sample.id = motor_id + sample.position_deg = int(position) + # Invert position for SHOULDER and ELBOW to match physical movement shown in digital twin + if motor_id == SurgicalRobot.Motors.SHOULDER or motor_id == SurgicalRobot.Motors.ELBOW: + sample.position_deg = -sample.position_deg + + sample.speed_rpm = speed + sample.current_mA = current + sample.voltage_V = voltage + sample.temp_c = temp + + self.telemetry_writer.write(sample) + except Exception as e: + print(f"Error writing telemetry for motor {motor_id}: {e}") + + + def cmd_handler(self, _): + samples = self.cmd_reader.take_data() + for sample in samples: + if sample.command == Orchestrator.DeviceCommands.START: + print("Arm received Start Command, Turning on Arm") + self.arm_status.status = Common.DeviceStatuses.ON + elif sample.command == Orchestrator.DeviceCommands.PAUSE: + print("Arm received Pause Command, Pausing Arm") + self.arm_status.status = Common.DeviceStatuses.PAUSED + else: + print("Arm received Shutdown Command") + self.arm_status.status = Common.DeviceStatuses.OFF + self.stop_event.set() + + self.status_writer.write(self.arm_status) + + + def motor_handler(self, _): + samples = self.motor_control_reader.take_data() + for sample in samples: + + motor_id = sample.id + direction = sample.direction + delta = 0 + + # Invert direction for ELBOW and WRIST to match physical movement + if motor_id == SurgicalRobot.Motors.ELBOW or motor_id == SurgicalRobot.Motors.WRIST: + if direction == SurgicalRobot.MotorDirections.INCREMENT: + direction = SurgicalRobot.MotorDirections.DECREMENT + elif direction == SurgicalRobot.MotorDirections.DECREMENT: + direction = SurgicalRobot.MotorDirections.INCREMENT + + try: # Sometimes get NoneType from lss.get... + pos = float(self.servolist[motor_id].getPosition()) / 10.0 + speed = float(self.servolist[motor_id].getSpeedRPM()) + current = float(self.servolist[motor_id].getCurrent()) + voltage = float(self.servolist[motor_id].getVoltage()) / 1000.0 + temp = float(self.servolist[motor_id].getTemperature()) / 10.0 + except Exception as e: + print(f"Error getting servo data for motor {motor_id}: {e}") + continue + + if direction == SurgicalRobot.MotorDirections.INCREMENT: + delta = self.maxrpm[motor_id] + if pos+delta >= self.limits[motor_id][1]: + delta = 0 + elif direction == SurgicalRobot.MotorDirections.DECREMENT: + delta = -self.maxrpm[motor_id] + if pos+delta <= self.limits[motor_id][0]: + delta = 0 + + #print(f"Delta is {delta}, new position is {pos+delta}") + + if delta != 0: + rpm = self.maxrpm[motor_id] + if direction == SurgicalRobot.MotorDirections.DECREMENT and motor_id == SurgicalRobot.Motors.ELBOW: + rpm = rpm / 1.5 + + # write current position before moving, as the move command will take some time to execute and we want to publish the telemetry as close to the command as possible + asyncio.run_coroutine_threadsafe(self.write_telemetry(motor_id, pos+delta, speed, current, voltage, temp), self.event_loop) + + self.servolist[motor_id].setMaxSpeedRPM(rpm) + self.servolist[motor_id].move((pos+delta) * 10) + + + # Main function + async def run(self): + + print("Starting Robot Controller") + + threading.Thread(target=self.event_loop.run_forever, daemon=True).start() + + # setup robot hardware and connext in parallel, as they are independent and can save time - the robot setup can take a while as it resets and initializes the servos, so doing this in parallel with the connext setup allows us to be ready to receive commands as soon as possible. The connext setup is mostly just creating entities and doesn't involve any waiting, so it will be ready very quickly. + await asyncio.gather( self.robot_setup(), self.connext_setup() ) + + # Start heartbeat task - this will run until the application is shutdown, at which point the stop_event will be set and the task will exit its loop and complete + hb_task = asyncio.create_task(self.write_hb(self.hb_writer)) + + try: + while not self.stop_event.is_set(): + await self.general_waitset.dispatch_async(dds.Duration(1)) + except KeyboardInterrupt: + self.stop_event.set() + + print("Shutting down Robot Controller") + + # Set status to off + self.arm_status.status = Common.DeviceStatuses.OFF + + # Rejoin all asyncio tasks - in this case just the heartbeat task, as telemetry tasks are fire-and-forget + await hb_task + + print("Robot Controller shutdown complete.") + +if __name__ == "__main__": + thisapp = RobotApp() + asyncio.run(thisapp.run()) diff --git a/examples/telemetry_bridge/README.md b/examples/telemetry_bridge/README.md new file mode 100644 index 0000000..d3604d5 --- /dev/null +++ b/examples/telemetry_bridge/README.md @@ -0,0 +1,120 @@ +# Telemetry Bridge — RTI MedTech Reference Architecture + +This example implements a telemetry bridge (Digital Twin) for the RTI MedTech Reference Architecture. The bridge listens to `MotorControl` commands on the Arm domain, updates an internal simulated model of motor angles, and publishes simulated `MotorTelemetry` data to the `topic/MotorTelemetry` topic on **Domain 6** using a separate DomainParticipant. It also participates as a first-class Arm device by publishing device status and heartbeats and responding to orchestrator commands. + +See the project root [README.md](../../README.md) for overall architecture and how this example fits in. + +## Contents + +- [Example Description](#example-description) +- [Setup and Installation](#setup-and-installation) +- [Run the Example](#run-the-example) +- [Telemetry Outputs and Topic](#telemetry-outputs-and-topic) +- [Notes on Behavior](#notes-on-behavior) +- [Hands-On: Going Further](#hands-on-going-further) + +## Example Description + +This example implements a telemetry bridge (Digital Twin) that simulates motor telemetry for the surgical robot arm. The system consists of: + +### Main Application + +The `telemetry_app.py` application simulates motor telemetry and publishes DDS messages: + +- Declares a Python `idl.struct` mapping for `SurgicalRobot::MotorTelemetry` and assigns it to `SurgicalRobot.MotorTelemetry`. +- Registers DDS types (DeviceStatus, DeviceHeartbeat, DeviceCommand, MotorControl, MotorTelemetry) with Connext using `DdsUtils`. +- Creates a DomainParticipant for the Arm domain (via QoS provider) to read `MotorControl` and publish `DeviceStatus`/heartbeats. +- Creates a second DomainParticipant on **Domain 6** and a `topic/MotorTelemetry` topic to publish simulated telemetry data from the Digital Twin. +- Subscribes to `MotorControl` and updates an internal `angles` map when INCREMENT/DECREMENT commands are received. +- Runs a background telemetry writer thread that periodically publishes `MotorTelemetry` samples with fields: `position_deg`, `speed_rpm`, `current_mA`, `voltage_V`, and `temp_c`. + +### Launch Script + +The `launch_telemetry_app.sh` helper script sets up environment variables and starts the application. + +## Setup and Installation + +### 1. Install Dependencies + +***This example is best run from a Docker container running the image from [containers/examples/](./../containers/examples/Dockerfile). Currently, the example is not designed to be run directly on a host machine and will fail to launch using the script.*** + +*Refer to [1. Prerequisites](./../README.md#1-prerequisites) to build and start the examples container.* + +This example uses: + +- Python 3 +- [RTI Connext DDS Python API](https://community.rti.com/static/documentation/developers/get-started/pip-install.html#python-installation) (`rti.connextdds`) +- The repository `Types` and `DdsUtils` modules (included in [modules/01-operating-room/src](./../../modules/01-operating-room/src/)) + +## Run the Example + +### 1. Start the examples container + +```bash +# Ensure $RTI_LICENSE_FILE is set, or the applications may fail to start. +docker run --rm -it \ + --network host \ + -e DISPLAY \ + -e SDL_AUDIODRIVER=dummy \ + --device=/dev/ttyUSB0 \ + --privileged \ + --hostname rtimedtech \ + --name rtimedtechra \ + -v $HOME/.Xauthority:/root/.Xauthority \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $RTI_LICENSE_FILE:/root/rti_license.dat \ + connext:medtech_ra \ + bash +``` + +### 2. Start the Application + +Start the application using the provided script: + +```bash +cd ~/medtech_ra/modules/01-operating-room +./scripts/launch_telemetry_app.sh +``` + +>**Observe:** The bridge will publish simulated telemetry to `topic/MotorTelemetry` on Domain 6 based on motor control commands. The app acts like any other managed device in the architecture: it sends heartbeats and status updates and listens for orchestrator commands so the Orchestrator can start, pause, or shutdown the bridge as part of a larger scenario. + +## Telemetry Outputs and Topic + +The application publishes telemetry on the following topic: + +- **Topic**: `topic/MotorTelemetry` on **Domain 6** + +Published fields (per sample): + +| Field | Description +| ----- | ----------- +| `id` | Motor identifier (BASE, SHOULDER, ELBOW, WRIST, HAND) +| `position_deg` | Current simulated angular position in degrees +| `speed_rpm` | Reserved for future use (not actively computed in the default example) +| `current_mA` | Simulated current consumption in milliamps (randomized within a small range) +| `voltage_V` | Simulated supply voltage in volts (small randomized variation) +| `temp_c` | Simulated temperature in degrees Celsius + +Update frequency: 0.5 seconds by default (see `write_telemetry()` in the application). + +## Notes on Behavior + +- The bridge maintains an internal model of motor positions and updates them in response to `MotorControl` INCREMENT/DECREMENT messages. +- Telemetry is published from a distinct DomainParticipant on Domain 6 to demonstrate cross-domain telemetry publishing and to keep telemetry traffic segregated from control traffic. +- The bridge also behaves as any other managed device in the architecture: it publishes DeviceStatus and DeviceHeartbeat and listens for Orchestrator `DeviceCommand`s (START, PAUSE, SHUTDOWN) to change device state. +- If you want higher or lower telemetry frequency, change the sleep delay in `write_telemetry()` (default 0.5s). +- This example uses randomized telemetry values for current/voltage/temperature to simulate realistic but synthetic sensor output. + +## Hands-On: Going Further + +### 1. Telemetry Validation with RTI DDS Spy + +Quickly validate with RTI DDS Spy that the telemetry app is publishing data on Domain 6. + +```bash +$NDDSHOME/bin/rtiddsspy \ + -domainId 6 \ + -topicRegex "topic/MotorTelemetry" \ + -mode USER \ + -printSample +``` diff --git a/examples/telemetry_bridge/launch_telemetry_app.sh b/examples/telemetry_bridge/launch_telemetry_app.sh new file mode 100755 index 0000000..15c8e0a --- /dev/null +++ b/examples/telemetry_bridge/launch_telemetry_app.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Remember to source the .bash file to dynamically load the security libraries + +# Store the "-s" argument if provided +SEC_FLAG=${1:-} + +# Set up XML-related variables (QoS, XML App Creation, etc.) +source ./scripts/common.sh $SEC_FLAG + +# Start the processes +python3 src/telemetry_app.py & diff --git a/examples/telemetry_bridge/telemetry_app.py b/examples/telemetry_bridge/telemetry_app.py new file mode 100644 index 0000000..4e09633 --- /dev/null +++ b/examples/telemetry_bridge/telemetry_app.py @@ -0,0 +1,191 @@ +# +# (c) 2026 Copyright, Real-Time Innovations, Inc. (RTI) All rights reserved. +# +# RTI grants Licensee a license to use, modify, compile, and create derivative +# works of the software solely for use with RTI Connext DDS. Licensee may +# redistribute copies of the software provided that all such copies are +# subject to this license. The software is provided "as is", with no warranty +# of any type, including any warranty for fitness for any purpose. RTI is +# under no obligation to maintain or support the software. RTI shall not be +# liable for any incidental or consequential damages arising out of the use or +# inability to use the software. + +# Simple bridge application to publish telemetry data to the MedTech Reference Architecture from the MotorControl topic +import sys + +import threading, random, asyncio +import rti.connextdds as dds +import DdsUtils +from Types import Common, SurgicalRobot, Orchestrator +import rti.idl as idl + + +@idl.struct( + type_annotations = [idl.type_name("SurgicalRobot::MotorTelemetry")], + + member_annotations = { + 'id': [idl.key, idl.default(0),], + } +) +class SurgicalRobot_MotorTelemetry: + id: SurgicalRobot.Motors = SurgicalRobot.Motors.BASE + position_deg: idl.float32 = 0.0 + speed_rpm: idl.float32 = 0.0 + current_mA: idl.float32 = 0.0 + voltage_V: idl.float32 = 0.0 + temp_c: idl.float32 = 0.0 + +SurgicalRobot.MotorTelemetry = SurgicalRobot_MotorTelemetry + +class DigitalTwinApp: + def __init__(self): + self.angles = {SurgicalRobot.Motors.BASE : 180.0, + SurgicalRobot.Motors.SHOULDER : 180.0, + SurgicalRobot.Motors.ELBOW : 180.0, + SurgicalRobot.Motors.WRIST : 180.0, + SurgicalRobot.Motors.HAND : 180.0} + self.stop_event = asyncio.Event() + self.event_loop = asyncio.new_event_loop() + + def connext_setup(self): + # Register DDS types, using a function from DdsUtils.py + DdsUtils.register_type(Common.DeviceStatus) + DdsUtils.register_type(Common.DeviceHeartbeat) + DdsUtils.register_type(Orchestrator.DeviceCommand) + DdsUtils.register_type(SurgicalRobot.MotorControl) + DdsUtils.register_type(SurgicalRobot.MotorTelemetry) + + # Connext will load XML files through the default provider from the + # NDDS_QOS_PROFILES environment variable + qos_provider = dds.QosProvider.default + + participant = qos_provider.create_participant_from_config(DdsUtils.arm_dp_fqn) + + # Create a second participant for telemetry topic on the telemetry domain (6) + self.participant_6 = dds.DomainParticipant(6) + self.telemetry_topic = dds.Topic(self.participant_6, "topic/MotorTelemetry", SurgicalRobot.MotorTelemetry) + + # Initialize DataWriters + self.telemetry_writer = dds.DataWriter( + self.participant_6.implicit_publisher, self.telemetry_topic + ) + self.status_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.status_dw_fqn) + ) + self.hb_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.device_hb_dw_fqn) + ) + self.arm_status = Common.DeviceStatus( + device=Common.DeviceType.ARM, status=Common.DeviceStatuses.ON + ) + self.status_writer.write(self.arm_status) + + # Initialize DataReaders + self.motor_control_reader = dds.DataReader( + participant.find_datareader(DdsUtils.motor_control_dr_fqn) + ) + self.cmd_reader = dds.DataReader( + participant.find_datareader(DdsUtils.device_command_dr_fqn) + ) + + # Setup command condition + cmd_status_condition = dds.StatusCondition(self.cmd_reader) + cmd_status_condition.enabled_statuses = dds.StatusMask.DATA_AVAILABLE + cmd_status_condition.set_handler(self.cmd_handler) + + # Setup motor control condition + motor_status_condition = dds.StatusCondition(self.motor_control_reader) + motor_status_condition.enabled_statuses = dds.StatusMask.DATA_AVAILABLE + motor_status_condition.set_handler(self.motor_handler) + + self.general_waitset = dds.WaitSet() + self.general_waitset += cmd_status_condition + self.general_waitset += motor_status_condition + + + async def write_hb(self, hb_writer): + while not self.stop_event.is_set(): + hb = Common.DeviceHeartbeat() + hb.device = Common.DeviceType.ARM + hb_writer.write(hb) + await asyncio.sleep(0.05) # 20Hz heartbeat + + async def write_telemetry(self, motor_id, position): + try: + sample = SurgicalRobot.MotorTelemetry() + sample.id = motor_id + sample.position_deg = int(position) + # Invert position for SHOULDER and ELBOW to match physical movement shown in digital twin + #if motor_id == SurgicalRobot.Motors.SHOULDER or motor_id == SurgicalRobot.Motors.ELBOW: + # sample.position_deg = -sample.position_deg + + sample.speed_rpm = round(random.uniform(-10,10),2) + sample.current_mA = round(random.uniform(1,1.5),2) + sample.voltage_V = round(random.uniform(12,12.1),2) + sample.temp_c = round(random.uniform(26,27.0),2) + + self.telemetry_writer.write(sample) + except Exception as e: + print(f"Error writing telemetry for motor {motor_id}: {e}") + + + def cmd_handler(self, _): + samples = self.cmd_reader.take_data() + for sample in samples: + if sample.command == Orchestrator.DeviceCommands.START: + print("Arm received Start Command, Turning on Arm") + self.arm_status.status = Common.DeviceStatuses.ON + elif sample.command == Orchestrator.DeviceCommands.PAUSE: + print("Arm received Pause Command, Pausing Arm") + self.arm_status.status = Common.DeviceStatuses.PAUSED + else: + print("Arm received Shutdown Command") + self.arm_status.status = Common.DeviceStatuses.OFF + self.stop_event.set() + + self.status_writer.write(self.arm_status) + + + def motor_handler(self, _): + samples = self.motor_control_reader.take_data() + for sample in samples: + if(sample.direction == SurgicalRobot.MotorDirections.INCREMENT): + self.angles[sample.id] = (self.angles[sample.id] + 1) % 360.0 + elif(sample.direction == SurgicalRobot.MotorDirections.DECREMENT): + self.angles[sample.id] = (self.angles[sample.id] - 1) % 360.0 + + asyncio.run_coroutine_threadsafe(self.write_telemetry(sample.id, self.angles[sample.id]), self.event_loop) + + + # Main function + async def run(self): + + print("Starting DigitalTwin Controller") + + threading.Thread(target=self.event_loop.run_forever, daemon=True).start() + + # setup Connext + self.connext_setup() + + # Start tasks + hb_task = asyncio.create_task(self.write_hb(self.hb_writer)) + + try: + while not self.stop_event.is_set(): + await self.general_waitset.dispatch_async(dds.Duration(1)) + except KeyboardInterrupt: + self.stop_event.set() + + print("Shutting down DigitalTwin Controller") + + # Set status to off + self.arm_status.status = Common.DeviceStatuses.OFF + + # Wait for all async tasks to finish + await hb_task + + print("DigitalTwin Controller shutdown complete.") + +if __name__ == "__main__": + thisapp = DigitalTwinApp() + asyncio.run(thisapp.run()) diff --git a/examples/xbox_controller/README.md b/examples/xbox_controller/README.md new file mode 100644 index 0000000..3670a25 --- /dev/null +++ b/examples/xbox_controller/README.md @@ -0,0 +1,109 @@ +# Xbox Controller — RTI MedTech Reference Architecture + +This example implements an Xbox controller-based Arm controller for the RTI MedTech Reference Architecture. The controller reads an Xbox gamepad through `pygame`, publishes motor control commands to the DDS `MotorControl` topic, and participates as a first-class Arm device by publishing device status and heartbeats and responding to orchestrator commands. + +See the project root [README](../../README.md) for overall architecture and how this example fits in. + +## Contents + +- [Example Description](#example-description) +- [Setup and Installation](#setup-and-installation) +- [Run the Example](#run-the-example) +- [Button and Stick Mappings](#button-and-stick-mappings) +- [Notes on Behavior](#notes-on-behavior) + +## Example Description + +This example implements an Xbox gamepad-based controller for the surgical robot arm. The system consists of: + +### Main Application + +The `xbox_controller.py` application reads Xbox controller input and publishes DDS messages: + +- Registers DDS types (DeviceStatus, DeviceHeartbeat, DeviceCommand, MotorControl) with Connext using `DdsUtils`. +- Creates a DomainParticipant from the configured QoS profiles and finds the pre-configured DataWriters/DataReaders using the FQNs in `DdsUtils`. +- Publishes an initial `DeviceStatus` indicating the Arm is ON, and runs a background heartbeat writer thread publishing `DeviceHeartbeat` messages. +- Subscribes to `DeviceCommand` from the Orchestrator and reacts to START, PAUSE, and SHUTDOWN commands (updating `DeviceStatus` accordingly). +- Reads controller inputs via `pygame` (hats and stick axes) and writes `MotorControl` messages for commanded motors. + +### Launch Script + +The [`launch_arm_xbox.sh`](./launch_arm_xbox.sh) helper script starts the Xbox controller with the appropriate environment and QoS profiles. + +## Setup and Installation + +### 1. Install Dependencies + +***This example is best run from a Docker container running the image from [containers/examples/](./../containers/examples/Dockerfile). Currently, the example is not designed to be run directly on a host machine and will fail to launch using the script.*** + +*Refer to [1. Prerequisites](./../README.md#1-prerequisites) to build and start the examples container.* + +This example uses: + +- Python 3 +- [pygame](https://www.pygame.org/wiki/GettingStarted) (for controller input) +- [RTI Connext DDS Python API](https://community.rti.com/static/documentation/developers/get-started/pip-install.html#python-installation) (`rti.connextdds`) +- The repository `Types` and `DdsUtils` modules (included in [modules/01-operating-room/src](./../../modules/01-operating-room/src/)) + +## Run the Example + +### 1. Connect Controller + +Ensure your Xbox controller is connected and recognized by the OS. + +### 2. Start the examples container + +```bash +# Ensure $RTI_LICENSE_FILE is set, or the applications may fail to start. +docker run --rm -it \ + --network host \ + -e DISPLAY \ + -e SDL_AUDIODRIVER=dummy \ + --device=/dev/ttyUSB0 \ + --privileged \ + --hostname rtimedtech \ + --name rtimedtechra \ + -v $HOME/.Xauthority:/root/.Xauthority \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $RTI_LICENSE_FILE:/root/rti_license.dat \ + connext:medtech_ra \ + bash +``` + +### 3. Start the Controller + +Start the controller app using the provided script from the examples container: + +```bash +cd ~/medtech_ra/modules/01-operating-room +./scripts/launch_arm_xbox.sh +``` + +>**Observe:** The controller will publish motor control commands based on gamepad input. The app acts like any other managed device in the architecture: it sends heartbeats and status updates and listens for orchestrator commands so the Orchestrator can start, pause, or shutdown the Arm as part of a larger scenario. + +## Button and Stick Mappings + +The Xbox controller inputs map to specific motor controls: + +| Controller Input | Motor | Direction +| ---------------- | ----- | --------- +| D-pad X (left) | `BASE` | decrement +| D-pad X (right) | `BASE` | increment +| D-pad Y (up) | `SHOULDER` | increment +| D-pad Y (down) | `SHOULDER` | decrement +| Left stick X (left) | `WRIST` | decrement +| Left stick X (right) | `WRIST` | increment +| Left stick Y (up) | `ELBOW` | increment (polarity inverted) +| Left stick Y (down) | `ELBOW` | decrement (polarity inverted) +| Right stick Y (up) | `HAND` | increment +| Right stick Y (down) | `HAND` | decrement + +*Note: The implementation inverts the Elbow polarity (up vs down) to match the intended motion (see `xbox_controller.py` for details).* + +## Notes on Behavior + +- The app publishes `MotorControl` messages based on axis/hats polarity. +- D-pad values are read from `joystick.get_hat(0)` when available; hat polarity may vary between controllers. +- If no controller is detected, the app exits with `No joystick detected.` Ensure your controller is connected and recognized by the OS. +- Button/hat/axis indices and polarity may differ between controllers. Use `joystick.get_numbuttons()`, `joystick.get_numhats()`, and `joystick.get_numaxes()` in an interactive session to verify. +- For headless/no-sound setups, use `-e SDL_AUDIODRIVER=dummy` in the docker command to suppress SDL sound initialization errors. diff --git a/examples/xbox_controller/launch_arm_xbox.sh b/examples/xbox_controller/launch_arm_xbox.sh new file mode 100755 index 0000000..856153d --- /dev/null +++ b/examples/xbox_controller/launch_arm_xbox.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Remember to source the .bash file to dynamically load the security libraries + +# Store the "-s" argument if provided +SEC_FLAG=${1:-} + +# Set up XML-related variables (QoS, XML App Creation, etc.) +source ./scripts/common.sh $SEC_FLAG + +# Start the processes +python3 src/xbox_controller.py & diff --git a/examples/xbox_controller/xbox_controller.py b/examples/xbox_controller/xbox_controller.py new file mode 100644 index 0000000..79c429e --- /dev/null +++ b/examples/xbox_controller/xbox_controller.py @@ -0,0 +1,304 @@ +# +# (c) 2026 Copyright, Real-Time Innovations, Inc. (RTI) All rights reserved. +# +# RTI grants Licensee a license to use, modify, compile, and create derivative +# works of the software solely for use with RTI Connext DDS. Licensee may +# redistribute copies of the software provided that all such copies are +# subject to this license. The software is provided "as is", with no warranty +# of any type, including any warranty for fitness for any purpose. RTI is +# under no obligation to maintain or support the software. RTI shall not be +# liable for any incidental or consequential damages arising out of the use or +# inability to use the software. + +import pygame +from enum import IntEnum +import asyncio, os, threading +import rti.connextdds as dds +import DdsUtils +from Types import Common, SurgicalRobot, Orchestrator + +class Buttons(IntEnum): + PRIMARY_LEFT = 3 + PRIMARY_RIGHT = 0 + SECONDARY_LEFT = 4 + SECONDARY_RIGHT = 1 + +class JoystickApp: + def __init__(self): + self.arm_status = None + self.joystick = None + self.up_down = [SurgicalRobot.Motors.SHOULDER, SurgicalRobot.Motors.ELBOW, SurgicalRobot.Motors.WRIST] + self.left_right = [SurgicalRobot.Motors.BASE, SurgicalRobot.Motors.HAND] + self.stop_event = asyncio.Event() + self.event_loop = asyncio.new_event_loop() + # Enable debug printing when XBOX_DEBUG=1 or XBOX_DEBUG=true in environment + self.debug = os.getenv('XBOX_DEBUG', '0') in ('1', 'true', 'True') + + def __del__(self): + self.event_loop.close() # Final cleanup + + + async def joystick_setup(self): + pygame.init() + pygame.joystick.init() + + # Check if joystick is available + if pygame.joystick.get_count() < 1: + print("No joystick detected.") + pygame.quit() + return False + + # Initialize joystick + self.joystick = pygame.joystick.Joystick(0) + self.joystick.init() + + print(f"Starting XBox Controller, using joystick: {self.joystick.get_name()}") + + # Print detected joystick mapping for debugging + num_axes = self.joystick.get_numaxes() + num_buttons = self.joystick.get_numbuttons() + num_hats = self.joystick.get_numhats() + print(f"Joystick detected: axes={num_axes}, buttons={num_buttons}, hats={num_hats}") + print("Controls:") + print(" BASE <- D-pad X OR bumpers (L = CCW, R = CW)") + print(" SHOULDER <- D-Pad Y or left stick X ") + print(" ELBOW <- left stick Y ") + print(" WRIST <- right stick Y ") + print(" HAND <- right stick X or triggers (L = Open, R = Close)") + return True + + + async def connext_setup(self): + # Register DDS types, using a function from DdsUtils.py + DdsUtils.register_type(Common.DeviceStatus) + DdsUtils.register_type(Common.DeviceHeartbeat) + DdsUtils.register_type(Orchestrator.DeviceCommand) + DdsUtils.register_type(SurgicalRobot.MotorControl) + + # Connext will load XML files through the default provider from the + # NDDS_QOS_PROFILES environment variable + qos_provider = dds.QosProvider.default + + participant = qos_provider.create_participant_from_config(DdsUtils.arm_controller_dp_fqn) + + # Initialize DataWriters + self.status_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.status_dw_fqn) + ) + self.hb_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.device_hb_dw_fqn) + ) + self.motor_control_writer = dds.DataWriter( + participant.find_datawriter(DdsUtils.motor_control_dw_fqn) + ) + self.arm_status = Common.DeviceStatus( + device=Common.DeviceType.ARM, status=Common.DeviceStatuses.ON + ) + self.status_writer.write(self.arm_status) + + # Initialize DataReaders + self.cmd_reader = dds.DataReader( + participant.find_datareader(DdsUtils.device_command_dr_fqn) + ) + + # Setup command handling and waitsets + cmd_status_condition = dds.StatusCondition(self.cmd_reader) + cmd_status_condition.enabled_statuses = dds.StatusMask.DATA_AVAILABLE + cmd_status_condition.set_handler(self.cmd_handler) + self.cmd_waitset = dds.WaitSet() + self.cmd_waitset += cmd_status_condition + + print("Connext DDS setup complete.") + + + async def write_hb(self, hb_writer): + while not self.stop_event.is_set(): + hb = Common.DeviceHeartbeat() + hb.device = Common.DeviceType.ARM + hb_writer.write(hb) + await asyncio.sleep(0.05) # 20Hz heartbeat + + + async def waitsets(self): + while not self.stop_event.is_set(): + await self.cmd_waitset.dispatch_async(dds.Duration(1)) + + + def cmd_handler(self, _): + samples = self.cmd_reader.take_data() + for sample in samples: + if sample.command == Orchestrator.DeviceCommands.START: + print("Arm received Start Command, Turning on Arm") + self.arm_status.status = Common.DeviceStatuses.ON + elif sample.command == Orchestrator.DeviceCommands.PAUSE: + print("Arm received Pause Command, Pausing Arm") + self.arm_status.status = Common.DeviceStatuses.PAUSED + else: + print("Arm received Shutdown Command") + self.arm_status.status = Common.DeviceStatuses.OFF + self.stop_event.set() + + self.status_writer.write(self.arm_status) + + + def apply_deadzone(self, value, deadzone=0.1): + """Return 0 if value is within deadzone, otherwise return value""" + if abs(value) < deadzone: + return 0.0 + return value + + + def poll_joystick(self, joystick): + clock = pygame.time.Clock() + sample = SurgicalRobot.MotorControl + deadzone = 0.2 # Adjust this threshold as needed + + try: + num_buttons = joystick.get_numbuttons() + num_axes = joystick.get_numaxes() + debug_counter = 0 + debug_print_every = 6 # print ~10 times/sec at 60Hz if debug enabled + + while not self.stop_event.is_set(): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + return + + # Poll joystick for button states + button_states = [joystick.get_button(i) for i in range(num_buttons)] + # Poll joystick for axis states + axis_states = [self.apply_deadzone(joystick.get_axis(i), deadzone) for i in range(num_axes)] + + # Xbox control layout mapping: + # - D-pad X -> BASE + # - D-pad Y -> SHOULDER + # - Left stick X -> SHOULDER + # - Left stick Y -> ELBOW + # - Right stick Y -> WRIST + # - Right stick X -> HAND + # - BASE also controlled by left/right bumpers (buttons) + # - HAND also controlled by triggers (axes with threshold) + + # Read D-pad (hat) if available + num_hats = joystick.get_numhats() + if num_hats > 0: + dpad_x, dpad_y = joystick.get_hat(0) + else: + dpad_x = 0 + dpad_y = 0 + + # Left stick axes + left_x = round(axis_states[0]) if num_axes > 0 else 0 + left_y = round(axis_states[1]) if num_axes > 1 else 0 + + # Right stick axes + right_x = round(axis_states[3]) if num_axes > 2 else 0 + right_y = round(axis_states[4]) if num_axes > 3 else 0 + + # Triggers + left_trigger = round(axis_states[2]) if num_axes > 4 else 0 + right_trigger = round(axis_states[5]) if num_axes > 5 else 0 + trigger_threshold = 0.2 # lower threshold for higher sensitivity + + # Bumpers (if present) — commonly buttons 4/5 + left_bumper = button_states[4] if num_buttons > 4 else 0 + right_bumper = button_states[5] if num_buttons > 5 else 0 + + # Debug print button/axis states (throttled) + if self.debug: + if debug_counter % debug_print_every == 0: + print(f"buttons={button_states} axes={axis_states} dpad=({dpad_x},{dpad_y}) left_x={left_x} left_y={left_y} right_x={right_x} right_y={right_y} lt={left_trigger:.2f} rt={right_trigger:.2f}") + debug_counter += 1 + + # BASE controlled by D-pad X OR bumpers + if dpad_x < 0 or left_bumper: + sample.id = SurgicalRobot.Motors.BASE + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + elif dpad_x > 0 or right_bumper: + sample.id = SurgicalRobot.Motors.BASE + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + + # SHOULDER controlled by left stick X or D-pad Y + if left_x < 0 or dpad_y < 0: # left or dpad down maps to DECREMENT + sample.id = SurgicalRobot.Motors.SHOULDER + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + elif left_x > 0 or dpad_y > 0: + sample.id = SurgicalRobot.Motors.SHOULDER + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + + # ELBOW controlled by left stick Y + if left_y < 0: + sample.id = SurgicalRobot.Motors.ELBOW + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + elif left_y > 0: + sample.id = SurgicalRobot.Motors.ELBOW + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + + # WRIST controlled by right stick Y + if right_y < 0: + sample.id = SurgicalRobot.Motors.WRIST + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + elif right_y > 0: + sample.id = SurgicalRobot.Motors.WRIST + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + + # HAND controlled by right stick X or triggers + if right_x < 0 or left_trigger > trigger_threshold: + sample.id = SurgicalRobot.Motors.HAND + sample.direction = SurgicalRobot.MotorDirections.DECREMENT + self.motor_control_writer.write(sample) + elif right_x > 0 or right_trigger > trigger_threshold: + sample.id = SurgicalRobot.Motors.HAND + sample.direction = SurgicalRobot.MotorDirections.INCREMENT + self.motor_control_writer.write(sample) + + # Adjust the clock speed as needed + clock.tick(60) + + except KeyboardInterrupt: + pygame.quit() + + # Main function + async def run(self): + + print("Starting XBox Controller") + + threading.Thread(target=self.event_loop.run_forever, daemon=True).start() + + joystick_ok, _ = await asyncio.gather( self.joystick_setup(), self.connext_setup(), return_exceptions=True ) + if not joystick_ok: + print("Joystick setup failed, exiting.") + return + + # Start tasks + hb_task = asyncio.create_task(self.write_hb(self.hb_writer)) + sub_task = asyncio.create_task(self.waitsets()) + + # Poll joystick for button and axis states + self.poll_joystick(self.joystick) + + print("Shutting down XBox Controller") + + # Set status to off + self.arm_status.status = Common.DeviceStatuses.OFF + + # Wait for all async tasks to finish + await asyncio.gather(hb_task, sub_task) + + pygame.quit() + + print("XBox Controller shutdown complete.") + + +if __name__ == "__main__": + thisapp = JoystickApp() + asyncio.run(thisapp.run()) diff --git a/modules/01-operating-room/src/DdsUtils.py b/modules/01-operating-room/src/DdsUtils.py index e58d1c4..83838af 100644 --- a/modules/01-operating-room/src/DdsUtils.py +++ b/modules/01-operating-room/src/DdsUtils.py @@ -27,6 +27,9 @@ def register_type(type): arm_dp_fqn = ( constants.DP_LIBRARY_NAME + constants.SEPARATOR + constants.DP_ARM_NAME ) +arm_controller_dp_fqn = ( + constants.DP_LIBRARY_NAME + constants.SEPARATOR + constants.DP_ARM_CONTROLLER_NAME +) patient_monitor_dp_fqn = ( constants.DP_LIBRARY_NAME + constants.SEPARATOR @@ -44,6 +47,7 @@ def register_type(type): # DWs / DRs names status_dw_fqn = dw_prefix + constants.ENDPOINT_DEVICE_STATUS_NAME device_hb_dw_fqn = dw_prefix + constants.ENDPOINT_DEVICE_HEARTBEAT_NAME +motor_control_dw_fqn = dw_prefix + constants.ENDPOINT_MOTOR_CONTROL_NAME motor_control_dr_fqn = dr_prefix + constants.ENDPOINT_MOTOR_CONTROL_NAME device_command_dr_fqn = dr_prefix + constants.ENDPOINT_DEVICE_COMMAND_NAME