aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy@twine-s.com>2020-12-30 15:11:34 +0000
committerRoy Ben Shabat <Roy@twine-s.com>2020-12-30 15:11:34 +0000
commitd33c19b3ac6803de4b5c8d475832efef131c1a45 (patch)
treeea725abc39def99a755b041c13cba1fe0d594ddc /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels
parent1bdcaa9f51303bbff682507f31fb3b4414692ca4 (diff)
downloadTango-d33c19b3ac6803de4b5c8d475832efef131c1a45.tar.gz
Tango-d33c19b3ac6803de4b5c8d475832efef131c1a45.zip
Revert "Hope it is fine"
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs331
1 files changed, 240 insertions, 91 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
index f6b8a35df..8f5c67f96 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
@@ -41,6 +41,7 @@ using RealTimeGraphX.WPF;
using Tango.Core.ExtensionMethods;
using System.Diagnostics;
using Tango.BL.Builders;
+using Tango.Core;
namespace Tango.MachineStudio.Technician.ViewModels
{
@@ -79,6 +80,12 @@ namespace Tango.MachineStudio.Technician.ViewModels
private DateTime _last_time = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
private Machine _machine;
private List<PackColor> _packsColors;
+ private int _diagnostics_index = 0;
+ private DateTime _diagnosticsStartTime;
+ private DateTime _diagnosticsNowTime;
+
+ private ProducerConsumerQueue<StartDiagnosticsResponse> _framesQueue;
+ private Thread _populateFramesThread;
#region Properties
@@ -113,6 +120,8 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
_selectedTab.IsSelected = true;
}
+
+ EnableRenderingForSelectedTabGraphs();
}
}
@@ -309,6 +318,8 @@ namespace Tango.MachineStudio.Technician.ViewModels
/// <param name="notificationProvider">The notification provider.</param>
public MachineTechViewVM(IStudioApplicationManager applicationManager, INotificationProvider notificationProvider, IDiagnosticsFrameProvider diagnosticsFrameProvider, IEventLogger eventLogger)
{
+ _framesQueue = new ProducerConsumerQueue<StartDiagnosticsResponse>();
+
Tabs = new ObservableCollection<MachineTechTabVM>();
Tabs.Add(new MachineTechTabVM() { IsSelected = true, Name = "Untitled" });
SelectedTab = Tabs.First();
@@ -411,7 +422,7 @@ namespace Tango.MachineStudio.Technician.ViewModels
PackColor pc = new PackColor();
pc.Index = pack.PackIndex;
pc.Name = pack.LiquidType.Name;
-
+
if (pack.LiquidType.LiquidTypeColor == Colors.Black)
{
pc.Color = Colors.Gray;
@@ -443,26 +454,52 @@ namespace Tango.MachineStudio.Technician.ViewModels
/// <param name="response">The response.</param>
private void DiagnosticsFrameProvider_FrameReceived(object sender, StartDiagnosticsResponse response)
{
- PopulateDiagnosticsData(response);
+ _framesQueue.BlockEnqueue(response);
}
#endregion
#region Populate Diagnostics Data
+ private void PopulateFramesThreadMethod()
+ {
+ while (!ApplicationManager.IsShuttingDown)
+ {
+ var frame = _framesQueue.BlockDequeue();
+ PopulateDiagnosticsData(frame);
+ }
+ }
+
/// <summary>
/// Populates the diagnostics data to the proper elements.
/// </summary>
/// <param name="data">The data.</param>
private void PopulateDiagnosticsData(StartDiagnosticsResponse data)
{
- if (data.Monitors == null) return;
+ if (data.Monitors == null || _machineOperator == null || _machineOperator.DeviceInformation == null) return;
+
+ _diagnostics_index++;
+ uint interval = _machineOperator.DeviceInformation.DiagnosticsInterval;
TimeSpan delta_base = DateTime.Now - _start_time;
TimeSpan delta = (DateTime.Now - _last_time);
- double delta_mili = delta.TotalMilliseconds;
_last_time = DateTime.Now;
+ if (data.ElapsedMilli > 0)
+ {
+ _diagnosticsNowTime = DateTime.ParseExact(data.DateTime, "MM/dd/yyyy HH:mm:ss.fff", null); //_diagnosticsNowTime.Add(TimeSpan.FromMilliseconds(data.ElapsedMilli));
+ //var now = _diagnosticsStartTime.Add(TimeSpan.FromMilliseconds(interval * _diagnostics_index));
+ //Debug.WriteLine("DeltaBase Before: " + delta_base);
+ delta_base = _diagnosticsNowTime - _start_time;
+ //Debug.WriteLine("DeltaBase After: " + delta_base);
+
+ //Debug.WriteLine("Delta Before: " + delta);
+ delta = TimeSpan.FromMilliseconds(data.ElapsedMilli);
+ //Debug.WriteLine("Delta After: " + delta);
+ }
+
+ double delta_mili = delta.TotalMilliseconds;
+
if (DateTime.Now > _lastDiagnosticsResponseUpdate.AddMilliseconds(MIN_DIAGNOSTICS_UPDATE_MILI))
{
CurrentDiagnosticsResponse = data;
@@ -479,7 +516,11 @@ namespace Tango.MachineStudio.Technician.ViewModels
if (prop != null)
{
var points = GetDataArray(techMonitor, prop.GetValue(data.Monitors));
- sr.PushData(points, delta_base, delta);
+
+ if (points.Count > 0)
+ {
+ sr.PushData(points, delta_base, delta);
+ }
}
}
@@ -492,15 +533,20 @@ namespace Tango.MachineStudio.Technician.ViewModels
if (prop != null)
{
var points = GetDataMatrix(techMonitor, prop.GetValue(data.Monitors));
- mr.PushData(points, delta_base, delta);
+ if (points.Count > 0)
+ {
+ mr.PushData(points, delta_base, delta);
+ }
}
}
lock (_elementsLock)
{
var elements = Tabs.SelectMany(x => x.Elements).ToList();
+ var selectedTabElements = SelectedTab.Elements.ToList();
- foreach (var item in elements.Select(x => x.HostedElement as TechItem))
+ //Can be updated only when visible
+ foreach (var item in selectedTabElements.Select(x => x.HostedElement as TechItem))
{
if (item.GetType() == typeof(MonitorItem))
{
@@ -530,7 +576,79 @@ namespace Tango.MachineStudio.Technician.ViewModels
}
}
}
- else if (item.GetType() == typeof(SingleGraphItem))
+ else if (item.GetType() == typeof(DigitalOutItem))
+ {
+ DigitalOutItem digitalOutItem = item as DigitalOutItem;
+
+ var digitalPin = data.DigitalInterfaceStates.SingleOrDefault(x => x.InterfaceIO == (InterfaceIOs)digitalOutItem.TechIo.Code);
+
+ if (digitalPin != null)
+ {
+ digitalOutItem.EffectiveValue = digitalPin.Value;
+ }
+ }
+ else if (item.GetType() == typeof(DigitalInItem))
+ {
+ DigitalInItem digitalInItem = item as DigitalInItem;
+
+ var digitalPin = data.DigitalInterfaceStates.SingleOrDefault(x => x.InterfaceIO == (InterfaceIOs)digitalInItem.TechIo.Code);
+
+ if (digitalPin != null)
+ {
+ digitalInItem.Value = digitalPin.Value;
+ }
+ }
+ else if (item.GetType() == typeof(HeaterItem))
+ {
+ HeaterItem heaterItem = item as HeaterItem;
+
+ var heaterState = data.HeatersStates.SingleOrDefault(x => x.HeaterType == (HeaterType)heaterItem.TechHeater.Code);
+
+ if (heaterState != null)
+ {
+ heaterItem.HeaterState = heaterState;
+ }
+ }
+ else if (item.GetType() == typeof(ValveItem))
+ {
+ ValveItem valveItem = item as ValveItem;
+
+ var valveState = data.ValvesStates.SingleOrDefault(x => x.ValveType == (ValveType)valveItem.TechValve.Code);
+
+ if (valveState != null)
+ {
+ valveItem.EffectiveState = valveState.State;
+ }
+ }
+ else if (item.GetType() == typeof(BlowerItem))
+ {
+ BlowerItem blowerItem = item as BlowerItem;
+
+ if (data.Monitors.BlowerVoltage.Count > 0)
+ {
+ blowerItem.EffectiveActive = data.Monitors.BlowerVoltage.Last() > 0;
+ }
+ }
+ else if (item.GetType() == typeof(ControllerItem))
+ {
+ ControllerItem controllerItem = item as ControllerItem;
+
+ if (DateTime.Now > controllerItem.LastUpdateTime.AddMilliseconds(controllerItem.UpdateInterval))
+ {
+ var componentState = data.ComponentsStates.SingleOrDefault(x => (int)x.Component == controllerItem.TechController.Code);
+
+ if (componentState != null)
+ {
+ controllerItem.EffectiveValue = componentState.Value;
+ }
+ }
+ }
+ }
+
+ //Must be updated all the time.
+ foreach (var item in elements.Select(x => x.HostedElement as TechItem))
+ {
+ if (item.GetType() == typeof(SingleGraphItem))
{
SingleGraphItem graphItem = item as SingleGraphItem;
@@ -544,20 +662,23 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
var points = GetDataArray(graphItem.TechMonitor, prop.GetValue(data.Monitors));
- List<TimeSpanDataPoint> times = new List<TimeSpanDataPoint>();
- var dPoints = points.Select(x => new DoubleDataPoint(x)).ToList();
-
- for (int i = 0; i < points.Count; i++)
+ if (points.Count > 0)
{
- times.Add(delta_base.Add(TimeSpan.FromMilliseconds((delta_mili / points.Count) * i)));
- }
+ List<TimeSpanDataPoint> times = new List<TimeSpanDataPoint>();
+ var dPoints = points.Select(x => new DoubleDataPoint(x)).ToList();
- controller.PushData(times, dPoints);
+ for (int i = 0; i < points.Count; i++)
+ {
+ times.Add(delta_base.Add(TimeSpan.FromMilliseconds((delta_mili / points.Count) * i)));
+ }
- var _graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.Tag == graphItem);
- if (_graph_recording != null)
- {
- _graph_recording.PushData(points, delta_base, delta);
+ controller.PushData(times, dPoints);
+
+ var _graph_recording = _single_graphs_recordings.SingleOrDefault(x => x.Tag == graphItem);
+ if (_graph_recording != null)
+ {
+ _graph_recording.PushData(points, delta_base, delta);
+ }
}
}
}
@@ -620,70 +741,82 @@ namespace Tango.MachineStudio.Technician.ViewModels
}
}
}
- else if (item.GetType() == typeof(DigitalOutItem))
- {
- DigitalOutItem digitalOutItem = item as DigitalOutItem;
+ }
+ }
+ }
- var digitalPin = data.DigitalInterfaceStates.SingleOrDefault(x => x.InterfaceIO == (InterfaceIOs)digitalOutItem.TechIo.Code);
+ #endregion
- if (digitalPin != null)
- {
- digitalOutItem.EffectiveValue = digitalPin.Value;
- }
- }
- else if (item.GetType() == typeof(DigitalInItem))
- {
- DigitalInItem digitalInItem = item as DigitalInItem;
+ #region Private Methods
- var digitalPin = data.DigitalInterfaceStates.SingleOrDefault(x => x.InterfaceIO == (InterfaceIOs)digitalInItem.TechIo.Code);
+ private void EnableRenderingForSelectedTabGraphs()
+ {
+ if (SelectedTab != null)
+ {
+ lock (_elementsLock)
+ {
+ var elements = Tabs.SelectMany(x => x.Elements).ToList();
- if (digitalPin != null)
- {
- digitalInItem.Value = digitalPin.Value;
- }
- }
- else if (item.GetType() == typeof(HeaterItem))
+ foreach (var element in elements)
{
- HeaterItem heaterItem = item as HeaterItem;
+ if (SelectedTab.Elements.Contains(element))
+ {
+ var item = element.HostedElement as TechItem;
- var heaterState = data.HeatersStates.SingleOrDefault(x => x.HeaterType == (HeaterType)heaterItem.TechHeater.Code);
+ if (item != null)
+ {
+ if (item.GetType() == typeof(SingleGraphItem))
+ {
+ SingleGraphItem graphItem = item as SingleGraphItem;
- if (heaterState != null)
- {
- heaterItem.HeaterState = heaterState;
- }
- }
- else if (item.GetType() == typeof(ValveItem))
- {
- ValveItem valveItem = item as ValveItem;
+ TechGraphController controller = null;
- var valveState = data.ValvesStates.SingleOrDefault(x => x.ValveType == (ValveType)valveItem.TechValve.Code);
+ if (_singleControllers.TryGetValue(graphItem, out controller))
+ {
+ controller.DisableRendering = false;
+ }
+ }
+ else if (item.GetType() == typeof(MultiGraphItem))
+ {
+ MultiGraphItem graphItem = item as MultiGraphItem;
- if (valveState != null)
- {
- valveItem.EffectiveState = valveState.State;
- }
- }
- else if (item.GetType() == typeof(BlowerItem))
- {
- BlowerItem blowerItem = item as BlowerItem;
+ TechGraphController controller = null;
- if (data.Monitors.BlowerVoltage.Count > 0)
- {
- blowerItem.EffectiveActive = data.Monitors.BlowerVoltage.Last() > 0;
+ if (_multiControllers.TryGetValue(graphItem, out controller))
+ {
+ controller.DisableRendering = false;
+ }
+ }
+ }
}
- }
- else if (item.GetType() == typeof(ControllerItem))
- {
- ControllerItem controllerItem = item as ControllerItem;
-
- if (DateTime.Now > controllerItem.LastUpdateTime.AddMilliseconds(controllerItem.UpdateInterval))
+ else
{
- var componentState = data.ComponentsStates.SingleOrDefault(x => (int)x.Component == controllerItem.TechController.Code);
+ var item = element.HostedElement as TechItem;
- if (componentState != null)
+ if (item != null)
{
- controllerItem.EffectiveValue = componentState.Value;
+ if (item.GetType() == typeof(SingleGraphItem))
+ {
+ SingleGraphItem graphItem = item as SingleGraphItem;
+
+ TechGraphController controller = null;
+
+ if (_singleControllers.TryGetValue(graphItem, out controller))
+ {
+ controller.DisableRendering = true;
+ }
+ }
+ else if (item.GetType() == typeof(MultiGraphItem))
+ {
+ MultiGraphItem graphItem = item as MultiGraphItem;
+
+ TechGraphController controller = null;
+
+ if (_multiControllers.TryGetValue(graphItem, out controller))
+ {
+ controller.DisableRendering = true;
+ }
+ }
}
}
}
@@ -691,10 +824,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
}
}
- #endregion
-
- #region Private Methods
-
/// <summary>
/// Gets the last data point from a protobuf repeated field.
/// </summary>
@@ -1251,7 +1380,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, String.Format("Error executing technician set valve state command on '{0}'.", item.TechName));
- _eventLogger.Log(ex, String.Format("Error executing technician set valve state command on '{0}'.", item.TechName));
}
};
}
@@ -1272,7 +1400,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, $"Error executing SetBlowerState command for blower {item.HardwareBlower.HardwareBlowerType.Name}.");
- _eventLogger.Log(ex, $"Error executing SetBlowerState command for blower {item.HardwareBlower.HardwareBlowerType.Name}.");
}
};
}
@@ -1293,7 +1420,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, $"Error executing SetHeaterState command for heater {item.TechHeater.Name}.");
- _eventLogger.Log(ex, $"Error executing SetHeaterState command for heater {item.TechHeater.Name}.");
}
};
}
@@ -1390,7 +1516,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
item.HomingProgress = 0;
item.HomingMaximumProgress = 0;
LogManager.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
- _eventLogger.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
}
};
}
@@ -1488,7 +1613,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
item.HomingProgress = 0;
item.HomingMaximumProgress = 0;
LogManager.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
- _eventLogger.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
}
};
}
@@ -1642,7 +1766,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, String.Format(String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName)));
- _eventLogger.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
}
};
}
@@ -1726,7 +1849,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
- _eventLogger.Log(ex, String.Format("Error executing technician command '{0}' on item '{1}'.", action, item.TechName));
}
};
}
@@ -1747,7 +1869,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, String.Format("Error executing technician set digital out command on '{0}'.", item.TechName));
- _eventLogger.Log(ex, String.Format("Error executing technician set digital out command on '{0}'.", item.TechName));
}
};
}
@@ -1772,7 +1893,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
LogManager.Log(ex, String.Format("Error executing technician set value component command on '{0}'.", item.TechName));
- _eventLogger.Log(ex, String.Format("Error executing technician set value component command on '{0}'.", item.TechName));
}
};
}
@@ -1798,7 +1918,6 @@ namespace Tango.MachineStudio.Technician.ViewModels
catch (Exception ex)
{
String msg = "Error uploading process parameters:" + Environment.NewLine + parameters.ToJsonString();
- _eventLogger.Log(ex, msg);
LogManager.Log(ex, msg);
_notification.ShowError("Could not upload process parameters." + Environment.NewLine + ex.Message);
}
@@ -2097,16 +2216,41 @@ namespace Tango.MachineStudio.Technician.ViewModels
{
var to_remove = Tabs.ToList();
- if (AddNewTab())
+ var name = _notification.ShowTextInput("Enter project name", "Project Name", "untitled");
+
+ if (String.IsNullOrWhiteSpace(name))
{
- _singleControllers.Clear();
- _multiControllers.Clear();
+ return;
+ }
- foreach (var tab in to_remove)
- {
- Tabs.Remove(tab);
- }
+ SaveFileDialog dlg = new SaveFileDialog();
+ dlg.Title = "Select Technician Project Location";
+ dlg.Filter = "Technician Project File|*.tpf";
+ dlg.DefaultExt = ".tpf";
+ dlg.FileName = name;
+
+ if (!dlg.ShowDialog().Value)
+ {
+ return;
}
+
+ _singleControllers.Clear();
+ _multiControllers.Clear();
+ _multi_graph_recordings.Clear();
+ _multi_monitors_recordings.Clear();
+ _single_graphs_recordings.Clear();
+ _single_monitors_recordings.Clear();
+
+ foreach (var tab in to_remove)
+ {
+ Tabs.Remove(tab);
+ }
+
+ AddNewTab(name);
+
+ _lastTechProjectFile = dlg.FileName;
+ File.AppendAllText(_lastTechProjectFile, "");
+ SaveProject();
}
/// <summary>
@@ -2179,7 +2323,12 @@ namespace Tango.MachineStudio.Technician.ViewModels
public override void OnApplicationReady()
{
-
+ if (_populateFramesThread == null)
+ {
+ _populateFramesThread = new Thread(PopulateFramesThreadMethod);
+ _populateFramesThread.IsBackground = true;
+ _populateFramesThread.Start();
+ }
}
#endregion