using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_Tasks
{
///
/// 机械手 Socket 通信状态数据类
///
///
/// 该类用于在 Redis 缓存中存储机械手的实时状态,包括位置、任务、手臂对象等信息。
/// 所有属性均设计为线程安全更新,通过 的版本控制机制来防止并发覆盖。
///
public class RobotSocketState
{
///
/// 机械手的 IP 地址,作为缓存键的唯一标识
///
public string IPAddress { get; set; } = string.Empty;
///
/// 版本号,用于乐观并发控制
///
///
/// 每次修改状态时更新为 DateTime.UtcNow.Ticks。
/// 使用此字段实现乐观锁,防止并发更新时旧值覆盖新值。
///
public long Version { get; set; } = DateTime.UtcNow.Ticks;
///
/// 是否已订阅消息事件标志
///
///
/// 确保每个客户端只启动一次消息处理循环,避免重复订阅导致的消息重复处理。
///
public bool IsEventSubscribed { get; set; }
///
/// 机械手运行模式
///
///
/// 1: 手动模式
/// 2: 自动模式
/// 当 RobotRunMode == 2 且 RobotControlMode == 1 时,系统进入自动控制状态。
///
public int? RobotRunMode { get; set; }
///
/// 机械手控制模式
///
///
/// 1: 客户端控制
/// 2: 未知/其他
/// 与 RobotRunMode 配合判断机器人的当前控制状态。
///
public int? RobotControlMode { get; set; }
///
/// 机械手手臂抓取对象状态
///
///
/// 0: 无物料(手臂空闲)
/// 1: 有物料(已抓取货物)
/// 用于判断机器人是否可以执行下一步动作。
///
public int? RobotArmObject { get; set; }
///
/// 机械手设备基础信息
///
///
/// 包含设备的 DeviceCode、DeviceName、IPAddress 等基础信息。
/// 在状态初始化时从 JobDetail.JobDataMap 获取并缓存。
///
public RobotCraneDevice? RobotCrane { get; set; }
///
/// 机械手初始化完成回到待机位
///
///
/// 可能的值:
/// - "Homed": 已回零
/// - "Homing": 回零中
///
public string? Homed { get; set; }
///
/// 机械手当前正在执行的动作
///
///
/// 可能的值:
/// - "Picking": 取货中
/// - "Putting": 放货中
/// - "PickFinished": 取货完成
/// - "PutFinished": 放货完成
/// - "AllPickFinished": 全部取货完成
/// - "AllPutFinished": 全部放货完成
///
public string? CurrentAction { get; set; }
///
/// 机械手当前运行状态
///
///
/// 可能的值:
/// - "Homing": 回零中
/// - "Homed": 已回零
/// - "Running": 运行中
/// - "Pausing": 暂停中
/// - "Warming": 预热中
/// - "Emstoping": 急停中
///
public string? OperStatus { get; set; }
///
/// 最近一次取货完成的位置数组
///
///
/// 数组中的每个元素代表一个电池位置编号。
/// 用于记录取货动作涉及的货位,供后续组盘/拆盘操作使用。
///
public int[]? LastPickPositions { get; set; }
///
/// 最近一次放货完成的位置数组
///
///
/// 数组中的每个元素代表一个电池位置编号。
/// 用于记录放货动作涉及的货位。
///
public int[]? LastPutPositions { get; set; }
///
/// 电池/货位条码列表
///
///
/// 在组盘操作时用于记录生成的托盘条码。
/// 每个条码格式为 "TRAY" + 日期 + 时间 + 随机数。
///
public List CellBarcode { get; set; } = new List();
///
/// 机械手当前正在执行的任务
///
///
/// 当任务下发到机器人后,该字段保存任务详情。
/// 任务类型包括:组盘(500)、换盘(510)、拆盘(520)。
///
public Dt_RobotTask? CurrentTask { get; set; }
///
/// 是否需要执行拆盘任务
///
///
/// 当任务类型为 SplitPallet (520) 时设为 true。
/// 拆盘任务将电池从托盘上取下并逐个放置到目标位置。
///
public bool IsSplitPallet { get; set; }
///
/// 是否需要执行组盘任务
///
///
/// 当任务类型为 GroupPallet (500) 或 ChangePallet (510) 时设为 true。
/// 组盘任务将多个电池组合到同一个托盘上。
///
public bool IsGroupPallet { get; set; }
///
/// 机器人已处理的任务总数
///
///
/// 累计记录机器人已完成处理的电池/货物数量。
/// 当达到 MaxTaskTotalNum (48) 时,不再下发新任务。
///
public int RobotTaskTotalNum { get; set; }
///
/// 是否处于假电芯补充模式
///
///
/// 当正常电芯任务完成后设为 true,机器人从假电芯位置补充电芯至48个。
///
public bool IsInFakeBatteryMode { get; set; }
}
}