Files
Wesley Hofman 1232ca80c6 third commit
2025-09-18 14:36:50 +02:00

314 lines
11 KiB
C#

using Maser.Feanor.Biz;
using Maser.Feanor.Model;
using System;
using System.Collections.Generic;
using System.Net;
using System.Windows.Forms;
using System.IO;
using System.Text;
namespace Maser.Feanor.Client
{
public partial class FeanorClient : Form
{
private List<ClientWorker> _ClientWorkers = new List<ClientWorker>();
#warning Form laten zien in het midden van het scherm always on top als er iets fout gaat!
public FeanorClient()
{
InitializeComponent();
System.Reflection.Assembly ass = System.Reflection.Assembly.GetEntryAssembly(); // report build version
string exe = System.IO.Path.GetFullPath(ass.Location);
DateTime dt = new System.IO.FileInfo(exe).LastWriteTimeUtc;
this.Text = String.Format("Feanor - Clients" + " v{0:0000}{1:00}{2:00}", dt.Year, dt.Month, dt.Day);
}
private Server.Server _Server;
public Server.Server Server { get { return _Server; } }
public DateTime LastHTTP { get { return _LastHTTP; } }
private DateTime _LastHTTP;
private DateTime _LastDBWrite; // Used for detecting idling of server
public ChamberStatus Status { get { return _status; } }
private ChamberStatus _status;
private Chamber _Chamber;
public Chamber Chamber { get { return _Chamber; } }
private void FeanorClient_Load(object sender, EventArgs e)
{
StartWorkers();
}
private void StartWorkers()
{
Console.WriteLine("Checking if DB is online...");
lblStatus.Text = "Connecting to database...";
if (!SQLMethods.DatabaseOnline(60))
{
lblStatus.Text = "Could not connect to database...";
Console.WriteLine("Database OFFLINE");
return;
}
else
{
Console.WriteLine("Database online");
}
// Construct ClientWorkers from all active Chambers
_ClientWorkers = new List<ClientWorker>();
foreach (Chamber c in new Chambers().GetAllActive())
_ClientWorkers.Add(new ClientWorker(c));
// Initiate gv
Initialize_dgvChambers(_ClientWorkers.Count);
// Start workers
foreach (ClientWorker cw in _ClientWorkers)
cw.Start();
timer.Start();
LastStartupTimer.Start();
}
private void Initialize_dgvChambers(int rows)
{
// Initiate in dgv
// dgvChambers.DefaultCellStyle.SelectionBackColor = dgvChambers.DefaultCellStyle.BackColor;
// dgvChambers.DefaultCellStyle.SelectionForeColor = dgvChambers.DefaultCellStyle.ForeColor;
foreach (DataGridViewColumn column in dgvChambers.Columns)
{
column.SortMode = DataGridViewColumnSortMode.NotSortable;
column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
column.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
while (dgvChambers.Rows.Count > 0)
dgvChambers.Rows.RemoveAt(0);
dgvChambers.Rows.Add(rows);
foreach (DataGridViewRow row in dgvChambers.Rows)
{
//
}
//LastStartupTimer_Tick(null, null); // Obtain last startup of RPI
//CheckDBstatus(); // Check if SQL DB is online
UpdateRaspberryTime_Tick(null, null); // Set internal time of RPI
}
private void timer_Tick(object sender, EventArgs e)
{
lblStatus.Text = Time.Local.ToString() + " (UTC+1)"; // was lblStatus.Text = Time.UTC.ToString() +" (UTC)";
// Show ClientWorker that aren't running properly if cboxShowAll not checked
List<ClientWorker> workers;
workers = cboxShowAll.Checked ? _ClientWorkers : _ClientWorkers.FindAll(delegate (ClientWorker w) { return (w.Status != ChamberStatus.Running); });
if (workers.Count == 0)
{
dgvChambers.Visible = false;
return;
}
dgvChambers.Visible = true;
if (dgvChambers.Rows.Count != workers.Count)
{
while (dgvChambers.Rows.Count > 0)
dgvChambers.Rows.RemoveAt(0);
dgvChambers.Rows.Add(workers.Count);
}
int ConnTotal = workers.Count; // total amount of chambers
int ConnCounter = 0; // amount of chambers which are 'running'
int OfflineCounter = 0;
for (int i = 0; i < workers.Count; i++)
{
ClientWorker cw = workers[i];
dgvChambers[0, i].Value = String.Format("{0:00000}", cw.Chamber.MIDS); // MIDS ID of node
dgvChambers[1, i].Value = cw.Chamber.Network; // IP of node
dgvChambers[2, i].Value = cw.Status.ToText(); // Communication status with node
if (cw.Status.ToText() == "Running") ConnCounter++;
// Console.WriteLine(cw.Status.ToText().ToString());
if (cw.Status.ToText() == "No connection") OfflineCounter++;
if (cw.LastHTTP < new DateTime(2000, 1, 1))
dgvChambers[3, i].Value = "-";
else
dgvChambers[3, i].Value = cw.LastHTTP.ToString();
}
try
{
if (OfflineCounter > 1 ) // show panel stating that more than 2 nodes are offline!
{
pnlNodesOffline.Visible = true;
}
if (OfflineCounter <= 1) // show panel stating that more than 2 nodes are offline!
{
pnlNodesOffline.Visible = false;
}
}
catch { }
double ConnPercentageDouble = ((double)ConnCounter / (double)ConnTotal) * 100.0; // percentage 'running' nodes (double)
int ConnPercentageInt = (int)ConnPercentageDouble; // percentage 'running' nodes (int)
PercProgress.Maximum = 100;
PercProgress.Step = 1;
PercProgress.Value = ConnPercentageInt;
statusPercentage.Text = ConnPercentageInt.ToString() + "%";
}
private void FeanorClient_FormClosing(object sender, FormClosingEventArgs e)
{
// Stop workers
foreach (ClientWorker cw in _ClientWorkers)
cw.Stop();
}
private void cboxShowAll_CheckedChanged(object sender, EventArgs e)
{
timer_Tick(null, null);
}
private void LastStartupTimer_Tick(object sender, EventArgs e)
{
List<ClientWorker> workers;
workers = cboxShowAll.Checked ? _ClientWorkers : _ClientWorkers.FindAll(delegate (ClientWorker w) { return (w.Status != ChamberStatus.Running); });
for (int i = 0; i < workers.Count; i++)
{
ClientWorker cw = workers[i];
string url;
string data;
url = "http://" + cw.Chamber.Network + ":8080/" + "startuptime";
DateTime lastStartup;
try
{
using (WebClient client = new WebClient())
{
data = client.DownloadString(url);
lastStartup = Time.UnixToDatetime(int.Parse(data));
//Console.WriteLine(lastStartup.ToLocalTime());
dgvChambers[4, i].Value = lastStartup.ToLocalTime().ToString();
}
}
catch
{
// Continue with next object, ignoring exception
}
}
}
private void UpdateRaspberryTime_Tick(object sender, EventArgs e)
{
List<ClientWorker> workers;
workers = cboxShowAll.Checked ? _ClientWorkers : _ClientWorkers.FindAll(delegate (ClientWorker w) { return (w.Status != ChamberStatus.Running); });
for (int i = 0; i < workers.Count; i++) // for all chambers
{
ClientWorker cw = workers[i];
// Construct unix timestamp string
string http = "<time>,";
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
http += unixTimestamp.ToString();
http += ",</time>";
// Send unix timestamp string to RPI
try
{
using (WebClient client = new WebClient())
{
string URL = "http://" + cw.Chamber.Network + ":8080/";
string url = client.UploadString(URL, http);
}
}
catch
{
}
}
}
private void lblStatus_Click(object sender, EventArgs e)
{
}
private void PercProgress_Click(object sender, EventArgs e)
{
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void btnDismiss_Click(object sender, EventArgs e)
{
pnlNodesOffline.Visible = false;
}
private void timerSaveStatusPage_Tick(object sender, EventArgs e)
{
List<ClientWorker> workers;
workers = cboxShowAll.Checked ? _ClientWorkers : _ClientWorkers.FindAll(delegate (ClientWorker w) { return (w.Status != ChamberStatus.Running); });
for (int i = 0; i < workers.Count; i++)
{
ClientWorker cw = workers[i];
string url;
string data;
url = "http://" + cw.Chamber.Network + ":8080/" + "status";
try
{
using (WebClient client = new WebClient())
{
data = client.DownloadString(url);
string fileName = $"Node_{cw.Chamber.MIDS}_status.html";
string outputDirectory = "\\\\silicium\\projects\\2020\\P201339\\sub1\\4. Software\\8. Nodestatus";
Directory.CreateDirectory(outputDirectory);
string filePath = Path.Combine(outputDirectory, fileName);
File.WriteAllText(filePath, data);
}
}
catch
{
// Continue with next object, ignoring exception
}
}
}
}
}