using System; using System.Threading.Tasks; using TeamAAS.Feeder.Attributes; using TeamAAS.Feeder.Interfaces; using TeamAAS.Feeder.UI; using TeamAAS.Feeder.Enums; using TeamAAS.Feeder.Models; namespace TeamAAS.Feeder.Devices { /// /// Afag 品牌供料器骨架:已按插槽规格注册(品牌 + 专属调试页), /// 协议收发待开发——命令类方法目前统一抛出"待开发"提示,连接层仅保留 TCP 骨架。 /// [Feeder("Afag 供料器", FeederBrand.Afag, Description = "待开发", DebugPageType = typeof(AfagFeederDebugPage))] public class AfagFeeder : IFeeder { private readonly object _ioLock = new object(); private System.Net.Sockets.TcpClient _tcp; private volatile bool _manualDisconnect; public Guid Id { get; } public int FeederNo { get; } public string Name { get; } public FeederBrand Brand => FeederBrand.Afag; public bool IsConnected => _tcp?.Connected ?? false; public bool IsBacklightOn { get; private set; } public event Action ConnectionChanged; public event Action MessageExchanged; private string IP { get; } private int Port { get; } public AfagFeeder(Guid id, int feederNo, string name, string ip, int port) { Id = id; FeederNo = feederNo; Name = name; IP = ip; Port = port; } public async Task ConnectAsync() { _manualDisconnect = false; await Task.Run(() => { _tcp = new System.Net.Sockets.TcpClient(); _tcp.Connect(System.Net.IPAddress.Parse(IP), Port); ConnectionChanged?.Invoke(this, true); }); } public async Task DisconnectAsync() { _manualDisconnect = true; await Task.Run(() => { try { _tcp?.Close(); } catch { } ConnectionChanged?.Invoke(this, false); }); } public void Dispose() { _manualDisconnect = true; try { _tcp?.Close(); } catch { } } private void EnsureDeveloping() { if (!IsConnected) throw new InvalidOperationException("Afag 供料器未连接"); throw new NotSupportedException("Afag 供料器协议待开发"); } public Task OpenBacklightAsync() { EnsureDeveloping(); return Task.CompletedTask; } public Task CloseBacklightAsync() { EnsureDeveloping(); return Task.CompletedTask; } public Task QueryBacklightAsync() { EnsureDeveloping(); return Task.FromResult(false); } public Task RunDirectionAsync(FeederAction action, int? durationMs = null) { EnsureDeveloping(); return Task.FromResult(0); } public Task StopAsync() { EnsureDeveloping(); return Task.CompletedTask; } public Task GetActionParamAsync(int index) { EnsureDeveloping(); return Task.FromResult(new SingleActionParam()); } public Task SetActionParamAsync(int index, SingleActionParam param) { EnsureDeveloping(); return Task.CompletedTask; } public Task DownloadAllParamsAsync(FeederInfo info) { EnsureDeveloping(); return Task.CompletedTask; } public Task SaveToDeviceAsync() { EnsureDeveloping(); return Task.CompletedTask; } public Task GetSystemParamAsync() { EnsureDeveloping(); return Task.FromResult(new FeederSystemParam()); } public Task SetSystemParamAsync(FeederSystemParam param) { EnsureDeveloping(); return Task.CompletedTask; } public Task GetHopperParamAsync(int group) { EnsureDeveloping(); return Task.FromResult(new HopperOutputParam()); } public Task SetHopperParamAsync(int group, HopperOutputParam param) { EnsureDeveloping(); return Task.CompletedTask; } public Task RunHopperOutputAsync(int id, int? timespan = null) { EnsureDeveloping(); return Task.FromResult(0); } public Task StopHopperOutputAsync() { EnsureDeveloping(); return Task.CompletedTask; } public Task GetInputTriggerAsync(int index) { EnsureDeveloping(); return Task.FromResult(0); } public Task SetInputTriggerAsync(int index, int sequenceId) { EnsureDeveloping(); return Task.CompletedTask; } public Task ReadParamAsync(int id) { EnsureDeveloping(); return Task.FromResult(0); } public Task WriteParamAsync(int id, int value) { EnsureDeveloping(); return Task.CompletedTask; } } }