AfagFeeder.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using System.Threading.Tasks;
  3. using TeamAAS.Feeder.Attributes;
  4. using TeamAAS.Feeder.Interfaces;
  5. using TeamAAS.Feeder.UI;
  6. using TeamAAS.Feeder.Enums;
  7. using TeamAAS.Feeder.Models;
  8. namespace TeamAAS.Feeder.Devices
  9. {
  10. /// <summary>
  11. /// Afag 品牌供料器骨架:已按插槽规格注册(品牌 + 专属调试页),
  12. /// 协议收发待开发——命令类方法目前统一抛出"待开发"提示,连接层仅保留 TCP 骨架。
  13. /// </summary>
  14. [Feeder("Afag 供料器", FeederBrand.Afag, Description = "待开发", DebugPageType = typeof(AfagFeederDebugPage))]
  15. public class AfagFeeder : IFeeder
  16. {
  17. private readonly object _ioLock = new object();
  18. private System.Net.Sockets.TcpClient _tcp;
  19. private volatile bool _manualDisconnect;
  20. public Guid Id { get; }
  21. public int FeederNo { get; }
  22. public string Name { get; }
  23. public FeederBrand Brand => FeederBrand.Afag;
  24. public bool IsConnected => _tcp?.Connected ?? false;
  25. public bool IsBacklightOn { get; private set; }
  26. public event Action<IFeeder, bool> ConnectionChanged;
  27. public event Action<IFeeder, string, bool> MessageExchanged;
  28. private string IP { get; }
  29. private int Port { get; }
  30. public AfagFeeder(Guid id, int feederNo, string name, string ip, int port)
  31. {
  32. Id = id;
  33. FeederNo = feederNo;
  34. Name = name;
  35. IP = ip;
  36. Port = port;
  37. }
  38. public async Task ConnectAsync()
  39. {
  40. _manualDisconnect = false;
  41. await Task.Run(() =>
  42. {
  43. _tcp = new System.Net.Sockets.TcpClient();
  44. _tcp.Connect(System.Net.IPAddress.Parse(IP), Port);
  45. ConnectionChanged?.Invoke(this, true);
  46. });
  47. }
  48. public async Task DisconnectAsync()
  49. {
  50. _manualDisconnect = true;
  51. await Task.Run(() =>
  52. {
  53. try { _tcp?.Close(); } catch { }
  54. ConnectionChanged?.Invoke(this, false);
  55. });
  56. }
  57. public void Dispose()
  58. {
  59. _manualDisconnect = true;
  60. try { _tcp?.Close(); } catch { }
  61. }
  62. private void EnsureDeveloping()
  63. {
  64. if (!IsConnected)
  65. throw new InvalidOperationException("Afag 供料器未连接");
  66. throw new NotSupportedException("Afag 供料器协议待开发");
  67. }
  68. public Task OpenBacklightAsync() { EnsureDeveloping(); return Task.CompletedTask; }
  69. public Task CloseBacklightAsync() { EnsureDeveloping(); return Task.CompletedTask; }
  70. public Task<bool> QueryBacklightAsync() { EnsureDeveloping(); return Task.FromResult(false); }
  71. public Task<int> RunDirectionAsync(FeederAction action, int? durationMs = null) { EnsureDeveloping(); return Task.FromResult(0); }
  72. public Task StopAsync() { EnsureDeveloping(); return Task.CompletedTask; }
  73. public Task<SingleActionParam> GetActionParamAsync(int index) { EnsureDeveloping(); return Task.FromResult(new SingleActionParam()); }
  74. public Task SetActionParamAsync(int index, SingleActionParam param) { EnsureDeveloping(); return Task.CompletedTask; }
  75. public Task DownloadAllParamsAsync(FeederInfo info) { EnsureDeveloping(); return Task.CompletedTask; }
  76. public Task SaveToDeviceAsync() { EnsureDeveloping(); return Task.CompletedTask; }
  77. public Task<FeederSystemParam> GetSystemParamAsync() { EnsureDeveloping(); return Task.FromResult(new FeederSystemParam()); }
  78. public Task SetSystemParamAsync(FeederSystemParam param) { EnsureDeveloping(); return Task.CompletedTask; }
  79. public Task<HopperOutputParam> GetHopperParamAsync(int group) { EnsureDeveloping(); return Task.FromResult(new HopperOutputParam()); }
  80. public Task SetHopperParamAsync(int group, HopperOutputParam param) { EnsureDeveloping(); return Task.CompletedTask; }
  81. public Task<int> RunHopperOutputAsync(int id, int? timespan = null) { EnsureDeveloping(); return Task.FromResult(0); }
  82. public Task StopHopperOutputAsync() { EnsureDeveloping(); return Task.CompletedTask; }
  83. public Task<int> GetInputTriggerAsync(int index) { EnsureDeveloping(); return Task.FromResult(0); }
  84. public Task SetInputTriggerAsync(int index, int sequenceId) { EnsureDeveloping(); return Task.CompletedTask; }
  85. public Task<int> ReadParamAsync(int id) { EnsureDeveloping(); return Task.FromResult(0); }
  86. public Task WriteParamAsync(int id, int value) { EnsureDeveloping(); return Task.CompletedTask; }
  87. }
  88. }