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; }
}
}