using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Controls.Primitives; using Team.FFFeederService.Enums; using Team.FFFeederService.Interfaces; using Team.FFFeederService.Models; namespace Team.FFFeederService { /// /// Feeder自动调整参数 /// public class AutoAdjustmentParameter : IDisposable { /// /// 动作的编号 /// public int ActionIndex { get; set; } // 声明一个委托字段,其签名与A中的GetDataFromA方法匹配 private readonly Func> dataFetchDelegate; public FeederModel FeederModel { get; set; } private IVoiceCoilMotorFeeder Feeder; public VibrationFrequencyDetector detector; /// /// 振动参数改变 /// public event Action OnVibrationParamChanged; /// /// 构造函数 /// /// 动作参数 /// Feeder盘面的矩形 /// 回调函数,获取相机拍照后的结果 public AutoAdjustmentParameter(IVoiceCoilMotorFeeder feeder,int actionIndex,Func> _dataFetchDelegate) { Feeder = feeder; ActionIndex= actionIndex; dataFetchDelegate = _dataFetchDelegate; FeederModel = Feeder.FeederModel; int feedermodel = 0; switch (Feeder.FeederModel) { case FeederModel.FF120: feedermodel = 0; break; case FeederModel.FF240: feedermodel = 0; break; case FeederModel.FF380: feedermodel = 1; break; case FeederModel.FF530: feedermodel = 2; break; case FeederModel.Unknown: feedermodel = 0; break; default: break; } detector=new VibrationFrequencyDetector(); detector.Initialize(feedermodel, ActionIndex); // 订阅事件 detector.OnExecuteFeedervibration += data => { //Feeder振动参数设置并执行动作 int action = data.inFedAct; SingleActionParam actionp = new SingleActionParam { Motor1 = new VoiceMotorParam { Amplitude = data.u16VoiMot0, Frequency = data.u16VoiMot1, Phase = data.u16VoiMot2, WaveShape = (WaveShape)data.u16VoiMot3, }, Motor2 = new VoiceMotorParam { Amplitude = data.u16VoiMot4, Frequency = data.u16VoiMot5, Phase = data.u16VoiMot6, WaveShape = (WaveShape)data.u16VoiMot7, }, Motor3 = new VoiceMotorParam { Amplitude = data.u16VoiMot8, Frequency = data.u16VoiMot9, Phase = data.u16VoiMotA, WaveShape = (WaveShape)data.u16VoiMotB, }, Motor4 = new VoiceMotorParam { Amplitude = data.u16VoiMotC, Frequency = data.u16VoiMotD, Phase = data.u16VoiMotE, WaveShape = (WaveShape)data.u16VoiMotF, }, DurationValue = data.u16DuartTim }; OnVibrationParamChanged?.Invoke(actionp); ExecuteFeederVibration(action, actionp); }; detector.OnExecutePhoto += () => { /// 相机拍照获取物料位置 return dataFetchDelegate?.Invoke(); }; } public async Task Execute(int amplitudeMax, int amplitudeMin, int frequencyMax, int frequencyMin,int duration, CancellationToken token,Action callback) { //float currentX = 0, currentY=0; //float oldX = 0, oldY=0; //int counter = 0; int amplitude = amplitudeMin; int frequency = frequencyMin; await Feeder.OpenLightAsync(); detector.OnExecuteResult += status => { callback?.Invoke(status); }; while (!token.IsCancellationRequested) { detector.StartTask(); await Task.Delay(100); } detector.Dispose(); return false; } /// /// 执行振动 /// /// 动作索引 /// public async Task ExecuteAction(int action,int time) { await Feeder.StartAction(action, time); } /// /// 写入震动参数 /// /// /// /// public async Task WriteActionParm(int action, SingleActionParam actionp) { await Feeder.SetShakeParametersAsync(action, actionp); } public void ExecuteFeederVibration(int action, SingleActionParam actionp) { Task.Run(async () => { await WriteActionParm(action, actionp); await ExecuteAction(action, actionp.DurationValue); await Task.Delay(actionp.DurationValue+1000); }).GetAwaiter().GetResult(); } /// /// 设置寻频返回值0:停止 1 :启动 2:验证 3:结束 /// /// 0:停止 1 :启动 2:验证 3:结束 public void SetState(int state) { detector.SetLogicState(state); } public void Dispose() { if (detector!=null) { detector.Dispose(); } } } }