using RobotNet10.CANOpen.Interfaces;
namespace RobotNet10.CANOpen;
///
/// Service quản lý ICanBus và CanOpenDevice instances
/// Đảm bảo chỉ có một ICanBus instance cho mỗi CAN interface
///
public interface ICanOpenManager : IDisposable
{
///
/// Lấy hoặc tạo ICanBus instance cho interface name
/// Nếu đã tồn tại, trả về instance hiện có
///
/// Tên CAN interface (ví dụ: "can0", "can1")
/// Cancellation token
/// ICanBus instance (đã được connect)
Task GetOrCreateCanBusAsync(string interfaceName, CancellationToken cancellationToken = default);
///
/// Lấy ICanBus instance đã tồn tại (không tạo mới nếu chưa có)
///
/// Tên CAN interface
/// ICanBus instance hoặc null nếu chưa tồn tại
ICanBus? GetCanBus(string interfaceName);
///
/// Lấy hoặc tạo CanOpenDevice instance cho (interfaceName, nodeId) pair
///
/// Tên CAN interface
/// NodeId của device (1-127)
/// Cancellation token
/// CanOpenDevice instance
Task GetOrCreateDeviceAsync(string interfaceName, byte nodeId, CancellationToken cancellationToken = default);
///
/// Lấy CanOpenDevice instance đã tồn tại (không tạo mới nếu chưa có)
///
/// Tên CAN interface
/// NodeId của device
/// CanOpenDevice instance hoặc null nếu chưa tồn tại
CanOpenDevice? GetDevice(string interfaceName, byte nodeId);
///
/// Xóa CanOpenDevice instance khỏi cache và dispose nó
///
/// Tên CAN interface
/// NodeId của device
/// True nếu đã xóa thành công
bool RemoveDevice(string interfaceName, byte nodeId);
///
/// Xóa ICanBus instance khỏi cache và dispose nó
/// Lưu ý: Sẽ dispose tất cả CanOpenDevice đang sử dụng ICanBus này
///
/// Tên CAN interface
/// True nếu đã xóa thành công
Task RemoveCanBusAsync(string interfaceName, CancellationToken cancellationToken = default);
///
/// Lấy danh sách tất cả interface names đang được quản lý
///
IReadOnlyList GetManagedInterfaces();
///
/// Lấy danh sách tất cả nodeIds đang được quản lý cho một interface
///
/// Tên CAN interface
/// Danh sách nodeIds
IReadOnlyList GetManagedNodeIds(string interfaceName);
///
/// Kiểm tra xem interface có đang được quản lý không
///
bool IsInterfaceManaged(string interfaceName);
///
/// Kiểm tra xem device có đang được quản lý không
///
bool IsDeviceManaged(string interfaceName, byte nodeId);
}