1147 lines
44 KiB
C#
1147 lines
44 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Maser.Feanor.Biz;
|
|
using Maser.Feanor.Model;
|
|
using Maser.Feanor.Server;
|
|
using System.Globalization;
|
|
using System.Collections.ObjectModel;
|
|
using System.Net;
|
|
using System.IO;
|
|
using System.Data.SqlClient;
|
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
|
|
|
|
namespace FeanorConfig
|
|
{
|
|
public partial class Manager : Form
|
|
{
|
|
public Manager()
|
|
{
|
|
InitializeComponent();
|
|
groupBox2.Visible = false;
|
|
pnlDatabaseBackup.Visible = false;
|
|
groupBox1.Visible = false;
|
|
|
|
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 - Manager" + " v{0:0000}{1:00}{2:00}", dt.Year, dt.Month, dt.Day);
|
|
|
|
|
|
// super user default setup where options are disabled by default
|
|
nudChambersEditInterval.Enabled = false;
|
|
cboxChambersEditActive.Enabled = false;
|
|
cboxRS485.Enabled = false;
|
|
cbHumidity.Enabled = false;
|
|
cboxSensorEditEnabled.Enabled = false;
|
|
cboxChambersEditServerType.Enabled = false;
|
|
txtbChambersEditMIDS.Enabled = false;
|
|
txtbChambersEditDescription.Enabled = false;
|
|
txtbChambersEditNetwork.Enabled = false;
|
|
}
|
|
|
|
|
|
private void menuChambers_Click(object sender, EventArgs e)
|
|
{
|
|
pnlDatabaseBackup.Visible = false;
|
|
// Layout
|
|
pnlMenuChambers.BringToFront();
|
|
|
|
// Fill listbox
|
|
lboxChambers.Items.Clear();
|
|
try
|
|
{
|
|
List<Chamber> chambers;
|
|
if (cboxChambersFilterActive.Checked)
|
|
chambers = new Chambers().GetAllActive();
|
|
else
|
|
chambers = new Chambers().GetAll();
|
|
|
|
foreach (Chamber chamber in chambers)
|
|
lboxChambers.Items.Add(chamber.MIDSandDescription); // MD
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Chambers", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
|
|
// Fill groupbox
|
|
txtbChambersEditDescription.Text = "";
|
|
txtbChambersEditMIDS.Text = "";
|
|
txtbChambersEditNetwork.Text = "";
|
|
lblChambersEditPK.Text = "-1"; // PK is set to -1 if a new chamber is to be added
|
|
btnChambersEditUpdate.Text = "Create";
|
|
cboxChambersEditActive.Checked = true;
|
|
cbHumidity.Checked = true;
|
|
gboxChamberEdit.Text = "New chamber";
|
|
cboxChambersEditServerType.Enabled = true;
|
|
|
|
// Listbox sensors
|
|
gbSensorsEdit.Visible = false;
|
|
}
|
|
|
|
private void lboxChambers_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (lboxChambers.SelectedIndex < 0)
|
|
return;
|
|
|
|
Chamber chamber;
|
|
try
|
|
{
|
|
chamber = new Chambers().GetAll().ToList().Find(delegate (Chamber c) { return (c.MIDSandDescription == (string)lboxChambers.SelectedItem); });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
if (chamber.ServerType == ServerType.RaspberryDELTA | chamber.ServerType == ServerType.RaspberryHAMEG)
|
|
{
|
|
gbDeltaIP.Visible = true;
|
|
}
|
|
else
|
|
{
|
|
gbDeltaIP.Visible = false;
|
|
}
|
|
|
|
|
|
if (chamber == null)
|
|
return;
|
|
|
|
// Fill groupbox
|
|
cboxChambersEditServerType.Text = chamber.ServerType.ToText();
|
|
txtbChambersEditDescription.Text = chamber.Description;
|
|
txtbChambersEditMIDS.Text = string.Format("{0:00000}", chamber.MIDS);
|
|
txtbChambersEditNetwork.Text = chamber.Network;
|
|
lblChambersEditPK.Text = chamber.PK.ToString(); // PK is set to -1 if a new chamber is added
|
|
btnChambersEditUpdate.Text = "Modify";
|
|
gboxChamberEdit.Text = chamber.MIDSandDescription;
|
|
cboxChambersEditActive.Checked = chamber.Active;
|
|
cbHumidity.Checked = chamber.Humidity;
|
|
nudChambersEditInterval.Value = chamber.Interval;
|
|
cboxRS485.Checked = chamber.RS485;
|
|
|
|
if(cboxRS485.Checked == false)
|
|
{
|
|
RS485btn.Visible = false;
|
|
}
|
|
else
|
|
{
|
|
RS485btn.Visible = true;
|
|
}
|
|
|
|
// Block servertype from being changed
|
|
cboxChambersEditServerType.Enabled = false;
|
|
|
|
// Fill Sensors
|
|
List<Sensor> sensors;
|
|
try
|
|
{
|
|
sensors = new Sensors().GetByChamber(chamber.PK);
|
|
|
|
if (sensors.Count > 0)
|
|
{
|
|
gbSensorsEdit.Text = String.Format("Sensors in chamber {0:00000} ({1:0})", chamber.MIDS, sensors.Count);
|
|
lbSensorsEdit.Items.Clear();
|
|
foreach (Sensor s in sensors)
|
|
lbSensorsEdit.Items.Add(s.ToString());
|
|
gbSensorsEdit.Visible = true;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, String.Format("Sensors in chamber {0:00000}", chamber.MIDS), MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
gbSensorsEdit.Visible = false;
|
|
return;
|
|
}
|
|
lbSensorsEdit.ClearSelected();
|
|
pnlSensorEdit.Visible = false;
|
|
}
|
|
|
|
private Chamber GetChamber_FormChambersEdit()
|
|
{
|
|
int MIDS = 0;
|
|
if (!Int32.TryParse(txtbChambersEditMIDS.Text, out MIDS))
|
|
{
|
|
MessageBox.Show("Use integer value for MIDS!", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
if( MIDS < 0)
|
|
{
|
|
MessageBox.Show("Use positive value for MIDS!", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
|
|
if (MIDS >99999 )
|
|
{
|
|
MessageBox.Show("MIDS must be less than 100000!", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
|
|
string description = txtbChambersEditDescription.Text.Trim();
|
|
if (description.Length < 3)
|
|
{
|
|
MessageBox.Show("Description should be at least 3 characters!", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
|
|
int Interval = (int)nudChambersEditInterval.Value;
|
|
|
|
|
|
string network = txtbChambersEditNetwork.Text.Trim();
|
|
if (network.Length < 3)
|
|
{
|
|
MessageBox.Show("Network should be at least 3 characters!", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
|
|
int PK = int.Parse(lblChambersEditPK.Text);
|
|
|
|
// Check existing items
|
|
List<Chamber> chambers;
|
|
try
|
|
{
|
|
chambers = new Chambers().GetAllActive().ToList();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return null;
|
|
}
|
|
|
|
// Check if chamber with given MIDS already exists
|
|
if (PK < 0 && chambers.FindIndex(delegate (Chamber c) { return (c.MIDS == MIDS); }) >= 0)
|
|
{
|
|
MessageBox.Show("Chamber with MIDS already exists", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return null;
|
|
}
|
|
|
|
// Check if chamber with given Network already exists
|
|
if (PK < 0 && chambers.FindIndex(delegate (Chamber c) { return (c.Network == network); }) >= 0)
|
|
{
|
|
MessageBox.Show("Chamber with network already exists", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return null;
|
|
}
|
|
|
|
// Server type
|
|
ServerType serverType = ServerType.NONE;
|
|
foreach (ServerType s in Enum.GetValues(typeof(ServerType)))
|
|
{
|
|
if (s.ToText() == (string)cboxChambersEditServerType.SelectedItem)
|
|
{
|
|
serverType = s;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Construct chamber
|
|
Chamber chamber = new Chamber(PK, MIDS, description, Interval, network, serverType, cboxChambersEditActive.Checked,cboxRS485.Checked,cbHumidity.Checked);
|
|
return chamber;
|
|
}
|
|
|
|
|
|
|
|
private void btnChambersEditUpdate_Click(object sender, EventArgs e) // Create / modify chamber
|
|
{
|
|
Chamber chamber = GetChamber_FormChambersEdit();
|
|
|
|
if (chamber == null)
|
|
return;
|
|
|
|
// New (PK=-1) or modify (PK from DB)
|
|
if (chamber.PK < 0) // New chamber --> create
|
|
{
|
|
try
|
|
{
|
|
chamber.PK = new Chambers().Add(chamber);
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
Sensors SensorsBiz = new Sensors();
|
|
foreach (Sensor s in server.StandardSensors())
|
|
SensorsBiz.Add(s);
|
|
MessageBox.Show(string.Format("New chamber {0:00000} created!", chamber.MIDS), "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
String msg = String.Format("Could not add chamber!\n{0}", ex.Message);
|
|
MessageBox.Show(msg, "Add chamber", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
}
|
|
else // Existing chamber --> modify
|
|
{
|
|
try
|
|
{
|
|
new Chambers().Modify(chamber);
|
|
MessageBox.Show(string.Format("Chamber {0:00000} modified!", chamber.MIDS), "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
String msg = String.Format("Could not modify chamber!\n{0}", ex.Message);
|
|
MessageBox.Show(msg, "Modify chamber", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Send interval and time to server
|
|
try
|
|
{
|
|
this.Cursor = Cursors.WaitCursor;
|
|
ShowInfoLabel(string.Format("Uploading chamber details to server ({0}) connected to chamber {1:00000}...", chamber.Network, chamber.MIDS));
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
server.WriteInterval(chamber.Interval);
|
|
server.WriteDatetime(Time.UTC);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
HideInfoLabel(); // Called in finally, but also here to update GUI before ex-message is shown
|
|
String msg = String.Format("Could not connect to server chamber!\n{0}", ex.Message);
|
|
MessageBox.Show(msg, "Modify chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
}
|
|
finally
|
|
{
|
|
this.Cursor = Cursors.Default;
|
|
HideInfoLabel();
|
|
}
|
|
|
|
|
|
// Refresh and reselect
|
|
menuChambers_Click(null, null);
|
|
for (int i = 0; i < lboxChambers.Items.Count; i++)
|
|
{
|
|
if ((string)lboxChambers.Items[i] == chamber.MIDSandDescription)
|
|
{
|
|
lboxChambers.SelectedIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
MessageBox.Show("Please restart FEANOR Client and Manager!");
|
|
}
|
|
|
|
|
|
private void Manager_Load(object sender, EventArgs e)
|
|
{
|
|
// Init combobox with server types
|
|
cboxChambersEditServerType.Items.Clear();
|
|
foreach (ServerType serverType in Enum.GetValues(typeof(ServerType)))
|
|
cboxChambersEditServerType.Items.Add(serverType.ToText());
|
|
cboxChambersEditServerType.SelectedIndex = 0;
|
|
|
|
|
|
// Init pnl Chambers
|
|
menuChambers_Click(null, null);
|
|
}
|
|
|
|
private void cboxChambersFilterActive_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
menuChambers_Click(null, null);
|
|
}
|
|
|
|
private void lbSensorsEdit_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
pnlSensorEdit.Visible = false;
|
|
|
|
if (lboxChambers.SelectedIndex < 0)
|
|
return;
|
|
|
|
if (lbSensorsEdit.SelectedIndex < 0)
|
|
return;
|
|
|
|
lblSensorEditPK.Text = "-1";
|
|
lblSensorEditCalibrationPK.Text = "-1";
|
|
|
|
Sensor sensor;
|
|
try
|
|
{
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
sensor = new Sensors().GetByChamber(ChamberPK).Find(delegate (Sensor s) { return (s.ID == lbSensorsEdit.SelectedIndex); });
|
|
lblSensorEditPK.Text = sensor.PK.ToString();
|
|
if (sensor == null)
|
|
return;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Could not retrieve sensor details!", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
txtbSensorEditID.Text = String.Format("{0:00}", sensor.ID);
|
|
txtbSensorEditType.Text = sensor.TypeToString();
|
|
txtbSensorEditDescription.Text = sensor.Description;
|
|
cboxSensorEditEnabled.Checked = sensor.Enabled;
|
|
cboxSensorEditCalibrationEnabled.Checked = sensor.ApplyCalibration;
|
|
|
|
|
|
Calibration calibration;
|
|
try
|
|
{
|
|
calibration = new Calibrations().GetLastCreatedBySensorPK(sensor.PK);
|
|
|
|
if (calibration == null) // if no calibration is found
|
|
{
|
|
calibration = new Calibration(-1, sensor.PK, DateTime.Now, DateTime.Now.AddMonths(12), DateTime.Now, new double[4] { 0, 1, 0, 0 }, 0, new double[4] { 0, 0, 1, 1 });
|
|
cboxSensorEditCalibrationEnabled.Checked = false;
|
|
}
|
|
else
|
|
{
|
|
lblSensorEditCalibrationPK.Text = calibration.PK.ToString();
|
|
}
|
|
|
|
// display X1..X4 and C0 + C1
|
|
label17.Text = Math.Round(calibration.Coefficients[0],5).ToString();
|
|
label18.Text = Math.Round(calibration.Coefficients[1],5).ToString();
|
|
tbX1.Text = Math.Round(calibration.Xvalues[0], 5).ToString();
|
|
tbX2.Text = Math.Round(calibration.Xvalues[1], 5).ToString();
|
|
tbX3.Text = Math.Round(calibration.Xvalues[2], 5).ToString();
|
|
tbX4.Text = Math.Round(calibration.Xvalues[3], 5).ToString();
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Could not retrieve calibration details!", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
|
|
|
|
for (int i = 0; i < Coefficient_TextBoxes.Count; i++)
|
|
{
|
|
Coefficient_TextBoxes[i].Text = calibration.Coefficients[i].ToString("0.000000E0");
|
|
}
|
|
txtbSensorsEditCalibrationU.Text = calibration.Uncertainty.ToString("0.000000E0");
|
|
dtpSensorEditRelease.Value = calibration.Release;
|
|
dtpSensorEditExpiry.Value = calibration.Expiry;
|
|
//dtpSensorEditCreation.Value = calibration.Creation;
|
|
|
|
pnlSensorEdit.Visible = true;
|
|
}
|
|
|
|
public List<TextBox> Coefficient_TextBoxes
|
|
{
|
|
get
|
|
{
|
|
List<TextBox> txtbList = new List<TextBox>();
|
|
|
|
|
|
return txtbList;
|
|
}
|
|
}
|
|
|
|
|
|
private Sensor GetSensor_FormSensorEdit()
|
|
{
|
|
Sensor sensor;
|
|
try
|
|
{
|
|
int PK = int.Parse(lblSensorEditPK.Text);
|
|
sensor = new Sensors().GetByPK(PK);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show("Could not retrieve sensor from database!\n" + ex.Message, "Modify sensor", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return null;
|
|
}
|
|
|
|
string description = txtbSensorEditDescription.Text.Trim();
|
|
if (description.Length < 3)
|
|
{
|
|
MessageBox.Show("Description should be at least 3 characters!", "Chamber", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
sensor.Description = description;
|
|
sensor.Enabled = cboxSensorEditEnabled.Checked;
|
|
sensor.ApplyCalibration = cboxSensorEditCalibrationEnabled.Checked;
|
|
|
|
return sensor;
|
|
}
|
|
|
|
private Calibration GetCalibration_FormSensorEdit()
|
|
{
|
|
int PK = int.Parse(lblSensorEditCalibrationPK.Text);
|
|
int SensorPK = int.Parse(lblSensorEditPK.Text);
|
|
|
|
double X1 = 0.0;
|
|
double X2 = 0.0;
|
|
double X3 = 0.0;
|
|
double X4 = 0.0;
|
|
|
|
if (!tbX1.Text.TryParseToDouble(out X1))
|
|
{
|
|
MessageBox.Show("X1" + X1.ToString() + " should be a decimal number!\n\n(You can use format 0.0E0 or 0.0 with 6 decimals)", "Sensor calibration", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
if (!tbX2.Text.TryParseToDouble(out X2))
|
|
{
|
|
MessageBox.Show("X2" + X2.ToString() + " should be a decimal number!\n\n(You can use format 0.0E0 or 0.0 with 6 decimals)", "Sensor calibration", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
if (!tbX3.Text.TryParseToDouble(out X3))
|
|
{
|
|
MessageBox.Show("X3" + X3.ToString() + " should be a decimal number!\n\n(You can use format 0.0E0 or 0.0 with 6 decimals)", "Sensor calibration", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
if (!tbX4.Text.TryParseToDouble(out X4))
|
|
{
|
|
MessageBox.Show("X4" + X4.ToString() + " should be a decimal number!\n\n(You can use format 0.0E0 or 0.0 with 6 decimals)", "Sensor calibration", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
|
|
double a = (X3 - X1) / (X4 - X2);
|
|
double b = X1 - a * X2;
|
|
|
|
double[] Xvalues = new double[4] { X1, X2, X3, X4 };
|
|
|
|
double[] c = new double[4] { 0, 1, 0, 0 };
|
|
|
|
if (cboxSensorEditCalibrationEnabled.Checked == true) // if calibration is true --> a and b are used
|
|
{
|
|
c[0] = Math.Round(b, 5);
|
|
c[1] = Math.Round(a, 5) ;
|
|
}
|
|
else // if calibration is disabled --> use gain = 1 and offset = 0
|
|
{
|
|
c[0] = 0.0;
|
|
c[1] = 1.0;
|
|
}
|
|
|
|
|
|
label17.Text = c[0].ToString();
|
|
label18.Text = c[1].ToString();
|
|
|
|
|
|
double U = 0;
|
|
|
|
if (!txtbSensorsEditCalibrationU.Text.TryParseToDouble(out U))
|
|
{
|
|
MessageBox.Show("U should be a decimal number!\n\n(You can use format 0.0E0 or 0.0 with 6 decimals)", "Sensor calibration", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return null;
|
|
}
|
|
|
|
// for(int i =0; i<3; i++) Console.WriteLine(c[i]);
|
|
//Console.WriteLine(U);
|
|
|
|
return new Calibration(PK, SensorPK, dtpSensorEditRelease.Value, dtpSensorEditExpiry.Value, DateTime.Now, c, U, Xvalues);
|
|
|
|
}
|
|
|
|
private void btnSensorEditClearCalibration_Click(object sender, EventArgs e)
|
|
{
|
|
tbX1.Text = "0.0";
|
|
tbX2.Text = "0.0";
|
|
tbX3.Text = "1.0";
|
|
tbX4.Text = "1.0";
|
|
txtbSensorsEditCalibrationU.Text = "0";
|
|
dtpSensorEditRelease.Value = DateTime.Now;
|
|
dtpSensorEditExpiry.Value = DateTime.Now.AddYears(1);
|
|
}
|
|
|
|
private void btnSensorEditModify_Click(object sender, EventArgs e) // modify button click
|
|
{
|
|
// Get from GUI
|
|
Sensor sensor = GetSensor_FormSensorEdit();
|
|
if (sensor == null)
|
|
return;
|
|
|
|
Calibration calibration = GetCalibration_FormSensorEdit();
|
|
if (calibration == null)
|
|
return;
|
|
|
|
String InformationMsg = "";
|
|
Boolean WriteToServerRequired = false;
|
|
|
|
// Modify sensor in DB
|
|
try
|
|
{
|
|
Sensor existing = new Sensors().GetByPK(sensor.PK); // obtain sensor from DB
|
|
if (!new Sensors().Equal(sensor, existing)) // check if new sensor data is different (does not check for change of c0,c1...)
|
|
{
|
|
new Sensors().Modify(sensor);
|
|
//InformationMsg += "Changes to sensor saved!";
|
|
WriteToServerRequired = true;
|
|
}
|
|
else
|
|
{
|
|
//InformationMsg += "Sensor has not changed.";
|
|
}
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
String msg = String.Format("Could not modify sensor!\n{0}", ex.Message);
|
|
MessageBox.Show(msg, "Modify sensor", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
|
|
// Modify or add calibration in/to DB
|
|
if( calibration.PK < 0)
|
|
{
|
|
// Calibration for sensor was not found. Add new one.
|
|
try
|
|
{
|
|
new Calibrations().Add(calibration);
|
|
InformationMsg += "\nNew calibration added!";
|
|
//InformationMsg += "\n\nPlease restart the server!";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
String msg = String.Format("Could not create calibration!\n{0}", ex.Message);
|
|
MessageBox.Show(msg, "Calibration", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
// Sensor has a calibration. Add new one if changed.
|
|
try
|
|
{
|
|
Calibration existing = new Calibrations().GetByPK(calibration.PK);
|
|
if (!new Calibrations().Equal(calibration, existing) || calibration.Uncertainty != existing.Uncertainty) // if c[] of U is changed
|
|
{
|
|
int pk = new Calibrations().Add(calibration);
|
|
lblSensorEditCalibrationPK.Text = pk.ToString();
|
|
InformationMsg += "\nNew calibration added replacing previous calibration!";
|
|
//InformationMsg += "\n\nPlease restart the server!";
|
|
WriteToServerRequired = true;
|
|
}
|
|
else
|
|
InformationMsg += "\nCalibration has not changed.";
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
String msg = String.Format("Could not save calibration!\n{0}", ex.Message);
|
|
MessageBox.Show(msg, "Modify sensor", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
}
|
|
MessageBox.Show(InformationMsg, "Modify sensor", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
|
// Is there a need to update server?
|
|
if(WriteToServerRequired)
|
|
{
|
|
Chamber chamber;
|
|
try
|
|
{
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
chamber = new Chambers().GetByPK(ChamberPK);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
string msg = "Could not find chamber network information in database!\n\n" + ex.Message;
|
|
MessageBox.Show(msg, "Sensor upload", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
this.Cursor = Cursors.WaitCursor;
|
|
|
|
ShowInfoLabel(string.Format("Uploading sensor details to server ({0}) connected to chamber {1:00000}...", chamber.Network, chamber.MIDS));
|
|
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
|
|
if (!server.ModifySensor(sensor, calibration))
|
|
{
|
|
string msg = string.Format("Failed to upload sensor details to server ({0}) connected to chamber {1:00000}!", server.URL, chamber.MIDS);
|
|
MessageBox.Show(msg,"Sensor upload", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
HideInfoLabel();
|
|
string msg = string.Format("Sensor details could not be uploaded to server ({0}) connected to chamber {1:00000}!\n\n", chamber.Network, chamber.MIDS);
|
|
msg += ex.Message;
|
|
MessageBox.Show(msg, "Sensor upload", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
finally
|
|
{
|
|
this.Cursor = Cursors.Default;
|
|
HideInfoLabel();
|
|
}
|
|
}
|
|
|
|
// Refresh and reselect
|
|
int indexChamber = lboxChambers.SelectedIndex;
|
|
int indexSensor = lbSensorsEdit.SelectedIndex;
|
|
lboxChambers.ClearSelected();
|
|
lboxChambers.SelectedIndex = indexChamber;
|
|
lbSensorsEdit.ClearSelected();
|
|
lbSensorsEdit.SelectedIndex = indexSensor;
|
|
}
|
|
|
|
|
|
private void ShowInfoLabel(string msg)
|
|
{
|
|
this.Cursor = Cursors.WaitCursor;
|
|
pnlInfoLabel.Location = new Point(191, 285);
|
|
lblInfo.Text = msg;
|
|
int x = (int)Math.Round((double)(pnlInfoLabel.Width - lblInfo.Width) / 2.0);
|
|
int y = lblInfo.Location.Y;
|
|
lblInfo.Location = new Point(x, y);
|
|
pnlInfoLabel.BringToFront();
|
|
pnlInfoLabel.Visible = true;
|
|
pnlInfoLabel.Refresh();
|
|
}
|
|
private void HideInfoLabel()
|
|
{
|
|
lblInfo.Text = "";
|
|
pnlInfoLabel.Visible = false;
|
|
this.Cursor = Cursors.Default;
|
|
}
|
|
|
|
|
|
private void Reboot_Click(object sender, EventArgs e) // reboot raspberry pi
|
|
{
|
|
Chamber chamber;
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
chamber = new Chambers().GetByPK(ChamberPK);
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
try
|
|
{
|
|
using (WebClient client = new WebClient())
|
|
{
|
|
string dta = client.DownloadString(server.URL + "reboot");
|
|
// Console.WriteLine(dta);
|
|
if(dta == "OK")
|
|
{
|
|
MessageBox.Show("Reboot successful");
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("Reboot command not received successfully");
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
//Console.WriteLine("Reboot RPI");
|
|
}
|
|
}
|
|
|
|
private void Shutdown_Click(object sender, EventArgs e) // shutdown raspberry pi
|
|
{
|
|
Chamber chamber;
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
chamber = new Chambers().GetByPK(ChamberPK);
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
try
|
|
{
|
|
using (WebClient client = new WebClient())
|
|
{
|
|
string dta = client.DownloadString(server.URL + "shutdown");
|
|
//Console.WriteLine(dta);
|
|
if (dta == "OK")
|
|
{
|
|
MessageBox.Show("Shutdown successful");
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("Shutdown command not received successfully");
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
//Console.WriteLine("Shutdown RPI");
|
|
}
|
|
}
|
|
|
|
public void NodeState_Click(object sender, EventArgs e)
|
|
{
|
|
Chamber chamber;
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
chamber = new Chambers().GetByPK(ChamberPK);
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
|
|
try
|
|
{
|
|
using (WebClient client = new WebClient())
|
|
{
|
|
string dta = client.DownloadString(server.URL + "status"); // send status HTTP request to cms node
|
|
//Console.WriteLine(server.URL + "status"); // output URL
|
|
|
|
Nodestatus nodestate = new Nodestatus();
|
|
nodestate.Show(); // create HTML viewer
|
|
|
|
nodestate.webBrowser1.Navigate("about:blank"); // empty HTML viewer
|
|
if (nodestate.webBrowser1.Document != null)
|
|
{
|
|
nodestate.webBrowser1.Document.Write(string.Empty);
|
|
}
|
|
nodestate.webBrowser1.DocumentText = dta; // put received HTML into web viewer
|
|
|
|
string nodestatusurl = server.URL + "status"; // put used URL in text box for further use (update button)
|
|
nodestate.nodeURL.Text = nodestatusurl;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
Console.WriteLine("Status request error!");
|
|
System.Windows.Forms.MessageBox.Show("No response from CMS-2 node");
|
|
}
|
|
}
|
|
|
|
private void RS485btn_Click(object sender, EventArgs e)
|
|
{
|
|
RS485_Comm RScomm = new RS485_Comm();
|
|
RScomm.Show();
|
|
|
|
Chamber chamber;
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
chamber = new Chambers().GetByPK(ChamberPK);
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
|
|
RScomm.RSurl.Text = server.URL;
|
|
}
|
|
|
|
private void button1_Click(object sender, EventArgs e)
|
|
{
|
|
Chamber chamber;
|
|
int ChamberPK = Int32.Parse(lblChambersEditPK.Text);
|
|
chamber = new Chambers().GetByPK(ChamberPK);
|
|
Server server = Servers.GetInstanceByChamber(chamber);
|
|
|
|
string http = "<socket>,";
|
|
http += textBox1.Text;
|
|
http += ",";
|
|
http += int.Parse(textBox2.Text);
|
|
http += ",</socket>";
|
|
|
|
// Send unix timestamp string to RPI
|
|
try
|
|
{
|
|
using (WebClient client = new WebClient())
|
|
{
|
|
|
|
string URL = "http://" + chamber.Network + ":8080/";
|
|
//Console.WriteLine(URL);
|
|
string url = client.UploadString(URL, http);
|
|
//Console.WriteLine(url);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
private void databaseToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
pnlDatabaseBackup.Visible = true;
|
|
groupBox1.Visible = true;
|
|
|
|
//SqlConnection connection = new SqlConnection("Data Source=tcp:192.168.0.241\\FEANOR,1434; Initial Catalog = FEANOR; Persist Security Info=True; User " +"ID = sa; Password= ; connection timeout=15");
|
|
SqlConnection connection = new SqlConnection("Data Source=tcp:192.168.0.241,1434; Initial Catalog = FEANOR; Persist Security Info=True; User " +
|
|
"ID = sa; Password=resam; connection timeout=15; TrustServerCertificate=True");
|
|
|
|
DateTime st;
|
|
try
|
|
{
|
|
using (connection)
|
|
{
|
|
SqlCommand command = new SqlCommand(
|
|
"USE FEANOR SELECT TOP 1 TimeStamp FROM dbo.Results ORDER BY TimeStamp ASC;",
|
|
connection);
|
|
connection.Open();
|
|
|
|
st = (DateTime)command.ExecuteScalar();
|
|
lblFirstResult.Text = st.ToString();
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
st = DateTime.Now;
|
|
}
|
|
|
|
txtbBackupFile.Text = "C:\\FeanorDB_Backup\\CMS2backup (period " + st.ToString("yyyy dd MM") + " to " + DateTime.Now.ToString("yyyy dd MM") + ").bak";
|
|
txtbBackupFileCopy.Text = @"\\silicium\projects\2020\P201339\sub1\4. Software\6. CMS2_Database_Backup\CMS2backup (period " + st.ToString("yyyy dd MM") + " to " + DateTime.Now.ToString("yyyy dd MM") + ").bak";
|
|
|
|
}
|
|
|
|
private void btnDatabaseBackup_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
SqlConnection myConnection = new SqlConnection("Data Source=tcp:192.168.0.241,1434; Initial Catalog = FEANOR; Persist Security Info=True; User " +
|
|
"ID = sa; Password=resam; connection timeout=15; TrustServerCertificate=True");
|
|
|
|
while (File.Exists(txtbBackupFile.Text) == false)
|
|
{
|
|
// backup to local drive
|
|
try
|
|
{
|
|
myConnection.Open();
|
|
SqlCommand cmd = new SqlCommand(@"BACKUP DATABASE FEANOR TO DISK='" + txtbBackupFile.Text + "'", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Error during local DB backup!");
|
|
}
|
|
finally
|
|
{
|
|
myConnection.Close();
|
|
}
|
|
|
|
}
|
|
MessageBox.Show("Local DB backup succesful!");
|
|
|
|
// Check if server file is actually there
|
|
while (File.Exists(txtbBackupFileCopy.Text) == false)
|
|
{
|
|
try
|
|
{
|
|
File.Copy(txtbBackupFile.Text, txtbBackupFileCopy.Text, true);
|
|
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Error during server DB backup!");
|
|
}
|
|
}
|
|
MessageBox.Show("Server DB backup succesful!");
|
|
}
|
|
|
|
private void button2_Click(object sender, EventArgs e)
|
|
{
|
|
pnlDatabaseBackup.Visible = false;
|
|
pnlDatabaseBackup.Visible = false;
|
|
groupBox1.Visible = false;
|
|
}
|
|
|
|
private void dtpSensorEditCreation_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void label28_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void label30_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void cboxSensorEditCalibrationEnabled_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void button3_Click(object sender, EventArgs e)
|
|
{
|
|
CalibrationHelpPage CHP = new CalibrationHelpPage();
|
|
CHP.Show();
|
|
}
|
|
|
|
private void rS485ChambersToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
groupBox2.Visible = true;
|
|
|
|
dgvRS485.DefaultCellStyle.ForeColor = Color.Black;
|
|
dgvRS485.Rows.Clear();
|
|
|
|
List<Chamber> chambers;
|
|
chambers = new Chambers().GetAllActive();
|
|
foreach (Chamber chamber in chambers)
|
|
if (chamber.RS485 == true)
|
|
{
|
|
//Console.WriteLine(chamber.MIDS);
|
|
dgvRS485.Rows.Add(chamber.MIDS.ToString());
|
|
}
|
|
}
|
|
|
|
private void button4_Click(object sender, EventArgs e)
|
|
{
|
|
groupBox2.Visible = false;
|
|
|
|
|
|
}
|
|
|
|
private void timerDBbackup_Tick(object sender, EventArgs e)
|
|
{
|
|
Console.WriteLine("Making DB backup......");
|
|
timerDBbackup.Enabled = false; // only 1 tick
|
|
|
|
|
|
}
|
|
|
|
private void btnDeleteOneYear_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult dialogResult = MessageBox.Show("Are you sure you want to delete Database results older than 1 year?", "Delete Results", MessageBoxButtons.YesNo);
|
|
if (dialogResult == DialogResult.Yes)
|
|
{
|
|
SqlConnection myConnection = new SqlConnection("Data Source=tcp:192.168.0.241,1434; Initial Catalog = FEANOR; Persist Security Info=True; User " +
|
|
"ID = sa; Password=resam; connection timeout=15; TrustServerCertificate=True");
|
|
|
|
try
|
|
{
|
|
myConnection.Open();
|
|
SqlCommand cmd = new SqlCommand(@"DELETE FROM RESULTS WHERE TimeStamp < (GETDATE() - 365);", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
|
|
myConnection.Open();
|
|
cmd = new SqlCommand(@"DELETE FROM RESULTSOUDEHAL WHERE TimeStamp < (GETDATE() - 365);", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
MessageBox.Show("Deleting Database results succesful");
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Error during deleting DataBase results");
|
|
}
|
|
finally
|
|
{
|
|
myConnection.Close();
|
|
}
|
|
|
|
}
|
|
else if (dialogResult == DialogResult.No)
|
|
{
|
|
//do something else
|
|
}
|
|
}
|
|
|
|
private void btnDeleteHalfYear_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult dialogResult = MessageBox.Show("Are you sure you want to delete Database results older than half a year?", "Delete Results", MessageBoxButtons.YesNo);
|
|
if (dialogResult == DialogResult.Yes)
|
|
{
|
|
SqlConnection myConnection = new SqlConnection("Data Source=tcp:192.168.0.241,1434; Initial Catalog = FEANOR; Persist Security Info=True; User " +
|
|
"ID = sa; Password=resam; connection timeout=15; TrustServerCertificate=True");
|
|
|
|
try
|
|
{
|
|
myConnection.Open();
|
|
SqlCommand cmd = new SqlCommand(@"DELETE FROM RESULTS WHERE TimeStamp < (GETDATE() - 188);", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
myConnection.Open();
|
|
cmd = new SqlCommand(@"DELETE FROM RESULTSOUDEHAL WHERE TimeStamp < (GETDATE() - 188);", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
MessageBox.Show("Deleting Database results succesful");
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Error during deleting DataBase results");
|
|
}
|
|
finally
|
|
{
|
|
myConnection.Close();
|
|
}
|
|
|
|
}
|
|
else if (dialogResult == DialogResult.No)
|
|
{
|
|
//do something else
|
|
}
|
|
}
|
|
|
|
private void btnDeleteTwoYear_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult dialogResult = MessageBox.Show("Are you sure you want to delete Database results older than 2 years?", "Delete Results", MessageBoxButtons.YesNo);
|
|
if (dialogResult == DialogResult.Yes)
|
|
{
|
|
SqlConnection myConnection = new SqlConnection("Data Source=tcp:192.168.0.241,1434; Initial Catalog = FEANOR; Persist Security Info=True; User " +
|
|
"ID = sa; Password=resam; connection timeout=15; TrustServerCertificate=True");
|
|
|
|
try
|
|
{
|
|
myConnection.Open();
|
|
SqlCommand cmd = new SqlCommand(@"DELETE FROM RESULTS WHERE TimeStamp < (GETDATE() - 730);", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
myConnection.Open();
|
|
cmd = new SqlCommand(@"DELETE FROM RESULTSOUDEHAL WHERE TimeStamp < (GETDATE() - 730);", myConnection);
|
|
cmd.ExecuteNonQuery();
|
|
MessageBox.Show("Deleting Database results succesful");
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Error during deleting DataBase results");
|
|
}
|
|
finally
|
|
{
|
|
myConnection.Close();
|
|
}
|
|
|
|
}
|
|
else if (dialogResult == DialogResult.No)
|
|
{
|
|
//do something else
|
|
}
|
|
}
|
|
|
|
private void label33_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void cboxRS485_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void cbHumidity_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void cbSuperUser_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
cbSuperUser.CheckedChanged -= cbSuperUser_CheckedChanged;
|
|
if(cbSuperUser.Checked == true)
|
|
{
|
|
DialogResult dialogResult = MessageBox.Show("Are you sure that you want to edit node information?", "Super user", MessageBoxButtons.YesNo);
|
|
if (dialogResult == DialogResult.Yes)
|
|
{
|
|
cbSuperUser.Checked = true;
|
|
}
|
|
else if (dialogResult == DialogResult.No)
|
|
{
|
|
cbSuperUser.Checked = false;
|
|
}
|
|
}
|
|
cbSuperUser.CheckedChanged += cbSuperUser_CheckedChanged;
|
|
|
|
if (cbSuperUser.Checked == true)
|
|
{
|
|
nudChambersEditInterval.Enabled = true;
|
|
cboxChambersEditActive.Enabled = true;
|
|
cboxRS485.Enabled = true;
|
|
cbHumidity.Enabled = true;
|
|
cboxSensorEditEnabled.Enabled = true;
|
|
cboxChambersEditServerType.Enabled = true;
|
|
txtbChambersEditMIDS.Enabled = true;
|
|
txtbChambersEditDescription.Enabled = true;
|
|
txtbChambersEditNetwork.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
nudChambersEditInterval.Enabled = false;
|
|
cboxChambersEditActive.Enabled = false;
|
|
cboxRS485.Enabled = false;
|
|
cbHumidity.Enabled = false;
|
|
cboxSensorEditEnabled.Enabled = false;
|
|
cboxChambersEditServerType.Enabled = false;
|
|
txtbChambersEditMIDS.Enabled = false;
|
|
txtbChambersEditDescription.Enabled = false;
|
|
txtbChambersEditNetwork.Enabled = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|