aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.WatchDog/MainWindowVM.cs
blob: f126780547ddcbd1af3b79ce22fe5d6d44add1ca (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
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.Core.Helpers;
using Tango.Logging;
using Tango.PPC.Common.WatchDog;
using Tango.SharedUI;
using Tango.SharedUI.Components;

namespace Tango.PPC.WatchDog
{
    public class MainWindowVM : ViewModel
    {
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        private const String tango_process_name = "Tango.PPC.UI";
        private WatchDogClient _watchdog;
        public TextController Log { get; set; }

        public MainWindowVM()
        {
            var logger = new SimpleStringLogger();
            logger.LogReceived += Logger_LogReceived;
            LogManager.RegisterLogger(logger);

            _watchdog = new WatchDogClient();
            _watchdog.ServerNotResponding += _watchdog_ServerNotResponding;
            Log = new TextController();

            _watchdog.Start();
        }

        private void Logger_LogReceived(object sender, LogItemBase e)
        {
            if (e is ExceptionLogItem)
            {
                Log.WriteLine(e.ToString());
            }
            else
            {
                Log.WriteLine($"[{e.TimeStamp.ToString()}] {e.Message}");
            }
        }

        private void _watchdog_ServerNotResponding(object sender, EventArgs e)
        {
            LogManager.Log("PPC application failed to respond!", LogCategory.Warning);
            LogManager.Log("Ensuring PPC application is down...");

            var appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();
            Process p = new Process();
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.StartInfo.FileName = "wmic";
            p.StartInfo.Arguments = String.Format("process where name='{0}' delete", tango_process_name);

            try
            {
                if (appProcess != null)
                {
                    LogManager.Log("PPC application process found and seems to be frozen. Trying to kill the process...");
                    appProcess.Kill();

                    appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();

                    if (appProcess != null)
                    {
                        LogManager.Log("Process kill failed. Trying again...");
                        p.Start();
                        Thread.Sleep(2000);

                        appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();

                        if (appProcess == null)
                        {
                            LogManager.Log("PPC application is down.");
                        }
                    }
                    else
                    {
                        LogManager.Log("PPC application is down.");
                    }
                }
            }
            catch
            {
                try
                {
                    LogManager.Log("Process kill failed. Trying again...");
                    p.Start();
                    Thread.Sleep(2000);

                    appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();

                    if (appProcess == null)
                    {
                        LogManager.Log("PPC application is down.");
                    }
                }
                catch { }
            }

            LogManager.Log("Restarting PPC application...");

            try
            {
                var process = Process.Start(Path.Combine(AssemblyHelper.GetCurrentAssemblyFolder(), tango_process_name + ".exe"));
                LogManager.Log("PPC application started.");
                LogManager.Log("Waiting for the application main window....");
                if (WaitForPPCWindow(TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(1)))
                {
                    LogManager.Log("Application main window opened. waiting another 10 seconds...");
                    Thread.Sleep(TimeSpan.FromSeconds(10));
                    _watchdog.Start();
                }
                else
                {
                    LogManager.Log("The PPC application main window has failed to open within 1 minute. The Watchdog will not start again!");
                }
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error starting PPC application.");
            }
        }

        private bool WaitForPPCWindow(TimeSpan interval, TimeSpan timeout)
        {
            for (TimeSpan time = TimeSpan.Zero; time < timeout; time = time.Add(interval))
            {
                IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Tango - PPC");
                if (windowPtr != IntPtr.Zero)
                {
                    return true;
                }

                Thread.Sleep(interval);
            }

            return false;
        }
    }
}