AutoApplyAutoTurnHelper.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. namespace MinicsConsole.Helper.RawDataFilter;
  2. public class AutoApplyAutoTurnLayer(byte mini8Index, ILog log) : IMini8DataFilter
  3. {
  4. private readonly ConcurrentDictionary<byte, AutoTuneStatus> _LastStatus = [];
  5. public IDataSender? NextSender { get; set; }
  6. public IMini8Communicator? Sender { get; set; }
  7. private bool AutotuneFinishCheck(Mini8Output mini8Output)
  8. {
  9. if (mini8Output is null)
  10. return false;
  11. AutoTuneStatus lastActive = _LastStatus.ContainsKey(mini8Output.ChannelIndex) switch
  12. {
  13. true => _LastStatus[mini8Output.ChannelIndex],
  14. false => mini8Output.AutoTuneStatus
  15. };
  16. _LastStatus[mini8Output.ChannelIndex] = mini8Output.AutoTuneStatus;
  17. if (mini8Output.AutoTuneStatus != AutoTuneStatus.Complete || lastActive != AutoTuneStatus.Tuning)
  18. return false;
  19. return true;
  20. }
  21. private void ApplyAutotunePID(ChannelData channelData, Mini8Output mini8Output)
  22. {
  23. if (Sender is null)
  24. {
  25. log.Error($"AutoApplyAutoTurnHelper - SendSetValue Failed {channelData!.Mini8Index} Communicator Null ");
  26. return;
  27. }
  28. Mini8Input input = channelData.Adapt<Mini8Input>();
  29. input.Running_P = mini8Output.AutoTune_P;
  30. input.Running_I = mini8Output.AutoTune_I;
  31. input.Running_D = mini8Output.AutoTune_D;
  32. if (!Sender.SendMini8Data(channelData.ChannelIndex, input))
  33. {
  34. log.Error($"AutoApplyAutoTurnHelper - SendSetValue Failed {channelData!.Mini8Index} Send to Mini8 Failed ");
  35. return;
  36. }
  37. if (!Sender.SelectPID(channelData.ChannelIndex, ActiveTuneSet.Running))
  38. {
  39. log.Error($"AutoApplyAutoTurnHelper - SelectPID Mini8-{mini8Index} Channel-{channelData.ChannelIndex} ActiveTuneSet-{ActiveTuneSet.Running}");
  40. return;
  41. }
  42. log.Info($"AutoApplyAutoTurnHelper - Auto apply autotune PID {input.Running_P} {input.Running_I} {input.Running_D}");
  43. }
  44. bool IDataSender.Send(Mini8Output mini8Output, ChannelData channelData, object? s)
  45. {
  46. if (this.AutotuneFinishCheck(mini8Output) is true)
  47. this.ApplyAutotunePID(channelData, mini8Output);
  48. return this.NextSender?.Send(mini8Output, channelData, default) is true;
  49. }
  50. }