ForceBalanceControlViewModel.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using IModel;
  2. using Shaker.Models;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Runtime.CompilerServices;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace ShakerService.ViewModel
  10. {
  11. internal sealed class ForceBalanceControlViewModel : ViewModelBase<ForceBalanceControlModel>
  12. {
  13. /// <summary>
  14. /// 水平力反馈增益
  15. /// </summary>
  16. public double HorizontalForceBalanceGain => CurrentModel.HorizontalForceBalanceGain;
  17. /// <summary>
  18. /// 竖直力反馈增益
  19. /// </summary>
  20. public double VerticalForceBalanceGain =>CurrentModel.VerticalForceBalanceGain;
  21. /// <summary>
  22. /// 合成矩阵
  23. /// </summary>
  24. public double[,] CompositionMatrix =>CurrentModel.CompositionMatrix;
  25. /// <summary>
  26. /// 自由度分解列矩阵
  27. /// </summary>
  28. public double[,] FreedomDecompositionMatrix =>CurrentModel.FreedomDecompositionMatrix;
  29. private ForceBalanceControlViewModel() : base()
  30. {
  31. }
  32. static ForceBalanceControlViewModel()
  33. {
  34. }
  35. private protected override void UpModel(ForceBalanceControlModel model)
  36. {
  37. if(model.CompositionMatrix==null || model.CompositionMatrix.Length!=16)
  38. {
  39. model.CompositionMatrix = new double[2, 8];
  40. }
  41. if(model.FreedomDecompositionMatrix ==null || model.FreedomDecompositionMatrix.Length!=16)
  42. {
  43. model.FreedomDecompositionMatrix = new double[8, 2];
  44. }
  45. base.UpModel(model);
  46. }
  47. private protected override void ReadModel()
  48. {
  49. base.ReadModel();
  50. Communication.Instance.DbConnection.CreateTable<ForceBalanceControlModel>();
  51. var model = Communication.Instance.DbConnection.Table<ForceBalanceControlModel>().FirstOrDefault() ?? new ForceBalanceControlModel();
  52. Communication.Instance.DbConnection.Execute($"CREATE TABLE IF NOT EXISTS {nameof(ForceBalanceControlModel.CompositionMatrix)} ({nameof(BaseModel.Id)} INTEGER PRIMARY KEY AUTOINCREMENT, Value REAL);");
  53. var compositionMatrix = Communication.Instance.DbConnection.Query<double>($"select Value from {nameof(ForceBalanceControlModel.CompositionMatrix)}")?.ToArray() ?? new double[16];
  54. if(compositionMatrix==null || compositionMatrix.Length!=16)
  55. {
  56. compositionMatrix = new double[16];
  57. }
  58. model.CompositionMatrix = new double[2, 8];
  59. Unsafe.CopyBlock(ref Unsafe.As<double, byte>(ref model.CompositionMatrix[0, 0]), ref Unsafe.As<double, byte>(ref compositionMatrix[0]), (uint)(Unsafe.SizeOf<double>() * compositionMatrix.Length));
  60. Communication.Instance.DbConnection.Execute($"CREATE TABLE IF NOT EXISTS {nameof(ForceBalanceControlModel.FreedomDecompositionMatrix)} ({nameof(BaseModel.Id)} INTEGER PRIMARY KEY AUTOINCREMENT, Value REAL);");
  61. var freedomDecompositionMatrix = Communication.Instance.DbConnection.Query<double>($"select Value from {nameof(ForceBalanceControlModel.FreedomDecompositionMatrix)}")?.ToArray() ?? new double[16];
  62. if (freedomDecompositionMatrix == null || freedomDecompositionMatrix.Length != 16)
  63. {
  64. freedomDecompositionMatrix = new double[16];
  65. }
  66. model.FreedomDecompositionMatrix = new double[8,2];
  67. Unsafe.CopyBlock(ref Unsafe.As<double, byte>(ref model.FreedomDecompositionMatrix[0, 0]), ref Unsafe.As<double, byte>(ref freedomDecompositionMatrix[0]), (uint)(Unsafe.SizeOf<double>() * freedomDecompositionMatrix.Length));
  68. CurrentModel = model;
  69. SaveModel();
  70. }
  71. private protected override void SaveModel()
  72. {
  73. base.SaveModel();
  74. Communication.Instance.DbConnection.DeleteAll<ForceBalanceControlModel>();
  75. Communication.Instance.DbConnection.Insert(CurrentModel);
  76. Communication.Instance.DbConnection.DeleteAll<double>(tableName: nameof(ForceBalanceControlModel.CompositionMatrix));
  77. for(int i=0;i<CurrentModel.CompositionMatrix.Length;i++)
  78. {
  79. Communication.Instance.DbConnection.Execute($"INSERT INTO {nameof(ForceBalanceControlModel.CompositionMatrix)} (Value) VALUES ({Unsafe.Add(ref CurrentModel.CompositionMatrix[0,0],i)});");
  80. }
  81. Communication.Instance.DbConnection.DeleteAll<double>(tableName: nameof(ForceBalanceControlModel.FreedomDecompositionMatrix));
  82. for (int i = 0; i < CurrentModel.FreedomDecompositionMatrix.Length; i++)
  83. {
  84. Communication.Instance.DbConnection.Execute($"INSERT INTO {nameof(ForceBalanceControlModel.FreedomDecompositionMatrix)} (Value) VALUES ({Unsafe.Add(ref CurrentModel.FreedomDecompositionMatrix[0, 0], i)});");
  85. }
  86. }
  87. public override void SetFpga()
  88. {
  89. base.SetFpga();
  90. ShakerFpga.ShakerFpga.Instance.水平力反馈增益.Value = HorizontalForceBalanceGain;
  91. ShakerFpga.ShakerFpga.Instance.竖直力反馈增益.Value = VerticalForceBalanceGain;
  92. ShakerFpga.ShakerFpga.Instance.合成矩阵.Value = [.. CompositionMatrix];
  93. ShakerFpga.ShakerFpga.Instance.自由度分解列矩阵.Value = [.. FreedomDecompositionMatrix];
  94. }
  95. public static ForceBalanceControlViewModel Instance { get; } = new ForceBalanceControlViewModel();
  96. }
  97. }