using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using TeamAAS_VP.Enums;
using TeamAAS_VP.Interfaces;
namespace TeamAAS_VP.Core.ScrewDriver
{
/*
计划(伪代码):
1. 为类添加 XML 文档注释,描述此驱动器的用途与协议相关信息。
2. 为构造函数、属性、事件、公开方法(Connect/ConnectAsync/GetData/GetDataAsync/Dispose)添加注释,说明用途与返回值。
3. 为内部重要方法(EnsureSocket/SendGetTspc/ReceiveOnce/UpdateConnectState/DataAnalysis/ToInt16/ToInt32N)添加注释,解释实现细节与特殊字节序处理。
4. 在 DataAnalysis 中为每个解析字段添加注释,标明字节偏移与单位转换,保留对异常与边界检查的说明。
5. 保持原有逻辑不变,只增加注释,保证与现有代码风格一致并能通过编译。
*/
///
/// XYD 系列电动螺丝刀数据读取与解析器。
/// 通过 UDP 向设备发送 "GET_TSPC" 探测命令并接收包含 TSPB/TSPA 数据包的响应,
/// 解析设备返回的扭矩、角度、速度、时间等曲线和结果信息。
///
public class XYD_ScrewDriver : IScrewDriver
{
private Socket _socket;
private IPEndPoint _endPoint;
// 协议最小数据长度(TSPB 固定头与描述长度)
private const int MinDataLength = 508;
#region 属性
public Guid Id { get; private set; }
private bool _isConnected;
///
/// 当前连接状态(是否已与设备建立连接并成功接收过有效数据)。
///
public bool IsConnected => _isConnected;
///
/// 螺丝刀设备 IP 地址。
///
public string IPAdress { get; private set; }
///
/// 设备端口号。
///
public int Port { get; private set; }
///
/// 螺丝刀品牌标识(XYD 固定)。
///
public ElectricScrewdriverBrand Brand => ElectricScrewdriverBrand.XYD;
///
/// 螺丝编号(设备返回的整型编号)。
///
public int ScrewNum { get; private set; }
///
/// 曲线采样频率(单位:Hz 或协议定义的采样单位)。
///
public int Frequency { get; private set; }
///
/// 结果时间戳(设备返回的年月日时分秒)。
///
public DateTime ResultDateTime { get; private set; }
///
/// 锁止角(单位:度)。
///
public double LockAngel { get; private set; }
public double StrokeAngle1 { get; private set; }
public double StrokeAngle2 { get; private set; }
public double StrokeAngle3 { get; private set; }
public double StrokeAngle4 { get; private set; }
public double StrokeAngle5 { get; private set; }
public double StrokeTorque1 { get; private set; }
public double StrokeTorque2 { get; private set; }
public double StrokeTorque3 { get; private set; }
public double StrokeTorque4 { get; private set; }
public double StrokeTorque5 { get; private set; }
///
/// 峰值扭矩(单位:N·m,协议返回值需乘以 0.001)。
///
public double MaxTorque { get; private set; }
public double OverlockAngle { get; private set; }
///
/// 过锁扭矩(单位:N·m)。
///
public double OverlockTorque { get; private set; }
public double SlopeCheck { get; private set; }
public double ClampingAngle { get; private set; }
public double ClampingAngleCheck { get; private set; }
public double FitAngle { get; private set; }
public double FitAngleCheck { get; private set; }
///
/// 夹紧扭矩(单位:N·m)。
///
public double ClampingTorque { get; private set; }
public double ClampingTorqueCheck { get; private set; }
///
/// 过程最大扭矩(单位:N·m)。
///
public double ProcessMaxTorque { get; private set; }
public double ProcessMaxTorqueCheck { get; private set; }
public double FitPointCoord { get; private set; }
public double FitAngle1 { get; private set; }
///
/// 贴合点扭矩(单位:N·m)。
///
public double FitTorque { get; private set; }
public double SectionTooth { get; private set; }
public double SectionStroke1 { get; private set; }
public double SectionStroke2 { get; private set; }
public double SectionStroke3 { get; private set; }
public double SectionStroke4 { get; private set; }
public double SectionStroke5 { get; private set; }
public double SectionLockAngle { get; private set; }
public double SectionLockFinish1 { get; private set; }
public double SectionOverLock { get; private set; }
public double SectionFinalEnd { get; private set; }
///
/// 解析出的错误信息或结果说明(根据设备返回码映射)。
///
public string ErrorInfo { get; private set; }
///
/// 本次结果是否判定为成功(设备返回结果码为 4 表示成功)。
///
public bool Success { get; private set; }
public int ProgramNumber { get; private set; }
///
/// 总圈数(单位:圈,协议返回为度需除以 360)。
///
public double Truns { get; private set; }
///
/// 结果扭矩值(单位:N·m)。
///
public double TorqueValue { get; private set; }
public int FinalTime { get; private set; }
///
/// 曲线数据集合(解析后的时间、角度、扭矩、斜率等)。
///
public List WaveDatas { get; } = new List();
#endregion
#region 事件
///
/// 连接状态变化事件,参数:sender, connected。
/// 当连接状态改变时触发(包括连接失败/成功与获取数据后状态更新)。
///
public event Action