diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-05-14 08:45:03 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-05-14 08:45:03 +0300 |
| commit | bec7c8a5c429bb3dc7ca8b6874db8fce6ed6bdce (patch) | |
| tree | a9240422fc1d6c6233bcc635996cc86ab81e7fd0 /Software/Visual_Studio | |
| parent | 4b660ec84e2b0527d67d5146031c7be7cac8bd17 (diff) | |
| download | Tango-bec7c8a5c429bb3dc7ca8b6874db8fce6ed6bdce.tar.gz Tango-bec7c8a5c429bb3dc7ca8b6874db8fce6ed6bdce.zip | |
Diagnostics User Settings Merging !
Diffstat (limited to 'Software/Visual_Studio')
9 files changed, 383 insertions, 48 deletions
diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/DiagnosticsPackage.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/DiagnosticsPackage.cs index 2a41b2efe..70720676f 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/DiagnosticsPackage.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/DiagnosticsPackage.cs @@ -13,6 +13,8 @@ namespace Tango.FSE.Diagnostics { public class DiagnosticsPackage { + private static Dictionary<String, PropertyInfo> _monitorsProperties; + /// <summary> /// Gets or sets the frame. /// </summary> @@ -21,14 +23,27 @@ namespace Tango.FSE.Diagnostics /// <summary> /// Gets or sets the monitors properties. /// </summary> - public Dictionary<String, PropertyInfo> MonitorsProperties { get; set; } + public Dictionary<String, PropertyInfo> MonitorsProperties { get; private set; } + + /// <summary> + /// Initializes the <see cref="DiagnosticsPackage"/> class. + /// </summary> + static DiagnosticsPackage() + { + _monitorsProperties = new Dictionary<string, PropertyInfo>(); + + foreach (var prop in typeof(DiagnosticsMonitors).GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList()) + { + _monitorsProperties.Add(prop.Name, prop); + } + } /// <summary> /// Initializes a new instance of the <see cref="DiagnosticsPackage"/> class. /// </summary> public DiagnosticsPackage() { - MonitorsProperties = new Dictionary<string, PropertyInfo>(); + MonitorsProperties = _monitorsProperties; } /// <summary> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsConfigurableWidget.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsConfigurableWidget.cs index ac1d29847..90ad17055 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsConfigurableWidget.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsConfigurableWidget.cs @@ -8,34 +8,21 @@ namespace Tango.FSE.Diagnostics.Project { public abstract class DiagnosticsConfigurableWidget : DiagnosticsWidget { - public DiagnosticsWidgetSettings Settings { get; set; } - } - - public abstract class DiagnosticsConfigurableWidget<T> : DiagnosticsConfigurableWidget where T : DiagnosticsWidgetSettings, new() - { - private T _settings; - public new T Settings + private DiagnosticsWidgetSettings _settings; + public DiagnosticsWidgetSettings Settings { get { return _settings; } set { _settings = value; - RaisePropertyChangedAuto(); - - if (_settings != null) + if (value != null) { - base.Settings = value; OnSettingsChanged(); - _settings.PropertyChanged += _settings_PropertyChanged; + value.PropertyChanged += _settings_PropertyChanged; } } } - public DiagnosticsConfigurableWidget() : base() - { - Settings = new T(); - } - private void _settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { OnSettingsChanged(); @@ -46,4 +33,22 @@ namespace Tango.FSE.Diagnostics.Project } } + + public abstract class DiagnosticsConfigurableWidget<T> : DiagnosticsConfigurableWidget where T : DiagnosticsWidgetSettings, new() + { + public new T Settings + { + get { return base.Settings as T; } + set + { + base.Settings = value; + RaisePropertyChangedAuto(); + } + } + + public DiagnosticsConfigurableWidget() : base() + { + Settings = new T(); + } + } } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsProject.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsProject.cs index bc93f4101..2a6bb5888 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsProject.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsProject.cs @@ -17,6 +17,11 @@ namespace Tango.FSE.Diagnostics.Project public String Name { get; set; } public ObservableCollection<DiagnosticsProjectTab> Tabs { get; set; } + public List<DiagnosticsWidget> FlattenWidgets() + { + return Tabs.SelectMany(x => x.Widgets).ToList(); + } + static DiagnosticsProject() { _settings = new JsonSerializerSettings() diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserSettingsCollection.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserSettingsCollection.cs new file mode 100644 index 000000000..35bc164b9 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserSettingsCollection.cs @@ -0,0 +1,100 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.ExtensionMethods; + +namespace Tango.FSE.Diagnostics.Project +{ + public class DiagnosticsUserSettingsCollection + { + private static JsonSerializerSettings _settings; + + public List<DiagnosticsUserWidgetSettings> Widgets { get; set; } + + public T GetWidgetSettings<T>(DiagnosticsConfigurableWidget widget) where T : DiagnosticsWidgetSettings + { + return GetWidgetSettings(widget) as T; + } + + public DiagnosticsWidgetSettings GetWidgetSettings(DiagnosticsConfigurableWidget widget) + { + var record = Widgets.FirstOrDefault(x => x.WidgetID == widget.ID); + if (record != null) + { + return record.Settings; + } + + return null; + } + + public void ApplyWidgetSettings(DiagnosticsConfigurableWidget widget) + { + var record = Widgets.FirstOrDefault(x => x.WidgetID == widget.ID); + if (record != null) + { + if (widget.Settings == null) + { + widget.Settings = record.Settings; + } + else + { + record.Settings.MapPropertiesTo(widget.Settings, MappingFlags.All, (prop) => prop.GetCustomAttribute<JsonIgnoreAttribute>() == null); + } + } + } + + public void SetWidgetSettings(DiagnosticsConfigurableWidget widget) + { + var record = Widgets.FirstOrDefault(x => x.WidgetID == widget.ID); + if (record == null) + { + record = new DiagnosticsUserWidgetSettings() + { + WidgetID = widget.ID, + }; + Widgets.Add(record); + } + + record.Settings = widget.Settings; + } + + static DiagnosticsUserSettingsCollection() + { + _settings = new JsonSerializerSettings() + { + TypeNameHandling = TypeNameHandling.Auto, + Formatting = Formatting.Indented + }; + } + + public DiagnosticsUserSettingsCollection() + { + Widgets = new List<DiagnosticsUserWidgetSettings>(); + } + + public String ToJson() + { + return JsonConvert.SerializeObject(this, _settings); + } + + public static DiagnosticsUserSettingsCollection FromJson(String json) + { + return JsonConvert.DeserializeObject<DiagnosticsUserSettingsCollection>(json, _settings); + } + + public void ToFile(String fileName) + { + File.WriteAllText(fileName, ToJson()); + } + + public static DiagnosticsUserSettingsCollection FromFile(String fileName) + { + return FromJson(File.ReadAllText(fileName)); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserSettingsManager.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserSettingsManager.cs new file mode 100644 index 000000000..1e3684733 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserSettingsManager.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.FSE.Diagnostics.Project +{ + public class DiagnosticsUserSettingsManager : ExtendedObject + { + private static object _syncLock = new object(); + + private static DiagnosticsUserSettingsManager _default; + public static DiagnosticsUserSettingsManager Default + { + get + { + if (_default == null) + { + _default = new DiagnosticsUserSettingsManager(); + } + + return _default; + } + } + + public String FilePath { get; protected set; } + + public DiagnosticsUserSettingsCollection Settings { get; set; } + + private DiagnosticsUserSettingsManager() + { + Settings = new DiagnosticsUserSettingsCollection(); + FilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Twine", "Tango", "Diagnostics", Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName) + ".User.json"); + Reload(); + } + + public void Reload() + { + try + { + Settings = DiagnosticsUserSettingsCollection.FromFile(FilePath); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error loading diagnostics user settings."); + } + } + + public void ClearGhostRecords(List<DiagnosticsConfigurableWidget> widgets) + { + Settings.Widgets.RemoveAll(x => !widgets.Exists(y => y.ID == x.WidgetID)); + } + + public void Save() + { + lock (_syncLock) + { + Directory.CreateDirectory(Path.GetDirectoryName(FilePath)); + Settings.ToFile(FilePath); + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserWidgetSettings.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserWidgetSettings.cs new file mode 100644 index 000000000..855bd31f9 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Project/DiagnosticsUserWidgetSettings.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.FSE.Diagnostics.Project +{ + public class DiagnosticsUserWidgetSettings + { + public String WidgetID { get; set; } + public DiagnosticsWidgetSettings Settings { get; set; } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Tango.FSE.Diagnostics.csproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Tango.FSE.Diagnostics.csproj index c6a3efbeb..69c89e265 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Tango.FSE.Diagnostics.csproj +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/Tango.FSE.Diagnostics.csproj @@ -102,6 +102,9 @@ <Compile Include="Project\DiagnosticsProjectTab.cs" /> <Compile Include="Project\DiagnosticsProjectTabColumnDefinition.cs" /> <Compile Include="Project\DiagnosticsProjectTabRowDefinition.cs" /> + <Compile Include="Project\DiagnosticsUserSettingsCollection.cs" /> + <Compile Include="Project\DiagnosticsUserSettingsManager.cs" /> + <Compile Include="Project\DiagnosticsUserWidgetSettings.cs" /> <Compile Include="Project\DiagnosticsWidget.cs" /> <Compile Include="Project\DiagnosticsWidgetSettings.cs" /> <Compile Include="Project\Widgets\Dispenser\DispenserWidget.cs" /> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/ViewModels/DiagnosticsViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/ViewModels/DiagnosticsViewVM.cs index d8d22dd70..955562472 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/ViewModels/DiagnosticsViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/ViewModels/DiagnosticsViewVM.cs @@ -16,7 +16,6 @@ namespace Tango.FSE.Diagnostics.ViewModels { public class DiagnosticsViewVM : FSEViewModel { - private Dictionary<String, PropertyInfo> _monitorsProperties; private bool _isLoaded; private string _diagnosticsProjectFile; private FileSystemWatcher _diagnosticsProjectFileWatcher; @@ -53,13 +52,6 @@ namespace Tango.FSE.Diagnostics.ViewModels public DiagnosticsViewVM() { - _monitorsProperties = new Dictionary<string, PropertyInfo>(); - - foreach (var prop in typeof(DiagnosticsMonitors).GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList()) - { - _monitorsProperties.Add(prop.Name, prop); - } - Tabs = new ObservableCollection<DiagnosticsTabViewVM>(); Project = new DiagnosticsProject(); @@ -115,19 +107,24 @@ namespace Tango.FSE.Diagnostics.ViewModels private async Task LoadProject() { - Project = DiagnosticsProject.FromFile(_diagnosticsProjectFile); - try { IsLoadingProject = true; _isLoaded = false; + Project = DiagnosticsProject.FromFile(_diagnosticsProjectFile); + await Services.TechComponentsService.Preload(); foreach (var widget in Project.Tabs.SelectMany(x => x.Widgets)) { try { + if (widget is DiagnosticsConfigurableWidget) + { + DiagnosticsUserSettingsManager.Default.Settings.ApplyWidgetSettings(widget as DiagnosticsConfigurableWidget); + } + await widget.Init(); } catch (Exception ex) @@ -171,7 +168,6 @@ namespace Tango.FSE.Diagnostics.ViewModels tab.PopulateDiagnosticsData(new DiagnosticsPackage() { Frame = frame, - MonitorsProperties = _monitorsProperties }); } } @@ -186,6 +182,7 @@ namespace Tango.FSE.Diagnostics.ViewModels try { Project.ToFile(result.SelectedItem); + SaveUserSettings(); await NotificationProvider.ShowSuccess("Diagnostics project exported successfully."); } catch (Exception ex) @@ -195,5 +192,43 @@ namespace Tango.FSE.Diagnostics.ViewModels } } } + + public override void OnApplicationShuttingDown() + { + base.OnApplicationShuttingDown(); + + SaveUserSettings(); + } + + private void SaveUserSettings() + { + try + { + foreach (var widget in Project.FlattenWidgets()) + { + try + { + if (widget is DiagnosticsConfigurableWidget) + { + DiagnosticsUserSettingsManager.Default.Settings.SetWidgetSettings(widget as DiagnosticsConfigurableWidget); + } + } + catch (Exception ex) + { + LogManager.Log(ex, $"Error saving widget user settings for widget '{widget.DisplayName}'."); + } + } + + //If you are going to work with different projects in the future you need to remote this. + //Because it will erase any settings other than for the current project. + DiagnosticsUserSettingsManager.Default.ClearGhostRecords(Project.FlattenWidgets().OfType<DiagnosticsConfigurableWidget>().ToList()); + + DiagnosticsUserSettingsManager.Default.Save(); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error saving diagnostics user settings collection."); + } + } } } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/diagnostics.json b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/diagnostics.json index a2d9286b5..4c68e4075 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/diagnostics.json +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Diagnostics/diagnostics.json @@ -82,86 +82,167 @@ "Widgets": [ { "$type": "Tango.FSE.Diagnostics.Project.Widgets.RealTimeGraph.RealTimeGraphWidget, Tango.FSE.Diagnostics", - "Monitor": "Dancer2Angle", "Column": 0, "Row": 0, "ColumnSpan": 3, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0, + "Settings": { + "Duration": "00:10:00", + "DecimalPlaces": 0, + "Min": 0.0, + "Max": 1000.0, + "AutoRange": true, + "Color": "#FF1E90FF" + }, + "Monitor": "Dancer2Angle", + "ID": "632ba431-4875-46f9-b9d6-39cbef3de2e5" }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.RealTimeGraph.RealTimeGraphWidget, Tango.FSE.Diagnostics", - "Monitor": "Dancer2Angle", "Column": 3, "Row": 0, "ColumnSpan": 3, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0, + "Settings": { + "Duration": "00:10:00", + "DecimalPlaces": 0, + "Min": 0.0, + "Max": 1000.0, + "AutoRange": true, + "Color": "#FF1E90FF" + }, + "Monitor": "Dancer2Angle", + "ID": "3e8ab666-ab5d-4f14-979c-bcad02007802" }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.RealTimeGraph.RealTimeGraphWidget, Tango.FSE.Diagnostics", - "Monitor": "Dancer2Angle", "Column": 6, "Row": 0, "ColumnSpan": 3, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0, + "Settings": { + "Duration": "00:10:00", + "DecimalPlaces": 0, + "Min": 0.0, + "Max": 1000.0, + "AutoRange": true, + "Color": "#FF1E90FF" + }, + "Monitor": "Dancer2Angle", + "ID": "1b6580fb-ef48-42f6-a340-775b5f586dad" }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.RealTimeGraph.RealTimeGraphWidget, Tango.FSE.Diagnostics", - "Monitor": "Dancer2Angle", "Column": 9, "Row": 0, "ColumnSpan": 3, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0, + "Settings": { + "Duration": "00:10:00", + "DecimalPlaces": 0, + "Min": 0.0, + "Max": 1000.0, + "AutoRange": true, + "Color": "#FF1E90FF" + }, + "Monitor": "Dancer2Angle", + "ID": "4f22da27-4b60-4ea1-871b-73b091cecdb9" }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.RealTimeGraphMultiChannel.RealTimeGraphMultiChannelWidget, Tango.FSE.Diagnostics", - "Monitor": "DispensersMotorsFrequency", "Column": 0, "Row": 3, "ColumnSpan": 3, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0, + "Settings": { + "Duration": "00:10:00", + "DecimalPlaces": 0, + "Min": 0.0, + "Max": 1000.0, + "AutoRange": true, + "Color": "#FF1E90FF" + }, + "Monitor": "DispensersMotorsFrequency", + "ID": "a72aa86c-ae39-42cc-8ca8-340abd4dd7f2" }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.Monitor.MonitorWidget, Tango.FSE.Diagnostics", "Monitor": "Dancer2Angle", + "Settings": { + "DecimalPlaces": 0, + "Color": "#FFDCDCDC" + }, + "ID": "90899668-6cce-4f51-a401-3039fb2226b8", "Column": 0, "Row": 6, "ColumnSpan": 3, "RowSpan": 2, - "Width": 50 + "Width": 50.0, + "Height": 100.0 }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.Input.InputWidget, Tango.FSE.Diagnostics", "IO": "LS_DH_CLEAN_DOWN", + "ID": "3010722d-ef21-4c86-ad23-19956108169b", "Column": 1, "Row": 8, "ColumnSpan": 1, - "RowSpan": 1 + "RowSpan": 1, + "Width": 100.0, + "Height": 100.0 }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.Motor.MotorWidget, Tango.FSE.Diagnostics", "Motor": "MOTO_DH_CLEANHEAD", + "Settings": { + "Speed": 400, + "Color": "#FF79FF00" + }, + "ID": "625be286-0670-4784-b1ef-d78f854c4072", "Column": 3, "Row": 8, "ColumnSpan": 4, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0 }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.Dispenser.DispenserWidget, Tango.FSE.Diagnostics", "Dispenser": "Dispenser2", + "Settings": { + "Speed": 400, + "Color": "#FF141414" + }, + "ID": "86e5683c-a9dc-46f4-a88b-087bff6f8432", "Column": 8, "Row": 8, "ColumnSpan": 4, - "RowSpan": 3 + "RowSpan": 3, + "Width": 100.0, + "Height": 100.0 }, { "$type": "Tango.FSE.Diagnostics.Project.Widgets.Valve.ValveWidget, Tango.FSE.Diagnostics", "Valve": "DispenserValve2", + "Settings": {}, + "ID": "4829f0da-e128-42f9-a4af-621e895df3ef", "Column": 3, "Row": 3, "ColumnSpan": 3, - "RowSpan": 2 + "RowSpan": 2, + "Width": 100.0, + "Height": 100.0 } - ] }, { @@ -245,11 +326,22 @@ "Widgets": [ { "$type": "Tango.FSE.Diagnostics.Project.Widgets.RealTimeGraph.RealTimeGraphWidget, Tango.FSE.Diagnostics", - "Monitor": "Dancer2Angle", "Column": 2, "Row": 2, "ColumnSpan": 6, - "RowSpan": 6 + "RowSpan": 6, + "Width": 100.0, + "Height": 100.0, + "Settings": { + "Duration": "00:10:00", + "DecimalPlaces": 0, + "Min": 0.0, + "Max": 1000.0, + "AutoRange": true, + "Color": "#FF1E90FF" + }, + "Monitor": "Dancer2Angle", + "ID": "e1da6427-d164-42f7-a4a8-44f804dd51df" } ] } |
