using RobotNet10.Shared.Sensor;
namespace RobotNet10.RobotApp.Devices;
///
/// Interface cho thiết bị LiDAR trong robot AGV (common interface for all Lidar brands)
/// Không bao gồm các chức năng kết nối vì đã được xử lý trong DeviceBase
///
public interface ILidar
{
// Scan Data Properties (common for all Lidar brands)
///
/// Measurement data hiện tại (scan points) - sử dụng LaserScan từ sensor_msgs
///
LaserScan? CurrentMeasurementData { get; }
///
/// Timestamp của scan data gần nhất
///
DateTime? LastScanDataTimestamp { get; }
// Device Specifications (common for all Lidar brands)
///
/// Góc quét tối thiểu (radian) - góc bắt đầu của phạm vi quét
///
double MinAngleRad { get; }
///
/// Góc quét tối đa (radian) - góc kết thúc của phạm vi quét
///
double MaxAngleRad { get; }
///
/// Tầm quét tối thiểu (mét) - khoảng cách gần nhất có thể đo được
///
double MinRangeM { get; }
///
/// Tầm quét tối đa (mét) - khoảng cách xa nhất có thể đo được
///
double MaxRangeM { get; }
///
/// Độ phân giải góc (radian) - góc giữa hai điểm scan liên tiếp
///
double? AngularResolutionRad { get; }
///
/// Tần số quét (Hz) - số lần quét trong một giây
///
double? ScanFrequencyHz { get; }
///
/// Góc quét tổng (Field of View - FOV) (radian) - tổng góc quét của thiết bị
///
double FieldOfViewRad { get; }
///
/// Hỗ trợ đo intensity (cường độ phản xạ) hay không
///
bool SupportsIntensity { get; }
///
/// Độ chính xác đo khoảng cách (mét) - sai số đo khoảng cách
///
double? AccuracyM { get; }
// Events
///
/// Event được kích hoạt khi có dữ liệu scan mới
///
event EventHandler? ScanDataReceived;
}
///
/// EventArgs cho event ScanDataReceived - common structure for all Lidar brands
///
public class LidarScanDataEventArgs(DateTime timestamp, LaserScan measurementData) : EventArgs
{
///
/// Timestamp khi scan data được nhận
///
public DateTime Timestamp { get; init; } = timestamp;
///
/// Measurement data từ scan (sử dụng LaserScan từ sensor_msgs)
///
public LaserScan MeasurementData { get; init; } = measurementData;
}