version: '3.8'

services:

  gui-tools:
    runtime: nvidia
    env_file:
      - .env
    build:
      context: ./guiTools/

    environment:
      # Display settings
      - DISPLAY=${DISPLAY}
      - WAYLAND_DISPLAY=${WAYLAND_DISPLAY}
      # - QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-xcb}  # Default to X11
      # If running with Wayland
      - XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR}
      - ROS_MASTER_URI=http://ros-master:11311
      # - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
      # - NVIDIA_VISIBLE_DEVICES=all
    volumes:
      # X11 socket
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ${XAUTHORITY:-~/.Xauthority}:/root/.Xauthority
      # Wayland socket
      #- ${XDG_RUNTIME_DIR}/wayland-0:${XDG_RUNTIME_DIR}/wayland-0
      # Allow access to the host's GPU
      - /dev/dri:/dev/dri
    devices:
      # Provide access to GPU devices
      - /dev/dri:/dev/dri
    network_mode: host
    ipc: host
    #user: "${UID}:${GID}"
    privileged: true  # Allow privileged access if necessary (e.g., for GPU access)
    # restart: unless-stopped
    # command: /bin/bash -c "source /opt/ros/foxy/setup.bash && rvis2"  # Replace with the actual command to run Gazebo Ignition
    profiles: [ui,]
    # deploy:
    #   resources:
    #     reservations:
    #       devices:
    #        - driver: cdi
    #          device_ids:
    #             - nvidia.com/gpu=all


  ardupilot:
    container_name: ardupilot-$DRONE_SYS_ID
    image: git.spirirobotics.com/spiri/ardupilot:spiri-master
    profiles:
      - uav-sim
    env_file:
      - .env
    command:
      - /bin/bash
      - -c
      - |
        ./Tools/autotest/sim_vehicle.py $ARDUPILOT_VEHICLE --no-rebuild \
        --no-mavproxy --enable-dds --sysid $DRONE_SYS_ID -I$TRACKER_INSTANCE
    stdin_open: true
    tty: true
    network_mode: host

  mavproxy:
    container_name: mavproxy-$DRONE_SYS_ID
    image: git.spirirobotics.com/spiri/services-mavproxy:main
    profiles:
      - uav-sim
    env_file:
      - .env
    command: >
      mavproxy.py --non-interactive
      --master tcp:127.0.0.1:$SERIAL0_PORT 
      --out udpout:0.0.0.0:$MAVLINK_PORT
      --sitl 127.0.0.1:$SITL_PORT
      --out udp:0.0.0.0:14550
    restart: always
    network_mode: host

  mavros:
    #This service bridges our mavlink-based robot-coprosessor into ROS
    #In this example it connects to a simulated coprocessor.
    image: git.spirirobotics.com/spiri/services-ros1-mavros:master
    command: roslaunch mavros px4.launch fcu_url:="udp://:14555@mavproxy:14550" tgt_system:="1"
    environment:
      - "ROS_MASTER_URI=http://ros-master:11311"
    depends_on:
      ros-master:
        condition: service_healthy
      mavproxy:
        condition: service_started
    restart: always
    deploy:
      resources:
        limits:
          # cpus: '0.01'
          memory: 200M
    ulimits:
      nofile:
        soft: 1024
        hard: 524288
  mavros2:
    container_name: mavros2-$DRONE_SYS_ID
    image: git.spirirobotics.com/spiri/services-ros2-mavros:main
    profiles:
      - uav-sim
    env_file:
      - .env
    command: ros2 launch mavros apm.launch fcu_url:="udp://0.0.0.0:$MAVLINK_PORT@:14555" namespace:="spiri$DRONE_SYS_ID" tgt_system:="$DRONE_SYS_ID"
    depends_on:
      ardupilot:
        condition: service_started
      mavproxy:
        condition: service_started
    restart: always
    ipc: host
    network_mode: host
    deploy:
      resources:
        limits:
          # cpus: '0.01'
          memory: 200M
    ulimits:
      nofile:
        soft: 1024
        hard: 524288

  ros-master:
    image: git.spirirobotics.com/spiri/services-ros1-core:main
    command: stdbuf -o L roscore
    environment:
      - "ROS_MASTER_URI=http://localhost:11311"
    restart: always
    ports:
      - "127.0.0.1:11311:11311"
    deploy:
      resources:
        limits:
          memory: 1G
    # Madness, setting a low ulimit here fixes memory leaks
    # https://answers.ros.org/question/336963/rosout-high-memory-usage/
    ulimits:
      nofile:
        soft: 1024
        hard: 524288

