using IModel; using Shaker.Model; using Shaker.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShakerService.ViewModel { internal sealed class ShakerChannelConfigViewModel:ViewModelBase { private ShakerChannelConfigViewModel():base() { } static ShakerChannelConfigViewModel() { } /// /// 位移通道 /// public IReadOnlyList Displacement =>CurrentModel.Displacement; /// /// 加速度通道 /// public IReadOnlyList Acceleration =>CurrentModel.Acceleration; /// /// 外部输入通道 /// public IReadOnlyList OutSignal =>CurrentModel.OutSignal; /// /// 压差通道 /// public IReadOnlyList DifferentialPressure =>CurrentModel.DifferentialPressure; /// /// 支撑压力通道 /// public IReadOnlyList Pressure =>CurrentModel.Pressure; /// /// 水平缸通道 /// public IReadOnlyList Horizontal =>CurrentModel.Horizontal; /// /// 垂直缸通道 /// public IReadOnlyList Vertical =>CurrentModel.Vertical; /// /// 平衡缸通道 /// public IReadOnlyList Balancing =>CurrentModel.Balancing; private protected override void SaveModel() { base.SaveModel(); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(Displacement)); Communication.Instance.DbConnection.InsertAll(CurrentModel.Displacement, tableName: nameof(Displacement)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(Acceleration)); Communication.Instance.DbConnection.InsertAll(CurrentModel.Acceleration, tableName: nameof(Acceleration)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(OutSignal)); Communication.Instance.DbConnection.InsertAll(CurrentModel.OutSignal, tableName: nameof(OutSignal)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(DifferentialPressure)); Communication.Instance.DbConnection.InsertAll(CurrentModel.DifferentialPressure, tableName: nameof(DifferentialPressure)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(Pressure)); Communication.Instance.DbConnection.InsertAll(CurrentModel.Pressure, tableName: nameof(Pressure)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(Horizontal)); Communication.Instance.DbConnection.InsertAll(CurrentModel.Horizontal, tableName: nameof(Horizontal)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(Vertical)); Communication.Instance.DbConnection.InsertAll(CurrentModel.Vertical, tableName: nameof(Vertical)); Communication.Instance.DbConnection.DeleteAll(tableName: nameof(Balancing)); for(int i=0;i(tableName: nameof(Displacement)); CurrentModel.Displacement = Communication.Instance.DbConnection.Table(tableName: nameof(Displacement))?.ToList() ?? new List(); if(CurrentModel.Displacement.Count>ShakerConfigViewModel.Instance.DisplacementCount) { CurrentModel.Displacement.RemoveRange(ShakerConfigViewModel.Instance.DisplacementCount, CurrentModel.Displacement.Count - ShakerConfigViewModel.Instance.DisplacementCount); } else if(CurrentModel.Displacement.Count(tableName: nameof(Acceleration)); CurrentModel.Acceleration = Communication.Instance.DbConnection.Table(tableName: nameof(Acceleration))?.ToList() ?? new List(); if (CurrentModel.Acceleration.Count > ShakerConfigViewModel.Instance.AccelerationCount) { CurrentModel.Acceleration.RemoveRange(ShakerConfigViewModel.Instance.AccelerationCount, CurrentModel.Acceleration.Count - ShakerConfigViewModel.Instance.AccelerationCount); } else if (CurrentModel.Acceleration.Count < ShakerConfigViewModel.Instance.AccelerationCount) { CurrentModel.Acceleration.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.AccelerationCount - CurrentModel.Acceleration.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.AccelerationCount; i++) { CurrentModel.Acceleration[i].ChannelType = AIChannelType.Acceleration; CurrentModel.Acceleration[i].Sensitivity = CurrentModel.Acceleration[i].Sensitivity == 0 ? 1000 : CurrentModel.Acceleration[i].Sensitivity; } Communication.Instance.DbConnection.CreateTable(tableName: nameof(OutSignal)); CurrentModel.OutSignal = Communication.Instance.DbConnection.Table(tableName: nameof(OutSignal))?.ToList() ?? new List(); if (CurrentModel.OutSignal.Count > ShakerConfigViewModel.Instance.OutSignalCount) { CurrentModel.OutSignal.RemoveRange(ShakerConfigViewModel.Instance.OutSignalCount, CurrentModel.OutSignal.Count - ShakerConfigViewModel.Instance.OutSignalCount); } else if (CurrentModel.OutSignal.Count < ShakerConfigViewModel.Instance.OutSignalCount) { CurrentModel.OutSignal.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.OutSignalCount - CurrentModel.OutSignal.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.OutSignalCount; i++) { CurrentModel.OutSignal[i].ChannelType = AIChannelType.OutSignal; CurrentModel.OutSignal[i].Sensitivity = CurrentModel.OutSignal[i].Sensitivity == 0 ? 1000 : CurrentModel.OutSignal[i].Sensitivity; } Communication.Instance.DbConnection.CreateTable(tableName: nameof(DifferentialPressure)); CurrentModel.DifferentialPressure = Communication.Instance.DbConnection.Table(tableName: nameof(DifferentialPressure))?.ToList() ?? new List(); if (CurrentModel.DifferentialPressure.Count > ShakerConfigViewModel.Instance.DifferentialPressureCount) { CurrentModel.DifferentialPressure.RemoveRange(ShakerConfigViewModel.Instance.DifferentialPressureCount, CurrentModel.DifferentialPressure.Count - ShakerConfigViewModel.Instance.DifferentialPressureCount); } else if (CurrentModel.DifferentialPressure.Count < ShakerConfigViewModel.Instance.DifferentialPressureCount) { CurrentModel.DifferentialPressure.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.DifferentialPressureCount - CurrentModel.DifferentialPressure.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.DifferentialPressureCount; i++) { CurrentModel.DifferentialPressure[i].ChannelType = AIChannelType.DifferentialPressure; CurrentModel.DifferentialPressure[i].Sensitivity = CurrentModel.DifferentialPressure[i].Sensitivity == 0 ? 1000 : CurrentModel.DifferentialPressure[i].Sensitivity; } Communication.Instance.DbConnection.CreateTable(tableName: nameof(Pressure)); CurrentModel.Pressure = Communication.Instance.DbConnection.Table(tableName: nameof(Pressure))?.ToList() ?? new List(); if (CurrentModel.Pressure.Count > ShakerConfigViewModel.Instance.PressureCount) { CurrentModel.Pressure.RemoveRange(ShakerConfigViewModel.Instance.PressureCount, CurrentModel.Pressure.Count - ShakerConfigViewModel.Instance.PressureCount); } else if (CurrentModel.Pressure.Count < ShakerConfigViewModel.Instance.PressureCount) { CurrentModel.Pressure.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.PressureCount - CurrentModel.Pressure.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.PressureCount; i++) { CurrentModel.Pressure[i].ChannelType = AIChannelType.Pressure; CurrentModel.Pressure[i].Sensitivity = CurrentModel.Pressure[i].Sensitivity == 0 ? 1000 : CurrentModel.Pressure[i].Sensitivity; } Communication.Instance.DbConnection.CreateTable(tableName: nameof(Horizontal)); CurrentModel.Horizontal = Communication.Instance.DbConnection.Table(tableName: nameof(Horizontal))?.ToList() ?? new List(); if (CurrentModel.Horizontal.Count > ShakerConfigViewModel.Instance.HorizontalCount) { CurrentModel.Horizontal.RemoveRange(ShakerConfigViewModel.Instance.HorizontalCount, CurrentModel.Horizontal.Count - ShakerConfigViewModel.Instance.HorizontalCount); } else if (CurrentModel.Horizontal.Count < ShakerConfigViewModel.Instance.HorizontalCount) { CurrentModel.Horizontal.AddRange(Enumerable.Repeat(new AOConfigModel(), ShakerConfigViewModel.Instance.HorizontalCount - CurrentModel.Horizontal.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.HorizontalCount; i++) { CurrentModel.Horizontal[i].ChannelType = AOChannelType.Horizontal; } Communication.Instance.DbConnection.CreateTable(tableName: nameof(Vertical)); CurrentModel.Vertical = Communication.Instance.DbConnection.Table(tableName: nameof(Vertical))?.ToList() ?? new List(); if (CurrentModel.Vertical.Count > ShakerConfigViewModel.Instance.VerticalCount) { CurrentModel.Vertical.RemoveRange(ShakerConfigViewModel.Instance.VerticalCount, CurrentModel.Vertical.Count - ShakerConfigViewModel.Instance.VerticalCount); } else if (CurrentModel.Vertical.Count < ShakerConfigViewModel.Instance.VerticalCount) { CurrentModel.Vertical.AddRange(Enumerable.Repeat(new AOConfigModel(), ShakerConfigViewModel.Instance.VerticalCount - CurrentModel.Vertical.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.VerticalCount; i++) { CurrentModel.Vertical[i].ChannelType = AOChannelType.Vertical; } Communication.Instance.DbConnection.Execute($"CREATE TABLE IF NOT EXISTS {nameof(Balancing)} ({nameof(BaseModel.Id)} INTEGER PRIMARY KEY AUTOINCREMENT, Value INT);"); CurrentModel.Balancing = Communication.Instance.DbConnection.Query($"SELECT Value FROM {nameof(Balancing)}")?.ToList() ?? new List(); if (CurrentModel.Balancing.Count > ShakerConfigViewModel.Instance.BalancingCount) { CurrentModel.Balancing.RemoveRange(ShakerConfigViewModel.Instance.BalancingCount, CurrentModel.Balancing.Count - ShakerConfigViewModel.Instance.BalancingCount); } else if (CurrentModel.Balancing.Count < ShakerConfigViewModel.Instance.BalancingCount) { CurrentModel.Balancing.AddRange(Enumerable.Repeat(new AOChannel(), ShakerConfigViewModel.Instance.BalancingCount - CurrentModel.Balancing.Count)); } SaveModel(); } private protected override void UpModel(ShakerChannelConfigModel model) { model.Displacement ??= new List(); if (model.Displacement.Count > ShakerConfigViewModel.Instance.DisplacementCount) { model.Displacement.RemoveRange(ShakerConfigViewModel.Instance.DisplacementCount, model.Displacement.Count - ShakerConfigViewModel.Instance.DisplacementCount); } else if (model.Displacement.Count < ShakerConfigViewModel.Instance.DisplacementCount) { model.Displacement.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.DisplacementCount - model.Displacement.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.DisplacementCount; i++) { model.Displacement[i].ChannelType = AIChannelType.Displacement; model.Displacement[i].Sensitivity = model.Displacement[i].Sensitivity == 0 ? 1000 : model.Displacement[i].Sensitivity; } model.Acceleration ??= new List(); if (model.Acceleration.Count > ShakerConfigViewModel.Instance.AccelerationCount) { model.Acceleration.RemoveRange(ShakerConfigViewModel.Instance.AccelerationCount, model.Acceleration.Count - ShakerConfigViewModel.Instance.AccelerationCount); } else if (model.Acceleration.Count < ShakerConfigViewModel.Instance.AccelerationCount) { model.Acceleration.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.AccelerationCount - model.Acceleration.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.AccelerationCount; i++) { model.Acceleration[i].ChannelType = AIChannelType.Acceleration; model.Acceleration[i].Sensitivity = model.Acceleration[i].Sensitivity == 0 ? 1000 : model.Acceleration[i].Sensitivity; } model.OutSignal ??= new List(); if (model.OutSignal.Count > ShakerConfigViewModel.Instance.OutSignalCount) { model.OutSignal.RemoveRange(ShakerConfigViewModel.Instance.OutSignalCount, model.OutSignal.Count - ShakerConfigViewModel.Instance.OutSignalCount); } else if (model.OutSignal.Count < ShakerConfigViewModel.Instance.OutSignalCount) { model.OutSignal.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.OutSignalCount - model.OutSignal.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.OutSignalCount; i++) { model.OutSignal[i].ChannelType = AIChannelType.OutSignal; model.OutSignal[i].Sensitivity = model.OutSignal[i].Sensitivity == 0 ? 1000 : model.OutSignal[i].Sensitivity; } model.DifferentialPressure ??= new List(); if (model.DifferentialPressure.Count > ShakerConfigViewModel.Instance.DifferentialPressureCount) { model.DifferentialPressure.RemoveRange(ShakerConfigViewModel.Instance.DifferentialPressureCount, model.DifferentialPressure.Count - ShakerConfigViewModel.Instance.DifferentialPressureCount); } else if (model.DifferentialPressure.Count < ShakerConfigViewModel.Instance.DifferentialPressureCount) { model.DifferentialPressure.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.DifferentialPressureCount - model.DifferentialPressure.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.DifferentialPressureCount; i++) { model.DifferentialPressure[i].ChannelType = AIChannelType.DifferentialPressure; model.DifferentialPressure[i].Sensitivity = model.DifferentialPressure[i].Sensitivity == 0 ? 1000 : model.DifferentialPressure[i].Sensitivity; } model.Pressure ??= new List(); if (model.Pressure.Count > ShakerConfigViewModel.Instance.PressureCount) { model.Pressure.RemoveRange(ShakerConfigViewModel.Instance.PressureCount, model.Pressure.Count - ShakerConfigViewModel.Instance.PressureCount); } else if (model.Pressure.Count < ShakerConfigViewModel.Instance.PressureCount) { model.Pressure.AddRange(Enumerable.Repeat(new AIConfigModel(), ShakerConfigViewModel.Instance.PressureCount - model.Pressure.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.PressureCount; i++) { model.Pressure[i].ChannelType = AIChannelType.Pressure; model.Pressure[i].Sensitivity = model.Pressure[i].Sensitivity == 0 ? 1000 : model.Pressure[i].Sensitivity; } model.Horizontal ??= new List(); if (model.Horizontal.Count > ShakerConfigViewModel.Instance.HorizontalCount) { model.Horizontal.RemoveRange(ShakerConfigViewModel.Instance.HorizontalCount, model.Horizontal.Count - ShakerConfigViewModel.Instance.HorizontalCount); } else if (model.Horizontal.Count < ShakerConfigViewModel.Instance.HorizontalCount) { model.Horizontal.AddRange(Enumerable.Repeat(new AOConfigModel(), ShakerConfigViewModel.Instance.HorizontalCount - model.Horizontal.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.HorizontalCount; i++) { model.Horizontal[i].ChannelType = AOChannelType.Horizontal; } model.Vertical ??= new List(); if (model.Vertical.Count > ShakerConfigViewModel.Instance.VerticalCount) { model.Vertical.RemoveRange(ShakerConfigViewModel.Instance.VerticalCount, model.Vertical.Count - ShakerConfigViewModel.Instance.VerticalCount); } else if (model.Vertical.Count < ShakerConfigViewModel.Instance.VerticalCount) { model.Vertical.AddRange(Enumerable.Repeat(new AOConfigModel(), ShakerConfigViewModel.Instance.VerticalCount - model.Vertical.Count)); } for (int i = 0; i < ShakerConfigViewModel.Instance.VerticalCount; i++) { model.Vertical[i].ChannelType = AOChannelType.Vertical; } model.Balancing ??= new List(); if (model.Balancing.Count > ShakerConfigViewModel.Instance.BalancingCount) { model.Balancing.RemoveRange(ShakerConfigViewModel.Instance.BalancingCount, model.Balancing.Count - ShakerConfigViewModel.Instance.BalancingCount); } else if (model.Balancing.Count < ShakerConfigViewModel.Instance.BalancingCount) { model.Balancing.AddRange(Enumerable.Repeat(new AOChannel(), ShakerConfigViewModel.Instance.BalancingCount - model.Balancing.Count)); } base.UpModel(model); } public override void SetFpga() { base.SetFpga(); ShakerFpga.ShakerFpga.Instance.位移通道.Values = [.. Displacement.Select(x => (byte)x.Channel)]; /* * 位移灵敏度用户设置的单位为mv/mm,在这里需要转换成mm/V */ ShakerFpga.ShakerFpga.Instance.位移灵敏度.Value = [.. Displacement.Select(x => 1000 / x.Sensitivity)]; ShakerFpga.ShakerFpga.Instance.位移直偏.Value = [.. Displacement.Select(x => x.Bias)]; ShakerFpga.ShakerFpga.Instance.加速度通道.Values = [.. Acceleration.Select(x => (byte)x.Channel)]; /* * 加速度灵敏度用户设置的单位为mv/g,在这里需要转换成g/V */ ShakerFpga.ShakerFpga.Instance.加速度灵敏度.Value = [.. Acceleration.Select(x =>1000/ x.Sensitivity)]; ShakerFpga.ShakerFpga.Instance.外部输入通道.Values = [.. OutSignal.Select(x => (byte)x.Channel)]; ShakerFpga.ShakerFpga.Instance.外部输入增益.Value = [.. OutSignal.Select(x => x.Sensitivity)]; ShakerFpga.ShakerFpga.Instance.压差通道.Values = [.. DifferentialPressure.Select(x => (byte)x.Channel)]; ShakerFpga.ShakerFpga.Instance.压差直偏.Value = [.. DifferentialPressure.Select(x => x.Bias)]; /* * 压差灵敏度用户设置的单位为V/MPa,在这里需要转换成MPa/V */ ShakerFpga.ShakerFpga.Instance.压差灵敏度.Value = [.. DifferentialPressure.Select(x => 1/x.Sensitivity)]; ShakerFpga.ShakerFpga.Instance.支撑压力通道.Values = [.. Pressure.Select(x => (byte)x.Channel)]; ShakerFpga.ShakerFpga.Instance.支撑压力直偏.Value = [.. Pressure.Select(x => x.Bias)]; /* * 支撑压力灵敏度用户设置的单位为V/MPa,在这里需要转换成MPa/V */ ShakerFpga.ShakerFpga.Instance.支撑压力灵敏度.Value = [.. Pressure.Select(x => 1/x.Sensitivity)]; ShakerFpga.ShakerFpga.Instance.平衡缸通道.Values = [.. Balancing.Select(x => (byte)x)]; ShakerFpga.ShakerFpga.Instance.水平缸通道.Values = [.. Horizontal.Select(x => (byte)x.Channel)]; ShakerFpga.ShakerFpga.Instance.垂直缸通道.Values = [.. Vertical.Select(x => (byte)x.Channel)]; ShakerFpga.ShakerFpga.Instance.伺服驱动直偏.Value = [.. Horizontal.Select(x => x.Bias),..Vertical.Select(x => x.Bias)]; ShakerFpga.ShakerFpga.Instance.伺服缸极性.Values = [.. Horizontal.Select(x => x.Polarity == Shaker.Model.Polarity.Positive), ..Vertical.Select(x => x.Polarity == Shaker.Model.Polarity.Positive)]; ShakerFpga.ShakerFpga.Instance.伺服开环.Values = [.. Horizontal.Select(x => x.OpenLoop), .. Vertical.Select(x => x.OpenLoop)]; ShakerFpga.ShakerFpga.Instance.伺服阀开环驱动.Value = [.. Horizontal.Select(x => x.OpenLoopDriver), .. Vertical.Select(x => x.OpenLoopDriver)]; } public static ShakerChannelConfigViewModel Instance { get; } = new ShakerChannelConfigViewModel(); } }