IProtocolService.cs 5.88 KB
using Rcs.Application.Common;
using Rcs.Domain.Entities;
using Rcs.Domain.Models.VDA5050;

namespace Rcs.Application.Services.Protocol;

/// <summary>
/// 协议服务统一接口
/// 定义不同协议类型(VDA5050、自定义协议等)的通用操作
/// @author zzy
/// </summary>
public interface IProtocolService
{
    /// <summary>
    /// 支持的协议类型
    /// </summary>
    ProtocolType ProtocolType { get; }

    /// <summary>
    /// 发送任务指令
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="task">任务</param>
    /// <param name="ct">取消令牌</param>
    Task<ApiResponse> SendOrderAsync(Robot robot, RobotTask task,  CancellationToken ct = default);

    /// <summary>
    /// 取消指定订单
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="orderId">订单ID</param>
    /// <param name="ct">取消令牌</param>
    Task CancelOrderAsync(Robot robot, string? orderId, CancellationToken ct = default);

    /// <summary>
    /// 根据机器人取消任务
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="ct">取消令牌</param>
    Task CancelRobotTasksAsync(Robot robot, CancellationToken ct = default);

    /// <summary>
    /// 发送即时动作指令
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="actions">即时动作</param>
    /// <param name="ct">取消令牌</param>
    Task SendInstantActionAsync(Robot robot, InstantAction actions, CancellationToken ct = default);

    /// <summary>
    /// 复位机器人
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="ct">取消令牌</param>
    Task ResetRobotAsync(Robot robot, CancellationToken ct = default);

    /// <summary>
    /// 确认异常
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="ct">取消令牌</param>
    Task ConfirmExceptionAsync(Robot robot, CancellationToken ct = default);
    /// <summary>
    /// 机器人暂停
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="ct">取消令牌</param>
    Task RobotPauseAsync(Robot robot, CancellationToken ct = default);
    /// <summary>
    /// 机器人取消暂停
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="ct">取消令牌</param>
    Task RobotUnPauseAsync(Robot robot, CancellationToken ct = default);
    /// <summary>
    /// 重定位
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="ct">取消令牌</param>
    Task<ApiResponse> ReLocationAsync(Robot robot,string mapCode,double x,double y, double theta, CancellationToken ct = default);

    /// <summary>
    /// 发送下一段路径指令
    /// 从已缓存的分段路径中获取下一段并发送
    /// </summary>
    /// <param name="robot">机器人实体</param>
    /// <param name="task">任务实体</param>
    /// <param name="ct">取消令牌</param>
    /// <returns>操作响应</returns>
    Task<ApiResponse> SendNextSegmentAsync(Robot robot, RobotSubTask currentSubTask, CancellationToken ct = default, bool reExec = false);
    /// <summary>
    /// 发送下一段指令,针对VDA协议的制造商和序列号
    /// </summary>
    /// <param name="robotManufacturer"></param>
    /// <param name="robotSerialNumber"></param>
    /// <param name="ct"></param>
    /// <returns></returns>
    Task<ApiResponse> SendNextSegmentAsync(string robotManufacturer, string robotSerialNumber,
        CancellationToken ct = default, bool reExec = false);

    /// <summary>
    /// 判断指定机器人当前是否已在最后一段路径上(所有段已发送完毕)
    /// 用于NewBaseRequest预判断,避免在最后一段时触发不必要的SendNextSegmentAsync调用
    /// @author zzy
    /// </summary>
    /// <param name="robotManufacturer">机器人制造商</param>
    /// <param name="robotSerialNumber">机器人序列号</param>
    /// <param name="ct">取消令牌</param>
    /// <returns>true表示所有段已发送完毕(在最后一段上),false表示还有后续段</returns>
    Task<bool> IsAllSegmentsSentAsync(string robotManufacturer, string robotSerialNumber, CancellationToken ct = default);

    /// <summary>
    /// 判断机器人当前是否行驶在目前已下发路径集合中的最后一段路径上
    /// 用于NewBaseRequest判断:只有当机器人在最后一段上时才发送下一段,否则跳过
    /// @author zzy
    /// </summary>
    /// <param name="robotManufacturer">机器人制造商</param>
    /// <param name="robotSerialNumber">机器人序列号</param>
    /// <param name="ct">取消令牌</param>
    /// <returns>true表示当前正在已下发路径的最后一段上(可以发送下一段),false表示不在最后一段或无法判断(跳过发送)</returns>
    Task<bool> IsOnLastSentSegmentAsync(string robotManufacturer, string robotSerialNumber, CancellationToken ct = default);

    /// <summary>
    /// 根据VDA5050 State消息判断并处理订单(子任务)完成
    /// 当State消息满足完成条件时,自动触发子任务完成及级联父任务完成
    /// @author zzy
    /// </summary>
    /// <param name="robotManufacturer">机器人制造商</param>
    /// <param name="robotSerialNumber">机器人序列号</param>
    /// <param name="stateInfo">VDA5050 State消息数据</param>
    /// <param name="ct">取消令牌</param>
    /// <returns>是否成功触发了完成</returns>
    Task<bool> TryCompleteOrderFromStateAsync(
        string robotManufacturer, string robotSerialNumber,
        State stateInfo, CancellationToken ct = default);
    /// <summary>
    /// 清除VDA路径缓存
    /// </summary>
    /// <param name="robotId"></param>
    /// <returns></returns>
    Task ClearAllVdaPathCacheAsync(Guid robotId);

}