using aflex_CSharp_Integration_Sample; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using Team.FFFeederService.Enums; using Team.FFFeederService.Interfaces; using Team.FFFeederService.Models; using TouchSocket.Core; using TouchSocket.Sockets; namespace Team.FFFeederService { public struct FeederParam { public double backLightIntensity;//光源强度 public byte configNum;//震动模式 public double degreeNum;//震动角度 public double vibrationIntensity;//震动强度 public double intervalNum;//间隔时间ms } public class AfagFeeder : IVoiceCoilMotorFeeder { public TcpClient TcpClient { get; } public int FeederPort { get; private set; } public string FeederIp { get; private set; } public FeederBrand FeederBrand { get => FeederBrand.AFAG; } public FeederModel FeederModel { get; private set; } = FeederModel.Unknown; public Guid Id { get; set; } public int FeederNo { get; set; } public string Name { get; set; } public bool IsConnected => IsInit; public bool IsInit { get; set; } /// /// Feeder连接状态更改事件 /// public event Action FeederConnectionStatusChanged; private aflexCommunicationClass objaflex; Timer feedStepTimer; uint stepNum = 0; TimeSpan durationNum = new TimeSpan(); /// /// 配置编号 /// public int ConfigIndex { get { if (objaflex == null) return 0; else return objaflex.actual_ConfigNumber; } } /// /// 振动强度 /// public double Intensity { get { if (objaflex == null) return 0; else return objaflex.actual_intensity; } } /// /// 方向 /// public double Direction { get { if (objaflex == null) return 0; else return objaflex.actual_direction; } } public AfagFeeder(Guid id, int feederNo, string name, string ip, int port) { Id = id; FeederNo = feederNo; Name= name; FeederIp = ip; FeederPort = port; objaflex = new aflexCommunicationClass(); objaflex.aflexValueChanged += Objaflex_aflexValueChanged; } private void Objaflex_aflexValueChanged(object sender, EventArgs e) { } public void CloseLight() { try { if (!objaflex.actual_AutoMode) return; objaflex.SetAuxPowerOut(0); } catch (Exception) { } } public Task CloseLightAsync() { try { if (!objaflex.actual_AutoMode) return Task.CompletedTask; objaflex.SetAuxPowerOut(0); } catch (Exception) { } return Task.CompletedTask; } public void Connect() { if (!IsInit) { //Connect //Check IP Textbox IPAddress IPValue; if (IPAddress.TryParse(FeederIp, out IPValue)) { if (/*IPValue.GetAddressBytes()[3] != 0 && */IPValue.GetAddressBytes()[3] != 255) { //Valid IP //Check Port int PortValue = FeederPort; if (PortValue > 0) { //Valid Port //Connect bool flog = objaflex.Connect(IPValue, PortValue); if (flog) { FeederConnectionStatusChanged?.Invoke(this,true); GeneralRelease(); } else { FeederConnectionStatusChanged?.Invoke(this,false); } IsInit = true; } } } } //else //{ //Disconnect // objaflex.Disconnect(); //} } public async Task ConnectAsync() { await Task.Run(async () => { //Connect //Check IP Textbox IPAddress IPValue; bool resB = IPAddress.TryParse(FeederIp, out IPValue); int PortValue = FeederPort; try { if (resB && IPValue.GetAddressBytes()[3] != 255) { if (PortValue > 0) { bool flog = objaflex.Connect(IPValue, PortValue); if (flog) { FeederConnectionStatusChanged?.Invoke(this,true); GeneralRelease(); } else { FeederConnectionStatusChanged?.Invoke(this,false); } IsInit = true; } } } catch (Exception) { IsInit = false; while (!IsInit) { try { bool flog = objaflex.Connect(IPValue, PortValue); if (flog) { FeederConnectionStatusChanged?.Invoke(this,true); GeneralRelease(); } else { FeederConnectionStatusChanged?.Invoke(this,false); } IsInit = true; } catch (Exception) { await Task.Delay(1000); } } } }); } /// /// set release /// public void GeneralRelease() { if (!objaflex.actual_GeneralRelease) { objaflex.SetGeneralRelease(!objaflex.actual_GeneralRelease); } } /// /// 设置光源亮度 /// /// 亮度范围0-100 public void SetBackLight(double brightnessNum) { try { if (!objaflex.actual_AutoMode) return; if (IsInit) { GeneralRelease(); if (brightnessNum >= 0 && brightnessNum <= 100) { objaflex.SetAuxPowerOut(brightnessNum); } } } catch (Exception) { } } /// /// 设置震动强度 /// /// 强度范围0-100 public void SetIntensity(double IntensValue) { try { if (!objaflex.actual_AutoMode) return; GeneralRelease(); if (IntensValue >= 0 && IntensValue <= 100.0) { objaflex.SetIntensity(IntensValue); } } catch (Exception) { } } /// /// 加载配置参数 /// /// 范围1-49 public void LoadConfiguration(int modeNum) { try { if (!objaflex.actual_AutoMode) return; Byte ConfigNumber; if (Byte.TryParse(modeNum.ToString(), out ConfigNumber)) { if (ConfigNumber > 0 && ConfigNumber < 50) { GeneralRelease(); objaflex.LoadConfiguration(ConfigNumber); } } } catch (Exception) { } } /// /// 设置震动方向 /// /// 范围0-360° public void SetDirection(double DirectionValue) { try { if (!objaflex.actual_AutoMode) return; if (DirectionValue >= 0 && DirectionValue <= 360.0) { GeneralRelease(); objaflex.SetDirection(DirectionValue); } } catch (Exception) { } } public void StartShaking(double backLightIntensity, byte configNum, double degreeNum, double vibrationIntensity, double intervalNum) { FeederParam feed = new FeederParam(); feed.backLightIntensity = backLightIntensity; feed.configNum = configNum; feed.degreeNum = degreeNum; feed.vibrationIntensity = vibrationIntensity; feed.intervalNum = intervalNum; stepNum = 1; feedStepTimer = new Timer(StepSequenceHandler, feed, 3, 3); } public void StepSequenceHandler(object param) { FeederParam feedParam = (FeederParam)param; switch (stepNum) { case 0: feedStepTimer.Dispose(); break; case 1: //set general release if (!objaflex.actual_GeneralRelease) objaflex.SetGeneralRelease(true); stepNum = 2; //next step break; case 2: //设置光源 objaflex.SetAuxPowerOut(feedParam.backLightIntensity); stepNum = 3; break; case 3://确认设置 if (Math.Abs(Math.Round(objaflex.actual_auxPowerOut, 2) - feedParam.backLightIntensity) < 0.1) { stepNum = 4; //next step } break; case 4://加载震动模式 objaflex.LoadConfiguration(feedParam.configNum); //move = ConfigNumber 2 stepNum = 5; //next step break; case 5: //确认加载成功 if (objaflex.actual_ConfigNumber == feedParam.configNum) { stepNum = 6; //next step } break; case 6: //设置震动方向和强度 objaflex.SetDirection(feedParam.degreeNum); objaflex.SetIntensity(feedParam.vibrationIntensity); durationNum = durationNum.Subtract(durationNum); //reset Timespan stepNum = 7; //next step break; case 7: //确认设置成功 if ((Math.Abs(Math.Round(objaflex.actual_direction, 2) - feedParam.degreeNum) < 0.1) && (Math.Abs(Math.Round(objaflex.actual_intensity, 2) - feedParam.vibrationIntensity) < 0.1)) { durationNum = durationNum.Add(new TimeSpan(0, 0, 0, 0, 3)); } if (durationNum.Milliseconds > feedParam.intervalNum) { //500ms move duration stepNum = 8; //next step } break; case 8: //设置震动强度 0% objaflex.SetIntensity(0); stepNum = 9; //next step break; case 9: //确认 if (objaflex.actual_intensity == 0) { stepNum = 0; //next step } break; } } public void Dispose() { throw new NotImplementedException(); } public Task GetBackLightFlashTimeAsync() { return Task.FromResult((ushort)0); } public int GetDuration(int id) { return 0; } public Task GetDurationAsync(int id) { return Task.FromResult((int)0); } public Task GetInputTrigger(int i) { return Task.FromResult((int)0); } public Task GetLightBrightnessAsync() { return Task.FromResult((ushort)objaflex.actual_auxPowerOut); } public ushort GetLightTimeout() { return 0; } public Task GetLightTimeoutAsync() { return Task.FromResult((ushort)0); } public bool GetOutputStatus() { return false; } public Task GetOutputStatusAsync() { return Task.FromResult(false); } public Task GetPlatShakeTimeoutAsync() { return Task.FromResult((ushort)0); } public int GetSelectedSequence() { return Convert.ToInt16(objaflex.actual_ConfigNumber); } public Task GetSelectedSequenceAsync() { return Task.FromResult((int)Convert.ToInt16(objaflex.actual_ConfigNumber)); } public int GetSelectedShakeParam() { return 0; } public Task GetSelectedShakeParamAsync() { return Task.FromResult(0); } public Task GetSequenceGroupAsync(int id) { return Task.FromResult(null); } public SingleActionParam GetShakeGroupValue(int index) { return null; } public Task GetShakeGroupValueAsync(int index) { return Task.FromResult(null); } public SingleActionParam GetShakeParameters(int selectedShakeMotion) { return null; } public Task GetShakeParametersAsync(int selectedShakeMotion) { return Task.FromResult(null); } public string GetSingleParamValue(int id) { return ""; } public Task GetSingleParamValueAsync(int id) { return Task.FromResult(""); } public Task GetUpperFeederShakeTimeoutAsync() { return Task.FromResult((ushort)0); } public Task GetUpperParamAsync(int selectedSequence) { return Task.FromResult(null); } public bool LoadShakeSet(int v) { return false; } public Task LoadShakeSetAsync(int v) { return Task.FromResult(false); } public void OpenLight() { try { if (!objaflex.actual_AutoMode) return; double DirectionValue = 100; if (DirectionValue >= 0 && DirectionValue <= 360.0) { GeneralRelease(); objaflex.SetDirection(DirectionValue); } } catch (Exception) { } } public Task OpenLightAsync() { try { if (!objaflex.actual_AutoMode) return Task.CompletedTask; double DirectionValue = 100; if (DirectionValue >= 0 && DirectionValue <= 360.0) { GeneralRelease(); objaflex.SetDirection(DirectionValue); } } catch (Exception) { } return Task.CompletedTask; } public int Output(int id, int? timespan = null) { return 0; } public Task OutputAsync(int id, int? timespan = null) { return Task.FromResult((int)0); } public bool QueryLightState() { if (objaflex.actual_auxPowerOut > 0) return false; else return true; } public Task QueryLightStateAsync() { if (objaflex.actual_auxPowerOut > 0) return Task.FromResult(false); else return Task.FromResult(true); } public void Reset() { } public Task ResetAsync() { return Task.CompletedTask; } public Task RunFromCommand(string command, int? timespan = null) { return Task.FromResult(0); } public Task RunToBottomAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToBottomLeftAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToBottomRightAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToFlipAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToInnerHorizonAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToInnerVerticalAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToLeftAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToRightAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToTopAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToTopLeftAsync(int? timespan = null) { return Task.FromResult(0); } public Task RunToTopRightAsync(int? timespan = null) { return Task.FromResult(0); } public Task SaveAllSetAsync() { return Task.CompletedTask; } public Task SaveGlobalSetAsync() { return Task.CompletedTask; } public Task SaveSequenceAsync() { return Task.CompletedTask; } public Task SaveShakeSetAsync() { return Task.CompletedTask; } public void SelectShakeParam(int id) { } public Task SelectShakeParamAsync(int id) { return Task.CompletedTask; } public Task SetBackLightFlashTimeAsync(ushort backLightFlash) { return Task.CompletedTask; } public Task SetInputTrigger(int id, int value) { return Task.CompletedTask; } public void SetIpAddress(string ip, string subNetMask, int port) { } public Task SetIpAddressAsync(string ip, string subNetMask, int port) { return Task.CompletedTask; } public void SetLightTimeOut(ushort timeout) { } public Task SetLightTimeOutAsync(ushort timeout) { return Task.CompletedTask; } public Task SetLightValueAsync(ushort lightValue) { if (lightValue<0 || lightValue>100) { lightValue = 100; } try { objaflex.SetAuxPowerOut(lightValue); } catch (Exception) { } return Task.CompletedTask; } public Task SetLightValueToBufferAsync(ushort lightValue) { return Task.CompletedTask; } public Task SetPlatShakeTimeoutAsync(ushort upperFeederShakeTimeout) { return Task.CompletedTask; } public void SetSequence(int groupId, int actionId, SingleSequenceAction singleSequenceAction) { } public Task SetSequenceAsync(int groupId, int actionId, SingleSequenceAction singleSequenceAction) { return Task.CompletedTask; } public void SetShakeParameters(int selectedShakeMotion, int id, string value) { } public void SetShakeParameters(int selectedShakeMotion, string value) { } public void SetShakeParameters(int selectedShakeMotion, SingleActionParam value) { } public Task SetShakeParametersAsync(int selectedShakeMotion, int id, string value) { return Task.CompletedTask; } public Task SetShakeParametersAsync(int selectedShakeMotion, string value) { return Task.CompletedTask; } public Task SetShakeParametersAsync(int selectedShakeMotion, SingleActionParam value) { return Task.CompletedTask; } public Task SetUpperFeederShakeTimeoutAsync(ushort upperFeederShakeTimeout) { return Task.CompletedTask; } public int ShakeUp() { return 0; } public Task ShakeUpAsync() { return Task.FromResult(0); } public Task StartAction(int index, int? timespan = null) { return Task.FromResult(0); } public Task StartOneSequenceAsync(int id) { return Task.FromResult(0); } public void Stop() { SetIntensity(0); } public Task StopAsync() { SetIntensity(0); return Task.CompletedTask; } public Task StopOneSequenceAsync() { return Task.CompletedTask; } public void StopOutput() { } public Task StopOutputAsync() { return Task.CompletedTask; } public Task WriteOutputParamAsync(int groupId, HopperFeederParam param) { return Task.CompletedTask; } } }