Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions applications/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ add_holohub_application(webrtc_video_server)

add_holohub_application(yolo_model_deployment)
add_holohub_application(vila_live)
add_holohub_application(holocat)
add_holohub_application(holochat)
add_holohub_application(xr_holoviz DEPENDS OPERATORS xr)
add_holohub_application(xr_gsplat DEPENDS OPERATORS xr)
Expand Down
30 changes: 30 additions & 0 deletions applications/holocat/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

cmake_minimum_required(VERSION 3.20)

# Check if EC-Master SDK is available before building
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
find_package(EcMaster QUIET)

if(EcMaster_FOUND)
message(STATUS "Building HoloCat application with EC-Master SDK")
add_subdirectory(cpp)
else()
message(FATAL_ERROR "EC-Master SDK not found")

# Exit with failure
exit(1)
Comment on lines +27 to +29
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The exit(1) command on line 29 is unreachable because message(FATAL_ERROR) on line 26 already terminates the CMake configuration process. Remove lines 28-29 as they serve no purpose.

Suggested change
# Exit with failure
exit(1)

Copilot uses AI. Check for mistakes.
endif()
Comment on lines +26 to +30
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Remove invalid exit() command.

exit(1) is not a valid CMake command. The message(FATAL_ERROR ...) on line 26 already halts CMake configuration, making line 29 unreachable and incorrect.

Apply this diff:

 else()
     message(FATAL_ERROR "EC-Master SDK not found")
-
-    # Exit with failure
-    exit(1)
 endif()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
