aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Utilities/Tango.HardwareVersionComparison/MainWindowVM.cs
blob: bbdf01effcacf7ac87040b78f8ff27c228e7dbaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Tango.BL.Entities;
using Tango.Integration.Operation;
using Tango.Integration.ExternalBridge;

namespace Tango.PPC.Common.Application
{
    /// <summary>
    /// Represents the application manager.
    /// </summary>
    public interface IPPCApplicationManager
    {
        /// <summary>
        /// Occurs when the application has started.
        /// </summary>
        eventpre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using KellermanSoftware.CompareNetObjects;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Tango.BL;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.BL.Serialization;
using Tango.Core.Commands;
using Tango.SharedUI;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Tango.HardwareVersionComparison
{
    public class MainWindowVM : ViewModel
    {
        #region Property
        
        private String _jsonText1;
        public String JsonText1
        {
            get { return _jsonText1; }
            set
            {
                _jsonText1 = value;
                RaisePropertyChangedAuto();
                InvalidateRelayCommands();
            }
        }
        private String _jsonText2;
        public String JsonText2
        {
            get { return _jsonText2; }
            set
            {
                _jsonText2 = value;
                RaisePropertyChangedAuto();
                InvalidateRelayCommands();
            }
        }

        private ObservableCollection<String> _valuesVersion1;

        public ObservableCollection<String> ValuesForVersion1
        {
            get { return _valuesVersion1; }
            set { _valuesVersion1 = value; RaisePropertyChangedAuto(); }
        }
        private ObservableCollection<String> _valuesVersion2;

        public ObservableCollection<String> ValuesForVersion2
        {
            get { return _valuesVersion2; }
            set { _valuesVersion2 = value; RaisePropertyChangedAuto(); }
        }
        private bool _isShowDifference;
        public bool IsShowDifference
        {
            get { return _isShowDifference; }
            set
            {
                _isShowDifference = value;
                RaisePropertyChangedAuto();
            }
        }
        
        private HardwareCompareResult _result;
        public HardwareCompareResult Result
        {
            get
            {
                return _result;
            }
            set
            {
                _result = value;
                RaisePropertyChangedAuto();
                InvalidateRelayCommands();
            }
        }
        #endregion
        #region Command

        public RelayCommand CompareCommand { get; set; }

        #endregion
        public MainWindowVM()
        {
            ValuesForVersion1 = new ObservableCollection<string>();
            ValuesForVersion2 = new ObservableCollection<string>();
            _isShowDifference = false;
            CompareCommand = new RelayCommand(CompareVersions, () => !String.IsNullOrEmpty(JsonText1) && !String.IsNullOrEmpty(JsonText2));

        }
        #region Compare
        private void CompareVersions()
        {
            
                PMR.Hardware.HardwareConfiguration h1 = CreateHardwareVersionFromJson(JsonText1);
                PMR.Hardware.HardwareConfiguration h2 = CreateHardwareVersionFromJson(JsonText2);
                Result = CompareHardwareVersions(h1, h2);
        }
        private HardwareCompareResult CompareHardwareVersions(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            _result = new HardwareCompareResult();
            _result.Collections.Add(CompareMotorsCollection(h1, h2));
            _result.Collections.Add(CompareDancerCollection(h1, h2));
            _result.Collections.Add(ComparePidControlsCollection(h1, h2));
            _result.Collections.Add(CompareWindersCollection(h1, h2));
            _result.Collections.Add(CompareSpeedSensorsCollection(h1, h2));
            _result.Collections.Add(CompareBlowersCollection(h1, h2));
            _result.Collections.Add(CompareBreakSensorCollection(h1, h2));


            return _result;
        }
        private HardwareComponentCollectionCompareResult CompareMotorsCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "MOTORS"
            };
            foreach (var motorTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwareMotorType)).Cast<PMR.Hardware.HardwareMotorType>())
            {
                var motor1 = h1.Motors.SingleOrDefault(x => x.HardwareMotorType.ToInt32() == motorTypeCode.ToInt32());
                var motor2 = h2.Motors.SingleOrDefault(x => x.HardwareMotorType.ToInt32() == motorTypeCode.ToInt32());
         
                var componentResult = CompareComponents(
                    motorTypeCode.ToDescription(),
                    GetComponentProperties(typeof(PMR.Hardware.HardwareMotor)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }
        private HardwareComponentCollectionCompareResult CompareDancerCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "DANCERS"
            };
            foreach (var dancerTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwareDancerType)).Cast<PMR.Hardware.HardwareDancerType>())
            {
                var motor1 = h1.Dancers.SingleOrDefault(x => x.HardwareDancerType.ToInt32() == dancerTypeCode.ToInt32());
                var motor2 = h2.Dancers.SingleOrDefault(x => x.HardwareDancerType.ToInt32() == dancerTypeCode.ToInt32());

                var componentResult = CompareComponents(
                    dancerTypeCode.ToDescription(),
                    GetComponentProperties(typeof(Tango.PMR.Hardware.HardwareDancer)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }
        private HardwareComponentCollectionCompareResult ComparePidControlsCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "PID CONTROLS"
            };
            foreach (var pidControlsTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwarePidControlType)).Cast<PMR.Hardware.HardwarePidControlType>())
            {
                ///(PMR.Hardware.HardwarePidControlType)pid.HardwarePidControlType.Code
                var motor1 = h1.PidControls.SingleOrDefault(x => x.HardwarePidControlType.ToInt32() == pidControlsTypeCode.ToInt32());
                var motor2 = h2.PidControls.SingleOrDefault(x => x.HardwarePidControlType.ToInt32() == pidControlsTypeCode.ToInt32());

                var componentResult = CompareComponents(
                    pidControlsTypeCode.ToDescription(),
                    GetComponentProperties(typeof(Tango.PMR.Hardware.HardwarePidControl)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }
        private HardwareComponentCollectionCompareResult CompareWindersCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "WINDERS"
            };
            foreach (var WinderTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwareWinderType)).Cast<PMR.Hardware.HardwareWinderType>())
            {
                var motor1 = h1.Winders.SingleOrDefault(x => x.HardwareWinderType.ToInt32() == WinderTypeCode.ToInt32());
                var motor2 = h2.Winders.SingleOrDefault(x => x.HardwareWinderType.ToInt32() == WinderTypeCode.ToInt32());

                var componentResult = CompareComponents(
                    WinderTypeCode.ToDescription(),
                    GetComponentProperties(typeof(PMR.Hardware.HardwareWinder)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }
        private HardwareComponentCollectionCompareResult CompareSpeedSensorsCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "SPEED SENSORS"
            };
            foreach (var speedSewnsorsTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwareSpeedSensorType)).Cast<PMR.Hardware.HardwareSpeedSensorType>())
            {
                var motor1 = h1.SpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType.ToInt32() == speedSewnsorsTypeCode.ToInt32());
                var motor2 = h2.SpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType.ToInt32() == speedSewnsorsTypeCode.ToInt32());

                var componentResult = CompareComponents(
                    speedSewnsorsTypeCode.ToDescription(),
                    GetComponentProperties(typeof(PMR.Hardware.HardwareSpeedSensor)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }
        private HardwareComponentCollectionCompareResult CompareBlowersCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "BLOWERS"
            };
            foreach (var blowersTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwareBlowerType)).Cast<PMR.Hardware.HardwareBlowerType>())
            {
                var motor1 = h1.Blowers.SingleOrDefault(x => x.HardwareBlowerType.ToInt32() == blowersTypeCode.ToInt32());
                var motor2 = h2.Blowers.SingleOrDefault(x => x.HardwareBlowerType.ToInt32() == blowersTypeCode.ToInt32());

                var componentResult = CompareComponents(
                    blowersTypeCode.ToDescription(),
                    GetComponentProperties(typeof(PMR.Hardware.HardwareBlower)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }
        private HardwareComponentCollectionCompareResult CompareBreakSensorCollection(PMR.Hardware.HardwareConfiguration h1, PMR.Hardware.HardwareConfiguration h2)
        {
            HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult()
            {
                CollectionName = "BREAK SENSOR"
            };
            foreach (var breakSewnsorsTypeCode in Enum.GetValues(typeof(PMR.Hardware.HardwareBreakSensorType)).Cast<PMR.Hardware.HardwareBreakSensorType>())
            {
                var motor1 = h1.BreakSensors.SingleOrDefault(x => x.HardwareBreakSensorType.ToInt32() == breakSewnsorsTypeCode.ToInt32());
                var motor2 = h2.BreakSensors.SingleOrDefault(x => x.HardwareBreakSensorType.ToInt32() == breakSewnsorsTypeCode.ToInt32());

                var componentResult = CompareComponents(
                    breakSewnsorsTypeCode.ToDescription(),
                    GetComponentProperties(typeof(PMR.Hardware.HardwareBreakSensor)),
                    motor1,
                    motor2);

                collection.Components.Add(componentResult);
            }
            return collection;
        }

        private HardwareComponentCompareResult CompareComponents(String name, List<PropertyInfo> properties, Object component1, Object component2)
        {
            HardwareComponentCompareResult result = new HardwareComponentCompareResult();
            result.ComponentName = name;
            result.HasComponent1 = component1 != null;
            result.HasComponent2 = component2 != null;

            foreach (var prop in properties)
            {
                var hProp = new HardwareComponentPropertyResult();
                hProp.PropertyName = prop.Name;
                hProp.Value1 = component1 != null ? (prop.GetValue(component1) == null ? "" : prop.GetValue(component1).ToString()) : null;
                hProp.Value2 = component2 != null ? (prop.GetValue(component2) == null ? "" : prop.GetValue(component2).ToString()) : null;
              
                result.Properties.Add(hProp);
            }

            return result;
        }

        private List<PropertyInfo> GetComponentProperties(Type componentType)
        {
            List<String> exclude = new List<string>()
            {
                 "Guid",
                 "ID",
                 "LastUpdated",
                 "Parameters",
            };

            return componentType.GetProperties(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public).Where(x => !x.PropertyType.IsClass && !exclude.Contains(x.Name)).ToList();
        }
       public PMR.Hardware.HardwareConfiguration CreateHardwareVersionFromJson(string json)
        {
            try
            {
                var tmpObj = JContainer.Parse(json);
            }
            catch (FormatException fex)
            {
                Console.WriteLine(fex);
            }
            catch (Exception ex) //some other exception
            {
                Console.WriteLine(ex.ToString());
            }
            var jsonSettings = new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                MissingMemberHandling = MissingMemberHandling.Ignore
            };
            PMR.Hardware.HardwareConfiguration hversion = JsonConvert.DeserializeObject<PMR.Hardware.HardwareConfiguration>(json, jsonSettings);
            
            return hversion;
        }
        #endregion Compare
    }

}