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 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 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 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 Coefficient_TextBoxes { get { List txtbList = new List(); 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 = ","; http += textBox1.Text; http += ","; http += int.Parse(textBox2.Text); http += ","; // 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 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; } } } }