# Copyright (c) 2024, D-Robotics.
#
# 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.

import os

from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node


def generate_launch_description():
    package_share = get_package_share_directory("car_usb_cam")
    camera_config = os.path.join(package_share, "config", "usb_camera.yaml")
    calibration_file = os.path.join(
        package_share, "config", "usb_camera_calibration.yaml"
    )

    return LaunchDescription([
        DeclareLaunchArgument(
            "camera_config",
            default_value=camera_config,
            description="ROS parameter file for the USB camera",
        ),
        DeclareLaunchArgument(
            "usb_frame_id",
            default_value="default_usb_cam",
            description="Image message frame_id",
        ),
        DeclareLaunchArgument(
            "usb_framerate",
            default_value="30",
            description="USB camera frame rate",
        ),
        DeclareLaunchArgument(
            "usb_image_height",
            default_value="720",
            description="USB camera image height",
        ),
        DeclareLaunchArgument(
            "usb_image_width",
            default_value="1280",
            description="USB camera image width",
        ),
        DeclareLaunchArgument(
            "usb_io_method",
            default_value="mmap",
            description="USB camera io_method: mmap/read/userptr",
        ),
        DeclareLaunchArgument(
            "usb_pixel_format",
            default_value="mjpeg",
            description="USB camera pixel format, such as mjpeg or yuyv2rgb",
        ),
        DeclareLaunchArgument(
            "usb_video_device",
            default_value="/dev/video0",
            description="USB camera device",
        ),
        DeclareLaunchArgument(
            "usb_zero_copy",
            default_value="false",
            description="Publish zero-copy hbmem image messages when true",
        ),
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource(
                os.path.join(
                    get_package_share_directory("hobot_shm"),
                    "launch",
                    "hobot_shm.launch.py",
                )
            )
        ),
        Node(
            package="hobot_usb_cam",
            executable="hobot_usb_cam",
            name="hobot_usb_cam",
            parameters=[
                LaunchConfiguration("camera_config"),
                {"camera_calibration_file_path": calibration_file},
                {"frame_id": LaunchConfiguration("usb_frame_id")},
                {"framerate": LaunchConfiguration("usb_framerate")},
                {"image_height": LaunchConfiguration("usb_image_height")},
                {"image_width": LaunchConfiguration("usb_image_width")},
                {"io_method": LaunchConfiguration("usb_io_method")},
                {"pixel_format": LaunchConfiguration("usb_pixel_format")},
                {"video_device": LaunchConfiguration("usb_video_device")},
                {"zero_copy": LaunchConfiguration("usb_zero_copy")},
            ],
            arguments=["--ros-args", "--log-level", "warn"],
        ),
    ])
