aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/SystemInfo/DefaultSystemInfoService.cs
blob: 3c3a0247b2c9872fa93d0dc3fcff93248c9f552e (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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using Microsoft.WindowsAPICodePack.Net;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL;
using Tango.Core;
using Tango.Core.DI;
using Tango.Integration.ExternalBridge;
using Tango.PPC.Common.Application;
using Tango.PPC.Common.Connectivity;
using Tango.PPC.Common.ExternalBridge;
using Tango.PPC.Shared.Information;
using Tango.Settings;
using Tango.SystemInfo;

namespace Tango.PPC.Common.SystemInfo
{
    [TangoCreateWhenRegistered]
    public class DefaultSystemInfoService : ExtendedObject, ISystemInfoService, IExternalBridgeRequestHandler
    {
        public bool Enabled { get; set; } = true;

        private List<SystemObjectsCollection> _baseSystemInfo;
        private IPPCApplicationManager _applicationManager;
        private IConnectivityProvider _connectivityProvider;

        public DefaultSystemInfoService(IPPCExternalBridgeService externalBridge, IPPCApplicationManager applicationManager, IConnectivityProvider connectivityProvider)
        {
            _applicationManager = applicationManager;
            _connectivityProvider = connectivityProvider;
            externalBridge.RegisterRequestHandler(this);
        }

        [ExternalBridgeRequestHandlerMethod(typeof(GetMachineInformationRequest), RequestHandlerLoggingMode.LogRequestName)]
        public async Task OnGetMachineInformationRequest(GetMachineInformationRequest request, String token, ExternalBridgeReceiver receiver)
        {
            if (_baseSystemInfo == null) //Create hardware info just once.
            {
                _baseSystemInfo = new List<SystemObjectsCollection>();

                if (!Debugger.IsAttached)
                {
                    _baseSystemInfo = SystemObjectsCollection.Create();
                }
            }

            //Now always update the latest custom objects..
            var system = _baseSystemInfo.ToList();

            //Get the networks that are currently connected to
            var connectedNetwork = NetworkListManager.GetNetworks(NetworkConnectivityLevels.Connected).FirstOrDefault();

            var settings = SettingsManager.Default.GetOrCreate<PPCSettings>();

            var applicationCollection = new SystemObjectsCollection();
            applicationCollection.Name = "Application";
            system.Insert(0, applicationCollection);

            //Application.
            applicationCollection.Objects.Add(new SystemObject()
            {
                Name = "Tango PPC",
                Properties = new List<SystemObjectProperty>()
                                 {
                                     new SystemObjectProperty() { Name = "Version", Value = _applicationManager.Version.ToString(3) },
                                     new SystemObjectProperty() { Name = "Build Date", Value = _applicationManager.BuildDate },
                                     new SystemObjectProperty() { Name = "Previous Version", Value = settings.PreviousApplicationVersion },
                                     new SystemObjectProperty() { Name = "Firmware Version", Value = _applicationManager.FirmwareVersion.ToStringSafe() },
                                     new SystemObjectProperty() { Name = "Technician Mode", Value = _applicationManager.IsInTechnicianMode.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "After Update", Value = _applicationManager.IsAfterUpdate.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Startup Date", Value = _applicationManager.StartUpDate.ToString() },
                                 },
            });


            //Network.
            if (connectedNetwork != null)
            {
                applicationCollection.Objects.Add(new SystemObject()
                {
                    Name = "Network",
                    Properties = new List<SystemObjectProperty>()
                                 {
                                     new SystemObjectProperty() { Name = "Network Name", Value = connectedNetwork.Name },
                                     new SystemObjectProperty() { Name = "Category", Value = connectedNetwork.Category.ToString() },
                                     new SystemObjectProperty() { Name = "Type", Value = connectedNetwork.Connectivity.ToString() },
                                     new SystemObjectProperty() { Name = "Domain", Value = connectedNetwork.DomainType.ToString() },
                                     new SystemObjectProperty() { Name = "Connected Time", Value = connectedNetwork.ConnectedTime.ToString() },
                                     new SystemObjectProperty() { Name = "Internet Connection", Value = connectedNetwork.IsConnectedToInternet.ToStringYesNo() },
                                 },
                });
            }

            //Settings.
            applicationCollection.Objects.Add(new SystemObject()
            {
                Name = "Settings",
                Properties = new List<SystemObjectProperty>()
                                 {
                                     new SystemObjectProperty() { Name = "Application State", Value = settings.ApplicationState.ToString() },
                                     new SystemObjectProperty() { Name = "Auto Update Check", Value = settings.AutoCheckForUpdates.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Auto Update Interval", Value = settings.AutoUpdateCheckInterval.ToString() },
                                     new SystemObjectProperty() { Name = "Automatic Thread Loading", Value = settings.EnableAutomaticThreadLoading.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Firmware Logs Enabled", Value = settings.EnableEmbeddedDebugLogs.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Emergency Switch Enabled", Value = settings.EnableEmergencyNotifications.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Liquid Quantity Validation Enabled", Value = settings.EnableJobLiquidQuantityValidation.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Remote Assistance Enabled", Value = settings.EnableRemoteAssistance.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Remote Desktop Enabled", Value = settings.EnableRemoteDesktop.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Start in Technician Mode", Value = settings.EnableTechnicianModeByDefault.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Watchdog Enabled", Value = settings.EnableWatchDog.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Job Units Method", Value = settings.JobUnitsMethod.ToString() },
                                     new SystemObjectProperty() { Name = "PowerUp Screen Enabled", Value = settings.DisplayPowerUpScreen.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Firmware COM Port", Value = settings.EmbeddedComPort.ToStringOrEmpty() },
                                     new SystemObjectProperty() { Name = "Emergency COM Port", Value = settings.EmergencyComPort.ToStringOrEmpty() },
                                     new SystemObjectProperty() { Name = "Job Upload Method", Value = settings.JobUploadStrategy.ToString() },
                                     new SystemObjectProperty() { Name = "Diagnostics Synchronization", Value = settings.SynchronizeDiagnostics.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "Jobs Synchronization", Value = settings.SynchronizeJobs.ToStringYesNo() },
                                     new SystemObjectProperty() { Name = "TCP Write Mode", Value = settings.TcpTransportAdapterWriteMode.ToString() },
                                 }.OrderBy(x => x.Name).ToList(),
            });

            await receiver.SendGenericResponse(new GetMachineInformationResponse()
            {
                Package = new InformationPackage()
                {
                    System = system,
                }
            }, token);
        }

        [ExternalBridgeRequestHandlerMethod(typeof(GetMachineCountersRequest), RequestHandlerLoggingMode.LogRequestName)]
        public async Task OnGetMachineCountersRequest(GetMachineCountersRequest request, String token, ExternalBridgeReceiver receiver)
        {
            var counters = await GetCounters();

            var response = new GetMachineCountersResponse();
            response.TotalDyeTime = counters.Item1;
            response.TotalDyeMeters = counters.Item2;

            await receiver.SendGenericResponse(response, token);
        }

        private async Task<Tuple<TimeSpan, int>> GetCounters()
        {
            using (ObservablesContext db = ObservablesContext.CreateDefault())
            {
                var jobRuns = await db.JobRuns.Select(x => new { x.StartDate, x.EndDate, x.EndPosition }).ToListAsync();

                TimeSpan totalDyeTime = TimeSpan.FromHours(jobRuns.Select(x => x.EndDate - x.StartDate).Sum(x => x.TotalHours));

                int meters = (int)jobRuns.Select(x => x.EndPosition).Sum();

                return new Tuple<TimeSpan, int>(totalDyeTime, meters);
            }
        }

        public void OnReceiverDisconnected(ExternalBridgeReceiver receiver)
        {

        }
    }
}