message(FATAL_ERROR "EC-Master SDK not found")
# Exit with failure
exit(1)
endif()
else()
message(FATAL_ERROR "EC-Master SDK not found")
endif()
🤖 Prompt for AI Agents
In applications/holocat/CMakeLists.txt around lines 26 to 30, remove the invalid
exit(1) call since CMake does not have exit() and message(FATAL_ERROR "EC-Master
SDK not found") already stops configuration; simply delete the exit(1) line so
the FATAL_ERROR stands alone and there is no unreachable/incorrect command.

71 changes: 71 additions & 0 deletions applications/holocat/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# HoloCat EtherCAT Application Dockerfile

ARG BASE_SDK_VERSION
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Undefined build argument used in FROM statement. Line 3 declares ARG BASE_SDK_VERSION but line 4 references ${BASE_IMAGE} which is never defined. This should either be:

  • ARG BASE_IMAGE (and remove BASE_SDK_VERSION if unused), or
  • FROM ${BASE_SDK_VERSION} (if that's the intended variable)

Without this fix, the Dockerfile will fail to build.

Suggested change
ARG BASE_SDK_VERSION
ARG BASE_IMAGE

Copilot uses AI. Check for mistakes.
FROM ${BASE_IMAGE}
Comment on lines +3 to +4
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Missing ARG BASE_IMAGE declaration causes build failure.

BASE_IMAGE is used in the FROM instruction but is not declared as an ARG. Additionally, BASE_SDK_VERSION is declared but never used in this Dockerfile. This will cause the Docker build to fail.

Apply this diff to fix the ARG declarations:

 # HoloCat EtherCAT Application Dockerfile

-ARG BASE_SDK_VERSION
+ARG BASE_IMAGE
 FROM ${BASE_IMAGE}
+
+ARG BASE_SDK_VERSION

If BASE_SDK_VERSION is truly unused, consider removing it entirely.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
ARG BASE_SDK_VERSION
FROM ${BASE_IMAGE}
# HoloCat EtherCAT Application Dockerfile
ARG BASE_IMAGE
FROM ${BASE_IMAGE}
ARG BASE_SDK_VERSION
🤖 Prompt for AI Agents
In applications/holocat/Dockerfile around lines 3-4, the Dockerfile uses the
build ARG BASE_IMAGE in the FROM instruction but never declares ARG BASE_IMAGE
(and declares BASE_SDK_VERSION which is unused), causing builds to fail; add an
ARG BASE_IMAGE declaration before the FROM line (and either remove ARG
BASE_SDK_VERSION if truly unused or use it where intended), ensuring ARGs are
declared in correct order so BASE_IMAGE is available to FROM.


# Install system dependencies for EtherCAT and real-time operation
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
libcap-dev \
ethtool \
net-tools \
iproute2 \
sudo \
&& rm -rf /var/lib/apt/lists/*

# Copy EC-Master SDK from build context
# To build: Copy SDK to applications/holocat/ecmaster-sdk/
# cp -r /path/to/ecmaster applications/holocat/ecmaster-sdk
# Note: Docker COPY doesn't follow symlinks outside build context
RUN mkdir -p /opt/acontis/ecmaster
COPY applications/holocat/ecmaster-sdk /opt/acontis/ecmaster

# Set environment variables for EC-Master SDK
ENV ECMASTER_ROOT=/opt/acontis/ecmaster
ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/acontis/ecmaster/lib:/opt/acontis/ecmaster/Bin/Linux/x64

# Create holocat user with necessary privileges
RUN useradd -m -s /bin/bash holocat && \
usermod -aG sudo holocat && \
echo "holocat ALL=(ALL) NOPASSWD: /usr/sbin/setcap" >> /etc/sudoers

Comment on lines +30 to +32
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Dockerfile grants the holocat user passwordless sudo access to /usr/sbin/setcap, which allows that user (and any code running as it) to assign arbitrary Linux capabilities to any binary in the container. If an attacker gains code execution as holocat, they can use sudo setcap to escalate privileges and grant powerful capabilities (e.g., raw network, sys_admin) to other binaries, breaking the intended least-privilege isolation. Consider removing this sudoers entry and instead setting the minimal required capabilities at build time or via the container runtime, without allowing arbitrary setcap invocation from inside the container.

Suggested change
usermod -aG sudo holocat && \
echo "holocat ALL=(ALL) NOPASSWD: /usr/sbin/setcap" >> /etc/sudoers
usermod -aG sudo holocat

Copilot uses AI. Check for mistakes.
# Create directories for configuration, logs, and scripts
RUN mkdir -p /opt/holocat/config /opt/holocat/logs /opt/holocat/scripts && \
chown -R holocat:holocat /opt/holocat

# Copy default configuration files and verification script
COPY applications/holocat/configs/holocat_config.yaml /opt/holocat/config/
COPY applications/holocat/configs/eni2.xml /opt/holocat/config/
COPY applications/holocat/scripts/verify_ecmaster.sh /opt/holocat/scripts/
RUN chmod +x /opt/holocat/scripts/verify_ecmaster.sh

# Verify EC-Master installation (required - will fail build if not found)
# Only check critical components during build (headers and libraries)
RUN /opt/holocat/scripts/verify_ecmaster.sh || \
(echo "Verification failed - checking if SDK is minimally viable..." && \
test -f "/opt/acontis/ecmaster/SDK/INC/EcMaster.h" && \
test -f "/opt/acontis/ecmaster/Bin/Linux/x64/libEcMaster.so" && \
echo "✓ Minimal SDK requirements met for build")

# Set working directory
WORKDIR /workspace

# Switch to holocat user
USER holocat

# Set default environment variables for HoloCat
ENV HOLOCAT_ADAPTER_NAME=eth0
ENV HOLOCAT_ENI_FILE=/opt/holocat/config/eni2.xml
ENV HOLOCAT_CONFIG_DIR=/opt/holocat/config
ENV HOLOCAT_LOG_DIR=/opt/holocat/logs

# Default command
CMD ["/bin/bash"]

# Labels for container metadata
LABEL org.opencontainers.image.title="HoloCat EtherCAT Application"
LABEL org.opencontainers.image.description="Real-time EtherCAT integration with NVIDIA Holoscan SDK"
LABEL org.opencontainers.image.vendor="NVIDIA"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.documentation="https://github.com/nvidia-holoscan/holohub/applications/holocat"
155 changes: 155 additions & 0 deletions applications/holocat/FindEcMaster.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
# FindEcMaster.cmake
# Find the acontis EC-Master SDK
#
# This module defines:
# ECMASTER_FOUND - True if EC-Master SDK is found
# ECMASTER_INCLUDE_DIRS - Include directories for EC-Master
# ECMASTER_LIBRARIES - Libraries to link against
# ECMASTER_VERSION - Version of EC-Master SDK
#
# Environment variables used:
# ECMASTER_ROOT - Root directory of EC-Master installation

# Handle CMake policy for environment variables
if(POLICY CMP0144)
cmake_policy(SET CMP0144 NEW)
endif()

# Get ECMASTER_ROOT from environment if not set as CMake variable
if(NOT ECMASTER_ROOT AND DEFINED ENV{ECMASTER_ROOT})
set(ECMASTER_ROOT $ENV{ECMASTER_ROOT})
endif()

# Find include directory
find_path(ECMASTER_INCLUDE_DIR
NAMES EcMaster.h
PATHS
${ECMASTER_ROOT}/SDK/INC
/opt/acontis/ecmaster/SDK/INC
${CMAKE_SOURCE_DIR}/../ethercat/ecm/SDK/INC
/usr/local/include/ecmaster
DOC "EC-Master include directory"
)

# Determine library directory based on architecture
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ECMASTER_ARCH "x64")
else()
set(ECMASTER_ARCH "x86")
endif()

# Find main EC-Master library
find_library(ECMASTER_LIBRARY
NAMES EcMaster libEcMaster.so
PATHS
${ECMASTER_ROOT}/SDK/LIB/Linux/${ECMASTER_ARCH}
${ECMASTER_ROOT}/Bin/Linux/${ECMASTER_ARCH}
/opt/acontis/ecmaster/lib
${CMAKE_SOURCE_DIR}/../ethercat/ecm/Bin/Linux/${ECMASTER_ARCH}
/usr/local/lib
DOC "EC-Master library"
)

# Get library directory for finding link layer libraries
if(ECMASTER_LIBRARY)
get_filename_component(ECMASTER_LIBRARY_DIR ${ECMASTER_LIBRARY} DIRECTORY)
endif()

# Find all available link layer libraries
set(ECMASTER_LINK_LIBRARIES)
set(ECMASTER_LINK_LAYER_NAMES
emllSockRaw
emllDpdk
emllIntelGbe
emllRTL8169
emllVlan
emllRemote
emllCCAT
emllBcmNetXtreme
emllLAN743x
emllDW3504
emllAlteraTSE
)

foreach(lib_name IN LISTS ECMASTER_LINK_LAYER_NAMES)
find_library(ECMASTER_${lib_name}_LIBRARY
NAMES ${lib_name} lib${lib_name}.so
PATHS ${ECMASTER_LIBRARY_DIR}
NO_DEFAULT_PATH
)
if(ECMASTER_${lib_name}_LIBRARY)
list(APPEND ECMASTER_LINK_LIBRARIES ${ECMASTER_${lib_name}_LIBRARY})
message(STATUS "Found EC-Master link layer: ${lib_name}")
endif()
endforeach()

# Try to determine version from EcVersion.h
if(ECMASTER_INCLUDE_DIR)
set(ECVERSION_FILE "${ECMASTER_INCLUDE_DIR}/EcVersion.h")
if(EXISTS ${ECVERSION_FILE})
file(READ ${ECVERSION_FILE} ECVERSION_CONTENT)
string(REGEX MATCH "#define EC_VERSION_MAJ[ \t]+([0-9]+)" _ ${ECVERSION_CONTENT})
set(ECMASTER_VERSION_MAJOR ${CMAKE_MATCH_1})
string(REGEX MATCH "#define EC_VERSION_MIN[ \t]+([0-9]+)" _ ${ECVERSION_CONTENT})
set(ECMASTER_VERSION_MINOR ${CMAKE_MATCH_1})
string(REGEX MATCH "#define EC_VERSION_SERVICEPACK[ \t]+([0-9]+)" _ ${ECVERSION_CONTENT})
set(ECMASTER_VERSION_PATCH ${CMAKE_MATCH_1})
string(REGEX MATCH "#define EC_VERSION_BUILD[ \t]+([0-9]+)" _ ${ECVERSION_CONTENT})
set(ECMASTER_VERSION_BUILD ${CMAKE_MATCH_1})

if(ECMASTER_VERSION_MAJOR AND ECMASTER_VERSION_MINOR AND ECMASTER_VERSION_PATCH)
set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}.${ECMASTER_VERSION_BUILD}")
endif()
Comment on lines +100 to +102
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Version string may include empty component if BUILD is not found.

If EC_VERSION_BUILD is not defined in the header, ECMASTER_VERSION_BUILD will be empty, resulting in a version string like "3.2.1." with a trailing dot.

Consider conditionally including the build number:

         if(ECMASTER_VERSION_MAJOR AND ECMASTER_VERSION_MINOR AND ECMASTER_VERSION_PATCH)
-            set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}.${ECMASTER_VERSION_BUILD}")
+            if(ECMASTER_VERSION_BUILD)
+                set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}.${ECMASTER_VERSION_BUILD}")
+            else()
+                set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}")
+            endif()
         endif()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if(ECMASTER_VERSION_MAJOR AND ECMASTER_VERSION_MINOR AND ECMASTER_VERSION_PATCH)
set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}.${ECMASTER_VERSION_BUILD}")
endif()
if(ECMASTER_VERSION_MAJOR AND ECMASTER_VERSION_MINOR AND ECMASTER_VERSION_PATCH)
if(ECMASTER_VERSION_BUILD)
set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}.${ECMASTER_VERSION_BUILD}")
else()
set(ECMASTER_VERSION "${ECMASTER_VERSION_MAJOR}.${ECMASTER_VERSION_MINOR}.${ECMASTER_VERSION_PATCH}")
endif()
endif()
🤖 Prompt for AI Agents
In applications/holocat/FindEcMaster.cmake around lines 100-102, the version
string unconditionally appends ECMASTER_VERSION_BUILD which can be empty and
yield a trailing dot; change the logic to build a base version from
ECMASTER_VERSION_MAJOR.MINOR.PATCH and then only append
".${ECMASTER_VERSION_BUILD}" if ECMASTER_VERSION_BUILD is defined and not empty
(e.g., check using IF(DEFINED ECMASTER_VERSION_BUILD AND NOT
"${ECMASTER_VERSION_BUILD}" STREQUAL "") or similar) so the final
ECMASTER_VERSION has no trailing dot when build is missing.

endif()
endif()

# Handle standard CMake find_package arguments
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(EcMaster
REQUIRED_VARS ECMASTER_INCLUDE_DIR ECMASTER_LIBRARY
VERSION_VAR ECMASTER_VERSION
)

# Set output variables
if(EcMaster_FOUND)
set(ECMASTER_LIBRARIES ${ECMASTER_LIBRARY} ${ECMASTER_LINK_LIBRARIES})
set(ECMASTER_INCLUDE_DIRS ${ECMASTER_INCLUDE_DIR})

# Also check for Linux-specific include directory
if(EXISTS "${ECMASTER_INCLUDE_DIR}/Linux")
list(APPEND ECMASTER_INCLUDE_DIRS "${ECMASTER_INCLUDE_DIR}/Linux")
endif()

# Create imported target
if(NOT TARGET EcMaster::EcMaster)
add_library(EcMaster::EcMaster SHARED IMPORTED)
set_target_properties(EcMaster::EcMaster PROPERTIES
IMPORTED_LOCATION ${ECMASTER_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES "${ECMASTER_INCLUDE_DIRS}"
)

# Add link layer libraries as dependencies
if(ECMASTER_LINK_LIBRARIES)
set_target_properties(EcMaster::EcMaster PROPERTIES
INTERFACE_LINK_LIBRARIES "${ECMASTER_LINK_LIBRARIES}"
)
endif()
endif()

message(STATUS "Found EC-Master SDK:")
message(STATUS " Version: ${ECMASTER_VERSION}")
message(STATUS " Include: ${ECMASTER_INCLUDE_DIRS}")
message(STATUS " Library: ${ECMASTER_LIBRARY}")
message(STATUS " Link layers: ${ECMASTER_LINK_LIBRARIES}")
endif()

# Mark variables as advanced
mark_as_advanced(
ECMASTER_INCLUDE_DIR
ECMASTER_LIBRARY
ECMASTER_LIBRARY_DIR
)

foreach(lib_name IN LISTS ECMASTER_LINK_LAYER_NAMES)
mark_as_advanced(ECMASTER_${lib_name}_LIBRARY)
endforeach()
94 changes: 94 additions & 0 deletions applications/holocat/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# HoloCat - EtherCAT Real-time Integration

![HoloCat Logo](docs/holocat_logo.png)

HoloCat is an EtherCAT master application that integrates the acontis EC-Master SDK with NVIDIA's Holoscan platform.

## Overview

HoloCat provides deterministic EtherCAT communication capabilities within the Holoscan ecosystem, enabling:

- **Real-time Control**
- **Holoscan Native**

## Prerequisites

### Required Dependencies

1. **acontis EC-Master SDK** (Commercial License)
- Version 3.2.3 or later

## Usage

### Prerequisites
```bash
# Set EC-Master SDK path
export ECMASTER_ROOT=/home/hking/devel/ethercat/ecm
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoded user-specific path in documentation. The path "/home/hking/devel/ethercat/ecm" is developer-specific and should be replaced with a generic placeholder like "/path/to/ec-master" or "/opt/acontis/ecmaster".

Suggested change
export ECMASTER_ROOT=/home/hking/devel/ethercat/ecm
export ECMASTER_ROOT=/opt/acontis/ecmaster # Adjust to your EC-Master install path

Copilot uses AI. Check for mistakes.

# Verify installation (optional)
./applications/holocat/scripts/verify_ecmaster.sh
```

### Build
```bash
# Build using HoloHub CLI (recommended)
./holohub build holocat --local
```

### Run
```bash
# Run with configuration file
./build/holocat/applications/holocat/cpp/holocat --config ./applications/holocat/configs/holocat_config.yaml
```

## Configuration

### Basic Configuration

Create `holocat_config.yaml`:

```yaml
holocat:
# Network adapter for EtherCAT
adapter_name: "eth0" # Change to your EtherCAT interface

# EtherCAT configuration file
eni_file: "/tmp/holocat_config.xml"

# Cycle time in microseconds
cycle_time_us: 1000 # 1ms cycle time

# Real-time priorities (1-99)
rt_priority: 39
job_thread_priority: 98

# Enable real-time scheduling
enable_rt: true

# Holoscan application configuration
holoscan:
logging:
level: "info"
```

### ENI File Generation

Use EtherCAT configuration tools to generate your ENI file.


## Troubleshooting

### Common Issues

1. **Permission Denied**
```bash
# Ensure capabilities are set
sudo setcap 'cap_net_raw=ep' ./build/holocat/applications/holocat/holocat
```

3. **EC-Master SDK Not Found**
Comment on lines +83 to +89
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix troubleshooting section numbering.

The numbering jumps from issue 1 to issue 3, skipping 2.

Apply this diff:

-3. **EC-Master SDK Not Found**
+2. **EC-Master SDK Not Found**
🤖 Prompt for AI Agents
In applications/holocat/README.md around lines 83 to 89, the troubleshooting
list numbering skips from "1. Permission Denied" to "3. EC-Master SDK Not
Found"; update the ordered list so entries are sequential (1, 2, 3) by
renumbering the affected items or converting to an auto-numbered markdown list
so the second issue becomes "2. EC-Master SDK Not Found" (or use a continuous
numbered sequence) to restore correct ordering and consistency.

Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

List numbering is incorrect. The list jumps from "1. Permission Denied" to "3. EC-Master SDK Not Found", skipping item 2. Either add the missing item 2 or renumber item 3 as item 2.

Suggested change
3. **EC-Master SDK Not Found**
2. **EC-Master SDK Not Found**

Copilot uses AI. Check for mistakes.
```bash
# Verify ECMASTER_ROOT environment variable
echo $ECMASTER_ROOT
ls -la $ECMASTER_ROOT/SDK/INC/EcMaster.h
```
Comment on lines +1 to +94
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Add architecture overview section.

Per coding guidelines, the README should include an architecture overview. Add a section explaining the operator architecture (HolocatOp, HcDataTxOp, HcDataRxOp) and how they interact with the EtherCAT master and Holoscan framework.

As per coding guidelines, README.md must include architecture overview.

🤖 Prompt for AI Agents
applications/holocat/README.md lines 1-94: The README lacks the required
"Architecture Overview" section; add a concise subsection titled "Architecture
Overview" describing the operator architecture: list and briefly describe
HolocatOp, HcDataTxOp, and HcDataRxOp, explain that HolocatOp manages lifecycle
and interfaces with the acontis EC‑Master SDK (initialization, ENI loading,
cycle scheduling), HcDataTxOp handles outgoing process data to EtherCAT slaves
and timing control, and HcDataRxOp handles incoming process data and publishes
to Holoscan; include a simple diagram or sequence description of how data flows
between Holoscan application -> HolocatOp -> (HcDataTxOp -> EtherCAT master ->
slaves) and (slaves -> EtherCAT master -> HcDataRxOp -> Holoscan), and mention
real‑time considerations (cycle timing and priorities) and configuration points
(adapter_name, eni_file, cycle_time_us).

1 change: 1 addition & 0 deletions applications/holocat/configs/eni2.xml

Large diffs are not rendered by default.

Loading
Loading